iPXE部署Ubuntu无盘系统

iPXE部署Ubuntu无盘系统

放假回家,准备打开我那陈旧的HP2000笔记本,结果发现硬盘咔咔咔响,系统也是卡在加载界面,寻思着硬盘故障了,重启几次都不行。于是拆开硬盘修理。可就在拧紧磁头螺丝的时候,一不小心,用力过猛,“咔嚓”一声,那固定磁头螺丝的螺柱,被我拧断了。哦豁~这下好了,硬盘坏了,还没有备用的。那么干脆搭建一个无盘系统吧?

0 PXE简介

PXE(Preboot execute environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统,在启动过程中,终端要求服务器分配IP地址,再用TFTP(trivial file transfer protocol)或MTFTP(multicast trivial file transfer protocol)协议下载一个启动软件包到本机内存中执行,由这个启动软件包完成终端(客户端)基本软件设置,从而引导预先安装在服务器中的终端操作系统。PXE可以引导多种操作系统,如:Windows95/98/2000/windows2003/windows2008/winXP/win7/win8, linux系列系统等。

来源:百度百科

1 网络环境配置

一般电脑网卡自带的PXE固件,只支持TFTP模式启动。PXE固件初始化时,将从DHCP服务器获取一些options信息,以确定PXE TFTP服务器、启动文件名。这要求专用的DHCP服务。可是!目前我们用的路由器不支持那么多的自定义DHCP设置!于是就需要另外搭建DHCP服务器。不过有一个小软件已经帮我们解决了这个问题。——Tiny PXE Server

运行Tiny PXE Server,设置网络参数,然后点击右上角的运行即可。

2 iPXE配置

将启动文件改为ipxe.efi(对于EFI启动的电脑),如果用传统启动模式,则改为ipxe.pxe文件。这些文件都默认打包好了,放在下载的压缩文件夹里。

打开电脑,启用PXE/网络启动,看看有没有成功启动到iPXE

注意,从iPXE官网下载的ipxe.efi或者Tiny PXE Server自带的ipxe.efi都不支持NFS启动。所以需要在这个网站在线编译一个ipxe.efi:
https://rom-o-matic.eu/

选择Advanced,Output Format按需选择(EFI或PXE)

勾选DOWNLOAD_PROTO_NFS

3 服务器配置

既然无盘系统是基于文件共享而实现的,那么我们服务端需要安装文件共享服务端。此处我们选择文件传输较快的NFS。

具体安装NFS服务端方法可上网查找。

NFS服务端配置:

1
2
3
编辑/etc/exports
添加共享:
/path/to/ubuntu/rootfs *(rw,sync,crossmnt,no_root_squash)

rw 表示可读写,如果要求只读可修改为ro
sync 表示更改立即写入磁盘,实时性较高,若使用async,虽然提高了效率,但实时性降低了,在零碎写入的时候虽然会更快,但也可能出错
(更新:使用async效果更好,也挺稳定)
crossmnt 表示允许访问挂载在文件系统内的文件。如将/tmp挂载到了/path/to/ubuntu/rootfs/tmp下,添加crossmnt就可以允许挂载访问/tmp
no_root_squash 这个参数非常重要,如果写入用户为root,则对应将设置该文件所有者为root。如果使用root_squash,那么可能导致权限错误问题。

4 制作无盘系统

4.1 使用debootstrap制作基本系统

执行以下命令:

1
sudo debootstrap --arch=amd64 bionic '/path/to/ubuntu-18.04/rootfs' http://mirrors.tuna.tsinghua.edu.cn/ubuntu

debootstrap 是Debian系系统构建基本系统至某个文件夹的一个命令。
--arch=amd64 表示设置架构为64位PC CPU
bionic 是Ubuntu的发行版代号(即Ubuntu 18.04)
/path/to/ubuntu-18.04.02/rootfs 指定要构建的目录,构建完成后这个目录将会生成/etc/home/bin等文件夹,即根文件系统
http://mirrors.tuna.tsinghua.edu.cn/ubuntu 为可选项,指定了软件源。可以将其改成最快的软件源(如清华源、中科大源等)。也可以自己在家里NAS服务器上弄个镜像源,通过内网传输,当然速度最快~

命令执行完成后,命令cd进入刚刚创建的根文件系统,应该可以看见已经构建好一个基本系统了:

图:文件列表

4.2 chroot进入基本系统

执行 sudo chroot /path/to/ubuntu/rootfs

5 无盘系统基本配置

在chroot状态下,即可以对无盘系统进行配置啦
注意:确保以下命令都在chroot环境下运行,否则你配置的不是无盘系统而是现在运行的系统!

5.1 修改软件源

基本系统默认只包含一个main软件源,日常使用的话还需要添加其他软件源如universe等。编辑/etc/apt/sources.list添加软件源:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
nano /etc/apt/sources.list
=================sources.list==================
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-update main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-update universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-update multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-security main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-security universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-security multiverse
===============================================
(Ctrl-O)
(Enter)
(Ctrl-X)
apt update

如果提示没有找到nano命令,也可以用apt install nano安装或者使用Vim编辑器编辑

5.2 安装内核

目前我们的无盘系统是通过chroot运行在当前操作系统内核的,因此我们还需要构建自己的内核,提供给网络启动

1
2
apt dist-upgrade
apt install linux-image-generic

安装过程中可能弹出Grub引导安装错误的消息,此时可以忽略,因为我们不需要使用Grub引导启动。

Grub无法安装,Yes即可

5.3 修改initramfs配置

此时我们需要修改initramfs配置文件,配置其使用nfs方式加载根文件系统

1
nano /etc/initramfs-tools/initramfs.conf

配置NFSROOT=192.168.1.123(NFS服务器地址):/path/to/ubuntu-18.04.02/rootfs(无盘系统根文件夹目录)

然后执行更新initramfs命令:

1
update-initramfs -u

5.4 修改fstab配置

fstab是linux系统加载时自动挂载文件系统的配置文件。配置此文件以自动挂载根文件系统。

1
2
3
4
5
6
nano /etc/fstab
======================
修改为以下配置:
proc /proc proc defaults 0 0
192.168.1.123:/path/to/ubuntu/rootfs / nfs defaults,rw 0 0
写入,保存,退出。

5.5 修改hostname

hostname即相当于计算机名。打开这个文件你会发现它已经默认配置机器名为现在运行的系统(工作系统)的计算机名。为避免困惑,建议将其更改为其他名称。

1
nano /etc/hostname

5.6 修改/boot权限

无盘系统的linux内核文件放在/boot文件夹,其中内核文件(vmlinuz-xxx)的权限默认为700,即非root用户不可读。如果将其配置到pxe启动,可能会因为权限不足无法读取而导致无法启动。因此建议将权限改为755

1
chmod 755 /boot -R

5.7 配置root密码

如果不配置root密码,可能导致无法进入系统,因为一般不允许空密码登录

1
passwd

5.7 其他配置

设置时区:

1
tzselect

安装桌面环境

1
apt install ubuntu-desktop

添加用户

1
2
3
groupadd admin
useradd -g admin -m usernamelalala
passwd usernamelalala

后续还可以进行本地化配置等操作,这里就不再赘述了

6 配置iPXE启动菜单

可以参照Tiny PXE Server自带的menu.ipxe配置文件来自定义自己需要的启动目录。这里我就贴出来我的关于该Ubuntu无盘系统的配置:

1
2
3
4
5
6
7
:Ubuntu_18_04_02
  set server_ip 192.168.1.123
  set nfs_path /path/to/ubuntu/rootfs
  kernel nfs://${server_ip}${nfs_path}/vmlinuz || read void
  initrd nfs://${server_ip}${nfs_path}/initrd.img || read void
  imgargs vmlinuz initrd=initrd.img root=/dev/nfs netboot=nfs nfsroot=${server_ip}:${nfs_path} ip=dhcp splash quiet -- || read void
  boot || read void

7 完成

大功告成!快开机试试吧~

图:欢迎界面

总结

其实无盘系统的搭建,就是换一种方式安装系统而已。大家还可以多手动安装Archlinux来体会一下装系统的具体步骤,这样可以有助于学习Linux~