Howto:在基于 debian 和 dracut 的 Linux 上使用 iBFT 从 ipxe/iscsi 目标启动¶
简介¶
本指南旨在简要记录我在使用 ipxe 从 iscsi 启动方面学到的知识。
撰写本文时,距离我在自己的系统上实现这些设置已经过去了一段时间,因此一些细节可能不正确或缺失,请务必自己查阅文档……我会尽量包含我能记得的参考链接。
我的设置目标是实现运行基于 dracut 或 debian 的发行版的无盘 hypervisor 节点的远程启动,具体要求是不需要在无盘节点上配置任何主机/节点特有的设置,如 IP 地址、路径、iscsi 发起程序或目标。
这使得可以建立一种基础设施:物理裸机节点可以添加到集群或基础设施中或从中移除,除了把节点 BIOS 设置为通过 pxe/ipxe 从网卡启动,并把启动网卡的 MAC 地址添加到你的 DHCP 服务器之外,不需要任何配置。iscsi 发起程序和目标的名称以及所有 IP 设置只在 iPXE 菜单中配置一次,之后借助 iBFT,它们会自动贯穿整个启动过程。
标准的 iscsi 启动过程需要对托管根文件系统的 iscsi 目标进行 4 次单独的登录。遵循本指南,所有这 4 次登录都将具有相同的 IP 和可预测的发起程序名称,从而简化 NAS/SAN 防火墙规则以及 istgt 风格发起程序组上不那么复杂的 ACL。
管理员可以完全远程控制物理节点,无需任何类似 IPMI 的远程 BIOS 访问,只需使用 wake-on-lan 魔术包、基于 iPXE MAC/主机名的启动菜单默认值,以及 iscsi ACL 和目标组,管理员就可以指示节点从任何可以通过 iscsi 暴露的块设备类型启动,并使用任何 shell 脚本和/或 iPXE 脚本根据各种条件设置不同的启动默认值,永远不需要亲自到访节点。
经过数百次重启,我可以说,当这些方法正常工作时,从远程管理员的角度来看是 100% 可预测的,这意味着每一次启动都成功了,除了硬件故障外,没有发生任何不可重现的启动错误或失败。
重要提示:¶
使用非 intel 品牌的网卡可能会打乱网卡接口顺序,尤其是在 debian 中。如果你有非 intel 品牌的网卡,并且需要启动 debian,除了 debian 部分外,你还必须阅读本指南末尾的重要提示。你还需要一个包含非 OSS 固件的 debian 安装程序,或者你需要在安装程序中包含你的网卡驱动程序,或者你需要在之后手动添加内核模块(参见参考 wiki 网址)。
第 1 步:¶
在 https://gist.github.com/robinsmidsrod/2234639 设置 robinsmidsrod 的 iPXE 脚本。如果遇到问题,请在 freenode 的 #ipxe 或此主题帖中提问。你需要定义变量和默认值,并准备用于添加节点默认值的 /boot 目录。别担心,那实际上是难的部分。设置 debian 和 dracut 是简单的部分 :)
基于 Debian Jessie 和 Wheezy 的发行版:¶
Jessie:¶
1. 安装标准的 debian 发行版,方式不限:bootstrap、通过 debian 安装程序安装到 iscsi 目标、安装到 iscsi 支持的 KVM 卷、安装到 raw 文件、安装到磁盘。只要你能通过 iscsi 导出生成的块设备就可以。
最简单的方法是在 KVM/qemu 虚拟机中启动 debian 网络安装程序,把可用的 iscsi LUN 目标直接挂载为 kvm 块存储。(你也可以在不配置本地虚拟机磁盘的情况下运行安装程序,唯一的区别是你需要在安装后手动登录 iscsi 目标,挂载它,chroot 进入它以激活 ibft 启动)
2. 安装完成后重启进入系统,以 root 身份执行:
apt-get install open-iscsi -y
echo "ISCSI_AUTO=true" > /etc/iscsi/iscsi.initramfs
nano /etc/initramfs-tools/initramfs.conf
向下滚动并设置 DEVICE=eth0
重要¶
A: 据我所知,此设置仅在系统中有多个网卡时才需要,但无论如何我都会设置它,因为否则以后添加更多网卡时系统将变得无法启动。
B: 如果你运行多个网卡并且/或者尤其是运行非 intel 品牌网卡,此设置至关重要,在这种情况下你必须阅读本指南末尾的重要提示。
3.
update-initramfs -u
完成,你的系统现在将使用静态或基于 DHCP 的 IP 设置从 iscsi 启动,这些设置只在服务器端的 iPXE 启动脚本中定义一次。(编辑:使用静态 IP 时可能不完全正确,但静态 IP 设置有点违背本指南的整体思路)
Wheezy:¶
过程与上面完全相同,只是需要修改 halt 和 reboot 脚本,以防止它们在等待 iscsi 发起程序断开连接时挂起——这当然是不可能的,因为根文件系统就在它想要断开的远程目标上。
这部分需要读者自己搜索,因为我记不清具体需要的修改,而且撰写本文时没有 wheezy 可以测试。我只记得有一个开关,可能是 -f(强制),需要添加到 /etc/init.d/reboot 中(jessie 中的命令是 'reboot -d -f -i'),并在 /etc/init.d/halt 中编辑 NETDOWN=yes 或 no,把它翻转一下,我记不清默认值是什么了。
Dracut:¶
1. 像 debian 一样,照常安装到任何块设备。
2. 安装后执行:
yum update && yum install -y iscsi-initiator-utils
echo "add_dracutmodules+="iscsi"" > /etc/dracut.conf.d/ibft.conf
nano /etc/default/grub
把以下 3 个条目添加到 GRUB_CMDLINE_LINUX="rd.iscsi.firmware=1 rd.iscsi.ibft=1 netroot=iscsi:ibft"
update-grub
dracut -v
完成。(我不确定在内核中有 OSS 网卡驱动程序的机器上是否需要 rd.iscsi.firmware=1,也不确定由于撰写本文时缺乏测试,该条目是否会在只有 intel 网卡的配置中引起问题)
备注:¶
注 1: 在 DHCP 服务器中把主机名分配给 MAC 地址将使 robinsmidsrod 的脚本在 iscsi 发起程序名称中使用主机名(例如 iqn.2007-09.jp.ne.peach.istgt:debian),这与 ibft 结合使用,进一步改善和美化(!)了基础设施,主机名和 MAC 是后端为每个添加到网络的新节点仅需配置一次的变量。如果没有 DHCP 分配的主机名,发起程序地址将使用 MAC 地址(iqn.2007-09.jp.ne.peach.istgt:XX:XX:XX:XX:XX:XX)。无论哪种方式,在 iPXE 菜单 /boot 目录中为每个节点设置 iPXE 默认值,使用多个带有适当默认条目的目录为所有节点维护多个默认启动配置文件,或者简单地保持默认值静态并编辑 menu.ipxe 中的 LUN,或者两者兼做并添加 CGI/Perl 脚本自动化并发布你的脚本…… '':iscsi-node-01''
echo Booting iscsi node 01 for ${initiator-iqn}
set base-iscsi iscsi:${iscsi-server}::::${base-iqn}
set root-path ${base-iscsi}:iscsi-LUN-01
sanboot ${root-path} || goto failed
goto start
注 2: 如果你想提高过程的容错能力,可以在 iPXE undionly.kpxe 或自定义 ROM 中添加一个循环,不断查询 DHCP 和/或 HTTP 服务器,如下所示:
#!ipxe
goto dhcp_retry
:dhcp_retry
sleep 3
dhcp && goto chain_retry || goto dhcp_retry
:chain_retry
sleep 3
chain http://[your http server]/boot.ipxe && goto exit || goto chain_retry
- 这是为了防止停电——当电力恢复时,DHCP/tftp/http 服务器可能还没有准备好。循环将允许节点等待,而不是因超时而无法启动。如果链式加载 undionly.ipxe,只有当你能控制网卡 ROM 和/或 BIOS 如何处理 DHCP 超时时,DHCP 循环才有效。唯一的缺点是即使所有服务器都已启动,它也会在脚本中造成几秒钟的延迟(去掉 sleep 命令在屏幕上看起来不美观,它会以最快的速度发送大量请求)。
目前,我为无法刷写的集成网卡链式加载 undionly.kpxe,并且我把 DHCP 循环替换为 'ifopen net0',以把整个启动过程的 DHCP 查询总数减少到 2 次(网卡 PXE ROM 的 DHCP 查询,以及 grub 之后、chroot 之前的另一次)。这是因为我无法控制 BIOS 在 DHCP 超时时的行为,所以没有 DHCP 我的节点将无法启动并需要物理接触。然而,如果 DHCP/tftp 服务器已启动而只有 HTTP 服务器没有,循环将等待 boot.ipxe 变得可用。如果你刷入包含上述循环的自定义 iPXE,它将使你能够配置一个无限期等待 DHCP 和 HTTP 服务器变得可用的节点,降低停电或类似情况后必须亲自到访节点的风险。在极端情况下,也可以在 menu.ipxe 中的 sanboot 命令中添加循环,不断轮询 iscsi 目标直到可用。
注 3: 从 tftp 链式加载 undionly.ipxe,并把基础设施中的所有客户端设置为无论本地硬盘如何都通过 pxe/ipxe 启动,然后为不应该通过网络启动的节点定义一个默认值以跳出 iPXE 菜单并继续本地 BIOS 启动,这样你也可以在需要时远程控制这些节点的启动过程。
注 4: 为了获得更高的冗余性,把 iscsi LUN 托管在 RBD 或 DRBD 镜像池上,并把 tftp/http/iscsi 服务器设置为高可用。
注 5: 如果你要启动 hypervisor 节点,请注意你不能桥接 ibft/iscsi 接口,这会断开与根卷的连接并灾难性地中止进程。
注 6: 需要帮助来使托管根卷的 iscsi 连接更稳健。目前,在 debian 或 dracut 中执行 iscsiadm -m node -u,操作系统会愉快地断开根卷并停机。在 dracut 中,ibft 接口被重命名为 ibft0,我想这是朝着正确方向迈出的一步,但还需要更多工作。
注 7: 如果你的网络接口名称因启动期间 udev 重命名而混乱(dmesg | grep renamed),则删除 /etc/udev/rules.d/ 中名为 70-* 的文件并重启。
注 8: debian 和 dracut 安装也可以从本地磁盘/KVM 托管的 virtio 设备启动,因为没有对 grub 根设备定义进行更改。
注 9: 在本文中我输入 'boot' 和 'iscsi' 的次数多得吓人。
参考资料:
http://linux.die.net/man/8/dracut
http://pve.proxmox.com/wiki/Proxmox_ISCSI_installation
https://wiki.debian.org/Firmware
重要提示¶
例如,把一块基于 broadcom 的网卡添加到带有一块集成 intel 网卡的节点上,可能会在 grub 内核启动时翻转网卡的顺序,使 broadcom 网卡成为 eth0 而 intel 网卡成为 eth1。你需要意识到这一点,因为在这种情况下你需要更改在启动时被授予 DHCP 配置主机名的 MAC 地址,还因为在这种情况下 iPXE 会先看到 intel MAC,但在 grub 阶段之后 Linux 内核会切换接口,因此在 grub 阶段_之后_登录 iscsi 目标的客户端的 MAC 和 IP 地址将会不同,这意味着 SAN 防火墙和/或 iscsi 目标 LUN 访问权限中每个节点需要 2 个条目。
在我的测试中,这只在使用非全 intel 网卡时影响 debian。幸运的是,你可以指示 initramfs 在网络启动时使用哪个接口,因此结合 DHCP 服务器上的 MAC 设置,可以缓解这个否则可能非常痛苦的问题。
请记住,在 /etc/initramfs-tools/initramfs.conf 中设置 DEVICE= 时,它是 grub 内核阶段_之后_使用的设备,这意味着如果你使用集成的 intel 网卡通过 PXE/IPXE 启动,该网卡在 initramfs.conf 中将是 eth1,而其他品牌的附加网卡将是 eth0。因此,在有多块网卡(其中一些是非 intel 的)的机器中设置 DEVICE=eth1,并结合在 DHCP 服务器上切换为主机名分配的 MAC 地址,将产生一个"干净"的启动过程,其中相同的 MAC 地址请求每个 DHCP 租约,使配置在整个基础设施中保持持久。任何与此的偏差都可能在某个地方引起一些问题。当然,最好的解决方案是只使用 intel 网卡。
———–^^^^^^^^^^^———–