当前位置: 首页 > 科技观察

如何搭建网络启动服务器(一)

时间:2023-03-19 21:04:26 科技观察

有些计算机网络需要在每台物理机上维护相同的软件和配置。学校机房就是这样的环境。网络引导服务器可以配置为通过网络提供完整的操作系统,以便客户端计算机可以从中央位置获取配置。本教程将向您展示一种构建网络引导服务器的方法。本教程的第一部分将介绍创建网络引导服务器和镜像。第二部分将展示如何将经过Kerberos身份验证的主目录添加到网络引导配置中。初始配置首先下载Fedora服务器的netinst映像,将其刻录到CD,然后使用它来引导服务器以重新格式化。我们只需要FedoraServer的典型“最小安装”即可开始,安装后,我们可以使用命令行添加我们需要的任何额外包。注意:我们将在本教程中使用Fedora28。其他版本在Mini-Install中可能包含略有不同的包。如果您使用不同的Fedora版本,如果预期的文件或命令不可用,您可能需要进行一些调试。启动并运行最小的Fedora服务器后,以root身份登录:$sudo-i并设置主机名:$MY_HOSTNAME=server-01.example.edu$hostnamectlset-hostname$MY_HOSTNAME注意:RedHat建议使用静态和临时名称都匹配机器在DNS中的完全限定域名,例如host.example.com(用于主机名)。注意:本指南是为了方便“复制和粘贴”。任何需要自定义的值都被声明为MY_*变量,您可能需要在运行其余命令之前对其进行调整。如果您注销,变量分配将被清除。注意:默认情况下,Fedora28服务器倾向于将大量日志转储到控制台。您可以通过运行以下命令禁用控制台日志输出:sysctl-wkernel.printk=0。接下来,我们需要在我们的服务器上配置一个静态网络地址。运行以下一系列命令将找到并重新配置您的默认网络连接:$MY_DNS1=192.0.2.91$MY_DNS2=192.0.2.92$MY_IP=192.0.2.158$MY_PREFIX=24$MY_GATEWAY=192.0.2.254$DEFAULT_DEV=$(iprouteshowdefault|awk'{print$5}')$DEFAULT_CON=$(nmclidshow$DEFAULT_DEV|sed-n'/^GENERAL.CONNECTION:/s!.*:\s*!!p')$nohupbash</etc/exportsSELinux干扰网络启动服务器操作。为它配置例外超出了本教程的范围,所以我们在这里禁用它:$sed-i'/GRUB_CMDLINE_LINUX/s/"$/audit=0selinux=0"/'/etc/default/grub$grub2-mkconfig-o/boot/grub2/grub.cfg$sed-i's/SELINUX=enforcing/SELINUX=disabled/'/etc/sysconfig/selinux$setenforce0注意:应该不需要编辑grub命令行,但我们正在测试它在中发现,直接编辑/etc/sysconfig/selinux在重启后证明是无效的,所以再次这样做确保设置了selinux=0标志。现在,在本地防火墙中为NFS服务添加一条例外规则,并启动NFS服务:$firewall-cmd--add-servicenfs$firewall-cmd--runtime-to-permanent$systemctlenablenfs-server.service$systemctlstartnfs-server.service创建网络启动映像现在我们的NFS服务器已启动并正在运行,我们需要为其提供操作系统映像,以便它可以服务于客户端计算机。我们将从一个非常小的图像开始,然后在一切顺利时添加到它。首先,创建一个新目录来存放我们的镜像:$mkdir/fc28使用dnf命令在新目录中构建带有几个基本包的镜像:$dnf-y--releasever=28--installroot=/fc28installfedora-releasesystemdpasswdrootfilessudodracutdracut-networknfs-utilsvim-minimaldnf在上面的命令中省略了非常重要的内核包。在安装它们之前,我们需要调整initramfs映像中包含的驱动程序集,这些驱动程序将在安装内核***时自动构建。特别是,我们需要禁用hostonly模式,以便initramfs映像在各种硬件平台上正常工作,我们还需要添加对网络和NFS的支持:$echo'hostonly=no'>/fc28/etc/dracut.conf.d/hostonly.conf$echo'add_dracutmodules+="networknfs"'>/fc28/etc/dracut.conf.d/netboot.conf现在,安装内核包:$dnf-y--installroot=/fc28installkernel设置阻止内核包更新的规则:$echo'exclude=kernel-*'>>/fc28/etc/dnf/dnf.conf设置语言环境:$echo'LANG="en_US.UTF-8"'>/fc28/etc/locale.conf注意:如果语言环境配置不正确,某些程序(例如GNOMETerminal)将无法正常运行。设置客户端的主机名:$MY_CLIENT_HOSTNAME=client-01.example.edu$echo$MY_CLIENT_HOSTNAME>/fc28/etc/hostname禁用控制台日志输出:$echo'kernel.printk=0417'>/fc28/etc/sysctl.d/00-printk.conf在网络引导映像中定义本地liveuser用户:$echo'liveuser:x:1000:1000::/home/liveuser:/bin/bash'>>/fc28/etc/passwd$echo'liveuser:::::::'>>/fc28/etc/shadow$echo'liveuser:x:1000:'>>/fc28/etc/group$echo'liveuser:!::'>>/fc28/etc/gshadow允许liveuser使用sudo:$echo'liveuserALL=(ALL)NOPASSWD:ALL'>/fc28/etc/sudoers.d/liveuser允许自动创建主目录:$dnfinstall-y--installroot=/fc28authselectoddjob-mkhomedir$echo'dirs/home'>/fc28/etc/rwtab.d/home$chroot/fc28authselectselectsssdwith-mkhomedir--force$chroot/fc28systemctlenableoddjobd.service由于多个clients客户端会同时挂载我们的镜像,我们需要配置镜像以只读模式工作:$sed-i's/^READONLY=no$/READONLY=yes/'/fc28/etc/sysconfig/readonly-root配置记录到内存而不是持久存储:$sed-i's/^#Storage=auto$/Storage=volatile/'/fc28/etc/systemd/日nald.conf配置DNS:$MY_DNS1=192.0.2.91$MY_DNS2=192.0.2.92$cat</fc28/etc/resolv.confnameserver$MY_DNS1nameserver$MY_DNS2END绕过编写本教程时存在的根只读挂载漏洞(BZ1542567):$echo'dirs/var/lib/gssproxy'>/fc28/etc/rwtab.d/gssproxy$cat</fc28/etc/rwtab.d/systemddirs/var/lib/systemd/catalogdirs/var/lib/systemd/coredumpEND***为我们的镜像创建一个NFS文件系统并在我们的子网上共享它:$mkdir/export/fc28$echo'/fc28/export/fc28nonebind00'>>/etc/fstab$mount/export/fc28$echo"/export/fc28-ro,sec=sys,no_root_squash$MY_SUBNET/$MY_PREFIX">/etc/exports.d/fc28.exports$exportfs-vr创建引导加载程序现在我们有一个网络可引导的操作系统,我们需要一个引导加载程序来从客户端系统引导它。在本教程中,我们使用iPXE。注意:本节和以下部分是使用QEMU测试的,也可以在单独的计算机上完成;它们不需要在网络引导服务器上运行。安装git并使用它来下载iPXE:$dnfinstall-ygit$gitclonehttp://git.ipxe.org/ipxe.git$HOME/ipxe现在我们需要为我们的引导加载程序脚本创建一个专用引导:$cat<<'END'>$HOME/ipxe/init.ipxe#!ipxeprompt--key0x02--timeout2000按Ctrl-B进入iPXE命令行...&&shell||dhcp||exitset前缀文件:///linuxchain${prefix}/boot.cfg||exitEND引导“文件”下载协议:$echo'#defineDOWNLOAD_PROTO_FILE'>$HOME/ipxe/src/config/local/general.h安装C编译器和相关工具和库:$dnfgroupinstall-y"C开发工具和库"构建引导加载程序:$cd$HOME/ipxe/src$makeclean$makebin-x86_64-efi/ipxe.efiEMBED=../init.ipxe注意新编译的引导加载程序的存储位置。我们将在以下部分中使用它:$IPXE_FILE="$HOME/ipxe/src/bin-x86_64-efi/ipxe.efi"TestingwithQEMU此部分是可选的,但您需要复制以下显示布局物理机上的EFI系统分区,需要配置网络启动。注意:如果您想实现一个完全无盘的系统,您也可以将该文件复制到TFTP服务器,然后从DHCP指向该服务器。为了使用QEMU测试我们的引导加载程序,我们继续创建一个非常小的磁盘映像,其中只包含一个EFI系统分区和我们的引导文件。从创建EFI系统分区所需的目录布局开始,然后复制我们在上一节中创建的引导加载程序:$mkdir-p$HOME/esp/efi/boot$mkdir$HOME/esp/linux$cp$IPXE_FILE$HOME/esp/efi/boot/bootx64.efi以下命令将识别我们的引导加载程序映像正在使用的内核版本并将其保存到变量中以供后续配置命令使用它:$DEFAULT_VER=$(ls-c/fc28/lib/modules|head-n1)定义我们的客户端计算机将使用的引导配置:$MY_DNS1=192.0.2.91$MY_DNS2=192.0.2.92$MY_NFS4=server-01。example.edu$cat<$HOME/esp/linux/boot.cfg#!ipxekernel--namekernel.efi\${prefix}/vmlinuz-$DEFAULT_VERinitrd=initrd.imgroip=dhcprd.peerdns=0nameserver=$MY_DNS1nameserver=$MY_DNS2root=nfs4:$MY_NFS4:/fc28console=tty0console=ttyS0,115200n8audit=0selinux=0quietinitrd--nameinitrd.img\${prefix}/initramfs-$DEFAULT_VER.imgboot||exitEND注意:上面的引导脚本显示了如何使用iPXE网络引导Linux的最小示例。也可以进行更复杂的配置。值得注意的是,iPXE支持交互式启动菜单,它允许您配置默认选项和超时。例如,更高级的iPXE脚本可以默认从本地磁盘启动操作系统,并且仅当用户在倒计时到期之前按下某个键时才从网络启动操作系统。复制Linux内核并将initramfs分配给EFI系统分区:$cp$(find/fc28/lib/modules-maxdepth2-name'vmlinuz'|grep-m1$DEFAULT_VER)$HOME/esp/linux/vmlinuz-$DEFAULT_VER$cp$(find/fc28/boot-name'init*'|grep-m1$DEFAULT_VER)$HOME/esp/linux/initramfs-$DEFAULT_VER.img我们最终的目录布局应该是这样的:esp├──efi│└──boot│└──bootx64.efi└──linux├──boot.cfg├──initramfs-4.18.18-200.fc28.x86_64.img└──vmlinuz-4.18.18-200.fc28。x86_64要让QEMU使用我们的EFI系统分区,我们需要创建一个小的uefi.img磁盘映像来包含它,然后将它连接到QEMU作为主引导驱动器。开始安装必要的工具:$dnfinstall-yparteddosfstools现在创建uefi.img文件并将esp目录中的文件复制到其中:$ESP_SIZE=$(du-ks$HOME/esp|cut-f1)$ddif=/dev/zeroof=$HOME/uefi.img计数=$((${ESP_SIZE}+5000))bs=1KiB$UEFI_DEV=$(losetup--show-f$HOME/uefi.img)$parted${UEFI_DEV}-smklabelgptmkpartEFIFAT161MiB100%toggle1boot$mkfs-tmsdos${UEFI_DEV}p1$mkdir-p$HOME/mnt$挂载${UEFI_DEV}p1$HOME/mnt$cp-r$HOME/esp/*$HOME/mnt$umount$HOME/mnt$losetup-d${UEFI_DEV}注意:在物理机上,只需要将esp目录下的文件复制到现有EFI系统分区即可电脑。您不需要使用uefi.img文件来引导物理计算机。注意:在物理计算机上,如果文件名已存在,您可以重命名bootx64.efi文件。如果重命名了,则需要编辑电脑的BIOS设置,将推荐的efi文件添加到启动列表中间。接下来我们需要安装qemu包:$dnfinstall-yqemu-system-x86允许QEMU访问我们在本教程“初始配置”部分创建的桥:$echo'allowbr0'>/etc/qemu/bridge.conf创建OVMF_VARS.fd映像的副本以保存我们VM的永久BIOS配置:$cp/usr/share/edk2/ovmf/OVMF_VARS.fd$HOME现在,启动VM:$qemu-system-x86_64-machineaccel=kvm-nographic-m1024-driveif=pflash,format=raw,unit=0,file=/usr/share/edk2/ovmf/OVMF_CODE.fd,readonly=on-driveif=pflash,format=raw,unit=1,file=$HOME/OVMF_VARS.fd-driveif=ide,format=raw,file=$HOME/uefi.img-netbridge,br=br0-netnic,model=virtio如果一切顺利,你您将看到类似于下图的内容:您可以使用shutdown命令关闭虚拟机并返回到我们的服务器:$sudoshutdown-hnow注意:如果出现错误或虚拟机挂起,您可能需要启动一个新的SSH会话以连接到服务器,并使用killc命令终止qemu-system-x86_64进程。将包添加到镜像将包添加到镜像应该是一个简单的事情,只需在服务器上chroot到镜像并运行dnfinstall。对于可以在网络引导映像中安装的软件包没有任何限制。完整的图形安装应该可以完美运行。下面是一个如何将最小的网络引导映像转换为完整的图形安装的示例:$foriindevdev/ptsdev/shmprocsysrun;做mount-obind/$i/fc28/$i;完成$chroot/fc28/usr/bin/bash--login$dnf-ygroupinstall"FedoraWorkstation"$dnf-yremovegnome-initial-setup$systemctldisablesshd.service$systemctlenablegdm.service$systemctlset-defaultgraphical.target$sed-i's/SELINUX=enforcing/SELINUX=disabled/'/etc/sysconfig/selinux$logout$foriinrunsysprocdev/shmdev/ptsdev;卸载/fc28/$i;done或者,您可能希望为liveuser用户启用自动登录:$sed-i'/daemon/aAutomaticLoginEnable=true'/fc28/etc/gdm/custom.conf$sed-i'/daemon/aAutomaticLogin=liveuser'/fc28/etc/gdm/custom.conf