2014年8月31日日曜日

SoftLayerに冗長化NFSサーバを(その4)

前回宿題としていた、オンプレでも使える ssh 接続可能な Rescue モードを紹介します。他のクラウドでもどれかしら使えるのではないかと思います。
インストールメディアから起動できる場合はそれを利用してもよいですが、ssh 接続できるように設定が完了するまではコンソールが必須となり、おもしろくありません。
SoftLayer 上での操作手順となっていますが、インストーラへ http でアクセスできる等の条件さえ整えればよいです。
URL 等は適宜置き換えてください。

CentOS6 がインストールされている状態からの手順です。grub が使える状態になっていればどのような OS が入っていても問題ないと思います。設定ファイル名が /boot/grub/grub.conf ではないかもしれないので読み替えてください。CentOS7 で採用されている grub2 には未対応です。まだ試していませんが、PXE ブート対応にするのも難しくないはずです。

インストーラを起動するためのモジュールをインストールします。


sudo wget -O /boot/vmlinuz http://mirrors.service.networklayer.com/centos/6.5/os/x86_64/isolinux/vmlinuz
sudo wget -O /boot/initrd.img http://mirrors.service.networklayer.com/centos/6.5/os/x86_64/isolinux/initrd.img


grub の設定ファイルに、rescue モードでの起動に必要なオプションを追加します。


NIC0=eth0
ifconfig bond0 > /dev/null 2>&1 && NIC0=bond0
cat << EOF | sudo tee -a /boot/grub/grub.conf
title Rescue
^root (hd0,0)
^kernel /vmlinuz rescue repo=http://mirrors.service.networklayer.com/centos/6.5/os/x86_64/ lang=en_US keymap=jp106 selinux=0 sshd=1 nomount ksdevice=eth0 ip=$(ifconfig $NIC0 | grep inet | awk '{print $2}' | awk -F: '{print $2}') netmask=255.255.255.192 gateway=$(if route -n | grep -q '^10\.0\.0\.0'; then route -n | grep '^10\.0\.0\.0'; else route -n | grep '^0\.0\.0\.0'; fi | awk '{print $2}') dns=$(grep ^nameserver /etc/resolv.conf | head -1 | awk '{print $2}')
^initrd /initrd.img
EOF
sudo sed -i -e 's/^^/\t/g' /boot/grub/grub.conf


※2014/9/1 追記
上の2つの設定は、GitHub に置いてあるプロビジョニングスクリプトに追加済み。
プロビジョニングスクリプトの詳細は、「SoftLayer の CentOS 6.5 を CentOS 7 にアップグレードしてみた (http://dba-ha.blogspot.jp/2014/08/softlayer-centos-65-centos-7.html)」 を参照してください。

dhcp がある環境であれば、以下でもよいです。


cat << EOF | sudo tee -a /boot/grub/grub.conf
title Rescue
^root (hd0,0)
^kernel /vmlinuz rescue repo=http://mirrors.service.networklayer.com/centos/6.5/os/x86_64/ lang=en_US keymap=jp106 selinux=0 sshd=1 nomount ksdevice=eth0 ip=dhcp
^initrd /initrd.img
EOF
sudo sed -i -e 's/^^/\t/g' /boot/grub/grub.conf


/boot/grub/grub.conf の 「default=」を書き換え、先ほど追加した Rescue を指定してください。次のサーバ起動時にどのオプションで起動するかを、何個目の title 行にあたるかで指定します。1つ目を0から数えます。書き換えたら再起動してください。


sudoedit /boot/grub/grub.conf

sudo reboot


ssh でログインします。ホスト鍵が変更されている警告が出たら無視して接続してください。root、パスワードなしでログインできます。

ログインしたら、sshd をすぐに停止しておきます。パスワードなしでログインできるので危険です。


kill -KILL $(ps -ef | grep [s]shd | grep anaconda | awk '{print $2}')


ボンディング環境については、以下のように実行することで対応可能です。SoftLayer の例 (mode=802.3ad) となっています。


modprobe bonding
#echo +bond0 > /sys/class/net/bonding_masters
ifconfig bond0 down
echo 4 > /sys/class/net/bond0/bonding/mode
echo 100 > /sys/class/net/bond0/bonding/miimon
echo fast > /sys/class/net/bond0/bonding/lacp_rate
echo 1 > /sys/class/net/bond0/bonding/xmit_hash_policy
ifconfig eth0 down; \
ifconfig eth2 down; \
ifconfig bond0 10.110.88.60 netmask 255.255.255.192 up mtu 9000; \
echo +eth0 > /sys/class/net/bond0/bonding/slaves; \
echo +eth2 > /sys/class/net/bond0/bonding/slaves; \
route add -net 0.0.0.0/0 gw 10.110.88.1


※2014/9/2追記 ジャンボフレーム対応追加。
上記にて「mtu 9000」を追加しました。
NICを冗長化していない物理マシンの場合は、
ifconfig eth0 mtu 9000
を実行してください。
動作確認として、NFS サーバに対し以下のように ping を実行してみてください。
ping -c 1 -M do -s 8972 <NFSサーバのIPアドレス> || echo Error
Error と表示されなければ問題ありません。

次のサーバ起動時にどのオプションで起動するか書き換えた部分を元に戻しておきます。


mkdir /mnt/sysimage
DEV=xvda
[ -e /proc/xen ] || DEV=sda
mount /dev/${DEV}2 /mnt/sysimage/
mount /dev/${DEV}1 /mnt/sysimage/boot

vi /mnt/sysimage/boot/grub/grub.conf


後は、NFS をマウントして、バックアップを取得するなり、リストアするなりできます。
Rescue モードの / はメモリ上に構築されているので、ストレージをどのようにでも変更可能です。


コンソールがあり、最初から ssh による接続を許可したくない場合は、「sshd=1」というオプションを削除します。


コンソールがあり、起動後にネットワーク設定をシェルで完全に制御したい場合は、以下のような設定のやり方もあります。上記の設定では install.img を起動時に内部処理でダウンロードしていましたが、先にダウンロードしておき、ネットワーク設定なしで起動できます。


sudo mkdir /boot/images
sudo wget -O /boot/images/install.img http://mirrors.service.networklayer.com/centos/6.5/os/x86_64/images/install.img
BOOT_DEV=/dev/xvda1
[ -e /proc/xen ] || BOOT_DEV=/dev/sda1
cat << EOF | sudo tee -a /boot/grub/grub.conf
title Rescue-NoNetwork
^root (hd0,0)
^kernel /vmlinuz rescue repo=hd:UUID=$(sudo tune2fs -l $BOOT_DEV | grep UUID | awk '{print $3}'):/ lang=en_US keymap=jp106 selinux=0 nomount
^initrd /initrd.img
EOF
sudo sed -i -e 's/^^/\t/g' /boot/grub/grub.conf


こちらのオプションで起動した際は、ネットワーク設定をどうするか聞かれるので、適宜応答してください。

ちなみに、 repo= でローカルメディアを指定した場合、IPアドレス指定が無視されるようです。dhcp も機能しません。何とかならないか試行錯誤しましたが、何ともなりませんでした。「sshd=1」 指定は無視されなかったので、指定している場合は IP アドレスを設定した時点で ssh 接続が可能となります。sshd をシェルから起動してもよいです。

0 件のコメント:

コメントを投稿