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

咕咕咕。。。

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

关于无盘系统,本人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

mount -t proc /proc ./proc
mount -o bind /dev ./dev
mount -o bind /dev/pts ./dev/pts
mount -o bind /sys ./sys

arch-chroot .
mkinitcpio -p linux

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

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

退出chroot

exit
umount ./{sys,proc,dev/pts,dev}

Debian 客户端系统

创建 debian 最小系统文件夹

apt install debootstrap
mkdir debian-chroot
debootstrap stable ./debian-chroot https://mirrors.tuna.tsinghua.edu.cn/debian/

chroot 进入系统

mount -t proc /proc debian-chroot/proc
mount -o bind /dev debian-chroot/dev
mount -o bind /dev/pts debian-chroot/dev/pts
mount -o bind /sys debian-chroot/sys
chroot debian-chroot/

安装必须的软件

apt update
apt install neofetch vim
apt install linux-image-amd64 initramfs-tools network-manager
systemctl enable networking

修改 initramfs 配置,将 MODULES 的值修改为 netboot

vim /etc/initramfs-tools/initramfs.conf
...
# MODULES: [ most | netboot | dep | list ]
#
# most - Add most filesystem and all harddrive drivers.
#
# dep - Try and guess which modules to load.
#
# netboot - Add the base modules, network modules, but skip block devices.
#
# list - Only include modules from the 'additional modules' list
#

MODULES=netboot
...

重新生成 initramfs 并退出 chroot

update-initramfs -u

exit
umount debian-chroot/{sys,proc,dev/pts,dev}

配置服务端

网络拓扑图

简单的网络拓扑图

修改 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