読者です 読者をやめる 読者になる 読者になる

低レベルインフラエンジニアの忘備録

Linux系の各種作業を自分用の忘備録として残しています

RHEL6で自己証明書作成

以前に検証環境で自己証明書(オレオレ証明書)を作ったことがあったのでそれをメモしておきます。 こちらのサイトを参考にしています。
プライベート認証局の証明書、サーバー証明書、クライアント証明書の作成方法について | レンタルサーバー・自宅サーバー設定・構築のヒント

環境

  • RHEL6.7

  • openssl0.9.8e

CA(認証局構築)

(1)認証局用のopenssl.cnf作成

# cp -p /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl.cnf.org
# vi /etc/pki/tls/openssl.cnf
####################################################################
[ ca ]
default_ca  = CA_default        # The default ca section

####################################################################
[ CA_default ]

# 自己証明書作成用に修正
#dir        = /etc/pki/CA       # Where everything is kept
dir     = /etc/pki/hogehoge_CA       # Where everything is kept

[ usr_cert ]

# These extensions are added when 'ca' signs a request.

# This goes against PKIX guidelines but some CAs do it and some software
# requires this to avoid interpreting an end user certificate as a CA.

#basicConstraints=CA:FALSE
basicConstraints=CA:TRUE

(2)認証局構築用のスクリプト作成

デフォルトのスクリプト(CA)を流用します。

# cp -p /etc/pki/tls/misc/CA /etc/pki/tls/misc/CA_hoge
# ls -l /etc/pki/tls/misc/
合計 32
-rwxr-xr-x. 1 root root 5178  1月  7 18:17 2014 CA
-rwxr-xr-x  1 root root 5178  1月  7 18:17 2014 CA_hoge
-rwxr-xr-x. 1 root root  119  1月  7 18:17 2014 c_hash
-rwxr-xr-x. 1 root root  152  1月  7 18:17 2014 c_info
-rwxr-xr-x. 1 root root  112  1月  7 18:17 2014 c_issuer
-rwxr-xr-x. 1 root root  110  1月  7 18:17 2014 c_name
# vi /etc/pki/tls/misc/CA_hoge
if [ -z "$DAYS" ] ; then DAYS="-days 365" ; fi  # 1 year
#CADAYS="-days 1095"    # 3 years
CADAYS="-days 3600" # 10 years

#if [ -z "$CATOP" ] ; then CATOP=/etc/pki/CA ; fi
if [ -z "$CATOP" ] ; then CATOP=/etc/pki/hoge_CA ; fi

(3)CA構築用スクリプト実行

# /etc/pki/tls/misc/CA_hoge -newca
CA certificate filename (or enter to create)

Making CA certificate ...
Generating a 2048 bit RSA private key
...................+++
.................................................................+++
writing new private key to '/etc/pki/hoge_CA/private/./cakey.pem'
Enter PEM pass phrase:(パスフレーズを入力)
Verifying - Enter PEM pass phrase:(パスフレーズを入力)
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:(国名を入力)
State or Province Name (full name) []:(都道府県名を入力)
Locality Name (eg, city) [Default City]:(市区町村を入力)
Organization Name (eg, company) [Default Company Ltd]:(組織名を入力)
Organizational Unit Name (eg, section) []:(何も入力せずにenter)
Common Name (eg, your name or your server's hostname) []:(コモンネームを入力)
Email Address []:(何も入力せずにenter)

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:(何も入力せずにenter)
An optional company name []:(何も入力せずにenter)
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/hoge_CA/private/./cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 15386495605545154568 (0xd587d03b6aa0b808)
        Validity
            Not Before: Mar 28 03:56:55 2014 GMT
            Not After : Feb  4 03:56:55 2024 GMT
        Subject:
            countryName               = (国名)
            stateOrProvinceName       = (都道府県名)
            organizationName          = (組織名)
            commonName                = (コモンネーム)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                XX:XX:XX・・・・
            X509v3 Authority Key Identifier:
                keyid:XX:XX:XX・・・・

            X509v3 Basic Constraints:
                CA:TRUE
Certificate is to be certified until Feb  4 03:56:55 2024 GMT (3600 days)

Write out database with 1 new entries
Data Base Updated
# ls -l /etc/pki/hoge_CA
合計 40
-rw-r--r-- 1 root root 4472  3月 28 12:56 2014 cacert.pem
-rw-r--r-- 1 root root 1050  3月 28 12:56 2014 careq.pem
drwxr-xr-x 2 root root 4096  3月 28 12:55 2014 certs
drwxr-xr-x 2 root root 4096  3月 28 12:55 2014 crl
-rw-r--r-- 1 root root  128  3月 28 12:56 2014 index.txt
-rw-r--r-- 1 root root   21  3月 28 12:56 2014 index.txt.attr
-rw-r--r-- 1 root root    0  3月 28 12:55 2014 index.txt.old
drwxr-xr-x 2 root root 4096  3月 28 12:56 2014 newcerts
drwxr-xr-x 2 root root 4096  3月 28 12:56 2014 private
-rw-r--r-- 1 root root   17  3月 28 12:56 2014 serial

ルート証明書作成

# cd /etc/pki/hoge_CA
# openssl x509 -inform pem -in cacert.pem -outform der -out cacert.der
# ls -l
合計 52
-rw-r--r-- 1 root root  957  3月 31 15:11 2014 cacert.der
-rw-r--r-- 1 root root 4472  3月 28 12:56 2014 cacert.pem
-rw-r--r-- 1 root root 1050  3月 28 12:56 2014 careq.pem
drwxr-xr-x 3 root root 4096  3月 31 14:53 2014 certs
drwxr-xr-x 2 root root 4096  3月 28 12:55 2014 crl
-rw-r--r-- 1 root root  131  3月 31 11:59 2014 index.txt
-rw-r--r-- 1 root root   21  3月 31 11:59 2014 index.txt.attr
-rw-r--r-- 1 root root   21  3月 31 11:44 2014 index.txt.attr.old
-rw-r--r-- 1 root root    0  3月 31 11:59 2014 index.txt.old
drwxr-xr-x 2 root root 4096  3月 31 11:59 2014 newcerts
drwxr-xr-x 2 root root 4096  3月 28 12:56 2014 private
-rw-r--r-- 1 root root   17  3月 31 11:59 2014 serial
-rw-r--r-- 1 root root   17  3月 31 11:44 2014 serial.old

サーバ証明書作成

(1)サーバ用のopenssl.cnf作成

# ls -l /etc/pki/tls/
合計 36
lrwxrwxrwx. 1 root root    19  8月 13 23:27 2013 cert.pem -> certs/ca-bundle.crt
drwxr-xr-x. 2 root root  4096  2月  4 18:23 2014 certs
drwxr-xr-x. 2 root root  4096  3月 28 11:54 2014 misc
-rw-r--r--  1 root root 11025  3月 28 12:55 2014 openssl.cnf
-rw-r--r--  1 root root 10906  1月  7 18:11 2014 openssl.cnf.org
drwxr-xr-x. 2 root root  4096  2月 17 16:15 2014 private
# cp -p /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl_server.cnf
# vi /etc/pki/tls/openssl_server.cnf
           ・
           ・
basicConstraints=CA:FALSE
#basicConstraints=CA:TRUE
           ・
           ・
# This is OK for an SSL server.
 nsCertType         = server

(2)秘密鍵CSR作成

# cd /etc/pki/tls/
# SSLEAY_CONFIG="-config /etc/pki/tls/openssl_server.cnf" /etc/pki/tls/misc/CA_hoge -newreq
Generating a 2048 bit RSA private key
.........................................................................................................................+++
........................................................................................+++
writing new private key to 'newkey.pem'
Enter PEM pass phrase:(パスフレーズを入力)
Verifying - Enter PEM pass phrase:(パスフレーズを入力)
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:(国名を入力)
State or Province Name (full name) []:(都道府県名を入力)
Locality Name (eg, city) [Default City]:(市区町村を入力)
Organization Name (eg, company) [Default Company Ltd]:(組織名を入力)
Organizational Unit Name (eg, section) []:(部署名を入力)
Common Name (eg, your name or your server's hostname) []:(コモンネームを入力)
Email Address []:(何も入力せずにenter)

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:(何も入力せずにenter)
An optional company name []:(何も入力せずにenter)
Request is in newreq.pem, private key is in newkey.pem
# ls -l
合計 56
lrwxrwxrwx. 1 root root    19  8月 13 23:27 2013 cert.pem -> certs/ca-bundle.crt
drwxr-xr-x. 2 root root  4096  2月  4 18:23 2014 certs
drwxr-xr-x. 2 root root  4096  3月 28 11:54 2014 misc
-rw-r--r--  1 root root  1834  3月 31 11:57 2014 newkey.pem
-rw-r--r--  1 root root  1033  3月 31 11:57 2014 newreq.pem
-rw-r--r--  1 root root 11025  3月 28 12:55 2014 openssl.cnf
-rw-r--r--  1 root root 10906  1月  7 18:11 2014 openssl.cnf.org
-rw-r--r--  1 root root 11024  3月 31 11:11 2014 openssl_server.cnf
drwxr-xr-x. 2 root root  4096  2月 17 16:15 2014 private

(3)サーバ証明書作成

# cd /etc/pki/tls/
# SSLEAY_CONFIG="-config /etc/pki/tls/openssl_server.cnf" /etc/pki/tls/misc/CA_hoge -sign
Using configuration from /etc/pki/tls/openssl_server.cnf
Enter pass phrase for /etc/pki/hoge_CA/private/cakey.pem:(パスフレーズを入力)
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 15386495605545154570 (0xd587d03b6aa0b80a)
        Validity
            Not Before: Mar 31 02:59:27 2014 GMT
            Not After : Mar 31 02:59:27 2015 GMT
        Subject:
            countryName               = (国名)
            stateOrProvinceName       = (都道府県名)
            localityName              = (市区町村名)
            organizationName          = (組織名)
            commonName                = (コモンネーム)
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Cert Type:
                SSL Server
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                XX:XX:XX・・・・・
            X509v3 Authority Key Identifier:
                keyid:XX:XX:XX・・・・・

Certificate is to be certified until Mar 31 02:59:27 2015 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 15386495605545154570 (0xd587d03b6aa0b80a)
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=(国名), ST=(都道府県名), O=(組織名), CN=(コモンネーム)
        Validity
            Not Before: Mar 31 02:59:27 2014 GMT
            Not After : Mar 31 02:59:27 2015 GMT
        Subject: C=(国名), ST=(都道府県名), L=(市区町村名), O=(組織名), CN=(コモンネーム)
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                 XX:XX:XX・・・
                 XX:XX:XX・・・
                    ・
                    ・
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Cert Type:
                SSL Server
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                XX:XX:XX・・・・
            X509v3 Authority Key Identifier:
                keyid:XX:XX:XX・・・・

    Signature Algorithm: sha1WithRSAEncryption
         XX:XX:XX・・・・
         XX:XX:XX・・・・
         XX:XX:XX・・・・
              ・
              ・
-----BEGIN CERTIFICATE-----
XXX・・・・
XXX・・・・
-----END CERTIFICATE-----
Signed certificate is in newcert.pem
# ls -l
合計 64
lrwxrwxrwx. 1 root root    19  8月 13 23:27 2013 cert.pem -> certs/ca-bundle.crt
drwxr-xr-x. 2 root root  4096  2月  4 18:23 2014 certs
drwxr-xr-x. 2 root root  4096  3月 28 11:54 2014 misc
-rw-r--r--  1 root root  4716  3月 31 11:59 2014 newcert.pem
-rw-r--r--  1 root root  1834  3月 31 11:57 2014 newkey.pem
-rw-r--r--  1 root root  1033  3月 31 11:57 2014 newreq.pem
-rw-r--r--  1 root root 11025  3月 28 12:55 2014 openssl.cnf
-rw-r--r--  1 root root 10906  1月  7 18:11 2014 openssl.cnf.org
-rw-r--r--  1 root root 11024  3月 31 11:11 2014 openssl_server.cnf
drwxr-xr-x. 2 root root  4096  2月 17 16:15 2014 private

RHEL6で論理ボリューム拡張

前提条件、環境

  • OS:RHEL6.7

  • 物理サーバの空きスロットに900GBのディスクを3本増設し、RAID5を構築(ハードウェアRAID)

  • 拡張するLV(Logical Volume、論理ボリューム)は「VolGroup00-LogVol00」

# df -m
Filesystem           1M-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/VolGroup-LogVol00
                        492150    153556    313594  33% /
tmpfs                     5950         1      5950   1% /dev/shm
/dev/mapper/VolGroup00-LogVol00
                        297651    167939    114597  60% /backup
/dev/sda1                  243        60       171  26% /boot
/var/opt/aipsnap/aiptmpfile.img
                         20353       130     19189   1% /var/opt/aipsnap/tmp

パーティションテーブルの確認

# fdisk /dev/sdbバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルをディスク識別子 0xd322afdb で作成します。
あなたが書き込みを決定するまで、変更はメモリ内だけに残します。
その後はもちろん以前の内容は修復不可能になります。
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります

警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを
      強く推奨します。 and change display units to
         sectors (command 'u').

コマンド (m でヘルプ): p

ディスク /dev/sdb: 1799.3 GB, 1799255752704 バイ
ヘッド 255, セクタ 63, シリンダ 218747
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0xd322afdb

デバイス ブート      始点        終点     ブロック   Id  システム

コマンド (m でヘルプ):q

今回追加したディスクが/dev/sdbとして認識されています。

拡張パーティションの作成

# fdisk /dev/sdbバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルをディスク識別子 0x63fff6ee で作成します。
あなたが書き込みを決定するまで、変更はメモリ内だけに残します。
その後はもちろん以前の内容は修復不可能になります。
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります

警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを
      強く推奨します。 and change display units to
         sectors (command 'u').

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本パーティション (1-4)
e
パーティション番号 (1-4): 1
最初 シリンダ (1-218747, 初期値 1):(何も入力せずにenter)
初期値 1 を使います
Last シリンダ, +シリンダ数 or +size{K,M,G} (1-218747, 初期値 218747): +900G

コマンド (m でヘルプ): p

ディスク /dev/sdb: 1799.3 GB, 1799255752704 バイト
ヘッド 255, セクタ 63, シリンダ 218747
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x63fff6ee

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdb1               1      117489   943730361    5  拡張領域

上記の通り拡張パーティション/dev/sdb1が作成されています。
後々いろいろ調べていたのですが、Lastシリンダの選択に関してはディスク全てを拡張パーティションにする場合はデフォルト値(何も入力せずにenter)のほうがいいみたいです。

論理パーティションの作成

コマンド (m でヘルプ): n
コマンドアクション
   l   論理 (5 以上)
   p   基本パーティション (1-4)
l
最初 シリンダ (1-117489, 初期値 1):(何も入力せずにenter)
初期値 1 を使います
Last シリンダ, +シリンダ数 or +size{K,M,G} (1-117489, 初期値 117489): +900G

コマンド (m でヘルプ): p

ディスク /dev/sdb: 1799.3 GB, 1799255752704 バイト
ヘッド 255, セクタ 63, シリンダ 218747
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x63fff6ee

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdb1               1      117489   943730361    5  拡張領域
/dev/sdb5               1      117489   943730329+  83  Linux

コマンド (m でヘルプ):

論理パーティションsdb5が作成されています。

論理パーティションファイルシステム(システムID)変更

コマンド (m でヘルプ): t
パーティション番号 (1-5): 5
16進数コード (L コマンドでコードリスト表示): 8e
領域のシステムタイプを 5 から 8e (Linux LVM) に変更しました

コマンド (m でヘルプ): p

ディスク /dev/sdb: 1799.3 GB, 1799255752704 バイト
ヘッド 255, セクタ 63, シリンダ 218747
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x63fff6ee

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdb1               1      117489   943730361    5  拡張領域
/dev/sdb5               1      117489   943730329+  8e  Linux LVM

コマンド (m でヘルプ):

ファイルシステムが「Linux LVM」に変更されています。

変更の保存

コマンド (m でヘルプ): wq
パーティションテーブルは変更されました!

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
#

新しいパーティションをシステムに認識させる

# partprobe
Warning: WARNING: the kernel failed to re-read the partition table on /dev/sda (デバイスもしくはリソースがビジー状態です).  As a result, it may not reflect all of your changes until after reboot.

サーバ再起動

# shutdown -r now

念のため変更が反映されているか確認

# fdisk /dev/sdb

警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを
      強く推奨します。 and change display units to
         sectors (command 'u').

コマンド (m でヘルプ): p

ディスク /dev/sdb: 1799.3 GB, 1799255752704 バイト
ヘッド 255, セクタ 63, シリンダ 218747
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x63fff6ee

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdb1               1      117489   943730361    5  拡張領域
/dev/sdb5               1      117489   943730329+  8e  Linux LVM

コマンド (m でヘルプ): q

変更が反映されています。

物理ボリューム作成

# pvcreate /dev/sdb5
  Physical volume "/dev/sdb5" successfully created
# pvdisplay
              ・
              ・
  "/dev/sdb5" is a new physical volume of "900.01 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb5
  VG Name
  PV Size               900.01 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               k7nprd-HXRc-MmRQ-dfEP-JerS-vtqn-ybm0CK

物理ボリューム「/dev/sdb5」が作成されています。

現在のVG(VolumeGroup)の確認

# vgdisplay
  --- Volume group ---
  VG Name               VolGroup00
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               295.31 GiB
  PE Size               4.00 MiB
  Total PE              75599
  Alloc PE / Size       75599 / 295.31 GiB
  Free  PE / Size       0 / 0
  VG UUID               HstdF7-UfHF-h2vK-mHpB-iURB-YO4a-ZIeTSs

  --- Volume group ---
  VG Name               VolGroup
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               488.28 GiB
  PE Size               4.00 MiB
  Total PE              124999
  Alloc PE / Size       124999 / 488.28 GiB
  Free  PE / Size       0 / 0
  VG UUID               5o8RVG-g0kR-ncUN-K44V-xcVw-esne-HQKHrR

2つのVGがありますが、今回は「VolGroup00」を拡張します。

VG(VolumeGroup)拡張

# vgextend VolGroup00 /dev/sdb5
  Volume group "VolGroup00" successfully extended
# pvdisplay -v /dev/sdb5
    Using physical volume(s) on command line
  --- Physical volume ---
  PV Name               /dev/sdb5
  VG Name               VolGroup00
  PV Size               900.01 GiB / not usable 3.65 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              230402
  Free PE               230402
  Allocated PE          0
  PV UUID               k7nprd-HXRc-MmRQ-dfEP-JerS-vtqn-ybm0CK
# vgdisplay
  --- Volume group ---
  VG Name               VolGroup00
  System ID
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  5
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               1.17 TiB
  PE Size               4.00 MiB
  Total PE              306001
  Alloc PE / Size       75599 / 295.31 GiB
  Free  PE / Size       230402 / 900.01 GiB
  VG UUID               HstdF7-UfHF-h2vK-mHpB-iURB-YO4a-ZIeTSs

物理ボリュームがVG「VolGroup00」に所属しており、かつVG「VolGroup00」の容量が拡張されています。

LV(Logical Volume)の確認

# lvdisplay
  --- Logical volume ---
  LV Path                /dev/VolGroup00/LogVol00
  LV Name                LogVol00
  VG Name                VolGroup00
  LV UUID                Gu5YIo-HjiV-OcdP-xzeX-g9xn-oyr6-tbqDvU
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2013-08-13 22:51:36 +0900
  LV Status              available
  # open                 1
  LV Size                295.31 GiB
  Current LE             75599
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1

  --- Logical volume ---
  LV Path                /dev/VolGroup/LogVol00
  LV Name                LogVol00
  VG Name                VolGroup
  LV UUID                WAReRP-SClk-MpsC-oITR-Fpfb-QCbr-8IdWPY
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2013-08-13 22:50:31 +0900
  LV Status              available
  # open                 1
  LV Size                488.28 GiB
  Current LE             124999
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

LV拡張用のパラメータ取得

# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda3
  VG Name               VolGroup00
  PV Size               195.31 GiB / not usable 4.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              49999
  Free PE               0
  Allocated PE          49999
  PV UUID               Y8cRJ0-DARD-YFA2-3Ncq-OHOo-JUk5-fheULi

  --- Physical volume ---
  PV Name               /dev/sda6
  VG Name               VolGroup00
  PV Size               100.00 GiB / not usable 1.65 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              25600
  Free PE               0
  Allocated PE          25600
  PV UUID               K9z05R-knpR-2dFz-zN17-yDec-9tS7-P0441N

  --- Physical volume ---
  PV Name               /dev/sdb5
  VG Name               VolGroup00
  PV Size               900.01 GiB / not usable 3.65 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              230402
  Free PE               230402
  Allocated PE          0
  PV UUID               k7nprd-HXRc-MmRQ-dfEP-JerS-vtqn-ybm0CK

  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               VolGroup
  PV Size               488.28 GiB / not usable 4.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              124999
  Free PE               0
  Allocated PE          124999
  PV UUID               bZ3rT7-eX3B-Z93t-TrJl-5vPc-m1X1-grykyP

物理ボリューム「/dev/sdb5」の物理エクステントのサイズ(PE Size)と物理エクステントの総数(Total PE)を取得します。 PE(物理エクステント)はLVMが扱う記憶領域の最小単位となり、4MiBがデフォルトのようです。ちなみにPE Sizeに出ている「MiB」ですが、メビバイトと言ってコンピューター上での「MB」ということです。詳しくはこちらを。

拡張できるサイズの計算

拡張できるサイズに関しては「PE Size×Total PE」で求められるので、拡張できるサイズは4×230402=921608MBになります。

LV(Logical Volume)拡張

# lvextend -L +921608M /dev/VolGroup00/LogVol00
  Extending logical volume LogVol00 to 1.17 TiB
  Logical volume LogVol00 successfully resized

LV拡張確認

# lvdisplay /dev/VolGroup00/LogVol00
  --- Logical volume ---
  LV Path                /dev/VolGroup00/LogVol00
  LV Name                LogVol00
  VG Name                VolGroup00
  LV UUID                Gu5YIo-HjiV-OcdP-xzeX-g9xn-oyr6-tbqDvU
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2013-08-13 22:51:36 +0900
  LV Status              available
  # open                 1
  LV Size                1.17 TiB
  Current LE             306001
  Segments               3
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1

LVのサイズが拡張されています。

ファイルシステムの拡大

# resize2fs /dev/VolGroup00/LogVol00
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/VolGroup00/LogVol00 is mounted on /backup; on-line resizing required
old desc_blocks = 19, new_desc_blocks = 75
Performing an on-line resize of /dev/VolGroup00/LogVol00 to 313345024 (4k) blocks.
The filesystem on /dev/VolGroup00/LogVol00 is now 313345024 blocks long.

ディスク容量確認

# df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/VolGroup-LogVol00
                      481G  150G  307G  33% /
tmpfs                 5.9G   72K  5.9G   1% /dev/shm
/dev/mapper/VolGroup00-LogVol00
                      1.2T  168G  950G  15% /backup
/dev/sda1             243M   60M  171M  26% /boot
/var/opt/aipsnap/aiptmpfile.img
                       20G  130M   19G   1% /var/opt/aipsnap/tmp

ディスク容量が拡張されています。

MySQLレプリケーション(GTID使わない版)

MySQL5.6よりGTID(Global Transaction ID)でのレプリケーションが出来るようになりましたが、基本を押さえたかったのでまずはGTIDを使わないオーソドックスなレプリケーション対応手順をメモしておきます。

前提条件

*vagrantで2台の仮想環境を構築

*仮想環境のIPアドレスは、192.168.33.10(マスター)、192.168.33.11(スレーブ)

*仮想環境のCentOSのバージョンは6.7、MySQLのバージョンは5.7.12

*マスター側にDB「test_db」を作成し、DB内にテーブル「zaiko」を作成

*テーブル「zaiko」のカラム情報、レコードの内容は以下の通り

◆カラム情報

mysql>  SHOW COLUMNS FROM zaiko;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| maker       | text         | YES  |     | NULL    |                |
| type        | text         | YES  |     | NULL    |                |
| serial      | varchar(100) | YES  |     | NULL    |                |
| purpose     | varchar(20)  | YES  |     | NULL    |                |
| input_date  | date         | YES  |     | NULL    |                |
| output_date | date         | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)


◆レコードの内容

mysql> select * from zaiko;
+----+--------+-------+--------+----------+------------+-------------+
| id | maker  | type  | serial | purpose  | input_date | output_date |
+----+--------+-------+--------+----------+------------+-------------+
|  1 | maker1 | type1 | 001    | purpose1 | 2016-05-01 | 2017-05-01  |
|  2 | maker2 | type2 | 002    | purpose2 | 2016-05-02 | 2017-05-02  |
|  3 | maker3 | type3 | 003    | purpose3 | 2016-05-03 | 2017-05-03  |
+----+--------+-------+--------+----------+------------+-------------+
3 rows in set (0.00 sec)

【マスタ】/etc/my.cnf変更

下記を追加します。

# レプリケーション用設定
server_id=1
log_bin=mysql_bin
binlog_format=MIXED
max_binlog_size=100M
expire_logs_days=30
sync_binlog=1
innodb_support_xa=1
innodb_flush_log_at_trx_commit=1
項目 説明
server_id MySQLサーバを識別するためのID
log_bin バイナリ ログ を採取するか否か。
ここにログファイル名を指定することで、有効となる
binlog_format バイナリロギング形式の指定
STATEMENT:実行されたSQLに基づいてロギング
ROW:行ベースに基づきロギング
MIXED:基本はSTATEMENTだが特定の条件では行ベースでロギング
max_binlog_size バイナリログの最大サイズ
expire_logs_days バイナリログの保管期間
sync_binlog バイナリログをN回のステートメントまたはまたはトランザクションごとにフラッシュする設定
1が最も安全で、かつ最も遅い設定
innodb_support_xa XA トランザクションの 2 相コミットで InnoDB のサポートを有効にする
innodb_flush_log_at_trx_commit トランザクションのCOMMIT時に、InnoDBログファイルへデータがディスクへ同期されるかどうかを指定。
指定できる値は0,1,2でデフォルトは1。
1の場合COMMITごとにログファイルへの書き込みとディスクへの同期が行われる。
0の場合はCOMMIT時には何も行われず1秒ごとにログファイルへの書き込みとディスクへの同期が行われる。
2の場合COMMITと同時にログファイルへの書き込みが行われるがディスクとの同期は1秒ごと。

max_binlog_sizeとexpire_logs_daysはデフォルト値でも問題ないかと思います。
sync_binlog=1,innodb_support_xa=1,innodb_flush_log_at_trx_commit=1のとき、バイナリログとInnoDBログファイルは完全に同期されます。

【マスタ】文法チェック(念のため)

# mysqld --verbose --help > /dev/null

【マスタ】mysql再起動

# service mysqld restart
Stopping mysqld:                                           [  OK  ]
Starting mysqld:                                           [  OK  ]

【マスタ】レプリケーション用のユーザ作成

mysql> GRANT REPLICATION SLAVE ON *.*
    -> TO 'repluser'@'192.168.33.11' IDENTIFIED BY 'Repl-Pass0';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql>
mysql> SELECT user, host FROM mysql.user;
+-----------+---------------+
| user      | host          |
+-----------+---------------+
| repluser  | 192.168.33.11 |
| mysql.sys | localhost     |
| root      | localhost     |
| testuser  | localhost     |
+-----------+---------------+
4 rows in set (0.00 sec)

mysql>

ちなみに、GRANTを利用してユーザを作ることは近々出来なくなるらしいです。。。。

mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
  Level: Warning
   Code: 1287
Message: Using GRANT for creating new user is deprecated and will be removed in future release. Create new user with CREATE USER statement.
1 row in set (0.00 sec)

【マスタ】データベースのダンプ

# mysqldump -uroot -p --all-databases --master-data=2 --single-transaction --flush-logs > /tmp/dumpfile.sql
Enter password:(パスワードを入力)
# ls -l /tmp/dumpfile.sql
-rw-r--r-- 1 root root 766735 May 24 02:23 /tmp/dumpfile.sql
項目 説明
--all-databases すべてのデータベースをバックアップ
--master-data=2 CHANGE MASTER TOコマンドをダンプの先頭に付加。
--master-data=2:CHANGE MASTER TOがコメントアウト
--maser-data=1:CHANGE MASTER TOが
コメントアウトされずにダンプ
--single-transaction ダンプする際に先頭にBEGINをつける
(ダンプ時のデータのトランザクションの一貫性を保つことができる)。
--flush-logs ダンプを開始する前に、MySQL サーバ内のログファイルをフラッシュ

【スレーブ】my.cnf変更

下記を追加します。

server_id=1000
report_host=slave1000
sync_binlog=0
innodb_flush_log_at_trx_commit=0
項目 説明
report_host レプリケーションの状態をマスターサーバなどでも確認しやすくなる

【スレーブ】文法チェック(念のため)

# mysqld --verbose --help > /dev/null

【スレーブ】mysql再起動

# service mysqld restart
Stopping mysqld:                                           [  OK  ]
Starting mysqld:                                           [  OK  ]

【スレーブ】ダンプファイルをマスターからコピー

SCPかなんかで。。。

【スレーブ】ダンプファイルをリストア

# mysql -u root -p < /tmp/dumpfile.sql
Enter password:(パスワードを入力)

【スレーブ】バイナリログファイル名と開始位置を確認

# head -100 /tmp/dumpfile.sql | grep CHANGE
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql_bin.000008', MASTER_LOG_POS=154;

MASTER_LOG_FILEがバイナリログファイル名、MASTER_LOG_POGがログのポジションとなります。

【スレーブ】レプリケーションの設定

mysql> CHANGE MASTER TO
    ->  MASTER_HOST='192.168.33.10',
    ->  MASTER_USER='repluser',
    ->  MASTER_PASSWORD='Repl-Pass0',
    ->  MASTER_PORT=3306,
    ->  MASTER_LOG_FILE='mysql_bin.000002',
    ->  MASTER_LOG_POS=154,
    ->  MASTER_CONNECT_RETRY=10;
項目 説明
MASTER_HOST マスタのホスト名、もしくはIPアドレス
MASTER_USER マスタで作成したレプリケーション用ユーザ
MASTER_PASSWORD マスタで作成したレプリケーション用ユーザのパスワード
MASTER_PORT マスタのポート番号
(デフォルト値を設定しているだけなので特に設定しなくてもいいかも?)
MASTER_LOG_FILE バイナリログファイル名(*)
MASTER_LOG_POS バイナリログのポジション(*)
MASTER_CONNECT_RETRY マスタへの再接続を行う間隔(秒)

*先ほど確認したバイナリログファイル名とポジションを指定します。

【スレーブ】mysqld再起動

# service mysqld restart
Stopping mysqld:                                           [  OK  ]
Starting mysqld:                                           [  OK  ]

【スレーブ】レプリケーションの開始

mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)

【スレーブ】レプリケーションの状態確認

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.33.10
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 10
              Master_Log_File: mysql_bin.000008
          Read_Master_Log_Pos: 154
               Relay_Log_File: localhost-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql_bin.000008
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 154
              Relay_Log_Space: 531
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
                  Master_UUID: 901b3801-207a-11e6-a220-0800272020f4
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)

「Slave_IO_Running」と「Slave_SQL_Running」がYesになっていれば正常です。

ちなみにエラーが起きている場合は以下のような状態になります。

*************************** 1. row ***************************
               Slave_IO_State: Connecting to master
                  Master_Host: 192.168.33.10
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 10
              Master_Log_File: mysql_bin.000002
          Read_Master_Log_Pos: 154
               Relay_Log_File: localhost-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql_bin.000002
             Slave_IO_Running: Connecting
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 154
              Relay_Log_Space: 154
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 1045
                Last_IO_Error: error connecting to master 'repluser@192.168.33.10:3306' - retry-time: 10  retries: 54
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 0
                  Master_UUID:
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp: 160525 01:57:50
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)

上記はマスタ側のアカウント設定を誤ってマスタに接続できない状態なのですが、「Slave_IO_Running」が 「Connecting」となっており、「Last_IO_Error」にエラーメッセージが出力されています。

動作確認

実際にレプリケーションが動いているかどうかをzaikoテーブルにレコードを追加して確認してみます。

(1)レコード追加前の状態

【マスタ】

mysql> select * from zaiko;
+----+--------+-------+--------+----------+------------+-------------+
| id | maker  | type  | serial | purpose  | input_date | output_date |
+----+--------+-------+--------+----------+------------+-------------+
|  1 | maker1 | type1 | 001    | purpose1 | 2016-05-01 | 2017-05-01  |
|  2 | maker2 | type2 | 002    | purpose2 | 2016-05-02 | 2017-05-02  |
|  3 | maker3 | type3 | 003    | purpose3 | 2016-05-03 | 2017-05-03  |
+----+--------+-------+--------+----------+------------+-------------+
3 rows in set (0.00 sec)

【スレーブ】

mysql> select * from zaiko;
+----+--------+-------+--------+----------+------------+-------------+
| id | maker  | type  | serial | purpose  | input_date | output_date |
+----+--------+-------+--------+----------+------------+-------------+
|  1 | maker1 | type1 | 001    | purpose1 | 2016-05-01 | 2017-05-01  |
|  2 | maker2 | type2 | 002    | purpose2 | 2016-05-02 | 2017-05-02  |
|  3 | maker3 | type3 | 003    | purpose3 | 2016-05-03 | 2017-05-03  |
+----+--------+-------+--------+----------+------------+-------------+
3 rows in set (0.00 sec)

(2)マスタ側にレコード追加

mysql> insert into zaiko(maker,type,serial,purpose,input_date,output_date) values('maker4','type4','004','purpose4','2016-05-04','2017-05-04');
Query OK, 1 row affected (0.00 sec)

mysql> select * from zaiko;
+----+--------+-------+--------+----------+------------+-------------+
| id | maker  | type  | serial | purpose  | input_date | output_date |
+----+--------+-------+--------+----------+------------+-------------+
|  1 | maker1 | type1 | 001    | purpose1 | 2016-05-01 | 2017-05-01  |
|  2 | maker2 | type2 | 002    | purpose2 | 2016-05-02 | 2017-05-02  |
|  3 | maker3 | type3 | 003    | purpose3 | 2016-05-03 | 2017-05-03  |
|  4 | maker4 | type4 | 004    | purpose4 | 2016-05-04 | 2017-05-04  |
+----+--------+-------+--------+----------+------------+-------------+
4 rows in set (0.00 sec)

(3)スレーブを確認

mysql> select * from zaiko;
+----+--------+-------+--------+----------+------------+-------------+
| id | maker  | type  | serial | purpose  | input_date | output_date |
+----+--------+-------+--------+----------+------------+-------------+
|  1 | maker1 | type1 | 001    | purpose1 | 2016-05-01 | 2017-05-01  |
|  2 | maker2 | type2 | 002    | purpose2 | 2016-05-02 | 2017-05-02  |
|  3 | maker3 | type3 | 003    | purpose3 | 2016-05-03 | 2017-05-03  |
|  4 | maker4 | type4 | 004    | purpose4 | 2016-05-04 | 2017-05-04  |
+----+--------+-------+--------+----------+------------+-------------+
4 rows in set (0.00 sec)

データの同期が取れているので、正常に動作しているようです。

Vagrant1.8.1のゲストOS(CentOS6.7)にMysql5.7をインストール

Mysqlの本家サイトからRPMをダウンロード

# wget http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm

RPMインストール

# rpm -ivh mysql57-community-release-el6-7.noarch.rpm

mysqlインストール

# yum install mysql-community-server

サービス自動起動の設定

# chkconfig mysqld on
# chkconfig --list | grep mysql
mysqld          0:off   1:off   2:on    3:on    4:on    5:on    6:off

サービス起動

# service mysqld start
Initializing MySQL database:                               [  OK  ]
Installing validate password plugin:                       [  OK  ]
Starting mysqld:

RHEL6(CentOS6)でcron復旧

以前にこんな出来事がありました。

同僚「あの~、サーバのcron設定が全部消えちゃったみたいなんですけど。。。。」

私「ん?ちょっと見てみますね(そんなことないだろうな。たぶん何か勘違いなんだろう。。。」

実際にサーバにログインして「# crontab -l」コマンド叩いてみると、




ほんとに設定が消えてる!!ヽ(゚Д゚;)ノ!!




私「な、なんかコマンド実行しました?^^;」

同僚「crontabのオプションで-rオプション付けて実行しました。」




工工工エエエエエエェェェェェェ(゚Д゚)ェェェェェェエエエエエエ工工工



とそんなときにやったことを残しておきます。

復旧方法

/var/log/cronには以下のようにcronの実行内容が出力されています。

May 15 06:00:01 host1 CROND[702]: (root) CMD (/usr/bin/php /hoge/silent_push.php 60 >/dev/null 2>&1)
May 15 06:00:01 host1 CROND[703]: (root) CMD (perl /hoge/process_check.pl >> /tmp/process_check.log 2>&1 &)
May 15 06:00:01 host1 CROND[701]: (root) CMD (/usr/lib64/sa/sa1 1 1)
May 15 06:00:01 host1 CROND[710]: (root) CMD (/bin/bash -l service nagios restart > /tmp/nagios_restart.log 2>&1)
May 15 06:00:01 host1 CROND[706]: (root) CMD (/usr/bin/php /hoge/android99_push.php >/dev/null 2>&1)
May 15 06:01:01 host1 CROND[1902]: (root) CMD (run-parts /etc/cron.hourly)
May 15 06:01:01 host1 run-parts(/etc/cron.hourly)[1902]: starting 0anacron
May 15 06:01:01 host1 run-parts(/etc/cron.hourly)[1911]: finished 0anacron
May 15 06:05:01 host1 CROND[13744]: (root) CMD (perl /hoge/process_check.pl >> /tmp/process_check.log 2>&1 &)
May 15 06:10:01 host1 CROND[25976]: (root) CMD (/usr/lib64/sa/sa1 1 1)
May 15 06:10:01 host1 CROND[25977]: (root) CMD (perl /hoge/process_check.pl >> /tmp/process_check.log 2>&1 &)
May 15 06:15:01 host1 CROND[5788]: (root) CMD (perl /hoge/process_check.pl >> /tmp/process_check.log 2>&1 &)
May 15 06:20:01 host1 CROND[18551]: (root) CMD (perl /hoge/process_check.pl >> /tmp/process_check.log 2>&1 &)
May 15 06:20:01 host1 CROND[18550]: (root) CMD (/usr/lib64/sa/sa1 1 1)
May 15 06:25:01 host1 CROND[30763]: (root) CMD (perl /hoge/process_check.pl >> /tmp/process_check.log 2>&1 &)
May 15 06:30:01 host1 CROND[10669]: (root) CMD (perl /hoge/process_check.pl >> /tmp/process_check.log 2>&1 &)
May 15 06:30:01 host1 CROND[10671]: (root) CMD (/usr/lib64/sa/sa1 1 1)

この情報をもとに実行間隔と実行コマンドを見たうえでcronに書いて復旧させました(地味^^;)。
これってもっと簡単に復旧できる方法ってあるんですかね??

再発防止策

以後はcronを更新する際は専用のファイルを更新し、それをcrontabコマンドで読み込む運用にしました。

# touch /hogehoge/crontab.bak
# vi /hogehoge/crontab.bak
# rrdファイル作成
38 * * * * perl /hoge/rrdfile_create.pl >/dev/null 2>&1

# rrdファイル更新
31 * * * * sh /hoge/rrdupdate.sh > /dev/null 2>&1

# 速度データ更新
8 * * * * sh /hoge/check_speed.sh >> /tmp/check_speed.log 2>&1

# 速度データをDBに登録
10 2 * * * sh /hoge/create_speed_data.sh >/dev/null 2>&1
# crontab /hogehoge/crontab.bak

これであればcronが消えても復旧はできるかなと。
このファイルを無視してcron直しちゃうとデグレードしちゃいますけどね^^;

もっと賢いやり方があるのかなぁ~?

Vagrant + Chefでの環境構築自動化

Vagrantで仮想環境の構築を行うタイミングで、環境構築も一緒に出来るようにします。
今回の例ではnginxをインストール&起動するようにしています。

環境

◆ホストOS(RHEL6.7)
◆ゲストOS(CentOS6.7)
◆Chef: 12.9.38 ※既にVagrantに追加している「centos67」というBOXを利用します

検証用のディレクトリ作成

今回は「/root/chef-test」ディレクトリを作成しています。

# cd
# mkdir chef-test

この中にVagrantfileやchefの各ファイルを格納することとします。

Gemfile作成

# cd /root/chef-test
# vi Gemfile
source 'https://rubygems.org'

gem 'chef'
gem 'knife-solo'
gem 'berkshelf'

Gemのインストール

# cd /root/chef-test
# bundle install
Don't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your
bundle as root will break this application for all non-root users on this machine.
Fetching gem metadata from https://rubygems.org/.........
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Resolving dependencies.....
Using addressable 2.4.0
Using multipart-post 2.0.0
Using httpclient 2.7.2
Using buff-extensions 1.0.0
Installing hashie 3.4.4
Using buff-ignore 1.1.1
Using buff-ruby_engine 0.1.0
Installing hitimes 1.2.4 with native extensions
Using nio4r 1.2.1
Using fuzzyurl 0.8.0
Using mixlib-config 2.2.1
Using mixlib-shellout 2.2.6
Using erubis 2.7.0
Using json 1.8.3
Using mixlib-log 1.6.0
Using rspec-support 3.4.1
Using diff-lcs 1.2.5
Using retryable 2.0.3
Using semverse 1.2.1
Using cleanroom 1.0.0
Using minitar 0.5.4
Installing molinillo 0.4.5
Using thor 0.19.1
Using builder 3.2.2
Using bundler 1.11.2
Using libyajl2 1.2.0
Using rack 1.6.4
Using uuidtools 2.1.5
Using highline 1.7.8
Installing mixlib-cli 1.6.0
Using net-ssh 2.9.4
Using ffi 1.9.10
Using ipaddress 0.8.3
Using plist 3.2.0
Using systemu 2.6.5
Using wmi-lite 1.0.0
Using proxifier 1.0.3
Installing multi_json 1.12.0
Using net-telnet 0.1.1
Using sfl 2.2
Using syslog-logger 1.6.8
Using faraday 0.9.2
Using varia_model 0.4.1
Using buff-shell_out 0.2.0
Using timers 4.0.4
Installing chef-config 12.9.41
Using rspec-core 3.4.4
Using rspec-expectations 3.4.0
Using rspec-mocks 3.4.1
Using solve 2.0.3
Using ffi-yajl 2.2.3
Using net-sftp 2.1.2
Using net-ssh-gateway 1.2.0
Using net-scp 1.2.1
Using sawyer 0.7.0
Using buff-config 1.0.1
Using celluloid 0.16.0
Using rspec_junit_formatter 0.2.3
Using rspec-its 1.2.0
Using mixlib-authentication 1.4.0
Using rspec 3.4.0
Installing chef-zero 4.6.2
Installing ohai 8.15.1
Using net-ssh-multi 1.2.1
Installing specinfra 2.57.2
Using octokit 4.3.0
Using celluloid-io 0.16.2
Installing serverspec 2.34.0
Using ridley 4.5.0
Installing chef 12.9.41
Using berkshelf-api-client 2.0.2
Using knife-solo 0.5.1
Using berkshelf 4.3.2
Bundle complete! 3 Gemfile dependencies, 73 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.
# ls -l
合計 12
-rw-r--r-- 1 root root   76  5月  6 13:33 2016 Gemfile
-rw-r--r-- 1 root root 5219  5月  6 13:37 2016 Gemfile.lock

vagrant 初期化(Vagrantfileの作成)

# cd /root/chef-test
# vagrant init centos67
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
[root@124x39x29x22 chef-test]# ls -l
合計 16
-rw-r--r-- 1 root root   76  5月  6 13:33 2016 Gemfile
-rw-r--r-- 1 root root 5219  5月  6 13:37 2016 Gemfile.lock
-rw-r--r-- 1 root root 3020  5月  6 13:45 2016 Vagrantfile

nginx用のクックブック作成

# cd /root/chef-test
# bundle exec knife cookbook create nginx -o ./site-cookbooks
** Creating cookbook nginx in /root/chef-test/site-cookbooks
** Creating README for cookbook: nginx
** Creating CHANGELOG for cookbook: nginx
** Creating metadata for cookbook: nginx
# ls -l
合計 24
-rw-r--r-- 1 root root   84  5月  6 14:22 2016 Berksfile
-rw-r--r-- 1 root root   76  5月  6 13:33 2016 Gemfile
-rw-r--r-- 1 root root 5219  5月  6 13:37 2016 Gemfile.lock
-rw-r--r-- 1 root root 3079  5月  6 13:58 2016 Vagrantfile
drwxr-xr-x 4 root root 4096  5月  6 14:29 2016 site-cookbooks
# cd site-cookbooks/
# ls -l
合計 8
drwxr-xr-x 10 root root 4096  5月  6 14:29 2016 nginx

nginx用のレシピ作成

# vi /root/chef-test/site-cookbooks/nginx/recipes/default.rb
#
# Cookbook Name:: nginx
# Recipe:: default
#
# Copyright 2016, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#

include_recipe "yum-epel"

package "nginx" do
    action :install
end

service "nginx" do
    action [ :enable, :start]
    supports :status => true, :restart => true, :reload => true
end

コンフィグの内容は以下の通りです。
(1)「yum-epel」より「nginx」をインストール
(2)「nginx」を自動起動
(3)「nginx」を起動
(4)「nginx」のサービスに関して「status」「restart」「reload」を有効とする

クックブックの依存関係の定義(Berksfileの編集)

# vi /root/chef-test/Berksfile
site :opscode

cookbook "yum-epel"
cookbook "nginx", path: "./site-cookbooks/nginx"

yum-epel」は「cookbooks」ディレクトリ内のレシピを使い、nginxは「site-cookbooks」ディレクトリ内のレシピを使用します。

クックブックのダウンロード

# cd /root/chef-test
# berks vendor ./cookbooks
DEPRECATED: Your Berksfile contains a site location pointing to the Opscode Community Site (site :opscode). Site locations have been replaced by the source location. Change this to: 'source "https://supermarket.chef.io"' to remove this warning. For more information visit https://github.com/berkshelf/berkshelf/wiki/deprecated-locations
Resolving cookbook dependencies...
Fetching 'nginx' from source at site-cookbooks/nginx
Fetching cookbook index from https://supermarket.chef.io...
Using yum-epel (0.7.0)
Using yum (3.10.0)
Using nginx (0.1.0) from source at site-cookbooks/nginx
Vendoring nginx (0.1.0) to ./cookbooks/nginx
Vendoring yum (3.10.0) to ./cookbooks/yum
Vendoring yum-epel (0.7.0) to ./cookbooks/yum-epel
# ls -l
合計 32
-rw-r--r-- 1 root root   84  5月  6 14:22 2016 Berksfile
-rw------- 1 root root  139  5月  6 14:31 2016 Berksfile.lock
-rw-r--r-- 1 root root   76  5月  6 13:33 2016 Gemfile
-rw-r--r-- 1 root root 5219  5月  6 13:37 2016 Gemfile.lock
-rw-r--r-- 1 root root 3079  5月  6 13:58 2016 Vagrantfile
drwxr-xr-x 5 root root 4096  5月  6 14:31 2016 cookbooks
drwxr-xr-x 4 root root 4096  5月  6 14:29 2016 site-cookbooks
# cd cookbooks/
# ls -l
合計 12
drwxr-xr-x 10 root root 4096  5月  6 14:31 2016 nginx
drwxr-xr-x  8 root root 4096  5月  6 14:31 2016 yum
drwxr-xr-x  4 root root 4096  5月  6 14:31 2016 yum-epel

「cookbooks」ディレクトリ内にクックブックがコピーされます。

vagrant-omnibusプラグインのインストール

Vagrantを起動するときにChef Client/Chef Soloがインストールされていなければ自動でインストールさせるため、プラグインをインストールします。

# cd /root/chef-test
# vagrant plugin install vagrant-omnibus
Installing the 'vagrant-omnibus' plugin. This can take a few minutes...
Installed the plugin 'vagrant-omnibus (1.4.1)'!

Vagrantfile修正

# vi /root/chef-test/Vagrantfile
Vagrant.configure(2) do |config|
   ・
   ・
  # カスタマイズ用
  # IPアドレスの設定
  config.vm.network "private_network", ip: "192.168.33.13"

  # ポートフォワードの設定
  config.vm.network "forwarded_port", guest: 80, host: 8888

  # vagrant-omnibusの有効化
  config.omnibus.chef_version = :latest

  # プロビジョニング
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"]
    chef.run_list = %w[
      recipe[yum-epel]
      recipe[nginx]
    ]
  end
end

赤字の箇所を追記します。

vagrant起動

# cd /root/chef-test
# vagrant up --provision

ブラウザで確認

f:id:saosao_0706:20160509174243p:plain
正常に構築が完了していれば上記のような画面が表示されます。

VagrantでマルチVM

vegrantで複数VMを立ち上げてお互いに通信させる方法をメモしておきます。

環境(前提条件)

◆以下の手順に沿って単体のVMは構築済みです。今回はこちらで構築したCentOS6.7のVM(ゲストOS)を複数立ち上げます。
saosao-0706.hatenablog.com
◆Vagrantfileの格納されているディレクトリ(ホストOS)の場所は「/root/vagrant/centos67」です。

Vagrantfile変更

# vi /root/vagrant/centos67/Vagrantfile
              ・
              ・
  config.vm.define :node1 do |node1|
    node1.vm.network "private_network", ip: "192.168.33.10"
  end

  config.vm.define :node2 do |node2|
    node2.vm.network "private_network", ip: "192.168.33.11"
  end

上記の4行を追加してnode単位に内部ネットワーク用のIPアドレスを付与するようにします。

一旦構築したVMを削除

# cd /root/vagrant/centos67/
# vagrant destroy

VM(ゲストOS)の起動

# cd /root/vagrant/centos67/
# vagrant up
Bringing machine 'node1' up with 'virtualbox' provider...
Bringing machine 'node2' up with 'virtualbox' provider...
==> node1: Importing base box 'centos67'...
==> node1: Matching MAC address for NAT networking...
==> node1: Setting the name of the VM: centos67_node1_1462177540423_22245
==> node1: Fixed port collision for 22 => 2222. Now on port 2202.
==> node1: Clearing any previously set network interfaces...
==> node1: Preparing network interfaces based on configuration...
    node1: Adapter 1: nat
    node1: Adapter 2: hostonly
==> node1: Forwarding ports...
    node1: 22 (guest) => 2202 (host) (adapter 1)
==> node1: Booting VM...
==> node1: Waiting for machine to boot. This may take a few minutes...
    node1: SSH address: 127.0.0.1:2202
    node1: SSH username: vagrant
    node1: SSH auth method: private key
    node1: Warning: Remote connection disconnect. Retrying...
    node1:
    node1: Vagrant insecure key detected. Vagrant will automatically replace
    node1: this with a newly generated keypair for better security.
    node1:
    node1: Inserting generated public key within guest...
    node1: Removing insecure key from the guest if it's present...
    node1: Key inserted! Disconnecting and reconnecting using new SSH key...
==> node1: Machine booted and ready!
==> node1: Checking for guest additions in VM...
    node1: The guest additions on this VM do not match the installed version of
    node1: VirtualBox! In most cases this is fine, but in rare cases it can
    node1: prevent things such as shared folders from working properly. If you see
    node1: shared folder errors, please make sure the guest additions within the
    node1: virtual machine match the version of VirtualBox you have installed on
    node1: your host and reload your VM.
    node1:
    node1: Guest Additions Version: 4.3.30
    node1: VirtualBox Version: 5.0
==> node1: Configuring and enabling network interfaces...
==> node1: Mounting shared folders...
    node1: /vagrant => /root/vagrant/centos67
==> node2: Importing base box 'centos67'...
==> node2: Matching MAC address for NAT networking...
==> node2: Setting the name of the VM: centos67_node2_1462177592736_21927
==> node2: Fixed port collision for 22 => 2222. Now on port 2203.
==> node2: Clearing any previously set network interfaces...
==> node2: Preparing network interfaces based on configuration...
    node2: Adapter 1: nat
    node2: Adapter 2: hostonly
==> node2: Forwarding ports...
    node2: 22 (guest) => 2203 (host) (adapter 1)
==> node2: Booting VM...
==> node2: Waiting for machine to boot. This may take a few minutes...
    node2: SSH address: 127.0.0.1:2203
    node2: SSH username: vagrant
    node2: SSH auth method: private key
    node2: Warning: Remote connection disconnect. Retrying...
    node2:
    node2: Vagrant insecure key detected. Vagrant will automatically replace
    node2: this with a newly generated keypair for better security.
    node2:
    node2: Inserting generated public key within guest...
    node2: Removing insecure key from the guest if it's present...
    node2: Key inserted! Disconnecting and reconnecting using new SSH key...
==> node2: Machine booted and ready!
==> node2: Checking for guest additions in VM...
    node2: The guest additions on this VM do not match the installed version of
    node2: VirtualBox! In most cases this is fine, but in rare cases it can
    node2: prevent things such as shared folders from working properly. If you see
    node2: shared folder errors, please make sure the guest additions within the
    node2: virtual machine match the version of VirtualBox you have installed on
    node2: your host and reload your VM.
    node2:
    node2: Guest Additions Version: 4.3.30
    node2: VirtualBox Version: 5.0
==> node2: Configuring and enabling network interfaces...
==> node2: Mounting shared folders...
    node2: /vagrant => /root/vagrant/centos67

2つのVMが起動しています。

ホストOSからPINGを打ってみる

# ping 192.168.33.10
PING 192.168.33.10 (192.168.33.10) 56(84) bytes of data.
64 bytes from 192.168.33.10: icmp_seq=1 ttl=64 time=8.46 ms
64 bytes from 192.168.33.10: icmp_seq=2 ttl=64 time=0.184 ms
64 bytes from 192.168.33.10: icmp_seq=3 ttl=64 time=0.158 ms
64 bytes from 192.168.33.10: icmp_seq=4 ttl=64 time=0.298 ms
^C
--- 192.168.33.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3312ms
rtt min/avg/max/mdev = 0.158/2.277/8.469/3.575 ms


# ping 192.168.33.11
PING 192.168.33.11 (192.168.33.11) 56(84) bytes of data.
64 bytes from 192.168.33.11: icmp_seq=1 ttl=64 time=0.673 ms
64 bytes from 192.168.33.11: icmp_seq=2 ttl=64 time=0.197 ms
64 bytes from 192.168.33.11: icmp_seq=3 ttl=64 time=0.235 ms
64 bytes from 192.168.33.11: icmp_seq=4 ttl=64 time=0.231 ms
^C
--- 192.168.33.11 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3981ms
rtt min/avg/max/mdev = 0.197/0.334/0.673/0.196 ms

問題なさそうです。

SSHの設定

ホストOSからゲストOSにSSHログインする際にオプションを付けずにログインできるようにしておきます。

# cd /root/vagrant/centos67/
# vagrant ssh-config --host 192.168.33.10 node1 >> ~/.ssh/config
# vagrant ssh-config --host 192.168.33.11 node2 >> ~/.ssh/config
# cat ~/.ssh/config
Host 192.168.33.10
  HostName 127.0.0.1
  User vagrant
  Port 2202
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile "/root/vagrant/centos67/.vagrant/machines/node1/virtualbox/private_key"
  IdentitiesOnly yes
  LogLevel FATAL

Host 192.168.33.11
  HostName 127.0.0.1
  User vagrant
  Port 2203
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile "/root/vagrant/centos67/.vagrant/machines/node2/virtualbox/private_key"
  IdentitiesOnly yes
  LogLevel FATAL

ちょっと分かりずらいのですが、

# vagrant ssh --host [IPアドレス] [ノード名] 

で各ノードのSSH情報をHostをIPアドレス名に変換した形で標準出力に出力し、
その出力結果をrootユーザの「.ssh/config」に書き込んでいます。

SSHログイン確認

# ssh 192.168.33.10
Last login: Mon May  2 09:50:35 2016 from 10.0.2.2
[vagrant@localhost ~]$ exit
logout
Connection to 127.0.0.1 closed.
# ssh 192.168.33.11
Last login: Mon May  2 09:50:39 2016 from 10.0.2.2

問題なくSSHログインできます。

ゲストOS同士のPING確認

# ssh 192.168.33.10
Last login: Mon May  2 09:53:02 2016 from 10.0.2.2
[vagrant@localhost ~]$ ping 192.168.33.11      ※node1⇒node2へのPING
PING 192.168.33.11 (192.168.33.11) 56(84) bytes of data.
64 bytes from 192.168.33.11: icmp_seq=1 ttl=64 time=0.411 ms
64 bytes from 192.168.33.11: icmp_seq=2 ttl=64 time=0.331 ms
64 bytes from 192.168.33.11: icmp_seq=3 ttl=64 time=0.371 ms
64 bytes from 192.168.33.11: icmp_seq=4 ttl=64 time=0.421 ms
e64 bytes from 192.168.33.11: icmp_seq=5 ttl=64 time=0.378 ms
^C
--- 192.168.33.11 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4458ms
rtt min/avg/max/mdev = 0.331/0.382/0.421/0.036 ms
[vagrant@localhost ~]$ exit
logout
Connection to 127.0.0.1 closed.
# ssh 192.168.33.11
Last login: Mon May  2 09:53:07 2016 from 10.0.2.2
[vagrant@localhost ~]$ ping 192.168.33.10      ※node2⇒node1へのPING
PING 192.168.33.10 (192.168.33.10) 56(84) bytes of data.
64 bytes from 192.168.33.10: icmp_seq=1 ttl=64 time=0.291 ms
64 bytes from 192.168.33.10: icmp_seq=2 ttl=64 time=0.316 ms
64 bytes from 192.168.33.10: icmp_seq=3 ttl=64 time=0.237 ms
64 bytes from 192.168.33.10: icmp_seq=4 ttl=64 time=0.313 ms
^C
--- 192.168.33.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3246ms
rtt min/avg/max/mdev = 0.237/0.289/0.316/0.033 ms

問題なさそうです。