Linux无盘系统的搭建流程

修改 PXE 引导配置让客户端直接启动,就像 “给电脑贴一张启动路线图”,告诉它 “不用装系统,直接从服务器拿现成的系统来用”。我们一步步拆解,从 “准备材料” 到 “画路线图”,最后 “验证路线对不对”。
一、先明确清楚两个核心角色和 “工作流程”
在 PXE 无盘启动中,有 3 个关键角色:
客户端:你要启动的电脑(没硬盘,靠网络启动);TFTP 服务器:存放 “启动文件” 的仓库(客户端会来这里拿启动所需的核心文件);NFS/iSCSI 服务器:存放 “完整系统” 的仓库(客户端启动后,实际运行的系统文件存在这里)。
工作流程:
客户端开机 → 找 TFTP 服务器拿 “启动文件”(内核、引导程序)→ 用启动文件连接 NFS 服务器 → 加载 NFS 里的完整系统 → 直接进入桌面(无安装步骤)。
二、修改 PXE 配置的具体操作(全程可视化)
假设你的服务器 IP 是192.168.1.100,我们要做的就是 “画一张路线图”(修改配置文件),让客户端按这个路线走。
步骤 1:找到 “路线图” 存放的位置
PXE 的 “路线图” 叫default,存放在 TFTP 服务器的pxelinux.cfg文件夹里。
先登录你的服务器(比如用 Putty 或直接操作服务器),打开终端,输入命令进入这个文件夹:
bash
cd /var/lib/tftpboot/pxelinux.cfg/
(如果提示 “没有这个文件夹”,说明 TFTP 服务没装好,先装 TFTP 服务:sudo apt install tftp-hpa(Ubuntu)或yum install tftp-server(CentOS))
步骤 2:创建或修改 “路线图” 文件(default)
这个文件就是告诉客户端 “从哪拿文件、怎么启动” 的核心。
用记事本式的工具打开 / 创建default文件:
bash
sudo nano default # nano是简单的文本编辑器,按Ctrl+O保存,Ctrl+X退出
清空里面的内容,复制粘贴下面的 “标准路线图”,再根据你的实际情况修改括号里的内容:
bash
# 第一行:默认启动哪个选项(这里填"my-system",对应下面的label)
default my-system
# 第二行:是否让用户手动选择启动项(0=不显示选择界面,直接启动;1=显示)
prompt 0
# 第三行:超时时间(0=立即启动,单位是1/10秒,比如300=30秒后自动启动)
timeout 0
# 下面是具体的启动项配置(给这个启动项起个名字叫"my-system")
label my-system
# 告诉客户端:去TFTP服务器的这个路径拿内核文件(vmlinuz是Linux内核,相当于系统的“发动机”)
kernel 你的内核路径/vmlinuz
# 告诉客户端:去TFTP服务器拿初始化镜像(initramfs.img,相当于启动时的“辅助工具包”)
# 后面的参数是告诉内核:根系统在哪、怎么连接服务器
append initrd=你的初始化镜像路径/initramfs.img \
root=/dev/nfs \ # 根系统通过NFS协议获取(如果用iSCSI,这里改root=/dev/sda1等)
nfsroot=192.168.1.100:/srv/nfs/rootfs \ # 替换成你的服务器IP和系统存放路径
rw \ # 允许客户端读写系统文件(不然只能看不能改)
ip=dhcp # 客户端自动获取IP(如果想固定IP,改成ip=192.168.1.200::192.168.1.1:255.255.255.0::eth0:none)
步骤 3:替换 “路线图” 中的关键路径(最容易出错的地方)
上面的配置里,有 3 个地方必须改成你自己的实际路径,否则客户端会 “迷路”:
内核路径(kernel):
你的vmlinuz文件存在 TFTP 服务器的哪个文件夹?
假设放在/var/lib/tftpboot/system/里(TFTP 根目录是/var/lib/tftpboot/),那么这里填system/vmlinuz。
初始化镜像路径(initrd):
你的initramfs.img和内核在同一个文件夹,就填system/initramfs.img。
NFS 根系统路径(nfsroot):
你的完整系统文件(相当于电脑的 C 盘)存在服务器的/srv/nfs/ubuntu-root/,且服务器 IP 是192.168.1.100,就填192.168.1.100:/srv/nfs/ubuntu-root。
步骤 4:确保 “仓库” 里有对应的文件
客户端按 “路线图” 去找文件,必须能找到,否则会启动失败:
检查 TFTP 服务器里是否有内核和初始化镜像:
进入/var/lib/tftpboot/,看看你填的路径下(比如system/)是否有vmlinuz和initramfs.img。检查 NFS 服务器是否共享了根系统:
服务器上执行showmount -e,看看是否有你填的/srv/nfs/rootfs被共享出去(如果没有,需要配置 NFS 共享)。
步骤 5:重启服务,让 “新路线图” 生效
改完配置后,需要告诉服务器 “路线图更新了”:
bash
# 重启TFTP服务(让客户端能拿到新配置)
sudo systemctl restart tftpd-hpa
# 重启DHCP服务(确保客户端能正确找到TFTP服务器)
sudo systemctl restart isc-dhcp-server
三、验证是否成功:客户端启动测试
打开客户端电脑,进入 BIOS 设置(按 F2、Del 等键,看主板提示),把 “网络启动” 设为第一启动项,保存重启。客户端会自动开始 PXE 启动:
正常情况:屏幕会显示 “从 TFTP 下载 vmlinuz”“挂载 NFS 根系统” 等信息,最后直接进入登录界面(无任何安装选项)。异常情况:如果还出现安装界面,说明 “路线图” 还是指向了安装文件,回去检查:
vmlinuz和initramfs.img是不是从 “安装镜像” 里拿的?必须换成 “运行镜像” 的内核文件(比如从已安装好的系统里复制)。nfsroot路径是否正确?服务器的 NFS 服务是否启动?
一句话总结
修改 PXE 配置让客户端直接启动,就是在pxelinux.cfg/default里写清楚 “内核文件在哪、完整系统在哪、怎么连接服务器”,并关闭手动选择界面。核心是别让客户端找到 “安装程序”,而是直接找到 “现成的系统文件”。如果哪一步卡住了,先检查文件路径是否正确 ——90% 的问题都是 “路线指错了”。
针对无盘系统的 NFS/iSCSI 服务器搭建方案,确保工作站能读写共享目录:
一、NFS 服务器搭建(适合中小规模无盘场景,简单易维护)
NFS(网络文件系统)通过文件级共享为无盘工作站提供根文件系统,适合 Linux 无盘客户端,配置简单且兼容性好。
1. 服务器端配置(以 Ubuntu Server 为例)
步骤 1:安装 NFS 服务
bash
# 安装NFS服务器组件
sudo apt update && sudo apt install nfs-kernel-server -y
步骤 2:创建无盘工作站专用共享目录
bash
# 创建根文件系统目录(无盘工作站的"系统盘")
sudo mkdir -p /srv/nfs/rootfs
# 创建用户回写目录(工作站写入的数据暂存于此,避免污染根镜像)
sudo mkdir -p /srv/nfs/writeback
# 设置权限(允许工作站读写)
sudo chmod -R 777 /srv/nfs/rootfs /srv/nfs/writeback
步骤 3:配置 NFS 共享规则(关键:允许无盘工作站访问)
编辑 NFS 配置文件/etc/exports,指定共享目录、允许访问的工作站网段及权限:
bash
sudo nano /etc/exports
添加以下内容(根据实际网段修改192.168.1.0/24):
bash
# 无盘工作站的根文件系统(允许读写、同步写入、不限制root权限)
/srv/nfs/rootfs 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check)
# 工作站回写目录(独立分区,避免影响根镜像)
/srv/nfs/writeback 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check)
rw:允许读写(核心权限,无盘工作站必须有写入权限才能保存数据);no_root_squash:允许工作站以 root 权限操作(避免权限不足导致启动失败);192.168.1.0/24:限制只有该网段的无盘工作站可访问(增强安全性)。
步骤 4:生效配置并启动服务
bash
# 应用共享配置
sudo exportfs -a
# 重启NFS服务
sudo systemctl restart nfs-kernel-server
# 设置开机自启
sudo systemctl enable nfs-kernel-server
制作 PXE 启动所需的 “启动文件”(内核、初始化镜像)和 NFS 中的 “完整系统”(根文件系统),本质是从现有 Linux 系统中提取核心组件,或构建一个精简的可运行系统。以下是详细的分步操作,以 Ubuntu 为例(其他 Linux 发行版思路类似):
一、制作 “启动文件”(内核 vmlinuz + 初始化镜像 initramfs)
启动文件是客户端启动时的 “核心工具包”:vmlinuz是 Linux 内核(负责硬件驱动和系统核心功能),initramfs.img是初始化内存文件系统(负责启动初期加载驱动、连接网络、挂载 NFS 根系统)。
步骤 1:准备一个 “模板系统”
需要一台已安装 Linux 的电脑(物理机或虚拟机,与客户端硬件架构一致,如 x86_64),用于提取内核和生成初始化镜像。
推荐安装Ubuntu Server LTS(精简、稳定,适合无盘环境),安装时勾选 “OpenSSH Server”(方便后续操作)。
步骤 2:提取内核文件(vmlinuz)
内核文件默认存放在/boot目录,直接复制即可:
bash
# 在模板系统中执行,查看可用内核
ls /boot | grep vmlinuz
# 输出类似:vmlinuz-5.4.0-150-generic(数字是内核版本,选最新的稳定版)
# 复制内核到临时目录(后续会传到TFTP服务器)
mkdir -p ~/pxe-files # 新建临时文件夹
cp /boot/vmlinuz-5.4.0-150-generic ~/pxe-files/vmlinuz # 重命名为vmlinuz(简化路径)
步骤 3:生成支持网络启动的初始化镜像(initramfs)
默认的 initramfs 可能缺少 NFS 客户端或网卡驱动,需要重新生成,确保包含网络启动必需的模块:
bash
# 在模板系统中执行,生成支持NFS的initramfs
sudo update-initramfs -c -k 5.4.0-150-generic -o ~/pxe-files/initramfs.img
# 参数说明:
# -c:创建新的initramfs
# -k:指定内核版本(与上面的vmlinuz版本一致)
# -o:输出路径(保存到临时文件夹)
关键验证:检查生成的initramfs.img是否包含 NFS 和网卡驱动:
bash
# 解压镜像查看内容(需要root权限)
mkdir ~/initramfs-tmp
cd ~/initramfs-tmp
zcat ~/pxe-files/initramfs.img | cpio -idmv
# 检查是否有NFS模块和常用网卡驱动
ls lib/modules/5.4.0-150-generic/kernel/fs/nfs/ # 应有nfs.ko等文件
ls lib/modules/5.4.0-150-generic/kernel/drivers/net/ # 应有e1000、igb等网卡驱动
如果缺少驱动,需在模板系统中安装对应驱动(如linux-modules-extra-$(uname -r)),再重新生成 initramfs。
步骤 4:将启动文件传到 TFTP 服务器
把提取的vmlinuz和initramfs.img复制到 TFTP 服务器的根目录(如/var/lib/tftpboot/):
bash
# 在PXE服务器上执行(假设通过SSH从模板系统复制)
sudo cp 模板系统IP:~/pxe-files/* /var/lib/tftpboot/
sudo chmod 755 /var/lib/tftpboot/vmlinuz /var/lib/tftpboot/initramfs.img # 确保可读
二、制作 NFS 中的 “完整系统”(根文件系统 rootfs)
根文件系统是客户端实际运行的 “操作系统目录”,包含/bin、/etc、/lib等所有系统文件,需通过 NFS 共享给客户端。
方法 1:从模板系统克隆(简单,适合新手)
直接复制模板系统的根目录,精简后作为 NFS 根系统(优点:操作简单,兼容性好;缺点:体积较大)。
步骤 1:在服务器上创建根文件系统目录
bash
sudo mkdir -p /srv/nfs/rootfs # NFS共享的根目录
步骤 2:复制模板系统的根文件系统
通过rsync或cp复制模板系统的所有文件(排除不需要的目录,如/proc、/sys等临时目录):
bash
# 在服务器上执行,从模板系统复制(需要模板系统的SSH权限)
sudo rsync -av --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/tmp --exclude=/boot \
模板系统IP:/ /srv/nfs/rootfs/
步骤 3:精简根文件系统(可选,减少体积)
删除不必要的软件和文件(如桌面环境、冗余文档):
bash
# 进入根文件系统目录
sudo chroot /srv/nfs/rootfs # 切换到目标根系统环境(类似“进入”这个系统)
# 卸载不需要的软件(以Ubuntu为例)
apt autoremove --purge -y ubuntu-desktop libreoffice* # 删桌面和办公软件
apt clean # 清理缓存
rm -rf /var/log/* # 清理日志
exit # 退出chroot环境
步骤 4:配置根文件系统的必要设置
确保客户端启动后能正常工作,需修改以下配置:
网络配置:设置客户端启动后自动获取 IP(通过 DHCP):
bash
# 编辑网络配置文件(Ubuntu 20.04+用netplan)
sudo nano /srv/nfs/rootfs/etc/netplan/00-installer-config.yaml
写入:
yaml
network:
ethernets:
eth0: # 网卡名(客户端通常是eth0)
dhcp4: true # 开启DHCP
version: 2
fstab 配置:指定根文件系统的挂载方式(客户端启动时会自动挂载):
bash
sudo nano /srv/nfs/rootfs/etc/fstab
写入(仅保留必要项,其他注释或删除):
plaintext
# 格式:设备 挂载点 文件系统类型 选项 备份 检查
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
允许 root 登录(方便调试,生产环境可关闭):
bash
sudo nano /srv/nfs/rootfs/etc/ssh/sshd_config
确保有:PermitRootLogin yes,然后重启 SSH 服务(客户端启动后生效)。