iSCSI/启动

来自 ArchWiki
(重定向自 ISCSI Boot

Arch Linux 可以安装在 iSCSI 目标上。这允许机器仅包含足够的存储空间来容纳 启动引导程序,例如 USB 驱动器,而其根分区通过 iSCSI 网络访问。任何后续分区也可以通过 iSCSI 或其他网络存储协议(如 NFS)访问。当与 PXE、iBFT 或其他网络启动方法结合使用时,它允许机器不包含任何大容量存储设备。

启动过程

有多种方法可以在启动时挂载 iSCSI 目标

  • 使用标准的 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

HOOKS 数组中插入 net hook

/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
}

HOOKS 数组中,在 net hook 之后附加新创建的 iscsi 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 无操作

/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 设置队列算法来禁用发起端系统上的任何排队算法。有关详细信息和配置,请参阅 提高性能#输入/输出调度器

故障排除

检测到连接错误 (1011)

这可能是由多种原因引起的

  • 发起端、目标或网络被 iSCSI 无操作压垮,导致繁忙的连接被视为断开连接,在这种情况下,SCSI 错误处理程序会覆盖设备,这可能会破坏工作但繁忙的 iSCSI 会话。请参阅 #使 iSCSI 守护进程更能适应网络问题,了解如何禁用无操作。
  • 网络适配器的 MTU 与网络其余部分的 MTU 不匹配。
  • 在极少数情况下,当 TCP 窗口缩放启用时。可以使用 sysctlnet.ipv4.tcp_window_scaling 设置禁用它。

参见