iSCSI/启动
Arch Linux 可以安装在 iSCSI 目标上。这允许机器仅包含足够的存储空间来容纳引导加载程序,例如 USB 驱动器,同时其根分区通过 iSCSI 在网络上访问。任何后续分区也可以通过 iSCSI 或其他网络存储协议(如 NFS)访问。当与 PXE、iBFT 或其他网络启动方法结合使用时,它允许机器不包含任何存储设备。
启动过程
在启动时挂载 iSCSI 目标有多种方法
- 使用配置为初始化网络连接并挂载 iSCSI 目标的标准 initramfs,最后从中启动。以下概述了此过程。
- 某些固件(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。
将 net
hook 插入到 HOOKS
数组中
/etc/mkinitcpio.conf
HOOKS=(base ... net block ...)
相应地将 ip=
参数附加到内核参数。例如,要使用 DHCP 配置 eth0
网络适配器
ip=dhcp
自动启动 iSCSI 会话
为了在 initramfs 中启动 iSCSI 会话,必须为其创建一个自定义 hook。如 Mkinitcpio#HOOKS 中所述,该 hook 由构建 hook 和运行时 hook 组成。
构建 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 }
将新创建的 iscsi
hook 附加到 HOOKS
数组中的 net
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 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'"
提高性能
由于低级 I/O 命令将通过远程系统上的 IO 调度器,并在那里排队,因此可以通过为 iSCSI 设备的排队算法使用 none
设置来禁用发起端系统上的任何排队算法。有关详细信息和配置,请参阅 Improving performance#Input/output schedulers。
故障排除
检测到连接错误 (1011)
这可能是由多种原因引起的
- 发起端、目标或网络因 iSCSI no-ops 而不堪重负,导致繁忙的连接被视为断开连接,在这种情况下,SCSI 错误处理程序会覆盖设备,这可能会破坏工作但繁忙的 iSCSI 会话。有关如何禁用 no-ops,请参阅 #Make the iSCSI daemon resilient to network problems。
- 网络适配器的 MTU 与网络其余部分的 MTU 不匹配。
- 在极少数情况下,当启用 TCP 窗口缩放时。可以使用 sysctl 和
net.ipv4.tcp_window_scaling
设置禁用它。