CentOS5からCentOS6へ移行する際にサーバ構築でハマりそうな箇所のメモ

最近CentOS5系からCentOS6系にシステムを移行する機会がありましてその時サーバ構築でハマりそうになった箇所のメモです webサービスで利用するための最小限の構成なので用途によっては他のハマり所があると思うので悪しからず

  1. yum groupinstall のパッケージ内容の違い
  2. bashバージョンアップによるシェルスクリプト正規表現判別文法の違い
  3. resolv.confの"options single-request-reopen"対応
  4. sysctlのip_conntrackからnf_conntrackへの名称変更
  5. NetworkManargerのoff
  6. ユーザ毎のプロセス数制限デフォルトポリシーの変更

1. yum groupinstall のパッケージ内容の違い

CentOS5系とCentOS6系でyumにて取得するグループパッケージ用リポジトリの内容に大幅に変更があります。 特に"Development Libraries"にてサーバ構築に必要なパッケージをインストールしていた人はこのグループパッケージ自体が存在しなくなっているので注意です。

[解決方法]
yum groupinfo "グループパッケージ名" を実行してCentOS5でインストールされていた1つ1つのパッケージをCentOS6で1つずつ指定してインストールしてください (パッケージ名が変わっていたりそもそも存在しなくなっていたりするので注意)

2. bashバージョンアップによるシェルスクリプト正規表現判別文法の違い

以下のようなどこにでもあるIPアドレスのフォーマットを正規表現でチェックするシェルスクリプトをCentOS5系で使っていたとします

IPADDR="192.168.1.1"

if [[ "${IPADDR}" =~ "^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})" ]]; then
    echo "This is IP Address."
else
    echo "This is not IP Address."
fi

もちろんCentOS5系では

This is IP Address.

となりますが一方CentOS6では

This is not IP Address.

と正しく正規表現判別ができません?!

[解決方法]
こちらに詳細は説明されているのですがCentOS5系で一般的にインストールされているBash3.x系とCentOS6系で一般的にインストールされているBash4.x系で正規表現判別式のクウォートの扱いの仕様に混乱?があるようですので、素直に以下のように変数に入れましょう

IPADDR="192.168.1.1"

PATTERN="^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})"

if [[ "${IPADDR}" =~ ${PATTERN} ]]; then
    echo "This is IP Address."
else
    echo "This is not IP Address."
fi

(※ちなみに私が確認した環境はCentOS5->Bash3.2.25, CentOS6->Bash4.1.2 でした)

3. resolv.confの"options single-request-reopen"対応

こちらの通り/etc/resolv.confに"options single-request-reopen"を入れておかないと、名前解決時に問い合わせDNSサーバのFirewallによっては無駄なタイムアウト待ちが発生してしまうそうです

4.sysctlのip_conntrackからnf_conntrackへの名称変更

他にもあるかとは思いますが、よく使用するiptablesのバッファで使用するパラメータの名称が変更されたので旧名だとsysctl -p 等の反映時に「error: *** is an unknown key」となり登録されません

CentOS5系 /etc/sysctl.conf (の一部)

net.ipv4.netfilter.ip_conntrack_max                     = <任意の値>
net.ipv4.netfilter.ip_conntrack_tcp_loose               = <任意の値>
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait   = <任意の値>
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait    = <任意の値>
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = <任意の値>

CentOS6系 /etc/sysctl.conf (の一部)

net.nf_conntrack_max                               = <任意の値>
net.netfilter.nf_conntrack_tcp_loose               = <任意の値>
net.netfilter.nf_conntrack_tcp_timeout_time_wait   = <任意の値>
net.netfilter.nf_conntrack_tcp_timeout_fin_wait    = <任意の値>
net.netfilter.nf_conntrack_tcp_timeout_established = <任意の値>

5.NetworkManargerのoff

こちらの通り、使用するCentOS6のイメージによっては主にノートPCで無線やVPNのネットワーク切り替えを楽にするようなNetworkManagerというデーモンが動作していますが、意図しないネットワーク設定がされてしまうので使用しない場合は止めておきましょう。

vi /etc/sysconfig/network-scripts/ifcfg-<使用しているインタフェイス>
--------------------------
#NM_CONTROLLED="yes"
NM_CONTROLLED="no"
--------------------------

/sbin/service NetworkManager stop
/sbin/chkconfig NetworkManager off

/sbin/service network restart

6.「nproc」によるユーザプロセス数制限

こちらの通り、CentOS6からユーザ毎に実行できるプロセス数の制限がデフォルトで無制限でなくなり、上限のunlimited指定が無効になったようです。そのシステムの最大数を設定するにはなにも指定しないことで実現できるようです。

vi /etc/security/limits.d/90-nproc.conf
--------------------------
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

# root以外のユーザの扱えるプロセス数上限1024をコメントアウト
#*          soft    nproc     1024
--------------------------