iSCSI/启动
Arch Linux 可以安装在 iSCSI 目标上。这允许机器仅包含足够的存储空间来容纳 启动引导程序,例如 USB 驱动器,而其根分区通过 iSCSI 网络访问。任何后续分区也可以通过 iSCSI 或其他网络存储协议(如 NFS)访问。当与 PXE、iBFT 或其他网络启动方法结合使用时,它允许机器不包含任何大容量存储设备。
启动过程
有多种方法可以在启动时挂载 iSCSI 目标
- 使用标准的 initramfs,配置为初始化网络连接并挂载 iSCSI 目标,最后从中启动。以下概述了此过程。
- 某些固件(BIOS 或 UEFI)和网络适配器可以在启动到 iSCSI 目标中包含的操作系统之前,自行初始化网络连接并挂载 iSCSI 目标。这还需要在目标中安装启动引导程序。这在服务器和企业级硬件中很常见。请查阅您的硬件手册和制造商,了解如何实现此目的。
- 使用自定义 PXE 固件,例如 iPXE,来挂载 iSCSI 目标并从中启动。
准备工作
目标端设置
按照 iSCSI 中概述的步骤在远程机器上设置 iSCSI 目标。
预安装
使用 下载页面 上的最新官方安装介质启动 Arch Linux 安装程序。按照安装指南直到分区。
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
。
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
自动启动 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 会话。它不应与 iscsiadm
或 iscsid
结合使用!运行时 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 目标。
生成 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'"
提高性能
由于低级 I/O 命令将通过远程系统上的 IO 调度器,并随后在那里排队,因此可以通过对 iSCSI 设备使用 none
设置队列算法来禁用发起端系统上的任何排队算法。有关详细信息和配置,请参阅 提高性能#输入/输出调度器。
故障排除
检测到连接错误 (1011)
这可能是由多种原因引起的
- 发起端、目标或网络被 iSCSI 无操作压垮,导致繁忙的连接被视为断开连接,在这种情况下,SCSI 错误处理程序会覆盖设备,这可能会破坏工作但繁忙的 iSCSI 会话。请参阅 #使 iSCSI 守护进程更能适应网络问题,了解如何禁用无操作。
- 网络适配器的 MTU 与网络其余部分的 MTU 不匹配。
- 在极少数情况下,当 TCP 窗口缩放启用时。可以使用 sysctl 和
net.ipv4.tcp_window_scaling
设置禁用它。