PXE 环境搭建完成后,现在还不能开始自动装机过程, 因为 TFTP 工作目录下的配置还是 Ubuntu 发行版 netboot 的默认配置,需要手动一步一步的完成整个过程的安装, 只能算手摇半自动.在真正开始之前,需要梳理下 Ubuntu 的 netboot 配置方式,以方便我们完成自定义的自动化装机.

初始化 /var/lib/tftpboot 目录

我们是将ubuntu-16.04.6-server-amd64.iso镜像挂载到/mnt, 将/mnt/install/netboot目录下的内容直接拷贝到/var/lib/tftpboot,我们先看看这个目录到底有什么内容:

root@server:~# mount ubuntu-16.04.6-server-amd64.iso /mnt
mount: /dev/loop0 is write-protected, mounting read-only
root@server:~# ll /mnt/install/netboot/
total 7
dr-xr-xr-x 1 root root 2048 Feb 27 08:06 ./
dr-xr-xr-x 1 root root 2048 Feb 27 08:06 ../
lr-xr-xr-x 1 root root   47 Feb 20 22:37 ldlinux.c32 -> ubuntu-installer/amd64/boot-screens/ldlinux.c32
lr-xr-xr-x 1 root root   33 Feb 20 22:37 pxelinux.0 -> ubuntu-installer/amd64/pxelinux.0
lr-xr-xr-x 1 root root   35 Feb 20 22:37 pxelinux.cfg -> ubuntu-installer/amd64/pxelinux.cfg/
dr-xr-xr-x 1 root root 2048 Feb 20 22:30 ubuntu-installer/
-r--r--r-- 2 root root   61 Feb 20 22:37 version.info
root@server:~# cp -rf /mnt/install/netboot/* /var/lib/tftpboot/
root@server:/var/lib/tftpboot# ll
total 16
drwxr-xr-x  3 root nogroup 4096 Jun 13 17:00 ./
drwxr-xr-x 39 root root    4096 Jun 11 21:48 ../
lrwxrwxrwx  1 root root      47 Jun 13 17:00 ldlinux.c32 -> ubuntu-installer/amd64/boot-screens/ldlinux.c32
lrwxrwxrwx  1 root root      33 Jun 13 17:00 pxelinux.0 -> ubuntu-installer/amd64/pxelinux.0
lrwxrwxrwx  1 root root      35 Jun 13 17:00 pxelinux.cfg -> ubuntu-installer/amd64/pxelinux.cfg/
dr-xr-xr-x  3 root root    4096 Jun 13 17:00 ubuntu-installer/
-r--r--r--  1 root root      61 Jun 13 17:00 version.info
root@server:/var/lib/tftpboot# find .
.
./ldlinux.c32
./pxelinux.0
./pxelinux.cfg
./ubuntu-installer
./ubuntu-installer/amd64
./ubuntu-installer/amd64/initrd.gz
./ubuntu-installer/amd64/pxelinux.0
./ubuntu-installer/amd64/linux
./ubuntu-installer/amd64/boot-screens
./ubuntu-installer/amd64/boot-screens/vesamenu.c32
./ubuntu-installer/amd64/boot-screens/rqtxt.cfg
./ubuntu-installer/amd64/boot-screens/f3.txt
./ubuntu-installer/amd64/boot-screens/f1.txt
./ubuntu-installer/amd64/boot-screens/stdmenu.cfg
./ubuntu-installer/amd64/boot-screens/f10.txt
./ubuntu-installer/amd64/boot-screens/syslinux.cfg
./ubuntu-installer/amd64/boot-screens/f7.txt
./ubuntu-installer/amd64/boot-screens/f5.txt
./ubuntu-installer/amd64/boot-screens/libutil.c32
./ubuntu-installer/amd64/boot-screens/prompt.cfg
./ubuntu-installer/amd64/boot-screens/f2.txt
./ubuntu-installer/amd64/boot-screens/ldlinux.c32
./ubuntu-installer/amd64/boot-screens/f4.txt
./ubuntu-installer/amd64/boot-screens/exithelp.cfg
./ubuntu-installer/amd64/boot-screens/txt.cfg
./ubuntu-installer/amd64/boot-screens/adtxt.cfg
./ubuntu-installer/amd64/boot-screens/menu.cfg
./ubuntu-installer/amd64/boot-screens/f8.txt
./ubuntu-installer/amd64/boot-screens/f9.txt
./ubuntu-installer/amd64/boot-screens/f6.txt
./ubuntu-installer/amd64/boot-screens/libcom32.c32
./ubuntu-installer/amd64/boot-screens/splash.png
./ubuntu-installer/amd64/pxelinux.cfg
./ubuntu-installer/amd64/pxelinux.cfg/default
./version.info

从输出内容可以看到ldlinux.c32 pxelinux.0 pxelinux.cfg 均是软链接到 ubuntu-installer/amd64 目录.所有资料和程序均在ubuntu-installer/amd64 目录统一管理和维护,这样有个好处就是,如果还需要支持其他操作系统类型,比如 CentOS/FreeBSD 等等,调整软链接就可以完成, 而不改变真是文件的内容.

pxelinux.0 是网卡引导文件,引导启动后依赖 ldlinux.c32 模块读取 pxelinux.cfg 目录下的配置文件, 然后根据 pxelinux.cfg/default 下的内容加载内核和内存盘, 这里可以以网卡的 mac 地址来命名, 作为特定硬件的启动配置文件, 执行特定的安装流程. PXE 启动过程以 网卡 mac 地址命名的配置文件优先.

从上面的输出我们可以找到./ubuntu-installer/amd64/linux文件,就是预编译好的内核.在硬件类型丰富服务器,我们当然是希望内核对硬件支持/功能支持越全面越好,但支持的越多, 内核的尺寸将越大, 加载过程中的 IO 耗时越长以及不必要的功能将造成更多额外性能开销.服务器或者虚拟机环境表现不是很明显,因为配置足够强大,但是对于嵌入式环境,其实这个影响就比较大了.有兴趣欢迎一起讨论下这块.

启动过程中的内存文件系统由./ubuntu-installer/amd64/initrd.gz存储, 该文件的叫法可能在不同机器上有区别, 有叫 initrd, 有叫 initramfs.均包含启动用户根文件系统之前的所有工具以及驱动.

Ubuntu 所有 menu 菜单文件介绍

./ubuntu-installer/amd64/boot-screens/f{1-9}.txt 文件是9 个帮助文档,便于了解如何操作和更改启动选项的内容.

./ubuntu-installer/amd64/boot-screens/rqtxt.cfg 文件是急救模式, 用于在异常情况下, 修复启动项或者修复 OS 配置, 这个对自动化装机, 暂时无用.

./ubuntu-installer/amd64/boot-screens/stdmenu.cfg 文件是对整个 menu 的 theme 的描述, 使用默认就好了, 不用调整.

./ubuntu-installer/amd64/boot-screens/syslinux.cfg 软链到 ./ubuntu-installer/amd64/pxelinux.cfg/default文件, 也即使整个启动配置的主文件.

./ubuntu-installer/amd64/boot-screens/prompt.cfg 提示或者帮助信息的菜单.

ubuntu-installer/amd64/boot-screens/exithelp.cfg 退出相关操作的帮助菜单.

ubuntu-installer/amd64/boot-screens/txt.cfg 是核心功能菜单文件, 我们后续的定制的配置即将放在这个文件中.对我们来说是最重要的文件.

ubuntu-installer/amd64/boot-screens/adtxt.cfg 高级选项菜单文件, 主要包含专家模式安装菜单.

ubuntu-installer/amd64/boot-screens/menu.cfg 整个菜单的核心文件, 整个主菜单界面的描述信息全在这个文件中.对于我们来说需要去掉不必要的一些选项, 添加一些我们需要的选项.

定制 ubuntu-installer/amd64/pxelinux.cfg/default

./ubuntu-installer/amd64/pxelinux.cfg/default文件, 该文件是 netboot 的核心文件,本质就是 grub 的配置文件, 用于描述 grub 启动菜单和内核引导相关的工作.

root@server:/var/lib/tftpboot# cat ./ubuntu-installer/amd64/pxelinux.cfg/default
# D-I config version 2.0
# search path for the c32 support libraries (libcom32, libutil etc.)
path ubuntu-installer/amd64/boot-screens/
include ubuntu-installer/amd64/boot-screens/menu.cfg
default ubuntu-installer/amd64/boot-screens/vesamenu.c32
prompt 0
timeout 0

我们看到./ubuntu-installer/amd64/pxelinux.cfg/default的配置都指向./ubuntu-installer/amd64/boot-screens目录下的文件,也就看到这个目录下的所有文件都是./ubuntu-installer/amd64/pxelinux.cfg/default的依赖文件, 我们要做的就是调整其中的子文件.

./ubuntu-installer/amd64/pxelinux.cfg/default文件用于描述整个 grub 配置.默认是没有超时自动执行默认选项机制的, 需要手动选择对应菜单, 对于装机自动化来说, 我们希望启动直接选中第一项菜单.

定制下该文件,将 timeout 设置为 3 秒,意思是启动过程中,停留 3 秒,然后自动执行默认菜单逻辑.官方默认配置是 Install菜单(通过命令行模式来完成安装过程).

# D-I config version 2.0
# search path for the c32 support libraries (libcom32, libutil etc.)
path ubuntu-installer/amd64/boot-screens/
include ubuntu-installer/amd64/boot-screens/menu.cfg
default ubuntu-installer/amd64/boot-screens/vesamenu.c32
prompt 0
timeout 3

定制 ubuntu-installer/amd64/boot-screens/menu.cfg

将高级菜单/帮助菜单/gtk 菜单取消掉, PXE 自动化装机我们用不上这些菜单逻辑, 修改后如下:

root@server:/var/lib/tftpboot# cat ubuntu-installer/amd64/boot-screens/menu.cfg
menu hshift 13
menu width 49
menu margin 8

menu title Installer boot menu
include ubuntu-installer/amd64/boot-screens/stdmenu.cfg
include ubuntu-installer/amd64/boot-screens/txt.cfg
#include ubuntu-installer/amd64/boot-screens/gtk.cfg
#menu begin advanced
#    menu title Advanced options
#    include ubuntu-installer/amd64/boot-screens/stdmenu.cfg
#    label mainmenu
#        menu label ^Back..
#        menu exit
#    include ubuntu-installer/amd64/boot-screens/adtxt.cfg
#    include ubuntu-installer/amd64/boot-screens/adgtk.cfg
#menu end
#label help
#    menu label ^Help
#    text help
#   Display help screens; type 'menu' at boot prompt to return to this menu
#    endtext
#    config ubuntu-installer/amd64/boot-screens/prompt.cfg

其中ubuntu-installer/amd64/boot-screens/gtk.cfg文件是缺失的, 我理解, 该文件应该是在 Desktop 镜像版本依赖的选项,但是在裁剪 Server 版本时文件删除了, 但是这个配置选项并未从ubuntu-installer/amd64/boot-screens/menu.cfg移除, 算是个小小的 bug, 不影响使用, 可以反馈到官方社区去掉不必要的内容.

定制 ubuntu-installer/amd64/boot-screens/txt.cfg

ubuntu-installer/amd64/boot-screens/txt.cfg菜单包含两部分, 标准安装部分和命令行安装部分, 其实对于 Server 版本镜像, 这两种选项实际是没太大区别的, 两个选项都将从命令行下开始安装.官方默认的配置我们都注释掉, 添加我们自己的配置, 更改后的配置如下:

root@server:/var/lib/tftpboot# cat ubuntu-installer/amd64/boot-screens/txt.cfg
default install
label install
  menu label ^Automatically Install Ubuntu 16.04
  kernel ubuntu-installer/amd64/linux
  append vga=788 initrd=ubuntu-installer/amd64/initrd.gz preseed/url=tftp://192.168.56.10/ubuntu-auto.seed net.ifnames=0 biosdevname=0 auto-install/enable=true debconf/priority=critical quiet --
#label install
#    menu label ^Install
#    menu default
#    kernel ubuntu-installer/amd64/linux
#    append vga=788 initrd=ubuntu-installer/amd64/initrd.gz --- quiet 
#label cli
#    menu label ^Command-line install
#    kernel ubuntu-installer/amd64/linux
#    append tasks=standard pkgsel/language-pack-patterns= pkgsel/install-language-support=false vga=788 initrd=ubuntu-installer/amd64/initrd.gz --- quiet

添加了几个特别的参数, preseed/url指向自动处理的 preseed 配置文件的路径, 参数有几个变种,比如preseed/url指向的是网络地址, 如 http/tftp等服务的资源定位路径, 也可以是preseed/file指向cdrom或者USB media.

auto-install/enable=truedebconf/priority=critical 是用于开启 debian 系列 OS 的自动安装模式, auto-install/enable=true并不能将所有选项都禁用掉,需要配合debconf/priority=critical才可以将一些低级别的配置选项的询问过程关闭.这些参数都有简写(auto=true和priority=critical), 建议还是写变量全名,简写模式其实很难分辨到底这个参数是内核自身依赖的还是 debian 安装器依赖的选项.

更多信息可参考 debian 的官方管理文档 Automating the installation using preseeding, 这里详细介绍了 debian 系列操作系统如何使用 preseeding 来完成自动化安装.

PXE Client 端验证 TFTP 配置

上述配置完成后, 就可以直接开启 "client" 虚拟机的电源,就可以看到 Ubuntu 16.04 在根据 preseed 文件的配置自动化安装, 还有很多的定制空间, 需要了解 debian 系列的 preseed 文件支持的所有指令, ubuntu-auto.seed 模板文件中也保留了大部分, 点击链接下载以便参考.

PXE Auto Install

到此我们一个基本的自动化 Ubuntu 系统装机环境就初步完成了.抽空在分享下 CentOS 系列 OS 基于 KickStart 的自动化安装环境的文章. 有任何问题欢迎邮件(linuxcoming@qq.com)沟通讨论.

192.168.56.10 是我们的前面安装的基于 Ubuntu 16.04 的 PXE Server 的 仅主机(Host-Only)网络网卡的 IP.

【腾讯云】境外1核2G服务器低至2折,半价续费券限量免费领取!
https://cloud.tencent.com/act/cps/redirect?redirect=1068&cps_key=e4b50f6c64a4480367f8a8d16fd07c5a&from=console

标签: netboot, tftpboot, pxelinux.cfg, default, seed

添加新评论