iSCSI boot

日付 2008.11.06
タイトル iSCSI boot
本文
http://www.microsoft.com/downloads/details.aspx?familyid=12cb3c1a-15d6-4585-b385-befd1319f825&displaylang=en
http://funmoco.seesaa.net/article/51419020.html
http://ja.wikipedia.org/wiki/DRBD
http://www.atmarkit.co.jp/flinux/special/drbd02/drbd02b.html
http://sourceforge.net/project/showfiles.php?group_id=108475
http://as-is.net/blog/archives/001191.html
http://lab.hde.co.jp/2008/05/centos-iscsi.html
http://www.hijiki.net/archives/000255.html
http://mitty.jp/pc/networkboot/
http://bird-memo.seesaa.net/article/36362388.html

#
# 全体の流れ
#
# storage serverをsoftware RAID LVMにて作成。
# iscsiのtargetを作成。(storage)
# boot用のtftp serverとdhcp serverを構築。(storage)
# wmware serverの領域を作成。target公開。
# vmware server(vm.local)をiscsi経由でインストール。
# iscsi boot用のkernelとinitrdの修正と配置。
# vmwareのインストール。
#

#
# tftpのインストール
#
yum install tftp-server tftp
chkconfig tftp on
/etc/init.d/xinetd reload


#
# dhcpのインストール
#
yum install dhcp
cp -pi /usr/share/doc/dhcp*/dhcpd.conf.sample /etc/dhcpd.conf

>>> vi /etc/dhcpd.conf
# http://www.linux.or.jp/JM/html/dhcp2/man5/dhcpd.conf.5.html
ddns-update-style interim;
ignore client-updates;

subnet 192.168.1.0 netmask 255.255.255.0 {
        filename "linux-install/pxelinux.0";
        next-server "192.168.1.248"; # これがないとbootできなかった。

# --- default gateway
        option routers                  192.168.1.1;
        option subnet-mask              255.255.255.0;

        option nis-domain               "systemix.local";
        option domain-name              "systemix.ne.jp";
        option domain-name-servers      192.168.1.3;

        option time-offset              -18000; # Eastern Standard Time
#       option ntp-servers              192.168.1.1;
#       option netbios-name-servers     192.168.1.1;
# --- Selects point-to-point node (default is hybrid). Don't change this unless
# -- you understand Netbios very well
#       option netbios-node-type 2;

        range dynamic-bootp 192.168.1.101 192.168.1.200;
        default-lease-time 21600;
        max-lease-time 43200;

        # we want the nameserver to appear at a fixed address        #host ns {
        #       next-server marvin.redhat.com;
        #       hardware ethernet 12:34:56:78:AB:CD;        #       fixed-address 207.175.42.254;        #}
}
<<<

chkconfig dhcpd on
/etc/init.d/dhcpd start


#
# install用boot imageの配置
#
mkdir -p -m 755 /tftpboot/linux-install/{centos5.2,pxelinux.cfg}
cd /tftpboot/linux-install

cp -pi /usr/lib/syslinux/pxelinux.0 ./

cd centos5.2
wget ftp://ftp.riken.jp/Linux/centos/5.2/os/i386/images/pxeboot/vmlinuz
wget ftp://ftp.riken.jp/Linux/centos/5.2/os/i386/images/pxeboot/initrd.img

cd ../pxelinux.cfg
>>> vi default
default centos5.2
prompt 1
timeout 15

label centos5.2
kernel centos5.2/vmlinuz
append load initrd=centos5.2/initrd.img noipv6 devfs=nomount
<<<


#
# iSCSI対応boot imageの作成
#

# initiatorが入っていない場合はinstall
>>> yum install iscsi-initiator-utils
=============================================================================
 Package                 Arch       Version          Repository        Size 
=============================================================================
Installing:
 iscsi-initiator-utils   i386       6.2.0.868-0.7.el5  base              550 k

Transaction Summary
=============================================================================
Install      1 Package(s)         
Update       0 Package(s)         
Remove       0 Package(s)         

Total download size: 550 k
Is this ok [y/N]: y
<<<

# 対象serverがPAE kernelのためインストール
>>> yum install kernel-PAE-2.6.18-92.el5.i686
Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size 
=============================================================================
Installing:
 kernel-PAE              i686       2.6.18-92.el5    base               14 M

Transaction Summary
=============================================================================
Install      1 Package(s)         
Update       0 Package(s)         
Remove       0 Package(s)         

Total download size: 14 M
Is this ok [y/N]: y
<<<

# インストールした先のkernelとinitrdをmountして持ってくる
# http://www.linux.or.jp/JM/html/GNU_cpio/man1/cpio.1.html
cp -pi <install dev mount> ./
cp -pi
mkdir -m 755 sysroot && cd sysroot
# typeの確認
gunzip -c ../initrd-2.6.18-92.el5PAE.img | file -
# 展開
gunzip -c ../initrd-2.6.18-92.el5PAE.img | cpio -ic


# 必要なコマンド
>>>
ip
 インターフェイス操作用
dhclient
 IPアドレス取得用
 実際にはdhclient-scriptで設定
iscsid
 NETLINKソケット経由でiSCSI制御用LKMと通信する。(嵌り所多いので以下にmemo)
  以下のディレクトリが必要
   /var/lock/iscsi /var/run /var/lib/iscsi/{ifaces,isns,nodes,send_targets,slp,static}
  nss関連のライブラリも必要かも(間接的に呼ばれてる)
  /etc/passwdが必要(rootエントリだけで良い)
  /etc/iscsi/{iscsid.conf,initiatorname.iscsi} も必要
iscsiadm
 iscsidとの通信用
<<<
# 依存ライブラリの判定
>>> ldd /sbin/ip /sbin/dhclient /sbin/iscsid /sbin/iscsiadm | sort | \
  perl -ne 'if (/^\s+/) { s/\s+\(.+\)//; print; }' | uniq

/lib/ld-linux.so.2
/lib/libc.so.6
/lib/libresolv.so.2

linux-gate.so.1(with in kernel)
<<<

# 依存カーネルモジュール
>>>
# network
e1000.ko
# iSCSI
sd_mod.ko
scsi_mod.ko
scsi_transport_iscsi.ko
libiscsi.ko
iscsi_tcp.ko
# LKM(FS用)
# とりあえずext3で使いたい場合は以下
jbd.ko
ext3.ko
<<<

echo '/sbin/ip
/sbin/dhclient
/sbin/iscsid
/sbin/iscsiadm
/lib/ld-linux.so.2
/lib/libc.so.6
/lib/libresolv.so.2
/lib/modules/2.6.18-92.el5PAE/kernel/drivers/net/e1000/e1000.ko
/lib/modules/2.6.18-92.el5PAE/kernel/drivers/scsi/sd_mod.ko
/lib/modules/2.6.18-92.el5PAE/kernel/drivers/scsi/scsi_mod.ko
/lib/modules/2.6.18-92.el5PAE/kernel/drivers/scsi/scsi_transport_iscsi.ko
/lib/modules/2.6.18-92.el5PAE/kernel/drivers/scsi/libiscsi.ko
/lib/modules/2.6.18-92.el5PAE/kernel/drivers/scsi/iscsi_tcp.ko' | cpio -pmd .

# NETLINKソケット経由でiSCSI制御用LKMと通信する。(嵌り所多いので以下にmemo)
# 以下のディレクトリが必要
# nss関連のライブラリも必要かも(間接的に呼ばれてる)
mkdir -p -m755 var/lock/iscsi var/run var/lib/iscsi/{ifaces,isns,nodes,send_targets,slp,static}

#  /etc/passwdが必要(rootエントリだけで良い)
echo 'root:x:0:0:root:/root:/bin/nash' > etc/passwd
#  /etc/iscsi/{iscsid.conf,initiatorname.iscsi} も必要
echo '/etc/iscsi/iscsid.conf
/etc/iscsi/initiatorname.iscsi' | cpio -pmd .

# initの修正
cp -pi init init.orig
>>> vi init
# デバイス名の固定 http://www.jp.redhat.com/support/faq/data/rhel/0009.html
<<<
>>> diff -u init.orig init
--- init.orig   2008-10-21 19:43:20.000000000 +0900
+++ init        2008-10-21 19:50:04.000000000 +0900
@@ -80,7 +80,7 @@
 echo Scanning and configuring dmraid supported devices
 resume LABEL=SWAP-sda2
 echo Creating root device.
-mkrootdev -t ext3 -o defaults,,ro sda3
+mkrootdev -t ext3 -o defaults,ro /dev/sda3
 echo Mounting root filesystem.
 mount /sysroot
 echo Setting up other filesystems.
<<<

find . > ../lst
>>> vi ../lst
# . と 先頭の ./を取り除く
<<<
cat ../lst | cpio --quiet -c -o | gzip -c > ../initrd-2.6.18-92.el5PAE.img
chcon root:object_r:tftpdir_t ../initrd-2.6.18-92.el5PAE.img
cp -pi ../initrd-2.6.18-92.el5PAE.img /tftpboot/vm-boot/

#
# iscsi boot用tftp領域作成
#
find /tftpboot/vm-boot/
/tftpboot/vm-boot/
/tftpboot/vm-boot/vmlinuz-2.6.18-92.el5PAE
/tftpboot/vm-boot/initrd-2.6.18-92.el5PAE.img.orig
/tftpboot/vm-boot/pxelinux.0
/tftpboot/vm-boot/initrd-2.6.18-92.el5PAE.img.bk
/tftpboot/vm-boot/initrd-2.6.18-92.el5PAE.img.bk081021
/tftpboot/vm-boot/pxelinux.cfg
/tftpboot/vm-boot/pxelinux.cfg/default
/tftpboot/vm-boot/initrd-2.6.18-92.el5PAE.img.bk081021-2
/tftpboot/vm-boot/initrd-2.6.18-92.el5PAE.img

>>> cat /tftpboot/vm-boot/pxelinux.cfg/default
default centos5.2
prompt 5
timeout 15

label centos5.2
#kernel centos5.2/vmlinuz
#kernel vmlinuz-2.6.18-92.el5PAE ro root=LABEL=/
kernel vmlinuz-2.6.18-92.el5PAE
#append load initrd=centos5.2/initrd.img noipv6 devfs=nomount text
append load initrd=initrd-2.6.18-92.el5PAE.img
<<<



[参考] ========================================================
■[unix][tips] PXEでiSCSI boot
iSCSI SAN bootはHBAが高い、使用できるハードウェアが限られる等あるのでPXE経由でiSCSI BOOT出来るように頑張ってみた。
InitiatorとしてはLinux-iSCSIはもうメンテされてないし、色々面倒なのでOpen-iSCSIを使用。なお、CentOS5にはiscsi-initiator-utilsとして入っている。

iSCSI Target設定
iSCSI TargetはiSCSI Enterprise Target等を使って適当にでっち上げる。

モジュールをビルド、インストールはCentOS5等だと特に問題なく可能。
最終的には専用のストレージ使うにしろテストにはこれで十分。

設定は以下の様に /etc/ietd.conf に追記。
最低限の設定はIQNとブロックデバイスの割り当てを記述するだけ。

ブロックデバイスの代わりにファイルも使えたりもする。

Target iqn.sample.target0
	Lun 0 Path=/dev/sdaXX
Target iqn.sample.target1
	Lun 0 Path=/dev/sdaYY

で以下の通り起動、至ってシンプル。

 # /etc/init.d/iscsi-target start

これでTargetは準備完了。



確認は以下の様な感じで可能。

loginした時点で/dev/sdXのブロックデバイスとして見えるはず。

 # iscsid
 # iscsiadm -m discovery -t sendtargets -p <target ip>
 # iscsiadm -m node -T <target iqn> -p <target ip> --login

この領域にOSを入れる必要があるが、CentOS5はiSCSI領域に直接標準のインストーラからインストール可能。面倒な場合は
他のホストでmountしてrestoreしたりそのままddするのも良い。

iSCSI Initiator設定
こっちがメイン。
方針としてパッケージの再コンパイル等は行わずにディストリビューション(この場合CentOS)で配布されているバイナリだけを使用する。(sharedバイナリのまま使用)
システムは作ったら終わりというわけでは無いので、メンテナンスに掛かるコストは少なければ少ないほど良いし。

ということで起動用initrdの準備。昔はext2だったが最近はcpioで固めた物がgzipされている。
全部最初から作るよりは、既に入っているinitrdを展開して追加、変更した後再packするのが楽。要はmkinitrdのやっていることを代わりにやるだけ。

また、手の込んだことをやる場合はbusybox等を使っている人も居るようだが、最近はそこまで領域の節約をする必要が無いのと、上記理由でupdateに追従し易くするため、必要なライブラリ、バイナリを直接コピーして使うことにした。

必要なライブラリは使いたいバイナリをlddして特定。(LKMはlsmod等)巨大なlibc.soが間違いなくinitrdに入ることになるが気にしない。

最低限必要なバイナリは以下(ライブラリは適宜必要な物を追加)。
debugしたい場合はstraceやらbashなども入れておくと便利。

ip
 インターフェイス操作用
dhclient
 IPアドレス取得用
 実際にはdhclient-scriptで設定
iscsid
 NETLINKソケット経由でiSCSI制御用LKMと通信する。(嵌り所多いので以下にmemo)
  以下のディレクトリが必要
   /var/lock/iscsi /var/run /var/lib/iscsi/{ifaces,isns,nodes,send_targets,slp,static}
  nss関連のライブラリも必要かも(間接的に呼ばれてる)
  /etc/passwdが必要(rootエントリだけで良い)
  /etc/iscsi/{iscsid.conf,initiatorname.iscsi} も必要
iscsiadm
 iscsidとの通信用
LKM(Ether用)
 e1000.ko,e100.ko 等々使ってるEther次第(ここではe1000を使用)
LKM(iSCSI用)
 依存関係によってinsmodに転けるのでロードする順番に注意
  sd_mod.ko
  scsi_mod.ko
  scsi_transport_iscsi.ko
  libiscsi.ko
  iscsi_tcp.ko
LKM(FS用)
 とりあえずext3で使いたい場合は以下
  jbd.ko
  ext3.ko

initrd内部のinitは以下のような感じ。モジュールをロードし始める所より下を以下のスクリプトに置き換える。(echo "Loading xxxxx module"のあたり)
直接IPを記述するようにしているが、dhcpのオプションで色々なパラメータは渡せるので適当に使わなそうな物を使ってIQNやTargetのIPを渡すと、複数のホストで共通のinitrdが使用できる。

 ##Network初期化
 insmod /lib/e1000.ko
 ip -o link set dev eth0 up
 dhclient -lf /var/run/dhcpc.lease -pf /var/run/dhcpc.pid
 ##iSCSI+FS初期化
 insmod /lib/jbd.ko
 insmod /lib/ext3.ko
 insmod /lib/scsi_mod.ko
 insmod /lib/sd_mod.ko
 insmod /lib/scsi_transport_iscsi.ko
 insmod /lib/libiscsi.ko
 insmod /lib/iscsi_tcp.ko
 iscsid
 iscsiadm -m discovery -t sendtargets -p <target ip>
 iscsiadm -m node -T <target iqn> -p <target ip> --login
 ##Rootマウント
 stabilized --hash --interval 250 /proc/scsi/scsi
 mkblkdevs
 mkrootdev -t ext3 -o defaults,ro /dev/sda1
 mount /sysroot
 setuproot
 switchroot

/dev/sdaに見えてる通り以降はローカルディスクから起動したのと何ら変わりなく使用可能。
ブロックサイズの性質上大きめのパケットが流れるので、Jumbo Frameが使える場合は有効にしておくとppsが格段に下がって良い感じになる。

DHCPとPXEの設定については色々な所で見かけるので割愛。
なおNFSROOTでのPXE BOOTも同様の方法で可能。iSCSIの代わりにNFSモジュールをロードしてmount.nfsでそのままmountするだけ。
カーネル組み込みのNFSROOTはあまりメンテされていないようでよく問題が起きてるし、updateのコスト考えるとこっちの方が楽な感じ。