基于Ubuntu 20.04 Server搭建PXE自动安装环境
Ubuntu 在不断进化,从20.04开始,Ubuntu决定更新实时服务器安装程序,只用Subiquity就能完全完成操作系统及附加程序的自动安装。以前用的kickstart、debian-installer都不是Ubuntu自家技术,用起来也不是很方便。
同时,PXE虽然出来很久了,但是整个安装过程还不是特别顺畅,随着Ubuntu 升级到20.04,使用cloud-init的配置实现Subiquity 参数的自动填写,整个过程变得些微优雅起来,让我有较大兴趣尝试使用PXE安装Ubuntu 20.04 Server。
本文,我想讲的是在Ubuntu 20.04 Server上搭建一套自动安装Ubuntu 20.04 Server的部署环境,其主要内容有两部分:
- 使用PXE自动从网络加载安装程序,发起安装。
- 使用Ubuntu的自动安装功能,自动加载cloud-init安装配置,完成操作系统的自动选择。
PXE 安装流程
PXE(Pre-boot Execution Environment/预启动执行环境)的实现依赖于网卡,只有支持PXE Client的网卡才能实现网络自动安装。这种网卡实现DHCP Client和 TFTP Client,在BIOS的引导下通过DHCP协议自动分配IP地址,通过TFTP获取最小内核,然后在最小内核环境下通过HTTP协议或NFS协议获取Ubuntu安装版本。之后最小内核引导进行Ubuntu 20.04的安装。下图是详细的安装流程。
文章图片
上图有几个前提:
- 网卡支持PXE,今年新出的网卡基本都支持,同时BIOS的启动项也要配置,请大家自行研究。
- UEFI启动才会请求bootx64.efi,如果是传统启动模式(Legacy),那么PXE Client会请求pxelinux.0。
- 可以采用nfsboot方式,这个流程采用的是iso镜像下载再安装的方式。
- 安装DHCP、TFTP服务器
dnsmasq同时实现了DHCP、TFTP、DNS三种服务器sudo apt-get install dnsmasq
- 安装HTTP服务器
HTTP Server有很多,大家可以使用自己的熟悉的服务器如nginx,这里使用的是apache2sudo apt-get install apache2
- 下载uefi 引导文件,shim.signed 安全启动链加载的引导程序
apt-get download shim.signed
- 下载ubuntu 20.04 server iso
这个直接去官网下载,我下载的是 ubuntu-20.04.2-live-server-amd64.iso,需要注意的是只有live版本才能支持subiquityhttps://ubuntu.com/download/server
TFTP 文件夹是TFTP服务的根目录,PXE启动过程中下载的文件都存在在该目录中
tftp/
├── boot
│└── live-server
│├── initrd
│└── vmlinuz
└── grub
├── bootx64.efi
├── font.pf2
└── grub.cfg
说明
- bootx64.efi 引导程序,来自shim.signed 安装包
- grub.cfg 自建
- 其他文件来自 ubuntu安装包
- 五个文件是需要的,但是目录结构是我自建的,大家可以根据自己的喜好修改
mkdir /home/mine/tftp
mkdir /home/mine/tftp/grub
mkdir /home/mine/tftp/boot
mkdir /home/mine/tftp/boot/live-server
获取引导文件
- 在安装包下载目录创建一个shim文件夹
- 解压安装包到shim文件夹
dpkg -xshim
- 拷贝引导文件到tftp目录
cp ./shim/usr/lib/shim/shimx64.efi.signed/home/mine/tftp/grub/bootx64.efi
获取内核镜像文件
- 在下载目录mount iso文件
sudo mount ubuntu-20.04.2.0-desktop-amd64.iso /media
系统会提示只读,不影响使用
mount: /media: WARNING: device write-protected, mounted read-only.
- 拷贝内核镜像文件
cp /media/casper/initrd/home/mine/tftp/boot/live-server
cp /media/casper/vmlinuz/home/mine/tftp/boot/live-server
- 拷贝grub文件
grub.cfg拷贝过来做个参考,内容会被全部修改掉
cp /media/grub/font.pf2/home/mine/tftp/grub cp /media/grub/grub.cfg/home/mine/tftp/grub
关键配置有以下几个
- 配置DHCP 地址段
- 配置引导文件目录
- 配置tftp 根目录
- 配置日志路径
- 配置服务网卡,多网卡机器需关注
# 配置外网DNS服务器地址
server=114.114.114.144# 指定服务的网卡
interface=enp2s0,lo# 绑定端口
bind-interfaces# 设置DHCP分发IP端范围、地址掩码、IP地址有效时间
dhcp-range=192.168.1.100,192.168.1.150,255.255.255.0,12h# 指定网关地址和安装无关,应该可以不配置
dhcp-option=3,192.168.1.9# 指定DNS服务器地址和安装无关,应该可以不配置
dhcp-option=6,114.114.114.114# 设置引导程序相对tftp根目录的路径
dhcp-match=set:efi-x86_64,option:client-arch,7
dhcp-boot=tag:efi-x86_64,grub/bootx64.efi# 打开tftp服务
enable-tftp# 设置tftp根路径
tftp-root=/home/mine/tftp# 设置日志路径
log-facility=/var/log/dnsmasq.log
创建HTTP文件夹
apache2的默认服务根目录是 /var/www/html,不修改他,在他下面创建目录
html/
├── autoinstall
│├── meta-data
│└── user-data
├── index.html
└── iso
└── ubuntu-20.04.2-live-server-amd64.iso
说明
- autoinstall 目录存放参数自动配置文件,user-data、meta-data是cloud-init要求的文件名
- iso 目录存放 操作系统镜像文件
mkdir /var/www/html/autoinstall
mkdir /var/www/html/iso
拷贝iso文件 【基于Ubuntu 20.04 Server搭建PXE自动安装环境】到下载目录拷贝iso文件
cp ubuntu-20.04.2-live-server-amd64.iso /var/www/html/iso
创建参数自动配置文件 先创建空文件,meta-data无需修改,user-data后续章节会详细描述配置
touch /var/www/html/autoinstall/user-data
touch /var/www/html/autoinstall/meta-data
配置grub.cfg
if loadfont /grub/font.pf2 ;
then
set gfxmode=auto
insmod efi_gop
insmod efi_uga
insmod gfxterm
terminal_output gfxterm
fiset menu_color_normal=white/black
set menu_color_highlight=black/light-gray
set timeout=5menuentry "Ubuntu server 20.04 autoinstall" {
set gfxpayload=keep
linux/boot/live-server/vmlinuz root=/dev/ram0 ramdisk_size=1500000 ip=dhcp url='http://192.168.1.9/iso/ubuntu-20.04.2-live-server-amd64.iso' autoinstall ds=nocloud-net\;
s=http://192.168.1.9/autoins
tall/ ---
initrd /boot/live-server/initrd
}
menuentry 之前是配置样式,也可以删除,重点关注
menuentry "Ubuntu server 20.04 autoinstall"
内的配置。
- 指定镜像文件相对于tftp根目录的路径 /boot/live-server/initrd
- root=/dev/ram0 ramdisk_size=1500000 为了指定内核镜像挂载空间,是否可删除待确认
- ip=dhcp 指定内核镜像挂载后使用DHCP 获取IP地址
- url= 指定ISO文件的网络存放路径
- 'autoinstall ds=nocloud-net\; s=http://192.168.1.9/autoinstall/ ---' 该配置指明参数自动填写,并指明配置文件所在路径
ds=nocloud-net;
s=http://192.168.1.9/autoinstall/
,我试了很多次,都没有自动安装。在网上查到,由于UEFI启动使用了grub,grub将; 识别为了特殊字符,所以要在; 前加\转义。
配置user-data
#cloud-config
autoinstall:
version: 1
# 修改apt 服务地址
apt:
primary:
- arches: [default]
uri: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
user-data:
# 配置时区
timezone: Asia/Shanghai
# 去使能 root账号
disable_root: true
# 配置用户
identity:
hostname: ubuntu-server
password: "yours"
username: ubuntu
# 配置键盘
keyboard: {layout: us, variant: ''}
locale: en_US.UTF-8
# 配置代理
proxy: http://192.168.1.112:3128
# 默认安装ssh server
ssh:
install-server: true
# 指定安装的包
packages:
- net-tools
- python3-pip
# 配置磁盘分区
storage:
grub:
reorder_uefi: False
config:
- {ptable: gpt, path: /dev/sda, wipe: superblock-recursive, preserve: false, name: '',
grub_device: false, type: disk, id: disk-sda}
- {device: disk-sda, size: 536870912, wipe: superblock, flag: boot, number: 1,
preserve: false, grub_device: true, type: partition, id: partition-0}
- {fstype: fat32, volume: partition-0, preserve: false, type: format, id: format-0}
- {device: disk-sda, size: -1, wipe: superblock, flag: '', number: 2,
preserve: false, type: partition, id: partition-1}
- {fstype: ext4, volume: partition-1, preserve: false, type: format, id: format-1}
- {device: format-1, path: /, type: mount, id: mount-1}
- {device: format-0, path: /boot/efi, type: mount, id: mount-0}
说明
- 密码需要加密,可以先用工具对自己的密码进行加密后填入
- 代理不是必须的配置,与网络拓扑有关
- 磁盘分区配置要注意,配置不对会导致自动安装走不下去,提示crash;这个配置的整体思路是先格式化disk-sda,然后在disk-sda下划分/dev/sda1 、/dev/sda2 ,然后分别mount /,/boot/efi目录
- 安装过程日志在 /var/log/installer/,如果安装失败可以通过nc 等工具实时发出去
- 我在电脑上搭建了DHCP、TFTP、HTTP三种服务
- 我在代理机上搭建了squid,作为HTTP代理
- 目标机器不能上网,三台机器在同一个局域网
文章图片
鸣谢
- 文章的基石来自Grffion,没有这篇文章我会摸索更长时间
- 这篇讨论askubuntu解决了坑
- user-data磁盘分区配置来自 小崔
- 原创不易,转载请与我联络
- 有问题请回帖,有空就会回复
推荐阅读
- 基于微信小程序带后端ssm接口小区物业管理平台设计
- 基于|基于 antd 风格的 element-table + pagination 的二次封装
- 基于爱,才会有“愿望”当“要求”。2017.8.12
- VM|VM ware 的 harbor 私有仓库搭建 (Ubuntu16.04)
- javaweb|基于Servlet+jsp+mysql开发javaWeb学生成绩管理系统
- JavaScript|vue 基于axios封装request接口请求——request.js文件
- 韵达基于云原生的业务中台建设 | 实战派
- EasyOA|EasyOA 基于SSM的实现 未完成总结与自我批判
- 基于stm32智能风扇|基于stm32智能风扇_一款基于STM32的智能灭火机器人设计
- stm32|基于STM32和freeRTOS智能门锁设计方案