网络引导 Fedora 现场CD

现场 CD 对许多任务都很有用,例如:

  • 将操作系统安装到硬盘驱动器
  • 修复引导加载程序或执行其他救援模式操作
  • 为网页浏览提供一致且最小的环境
  • …和 多得多.

作为使用 DVD 和 USB 驱动器存储 Live CD 映像的替代方法,您可以将它们上传到 iSCSI 他们不太可能丢失或损坏的服务器。 本指南向您展示如何将 Live CD 映像加载到 iSCSI 服务器并使用 iPXE 引导加载程序。

下载 Live CD 映像

$ MY_RLSE=27
$ MY_LIVE=$(wget -q -O - https://dl.fedoraproject.org/pub/archive/fedora/linux/releases/$MY_RLSE/Workstation/x86_64/iso | perl -ne '/(Fedora[^ ]*?-Live-[^ ]*?.iso)(?{print $^N})/;')
$ MY_NAME=fc$MY_RLSE
$ wget -O $MY_NAME.iso https://dl.fedoraproject.org/pub/archive/fedora/linux/releases/$MY_RLSE/Workstation/x86_64/iso/$MY_LIVE

以上命令下载 Fedora-Workstation-Live-x86_64-27-1.6.iso Fedora 实时图像并将其保存为 fc27.iso。 更改 MY_RLSE 的值以下载其他存档版本。 或者您可以浏览到 https://getfedora.org/ 下载最新的 Fedora 实时图像。 21 之前的版本使用不同的命名约定,并且必须 在这里手动下载. 如果您手动下载 Live CD 映像,请将 MY_NAME 变量设置为不带扩展名的文件的基本名称。 这样,以下部分中的命令将引用正确的文件。

转换 Live CD 映像

使用 livecd-iso-to-disk 工具将 ISO 文件转换为磁盘映像,并将 netroot 参数添加到嵌入式内核命令行:

$ sudo dnf install -y livecd-tools
$ MY_SIZE=$(du -ms $MY_NAME.iso | cut -f 1)
$ dd if=/dev/zero of=$MY_NAME.img bs=1MiB count=0 seek=$(($MY_SIZE+512))
$ MY_SRVR=server-01.example.edu
$ MY_RVRS=$(echo $MY_SRVR | tr '.' "n" | tac | tr "n" '.' | cut -b -${#MY_SRVR})
$ MY_LOOP=$(sudo losetup --show --nooverlap --find $MY_NAME.img)
$ sudo livecd-iso-to-disk --format --extra-kernel-args netroot=iscsi:$MY_SRVR:::1:iqn.$MY_RVRS:$MY_NAME $MY_NAME.iso $MY_LOOP
$ sudo losetup -d $MY_LOOP

将实时图像上传到您的服务器

在您的 iSCSI 服务器上创建一个目录来存储您的实时图像,然后将修改后的图像上传到它。

对于版本 21 及更高版本:

$ MY_FLDR=/images 
$ scp $MY_NAME.img $MY_SRVR:$MY_FLDR/

对于 21 之前的版本:

$ MY_FLDR=/images 
$ MY_LOOP=$(sudo losetup --show --nooverlap --find --partscan $MY_NAME.img)
$ sudo tune2fs -O ^has_journal ${MY_LOOP}p1
$ sudo e2fsck ${MY_LOOP}p1
$ sudo dd status=none if=${MY_LOOP}p1 | ssh $MY_SRVR "dd of=$MY_FLDR/$MY_NAME.img"
$ sudo losetup -d $MY_LOOP

定义 iSCSI 目标

在 iSCSI 服务器上运行以下命令:

$ sudo -i 
# MY_NAME=fc27
# MY_FLDR=/images
# MY_SRVR=`hostname`
# MY_RVRS=$(echo $MY_SRVR | tr '.' "n" | tac | tr "n" '.' | cut -b -${#MY_SRVR})
# cat << END > /etc/tgt/conf.d/$MY_NAME.conf
<target iqn.$MY_RVRS:$MY_NAME>
backing-store $MY_FLDR/$MY_NAME.img
readonly 1
allow-in-use yes
</target>
END
# tgt-admin --update ALL

创建可启动 USB 驱动器

iPXE 引导加载程序有一个 sanboot 命令可用于连接并启动 iSCSI 服务器上托管的实时映像。 它可以编译成许多不同的 格式. 效果最好的格式取决于您运行的硬件类型。 作为一个 example,以下说明显示如何 链负荷 iPXE 来自 系统Linux 在 USB 驱动器上。

首先,下载 iPXE 并以 lkrn 格式构建它。 这应该作为工作站上的普通用户完成:

$ sudo dnf install -y git 
$ git clone https://git.ipxe.org/ipxe.git $HOME/ipxe
$ sudo dnf groupinstall -y "C Development Tools and Libraries"
$ cd $HOME/ipxe/src
$ make clean
$ make bin/ipxe.lkrn
$ cp bin/ipxe.lkrn /tmp

接下来,准备一个带有 MSDOS 分区表和 FAT32 文件系统的 USB 驱动器。 以下命令假设您已经连接了要格式化的 U 盘。 注意不要格式化错误的驱动器!

$ sudo -i 
# dnf install -y parted util-linux dosfstools
# echo; find /dev/disk/by-id ! -regex '.*-part.*' -name 'usb-*' -exec readlink -f {} ; | xargs -i bash -c "parted -s {} unit MiB print | perl -0 -ne '/^Model: ([^(]*).*n.*?([0-9]*MiB)/i && print "Found: {} = $2 $1n"'"; echo; read -e -i "$(find /dev/disk/by-id ! -regex '.*-part.*' -name 'usb-*' -exec readlink -f {} ; -quit)" -p "Drive to format: " MY_USB
# umount $MY_USB?
# wipefs -a $MY_USB
# parted -s $MY_USB mklabel msdos mkpart primary fat32 1MiB 100% set 1 boot on
# mkfs -t vfat -F 32 ${MY_USB}1

最后,在 USB 驱动器上安装 syslinux 并将其配置为链式加载 iPXE:

# dnf install -y syslinux-nonlinux 
# syslinux -i ${MY_USB}1
# dd if=/usr/share/syslinux/mbr.bin of=${MY_USB}
# MY_MNT=$(mktemp -d)
# mount ${MY_USB}1 $MY_MNT
# MY_NAME=fc27
# MY_SRVR=server-01.example.edu
# MY_RVRS=$(echo $MY_SRVR | tr '.' "n" | tac | tr "n" '.' | cut -b -${#MY_SRVR})
# cat << END > $MY_MNT/syslinux.cfg
ui menu.c32
default $MY_NAME
timeout 100
menu title SYSLINUX
label $MY_NAME
menu label ${MY_NAME^^}
kernel ipxe.lkrn
append dhcp && sanboot iscsi:$MY_SRVR:::1:iqn.$MY_RVRS:$MY_NAME
END
# cp /usr/share/syslinux/menu.c32 $MY_MNT
# cp /usr/share/syslinux/libutil.c32 $MY_MNT
# cp /tmp/ipxe.lkrn $MY_MNT
# umount ${MY_USB}1

只需编辑 syslinux.cfg 文件并添加其他菜单条目,您就应该能够使用同一个 USB 驱动器来对其他 iSCSI 目标进行网络引导。

这只是加载 iPXE 的一种方法。 您可以直接在工作站上安装 syslinux。 另一种选择是将 iPXE 编译为 EFI 可执行文件并将其直接放在您的 ESP. 另一个是将 iPXE 编译为 PXE 加载程序并将其放置在 TFTP 服务器上以供 DHCP 引用。 最佳选择取决于您的环境。

最后的笔记

  • 如果您以 EFI 格式编译 iPXE,您可能需要将 –filename EFIBOOTgrubx64.efi 参数添加到 sanboot 命令。
  • 可以创建自定义实时图像。 参考 创建和使用 Live CD 了解更多信息。
  • 可以将 –overlay-size-mb 和 –home-size-mb 参数添加到 livecd-iso-to-disk 命令以创建具有持久存储的实时映像。 但是,如果您有多个并发用户,则需要设置 iSCSI 服务器来管理单独的每用户可写覆盖。 这类似于“如何构建 Netboot 服务器,第 4 部分”文章中显示的内容。
  • 实时映像在其内核命令行上支持persistenthome 选项(例如,persistenthome=LABEL=HOME)。 与 CHAP 身份验证的 iSCSI 目标一起使用,persistenthome 选项为集中式主目录提供了一个有趣的 NFS 替代方案。

摄影者 克里斯·耶茨不飞溅.