这篇文章上次修改于 188 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

咕咕咕。。。

还有一个平板的评测还鸽着呢🤣,请叫我挖坑小能手

关于无盘系统,本人Google捣腾了一段时间,才发现Arch Linux Wiki上有一篇无盘系统的文章,自己在虚拟机环境下测试可行,这里记录下搭建的完整流程。

Windows 无盘系统的逻辑与 Linux 的完全不同,尝试 iSCSI 启动时会直接蓝屏,还没有找到比较靠fang谱bian的解决方法,只能先放着咯😑

流程图

画了一个简单的流程图

创建客户端目录

ArchLinux客户端系统

这里使用 ArchLinux 搭建环境,因为要使用到pacstrap创建系统根目录,当然其他的发行版也是可以的

mkdir arch-diskless
pacstrap -d ./arch-diskless base mkinitcpio-nfs-utils nfs-utils

修改mkinitcpio配置以支持nfs网络启动

cd arch-diskless
vim etc/mkinitcpio.conf
......
MODULES=(nfs r8168 broadcom tg3 e1000 e1000e)

BINARIES=(/usr/bin/mount.nfs)

HOOKS=(base udev autodetect modconf block filesystems keyboard fsck net)
......

被wiki坑了,在MODULES中不用添加nfsv4BINARIES也不需要添加/usr/bin/mount.nfs4,如果加了反而会无法启动🌚。可能是新版本已经修复这个问题,相关的文档还没有更正。

进入客户端系统并生成initramfs

arch-chroot .
mkinitcpio -p linux

检查initramfskernel镜像是否存在,没有这两个文件系统根本无法启动

ls /boot
initramfs-linux-fallback.img  initramfs-linux.img  vmlinuz-linux

退出chroot

exit

配置服务端

网络拓扑图

简单的网络拓扑图

修改 NFS 配置

vim /etc/exports

添加配置

/srv/nfs/arch-diskless    192.168.x.0/24(rw,no_root_squash,no_subtree_check)
  • /srv/nfs/arch-diskless 共享目录
  • 192.168.x.0/24 可访问的主机(注意主机名和权限的小括号中间是没有空格的)
  • (rw,sync,no_root_squash) 权限

    • rw 读写
    • no_root_squash 登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限。这个参数权限很大,请妥善使用。
    • no_subtree_check 即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率。

重启 NFS 服务

Debian

sudo systemctl restart nfs-kernel-server

ArchLinux

sudo systemctl restart nfs-server

修改 iPXE 启动脚本

添加启动项

item --key a arch_diskless (A)Archlinux Diskless

:arch_diskless
echo Boot Arch Linux Diskless System 
set server_ip 192.168.x.x
set nfs_path /srv/nfs/arch-diskless 
kernel nfs://${server_ip}${nfs_path}/boot/vmlinuz-linux
initrd nfs://${server_ip}${nfs_path}/boot/initramfs-linux.img
imgargs vmlinuz-linux initrd=initramfs-linux.img nfsroot=${server_ip}:${nfs_path} netboot=nfs ip=dhcp
boot || goto failed

set server_ip 192.168.x.x 这里填写 NFS 服务器 IP

set nfs_path /srv/nfs/arch-diskless对应/etc/exports里的路径

vmlinuzinitrd 直接通过 NFS 文件系统获取

imgargs 在启动时给 Kernel 传递命令行参数

完成

到这里整个 Linux 无盘服务就搭建完成了🎉,出现问题的话可以参考下开头的流程图排错。

参考

BasicChroot
PXEBootDisklessSystem
Preboot Execution Environment (简体中文))
archlinux-diskless