无盘系统
出自 维基百科:无盘节点
- 无盘节点(或无盘工作站)是不带磁盘驱动器的工作站或个人电脑,它使用网络启动从服务器加载其操作系统。
服务器配置
首先,我们必须安装以下组件
- 一个 DHCP 服务器,用于为无盘节点分配 IP 地址。
- 一个 TFTP 服务器,用于传输启动镜像(所有 PXE 选项 ROM 的要求)。
- 一种网络存储方式(NFS、Samba 或 NBD),用于将 Arch 安装导出到无盘节点。
DHCP
安装 ISC dhcp 并进行配置
/etc/dhcpd.conf
allow booting; allow bootp; authoritative; option domain-name-servers 10.0.0.1; option architecture code 93 = unsigned integer 16; group { next-server 10.0.0.1; if option architecture = 00:07 { filename "/grub/x86_64-efi/core.efi"; } else { filename "/grub/i386-pc/core.0"; } subnet 10.0.0.0 netmask 255.255.255.0 { option routers 10.0.0.1; range 10.0.0.128 10.0.0.254; } }
next-server
应该是 TFTP 服务器的地址;其他所有内容都应更改以匹配您的网络RFC:4578 定义了 “客户端系统架构类型” dhcp 选项。在上面的配置中,如果 PXE 客户端请求 x86_64-efi 二进制文件(类型 0x7),我们会适当地提供一个,否则回退到旧版二进制文件。这允许 UEFI 和旧版 BIOS 客户端在同一网段上同时启动。
启动 ISC DHCP systemd 服务。
TFTP
TFTP 服务器将用于将引导加载程序、内核和 initramfs 传输到客户端。
将 TFTP 根目录设置为 /srv/arch/boot
。请参阅 TFTP 以获取安装和配置信息。
网络存储
使用 NFS 和 NBD 之间的主要区别在于,虽然两者都允许您让多个客户端使用相同的安装,但使用 NBD(通过直接操作文件系统的性质),您将需要使用 copyonwrite
模式来做到这一点,最终会丢弃客户端断开连接时的所有写入。然而,在某些情况下,这可能是非常理想的。
NFS
在服务器上安装 nfs-utils。
您将需要将 Arch 安装的根目录添加到您的 NFS 导出中
/etc/exports
/srv *(rw,fsid=0,no_root_squash,no_subtree_check) /srv/arch *(rw,no_root_squash,no_subtree_check)
接下来,启动 NFS 服务:nfs-idmapd
nfs-mountd
。
NBD
安装 nbd 并进行配置。
/etc/nbd-server/config
[generic] user = nbd group = nbd [arch] exportname = /srv/arch.img copyonwrite = false
copyonwrite
设置为 true;有关更多详细信息,请参阅 nbd-server(5)。另外,使用 chown 将 exportname 目录的所有权更改为用户 nbd
。启动 nbd
systemd 服务。
SKUF
您可以使用 SKUF 网络启动系统 项目启动 Arch Linux,其中文件系统的根目录将是位于 Samba 服务器上的 稀疏文件。
要开始使用,请安装 samba 并创建一个配置文件
/etc/samba/smb.conf
[global] workgroup = WORKGROUP security = user [arch] path = /srv/samba valid users = @skuf write list = @skuf guest ok = no read only = no writeable = yes browseable = yes
/srv/samba
)。启动 smb
systemd 服务
然后,创建一个 skuf
组和用户,这些用户将成为该组的成员,并通过他们进行客户端计算机上的 SAMBA
挂载。
# groupadd skuf # useradd test -g skuf # smbpasswd -a test
客户端安装
接下来,我们将在服务器上的子目录中创建一个完整的 Arch Linux 安装。在启动期间,无盘客户端将从 DHCP 服务器获取 IP 地址,然后使用 PXE 从主机启动,并将此安装挂载为其根目录。
目录设置
创建一个至少 2 gibibytes 的 稀疏文件,并在其上创建一个 btrfs 文件系统(当然,如果您愿意,也可以使用真实的块设备或 LVM)。
# truncate -s 2G /srv/arch.img # mkfs.btrfs /srv/arch.img # export root=/srv/arch # mount --mkdir -o loop,compress=lzo /srv/arch.img "$root"
引导安装
安装 devtools 和 arch-install-scripts,并运行 pacstrap 以安装客户端的基本软件包
# pacstrap -K "$root" base linux linux-firmware mkinitcpio-nfs-utils nfs-utils
ipconfig
仅由后者提供。现在需要构建 initramfs。
NFS
需要对 net
钩子进行微小的修改,以便 NFSv4 挂载能够工作(nfsmount
不支持 NFSv4 挂载,nfsmount
是 net
钩子的默认设置)。
# sed s/nfsmount/mount.nfs4/ "$root/usr/lib/initcpio/hooks/net" > "$root/usr/lib/initcpio/hooks/netnfs4" # cp $root/usr/lib/initcpio/install/net{,nfs4}
不幸的是,需要复制 net
,这样当在客户端安装上更新 mkinitcpio-nfs-utils 时,它不会被覆盖。
编辑 $root/etc/mkinitcpio.conf
并将 nfsv4
添加到 MODULES
,将 netnfs4
添加到 HOOKS
,并将 /usr/bin/mount.nfs4
添加到 BINARIES
。
接下来,我们 chroot 我们的安装并运行 mkinitcpio
# arch-chroot "$root" mkinitcpio -p linux
NBD
需要在客户端上安装 mkinitcpio-nbdAUR 软件包。使用 makepkg 构建并安装它
# pacman --root "$root" --dbpath "$root/var/lib/pacman" -U mkinitcpio-nbd-0.4-1-any.pkg.tar.xz
然后,您需要将 nbd
附加到 net
之后的 HOOKS
数组中;net
将为您配置网络,但如果内核行中未指定 nfsroot
,则不会尝试 NFS 挂载。
SKUF
要使用 SKUF 网络启动系统 在 稀疏文件 上安装 Arch Linux,请克隆 git 仓库
$ git clone https://github.com/BiteDasher/skuf.git $ cd skuf $ ./switch-tag latest
然后,构建 skuf
软件包和 ISO 镜像,稍后将用作 “kickstart” 以使用 kexec 启动主系统
首先,您需要调整 SAMBA 密码的加密方法(有关更多详细信息,请参阅 [1])
tune.crypt
A B X Y I O
tune.password
1234 Test password!
设置 默认值
defaults
SAMBA_USERNAME="testuser" SAMBA_PASSWORD="pa33w0rd" SAMBA_ADDRESS="192.168.0.5" SAMBA_PORT="445" SAMBA_VERSION="3.0" ...
安装所需的软件包
# ./install_deps.sh
最后,构建 skuf
软件包
$ ./tune_crypt.sh $ ./tune_password.sh $ ./setup_defaults.sh $ ./build_rootfs_tar.sh $ ./build_package.sh
ISO 镜像
# ./setup_repo.sh # ./build_iso.sh
和带有 Arch Linux 的 稀疏文件
# ./create_image.sh -s SIZE_IN_GIGABYTES additional_packages
然后,将 arch.ext4
移动到 /srv/samba
。
客户端配置
除了此处提到的设置之外,您还应该设置您的 主机名、时区、区域设置 和 键盘布局,并遵循 安装指南 的任何其他相关部分。
引导程序
GRUB
虽然文档记录不佳,但 GRUB 支持通过 PXE 加载。
# pacman --root "$root" --dbpath "$root/var/lib/pacman" -S grub
使用 grub-mknetdir
在目标安装上为两种架构创建 grub 前缀。
# arch-chroot "$root" grub-mknetdir --net-directory=/boot --subdir=grub
幸运的是,grub-mknetdir 为所有当前编译/安装的目标创建前缀,并且 grub 维护者非常友善地在同一个软件包中为我们提供了两者,因此 grub-mknetdir 只需要运行一次。
10.0.0.1
现在我们创建一个简单的 GRUB 配置
# vim "$root/boot/grub/grub.cfg"
menuentry "Arch Linux" { linux /vmlinuz-linux quiet add_efi_memmap ip=:::::eth0:dhcp nfsroot=10.0.0.1:/arch initrd /initramfs-linux.img } menuentry "Arch Linux (NBD)" { linux /vmlinuz-linux quiet add_efi_memmap ip=:::::eth0:dhcp nbd_host=10.0.0.1 nbd_name=arch root=/dev/nbd0 initrd /initramfs-linux.img }
GRUB 将自动 set root=(tftp,10.0.0.1)
,以便内核和 initramfs 通过 TFTP 传输,无需任何额外配置,但如果您有任何其他非 tftp 菜单项,您可能需要显式设置它。
- 所有 GRUB 文件和 initcpio 文件都必须通过 TFTP 提供。例如,对于 TFTP 根目录设置为
/srv/tftp
的 NBD 安装,必须存在/srv/tftp/grub/x86_64-efi/core.efi
、/srv/tftp/vmlinuz-linux
才能成功启动。您可以将镜像内的所有/boot
文件复制到 TFTP 服务器的根目录。 - 您可以使用
grub-mkconfig
生成 grub 配置,以确保视频设置正确设置。但是,之后需要编辑boot.cfg
,以删除search --no-floppy ...
并确保正确设置linux
initrd
选项(路径、NBD 设置、NFS 设置)。 - 根据需要修改您的内核行,有关 NBD 相关选项,请参阅 PXELINUX。
PXELINUX
PXELINUX 由 syslinux 提供,有关详细信息,请参阅 PXELINUX。
附加挂载点
NBD 根目录
在后期启动中,您将希望将根文件系统挂载切换为 rw
,并启用 compress=lzo
,以便与 NFS 相比,磁盘性能得到大大提高。
# vim "$root/etc/fstab"
/dev/nbd0 / btrfs rw,noatime,compress=lzo 0 0
程序状态目录
您可以将 /var/log
挂载为 tmpfs,例如,这样来自多台主机的日志就不会不可预测地混合在一起,并对 /var/spool/cups
执行相同的操作,这样使用同一假脱机目录的 20 个 cups 实例就不会相互冲突,生成 1,498 个打印作业并在一夜之间吃掉整卷纸(或更糟:墨粉盒)。
# vim "$root/etc/fstab"
tmpfs /var/log tmpfs nodev,nosuid 0 0 tmpfs /var/spool/cups tmpfs nodev,nosuid 0 0
最好配置一些具有某种状态/数据库的软件,以便为每台主机使用唯一的状态/数据库存储目录。例如,如果您想运行 puppet,您可以简单地在 puppet 单元文件中使用 %H
说明符
# vim "$root/etc/systemd/system/puppetagent.service"
[Unit] Description=Puppet agent Wants=basic.target After=basic.target network.target [Service] Type=forking PIDFile=/run/puppet/agent.pid ExecStartPre=/usr/bin/install -d -o puppet -m 755 /run/puppet ExecStart=/usr/bin/puppet agent --vardir=/var/lib/puppet-%H --ssldir=/etc/puppet/ssl-%H [Install] WantedBy=multi-user.target
Puppet-agent 会在 vardir
和 ssldir
不存在时创建它们。
如果这些方法都不合适,那么最后一个合理的选择是创建一个 systemd.generator(7),该生成器创建特定于当前主机的挂载单元(不幸的是,挂载单元中不允许使用说明符)。
客户端启动
NBD
如果您正在使用 NBD,您将需要在启动客户端之前/启动客户端时卸载 arch.img
。
当涉及到内核更新时,这会使事情变得特别有趣。当您启动客户端时,您不能挂载客户端文件系统,但这也意味着您需要使用与客户端文件系统分开的内核才能构建它。
您将需要首先将客户端安装中的 $root/boot
复制到您的 tftp 根目录(即 /srv/boot
)。
# cp -r "$root/boot" /srv/boot
然后,您需要在启动客户端之前卸载 $root
。
# umount "$root"
SKUF
将 skuflinux-smth.iso
写入您的 USB 驱动器,将其插入客户端计算机,并在 UEFI/BIOS 设置中选择作为启动设备。
SKUF
安装在 ESP 分区上,这样您就不必使用 USB 闪存驱动器/CD/DVD。为此,请将 skuflinux-smth.iso
挂载到某个位置(如 /mnt),然后将 /mnt/skuf/boot/x86_64/{vmlinuz-linux,initramfs-linux.img}
复制到 ESP 分区,并执行 efibootmgr -c -d /dev/sdX -p Y -u 'initrd=\initramfs-linux.img' -l '\vmlinuz-linux' -L 'SKUF'
,其中 /dev/sdX 是目标磁盘,Y 是目标 ESP 分区号。