iSCSI/ブート
関連記事
iSCSI ターゲットに Arch をインストールすることでディスクレスマシンを使って iSCSI ターゲットから起動することができます。(NIC が iBPT に対応していない、または TFTP サーバーをセットアップしたくないなどの理由で) iPXE ブート USB を必要としないかぎり物理ディスクは不要です。
目次
ターゲット構成
ホスティングサーバー OS で iSCSI ターゲットをセットアップできます。ホスティングサーバー OS として Arch Linux を使用する場合、iSCSI ターゲットに書かれている手順に従ってください。
イニシエータ構成
概要
- インストーラー環境に open-iscsi パッケージをインストール。
- iSCSI ターゲットに接続して論理ドライブにパーティションを作成。
- 通常通りに Arch Linux をインストール。
- インストールした環境に open-iscsi パッケージをインストール。
- open-iscsi モジュールを含んだ初期 RAM ディスクイメージを作成。
iSCSI でインストール
Arch Linux ISO イメージを ダウンロード して ISO イメージを使って Arch Linux を起動してください。
ISO インストールイメージには iSCSI に必要なモジュールは含まれていないため、先にインストール・セットアップする必要があります。
ディスクのパーティションを行う前に、公式リポジトリから open-iscsi パッケージをインストールしてターゲットに接続してください。
以下では例として、サーバー (ターゲット) の IP アドレスは 192.168.1.100、クライアント (イニシエータ) の IP アドレスは 192.168.1.101 とし、iSCSI イニシエータの名前は "iSCSI.Initiator.Name"、ターゲットの名前は "iSCSI.Target.Name" とします。ネットワーク構成にあわせて変更してください。
パッケージをインストールしてモジュールをロード:
pacman -Sy pacman -S open-iscsi modprobe iscsi_tcp
ターゲットのリストを表示 (ポータル IP やターゲットの名前によって出力は変わります):
# iscsiadm -m discovery -t st -p 192.168.1.100
192.168.1.100:3260,-1 iqn.2011-03.example.org.istgt:arch
ターゲットに接続:
# iscsiadm -m node -T iqn.2011-03.example.org.istgt:arch -p 192.168.1.100 -l
これでローカルホストはターゲットホストのドライブに接続されます (dmesg の出力を見てください)。
ローカルドライブと同じようにパーティションテーブルとパーティションを作成できます。それから Arch Linux のインストールを通常通りに行ってください。
新しくインストールしたルートファイルシステムに open-iscsi パッケージをインストールしてください。
ルートファイルシステムで mkinitcpio を実行する前に、以下のファイルを用意する必要があります:
/mnt/usr/lib/initcpio/install/iscsi
build () { local mod for mod in iscsi_ibft iscsi_tcp libiscsi libiscsi_tcp scsi_transport_iscsi crc32c; do add_module "$mod" done add_checked_modules "/drivers/net" add_binary "/usr/bin/iscsistart" add_runscript } help () { cat <<HELPEOF This hook allows you to boot from an iSCSI target. HELPEOF }
iBFT 互換 ROM を使う
iBFT に対応している NIC やブートデバイス (iPXE など) を使用している場合、自動設定を使ってネットワーク設定と iSCSI ターゲットを設定できます:
/mnt/usr/lib/initcpio/hooks/iscsi
run_hook () { modprobe iscsi_tcp modprobe iscsi_ibft echo "Network configuration based on iBFT" iscsistart -N || echo "Unable to configure network" echo "iSCSI auto connect based on iBFT" iscsistart -b || echo "Unable to auto connect" }
run_hook () { modprobe iscsi_tcp modprobe iscsi_ibft echo "Network configuration based on iBFT" iscsistart -N || echo "Unable to configure network" echo "Waiting 5 seconds..." sleep 5 echo "iSCSI auto connect based on iBFT" until iscsistart -b ; do sleep 3 done }
iSCSI ターゲットの手動設定
iBFT 対応のブート ROM を使っていない場合、ネットワークと iSCSI ターゲットを手動で明示的に設定する必要があります:
/mnt/usr/lib/initcpio/hooks/iscsi
run_hook () { modprobe iscsi_tcp ifconfig eth0 192.168.1.101 netmask 255.255.255.0 broadcast 192.168.1.255 sleep 2 iscsistart -i iSCSI.Initiator.Name -t iSCSI.Target.Name -g 1 -a 192.168.1.100 }
DHCP を使う
上記のスクリプトで DHCP を使いたい場合、以下のフックを使用することができます。ただし dhcpcd をインストールして /etc/mkinitcpio.conf の BINARY 行に追加する必要があります。
/mnt/usr/lib/initcpio/hooks/iscsi
run_hook () { modprobe iscsi_tcp mkdir -p /var/lib/dhcpcd dhcpcd eth0 sleep 2 iscsistart -i iSCSI.Initiator.Name -t iSCSI.Target.Name -g 1 -a 192.168.1.100 }
/etc/mkinitcpio.conf の HOOKS 行に "iscsi" を追加してください。
mkinitcpio -p linux
を実行すると新しい /boot/initramfs-linux.img
と /boot/initramfs-linux-fallback.img
が生成されます。
再起動後に iSCSI ターゲットドライブからファイルシステムをマウントできるようになります。
ディスクレスシステムの Open iSCSI イニシエータの設定
ディスクレスシステムのイニシエータはネットワークに問題が発生したりターゲットシステムを再起動しても大丈夫なように設定する必要があります。open-iscsi の README では iSCSI ルートに最適な iSCSI 設定が説明されています。
iSCSI ディスクでルートパーティションに直接アクセスする場合、iSCSI タイマーを設定して iSCSI レイヤーが複数回セッションの再確立を試行してコマンドがすぐに再度キューに入らないようにしてください。基本的には dm-multipath を使用する場合の逆をすれば良いでしょう。
この場合、以下の設定で iSCSI の ping をオフにできます:
node.conn[0].timeo.noop_out_interval = 0 node.conn[0].timeo.noop_out_timeout = 0
そして replacement_timer をとても大きな値に設定:
node.session.timeo.replacement_timeout = 86400
イニシエータによってネットワークの問題が検出されると、実行中のコマンドはすぐに失敗します。例外は SCSI レイヤーのエラーハンドラが動作している場合です。SCSI エラーハンドラが動作しているかどうかは以下のように iscsiadm を実行することで確認できます:
# iscsiadm -m session -P 3
以下のように表示されます:
Host Number: X State: Recovery
SCSI EH が動作している場合、node.session.timeo.replacement_timeout
の秒数が経過するまでコマンドは失敗しません。
SCSI EH を起動させるタイマーを修正するには、デバイスの sysfs ファイルに直接書き込みを行います (X は秒数に置き換えてください):
# echo X > /sys/block/sdX/device/timeout
もしくは udev ルールを使ってタイムアウトを修正する場合、/etc/udev/rules.d/50-iscsi.rules
を作成して以下の行を追加してください:
ACTION=="add", SUBSYSTEM=="scsi" , ATTR{type}=="0|7|14", \ RUN+="/bin/sh -c 'echo 90 > /sys$$DEVPATH/timeout'"
echo 90
は好きな値に変更してください。
udev を使用しない場合の通常のファイルシステムコマンドのデフォルトのタイムアウトは30秒です。
低水準の I/O コマンドはターゲットの IO スケジューラを通過します。パフォーマンスを向上させるため、ディスクレスシステムでは "none" つまりキューイングアルゴリズムを使用しないことを推奨します。詳細および設定方法はパフォーマンスの最大化#カーネルの I/O スケジューラを見てください。
トラブルシューティング
デバイスが認識されない
eth0 インターフェイスの検出に問題が発生する場合、/etc/mkinitcpio.conf の MODULES 行で NIC のカーネルモジュールを明示的にインストールしてください。