Environment:

Host: Ubuntu 20.04.1, Oracle VM VirtualBox Manager

第一步,创建一个虚拟机

vboxmanage 没什么好说的,读文档

首先要创建一个 natnetwork

然后根据 build.sh 的参数决定虚拟机的名称。创建虚拟磁盘并加载

第二步,准备 PXE 启动环境

首先搭一个 tftp 服务器,在里面准备:

1
2
3
4
5
6
pxelinux.0
pxelinux.cfg/default
jammy/vmlinuz
jammy/initrd
jammy/meta-data
jammy/user-data

挂一个 http 服务器,在里面准备:

1
2
3
4
ubuntu.iso
ssh/id_rsa
ssh/id_rsa.pub
id.conf # 返回机器编号的 nginx configuration

问题一,我在 Ubuntu 20.04.3 上 apt download pxelinux 解包得到的 pxelinux.0 6.0.4,在 PXE 启动后就中止了,界面停留在

1
PXELINUX 6.04 PXE 20190223 Copyright (C) 1994-2014 H. Peter Anvin et al

既不运行,也不报错。无论我如何写 .cfg,也没有用。在经过几小时的反复横跳后,我从 mirror 上随便找了一个 6.03,顺利启动了。。。

为了让每台机器配置的时候带上自己的机器编号(如 ip 配置所需要的),我把 tftp 服务器下的目录结构又改了一下:

image-20221028174547322

每个 vm-id 目录都是在 build.sh id 运行时自动生成。共用的文件用硬链接(tftp不识别软链接),需要修改的配置文件,用一个变量名把需要修改的地方标注,然后用 sed 替换为与各自的 id 相关的字符串。

自动安装的 user-data,主要是配置 hostname, username, password, ssh 等。以及安装后需要执行的命令。这里用 echo 创建了 systemd service,以及开机自动执行的脚本。

开机配置 ip 和 ssh 的公私钥,通过 systemd 执行一个脚本。

返回机器 id 的 http 服务器,我安装了 nginx 。配置文件在自动安装时用 wget 获取了。

image-20221028180406208