搭建基于 Ubuntu 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 的部署环境,其主要内容有两部分:

第一部分所有操作系统应该都是一样的,第二部分和 Ubuntu 20.04 版本紧密相关,其他的操作系统需要考虑其他方法。

PXE 安装流程

PXE(预启动执行环境Pre-boot Execution Environment)的实现依赖于网卡,只有支持 PXE 客户端的网卡才能实现网络自动安装。这种网卡实现了 DHCP 客户端和 TFTP 客户端,在 BIOS 的引导下通过 DHCP 协议自动分配 IP 地址,通过 TFTP 获取最小内核,然后在最小内核环境下通过 HTTP 协议或 NFS 协议获取 Ubuntu 安装版本。之后最小内核引导进行 Ubuntu 20.04 的安装。

下图是详细的安装流程。

上图有几个前提:

安装必须的服务端软件

准备启动文件

  • 下载 Ubuntu 20.04 Server ISO 镜像

    直接去官网下载,我下载的是 ubuntu-20.04.2-live-server-amd64.iso,需要注意的是只有 Live 版本才能支持 subiquity。

  • 创建 TFTP 文件夹

    TFTP 文件夹是 TFTP 服务的根目录,PXE 启动过程中下载的文件都存在在该目录中:

    1. tftp
    2. ├── boot
    3. │   └── live-server
    4. │   ├── initrd
    5. │   └── vmlinuz
    6. ├── grub
    7. │   ├── bootx64.efi
    8. │   ├── font.pf2
    9. │   └── grub.cfg
    10. └── grubx64.efi

    说明:

    创建目录

    在 /home/mine(可根据实际情况修改)目录下创建 tftp 目录:

    1. mkdir /home/mine/tftp
    2. mkdir /home/mine/tftp/grub
    3. mkdir /home/mine/tftp/boot
    4. mkdir /home/mine/tftp/boot/live-server

    获取引导文件

    1. cp ./sgrub/usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed /home/mine/tftp/grubx64.efi
    2. cp ./shim/usr/lib/shim/shimx64.efi.signed /home/mine/tftp/grub/bootx64.efi

    获取内核镜像文件

    系统会提示只读,不影响使用。

    1. mount: /media: WARNING: device write-protected, mounted read-only.
  • 拷贝内核镜像文件
    1. cp /media/casper/initrd /home/mine/tftp/boot/live-server
    2. cp /media/casper/vmlinuz /home/mine/tftp/boot/live-server
  • 拷贝 grub 文件

    grub.cfg 拷贝过来做个参考,内容会被全部修改掉。

    1. cp /media/grub/font.pf2 /home/mine/tftp/grub
    2. cp /media/grub/grub.cfg /home/mine/tftp/grub
  • 配置 dnsmasq

    关键配置有以下几个:

    1. # 配置外网 DNS 服务器地址
    2. server=114.114.114.144
    3.  
    4. # 指定服务的网卡
    5. interface=enp2s0,lo
    6.  
    7. # 绑定端口
    8. bind-interfaces
    9.  
    10. # 设置 DHCP 分发 IP 端范围、地址掩码、IP 地址有效时间
    11. dhcp-range=192.168.1.100,192.168.1.150,255.255.255.0,12h
    12.  
    13. # 指定网关地址
    14. # 和安装无关,应该可以不配置
    15. dhcp-option=3,192.168.1.9
    16.  
    17. # 指定 DNS 服务器地址
    18. # 和安装无关,应该可以不配置
    19. dhcp-option=6,114.114.114.114
    20.  
    21. # 设置引导程序相对 tftp 根目录的路径
    22. dhcp-match=set:efi-x86_64,option:client-arch,7
    23. dhcp-boot=tag:efi-x86_64,grub/bootx64.efi
    24.  
    25. # 启用 tftp 服务
    26. enable-tftp
    27.  
    28. # 设置 tftp 根路径
    29. tftp-root=/home/mine/tftp
    30.  
    31. # 设置日志路径
    32. log-facility=/var/log/dnsmasq.log

    修改配置后,重启 dnsmasq 服务才能生效。

    创建 HTTP 文件夹

    Apache2 的默认服务根目录是 /var/www/html,在其下创建目录:

    1. html/
    2. ├── autoinstall
    3. │   ├── meta-data
    4. │   └── user-data
    5. ├── index.html
    6. └── iso
    7. └── ubuntu-20.04.2-live-server-amd64.iso

    说明:

    创建目录

    1. mkdir /var/www/html/autoinstall
    2. mkdir /var/www/html/iso

    拷贝 ISO 文件

    到下载目录拷贝 ISO 文件:

    1. cp ubuntu-20.04.2-live-server-amd64.iso /var/www/html/iso

    创建参数自动配置文件

    先创建空文件,meta-data 无需修改,user-data 后续会详细描述配置。

    1. touch /var/www/html/autoinstall/user-data
    2. touch /var/www/html/autoinstall/meta-data

    配置 grub.cfg

    1. if loadfont /grub/font.pf2 ; then
    2. set gfxmode=auto
    3. insmod efi_gop
    4. insmod efi_uga
    5. insmod gfxterm
    6. terminal_output gfxterm
    7. fi
    8.  
    9. set menu_color_normal=white/black
    10. set menu_color_highlight=black/light-gray
    11. set timeout=5
    12.  
    13. menuentry "Ubuntu server 20.04 autoinstall" {
    14. set gfxpayload=keep
    15. 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
    16. tall/ ---
    17. initrd /boot/live-server/initrd
    18. }
    19.  

    menuentry 之前是配置样式,也可以删除,重点关注 menuentry "Ubuntu server 20.04 autoinstall" 内的配置:

    网上很多文章配置是这么写的 ds=nocloud-net;s=http://192.168.1.9/autoinstall/,我试了很多次,都没有自动安装。

    在网上查到,由于 UEFI 启动使用了 grub,它将 ; 识别为了特殊字符,所以要在 ;前加 \ 转义。

    配置 user-data

    1. #cloud-config
    2. autoinstall:
    3. version: 1
    4. # 修改apt 服务地址
    5. apt:
    6. primary:
    7. - arches: [default]
    8. uri: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
    9. user-data:
    10. # 配置时区
    11. timezone: Asia/Shanghai
    12. # 去使能 root账号
    13. disable_root: true
    14. # 配置用户
    15. identity:
    16. hostname: ubuntu-server
    17. password: "yours"
    18. username: ubuntu
    19. # 配置键盘
    20. keyboard: {layout: us, variant: ''}
    21. locale: en_US.UTF-8
    22. # 配置代理
    23. proxy: http://192.168.1.112:3128
    24. # 默认安装ssh server
    25. ssh:
    26. install-server: true
    27. # 指定安装的包
    28. packages:
    29. - net-tools
    30. - python3-pip
    31. # 配置磁盘分区
    32. storage:
    33. grub:
    34. reorder_uefi: False
    35. config:
    36. - {ptable: gpt, path: /dev/sda, wipe: superblock-recursive, preserve: false, name: '',
    37. grub_device: false, type: disk, id: disk-sda}
    38. - {device: disk-sda, size: 536870912, wipe: superblock, flag: boot, number: 1,
    39. preserve: false, grub_device: true, type: partition, id: partition-0}
    40. - {fstype: fat32, volume: partition-0, preserve: false, type: format, id: format-0}
    41. - {device: disk-sda, size: -1, wipe: superblock, flag: '', number: 2,
    42. preserve: false, type: partition, id: partition-1}
    43. - {fstype: ext4, volume: partition-1, preserve: false, type: format, id: format-1}
    44. - {device: format-1, path: /, type: mount, id: mount-1}
    45. - {device: format-0, path: /boot/efi, type: mount, id: mount-0}
    46.  

    说明:

    网络拓扑

    配置静态 IP

    在服务机开始服务前,需要在提供服务的网卡上配置静态 IP,Ubuntu 20.04 配置 netplan 即可,参考以下配置修改文件 /etc/netplan/00-installer-config.yaml,修改完成后执行 netplan apply 配置即可生效。

    1. # This is the network config written by 'subiquity'
    2. network:
    3. ethernets:
    4. enp2s0:
    5. addresses:
    6. - 192.168.1.9/24
    7. gateway4: 192.168.1.1
    8. nameservers:
    9. addresses:
    10. - 114.114.114.114
    11. search:
    12. - 114.114.114.114

    鸣谢

    相关内容