ISCSI/ブート

提供: ArchWiki
2020年8月24日 (月) 11:23時点におけるBlackteahamburger (トーク | 投稿記録)による版 (Blackteahamburger がページ「ISCSI ブート」を「ISCSI/ブート」に移動しました: Sync title)
ナビゲーションに移動 検索に移動

関連記事

iSCSI ターゲットに Arch をインストールすることでディスクレスマシンを使って iSCSI ターゲットから起動することができます。(NIC が iBPT に対応していない、または TFTP サーバーをセットアップしたくないなどの理由で) iPXE ブート USB を必要としないかぎり物理ディスクは不要です。

ターゲット構成

ホスティングサーバー OS で iSCSI ターゲットをセットアップできます。ホスティングサーバー OS として Arch Linux を使用する場合、iSCSI ターゲットに書かれている手順に従ってください。

イニシエータ構成

概要

  1. インストーラー環境に open-iscsi パッケージをインストール。
  2. iSCSI ターゲットに接続して論理ドライブにパーティションを作成。
  3. 通常通りに Arch Linux をインストール。
  4. インストールした環境に open-iscsi パッケージをインストール。
  5. open-iscsi モジュールを含んだ初期 RAM ディスクイメージを作成。
ノート: 上記に加えて、リモートディスクからブートローダー (GRUB など) をロードするのに必要な SAN ブート可能なインフラを用意する必要があります。複数のネットワークインターフェイスカードが SAN ブートをサポートしています。そのようなカードを持っていない場合、iPXEgPXE などを使います。

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 の出力を見てください)。

ノート: パーティションを作成する際に iSCSI ドライブにスワップは作成しないことを推奨します。警告は無視してかまいません。

ローカルドライブと同じようにパーティションテーブルとパーティションを作成できます。それから 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"
}
ノート: (111) や (15 - Session Exists) のような自動接続のエラーのせいで起動できない場合は、以下を試してください。次のフックではネットワークが初期化されるのを待ち、成功するまで自動接続を試み続けます.
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 が生成されます。

ノート:
  • 別のモジュールを必要とする NIC カードが接続されたマシンでインストールした Arch を起動する場合は、HOOKS から "autodetect" を削除してください。
  • HOOKS から "autodetect" を削除すると初期 RAM ディスクの再生成に時間がかかるようになります。

再起動後に 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 のカーネルモジュールを明示的にインストールしてください。