跳转至内容

iSCSI/启动

来自 ArchWiki
(重定向自 ISCSI Boot)

Arch Linux 可以安装在 iSCSI 目标上。这使得机器只需要包含足够容纳 引导加载程序 的海量存储,例如 U 盘,而其根分区则通过网络使用 iSCSI 访问。任何后续分区也可以使用 iSCSI 或其他网络存储协议(如 NFS)进行访问。当与 PXE、iBFT 或其他网络引导方法结合使用时,它允许机器不包含任何海量存储。

启动过程

在启动时挂载 iSCSI 目标的各种方法

  • 使用标准的 initramfs,该 initramfs 配置为初始化网络连接并挂载 iSCSI 目标,然后启动到它。其过程概述如下。
  • 某些固件(BIOSUEFI)和网络适配器可以在操作系统启动到 iSCSI 目标中包含的操作系统之前自行初始化网络连接并挂载 iSCSI 目标。这还需要在目标上安装引导加载程序。这在服务器和企业级硬件中很常见。请查阅您的硬件手册和制造商以了解如何实现这一点。
  • 使用自定义 PXE 固件,例如 iPXE,来挂载 iSCSI 目标并从中启动。

准备工作

目标设置

按照 iSCSI 中概述的步骤在远程机器上设置 iSCSI 目标。

安装前准备

使用来自 下载页面 的最新官方安装介质引导进入 Arch Linux 安装程序。按照 安装指南 进行,直到 分区

注意 在使用 iSCSI 的网络中,最好有一个 静态 IP 地址。这可以通过手动设置地址或使用网络 DHCP 服务器中的静态保留来实现。

iSCSI 启动器设置

如果需要,请在 iSCSI 配置中调整您的启动器名称。

/etc/iscsi/initiatorname.conf
InitiatorName=iqn.2011-03.example.org.istgt:arch

发现远程机器上可用的 iSCSI 目标,以确保它们对安装程序可见。调整门户 IP 地址以匹配您的环境。输出将取决于您的环境;确保它与您之前设置的目标匹配。

# iscsiadm -m discovery -t sendtargets -p PORTAL_IP_ADDRESS
192.168.1.100:3260,-1 iqn.2011-03.example.org.istgt:arch

登录到 iSCSI 目标。

# iscsiadm -m node -T TARGET_NAME -p PORTAL_IP_ADDRESS -l

iSCSI 块设备现在可用。验证 lsblk 的输出,以确保块设备可用。如果访问目标失败,内核日志消息可能包含有用的信息。

像往常一样继续在 iSCSI 目标上安装 Arch,直到您生成 initramfs 并安装引导加载程序。

系统设置

iSCSI 守护进程

在新系统中 安装 open-iscsi 包。

启动/启用 iscsid.service

注意 iSCSI 守护进程将检测并管理最初在 initramfs 中启动的 iSCSI 会话。

Fstab

安装过程会自动生成 /etc/fstab 以匹配新安装。确保正确添加了根文件系统。iSCSI 守护进程处理 iSCSI 内核层中的任何错误,因此将其保持运行状态至关重要,只要根文件系统 - 以及任何其他 iSCSI 文件系统 - 处于挂载状态。这可以通过将 x-systemd.requires=iscsid.service 追加到文件系统挂载选项来实现。例如

/etc/fstab
UUID=12345678-1234-1234-1234-123456789012 /     ext4   defaults,_netdev,x-systemd.requires=iscsid.service   0      1

initramfs

本指南概述了一种使用基于 busybox 的 init 的方法,而不是基于 systemd 的 init。对于基于 systemd 的 init,过程会有所不同。

自动连接到网络

initcpio 必须在打开与 iSCSI 目标的连接之前连接到网络。这可以通过多种方式实现,但一种简单的方法是使用带有 ip= 内核参数net-hook。此 hook 设计用于 NFS 根,但省略 NFS 特定参数可以只配置网络适配器。

在新系统中 安装 mkinitcpio-nfs-utils

net hook 插入 HOOKS 数组

/etc/mkinitcpio.conf
HOOKS=(base ... net block ...)

相应地将 ip= 参数追加到 内核参数。例如,使用 DHCP 配置 eth0 网络适配器

ip=dhcp
提示 一旦实际系统从 initramfs 启动,网络适配器将保留其地址。确保您的网络配置尊重此地址,或者使用相同的地址。

自动启动 iSCSI 会话

为了在 initramfs 中启动 iSCSI 会话,必须为其创建一个自定义 hook。hook 由一个构建 hook 和一个运行时 hook 组成,如 Mkinitcpio#HOOKS 中所述。

构建 hook 将把所需的 iSCSI 模块添加到 initramfs,以及 iscsistart 二进制文件。

/etc/initcpio/install/iscsi
build () {
        map add_module iscsi_tcp iscsi_ibft libiscsi libiscsi_tcp scsi_transport_iscsi crc32c
        add_checked_modules "/drivers/net"
        add_binary iscsistart
        add_runscript
}

help () {
cat <<HELPEOF
        This hook allows you to boot from an iSCSI target.
HELPEOF
}
警告 iscsistart 二进制文件专门用于从引导环境中启动 iSCSI 会话。它不应与 iscsiadmiscsid 一起使用!

运行时 hook 将使用给定的启动器名称、目标名称和门户启动 iSCSI 会话。根据您的环境填写值。

/etc/initcpio/hooks/iscsi
run_hook () {
        msg "Mounting iSCSI target"
        iscsistart -i INITIATOR_NAME -t TARGET_NAME -g 1 -a PORTAL_IP_ADDRESS -d 1
}

将新创建的 iscsi hook 追加到 HOOKS 数组中的 net hook 之后

/etc/mkinitcpio.conf
HOOKS=(... net iscsi block ...)

调整 root= 内核参数以匹配 iSCSI 目标。

提示 如果使用节点名称(/dev/sda/dev/sdb 等),使用 持久块设备名称 有助于防止与其他块设备发生不匹配。

生成 initramfs 映像 并完成安装指南。

技巧与提示

使用兼容 iBFT 的 ROM

iscsistart 可用于根据固件提供的 iBFT 配置值来配置网络和 iSCSI 目标。

修改 iBFT 的运行时 hook

/etc/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"
    until iscsistart -b ; do
        sleep 3
    done
}
注意 确保您使用的任何网络管理系统在关机过程中不会过早地关闭接口。

为 iscsistart 设置自定义配置值

由于 initramfs 中的 iscsistart 二进制文件不使用任何 iSCSI 守护进程,也不使用配置文件,因此它假定守护进程的所有配置设置都采用默认值。可以使用 -P 命令行参数设置单个设置

iscsistart ... -P 'node.conn[0].iscsi.MaxXmitDataSegmentLength=26144'

该参数可以多次提供以设置多个设置。所有可用设置及其默认值可以在 iscsid.conf 中找到。

使 iSCSI 守护进程对网络问题具有弹性

open-iscsi README 描述了在使用 iSCSI 目标作为根时的最佳 iSCSI 守护进程设置。应调整 iSCSI 超时,以便 iSCSI 内核层有几次机会尝试重新建立断开的会话,并且命令不会很快重新排队到 SCSI 层。这本质上与使用 dm-multipath 时相反。

关闭 iSCSI no-ops

/etc/iscsi/iscsid.conf
node.conn[0].timeo.noop_out_interval = 0
node.conn[0].timeo.noop_out_timeout = 0

将替换超时设置为一个较大的值

/etc/iscsi/iscsid.conf
node.session.timeo.replacement_timeout = 86400

如果 iSCSI 启动器检测到网络问题,正在运行的命令会立即失败。但是,SCSI 层中的 SCSI 错误处理程序会阻止命令失败,直到 iSCSI 守护进程配置的替换超时时间过去。iscsiadm 可用于查看 SCSI 错误处理程序是否正在运行

# iscsiadm -m session -P 3
************************
Attached SCSI devices:
************************
Host Number: 0  State: running
scsi0 Channel 00 Id 0 Lun: 0
        Attached scsi disk sda          State: running

要修改命令在 SCSI 错误处理程序运行之前的超时时间,请直接修改设备的超时值

# echo Y > /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 Y > /sys$$DEVPATH/timeout'"
注意 默认超时为 30 秒。

提升性能

由于低级 I/O 命令将通过远程系统上的 IO 调度程序,并在那里进行排队,因此可以通过对 iSCSI 设备使用排队算法的 none 设置来禁用启动器系统上的任何排队算法。有关详细信息和配置,请参阅 Improving performance#Input/output schedulers

故障排除

检测到连接错误 (1011)

这可能由于多种原因而发生

  • 启动器、目标或网络因 iSCSI no-ops 而过载,导致繁忙的连接被视为断开连接,在这种情况下,SCSI 错误处理程序会覆盖设备,这可能会破坏工作但繁忙的 iSCSI 会话。请参阅 #使 iSCSI 守护进程对网络问题具有弹性 以了解如何禁用 no-ops。
  • 网络适配器的 MTU 与网络的其余部分不匹配。
  • 在极少数情况下,当启用了 TCP 窗口缩放时。可以使用 net.ipv4.tcp_window_scaling 设置通过 sysctl 禁用它。

参见