我已阅读了 curtin 和 autoinstall 文档,但无法理解为什么此 autoinstall 脚本在我的开发笔记本电脑上运行良好,而在我的 vbox 安装(Ubuntu 主机上的版本 7.0.8)上却无法运行。起初我以为问题出在对/dev/mmcblk0
(virtualbox 使用/dev/sda
)的引用上,但在进行了许多不同的配置后,我认为这实际上不是问题,因为它给出了错误消息。autoinstall config did not create needed bootloader partition
我的理论是,此自动安装在笔记本电脑上有效是因为笔记本电脑是 UEFI,但在 Virtualbox 上无效,因为它不是。我在其他地方找到了一些关于如何使适用于 UEFI 的自动安装在 MBR 上工作的建议,但没有一个可以同时完成两者。
这是自动安装分区布局的问题吗?有解决办法吗?由于这个项目的特定要求,我无法使用内置布局(lvm 等)。我知道我可以将 Virtualbox 设置更改为 EFI 启动,但这个 ISO 必须安装在各种各样的机器上,其中一些可能不支持 EFI。
这是我当前的分区布局,它在一台笔记本电脑上运行,设备位于/dev/mmcblk0
需要如何修改此脚本才能在任何系统上运行?是的,对于此设置,/boot 分区确实需要那么大。
autoinstall:
version: 1
storage:
config:
- ptable: gpt
wipe: superblock-recursive
preserve: false
name: ''
grub_device: false
type: disk
id: disk-mmcblk0
match:
size: largest
- device: disk-mmcblk0
size: 1127219200
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-mmcblk0
size: 5GB
wipe: superblock
number: 2
preserve: false
type: partition
id: partition-1
- fstype: ext4
volume: partition-1
preserve: false
type: format
id: format-1
- device: disk-mmcblk0
size: -1
wipe: superblock
number: 3
preserve: false
type: partition
id: partition-2
- volume: partition-2
key: password
path: /dev/mapper/dm_crypt-0
preserve: false
type: dm_crypt
id: dm_crypt-0
- name: ubuntu-vg
devices:
- dm_crypt-0
preserve: false
type: lvm_volgroup
id: lvm_volgroup-0
- name: ubuntu-lv
volgroup: lvm_volgroup-0
size: -1
wipe: superblock
preserve: false
path: /dev/ubuntu-vg/ubuntu-lv
type: lvm_partition
id: lvm_partition-0
- fstype: btrfs
volume: lvm_partition-0
preserve: false
type: format
id: format-2
- path: /
device: format-2
type: mount
id: mount-2
options: 'noatime,discard,compress=zstd:1'
- path: /boot
device: format-1
type: mount
id: mount-1
- path: /boot/efi
device: format-0
type: mount
id: mount-0
答案1
正如@AndrewLowther 指出的那样回答他的评论指出:
正式来说,您无法创建同时支持 BIOS 和 UEFI 的单一存储配置。 grub_device 设置不兼容。
因此你有两个选择:
user-data
使用 Andrew 建议的解决方法进行修改- 创建单独的
user-data
文件。一个用于 BIOS,一个用于 UEFI
下面我将概述第一个选项,这也是您想要的。这意味着它可以适用于 BIOS 或 UEFI 计算机。
首先,您user-data
提供的文件缺少#cloud-config
第一行和identity
部分。两者都是必需的,因此我在下面的示例中添加了它们。部分identity
使用默认用户名ubuntu
和密码定义ubuntu
。此外,加密驱动器的密码为ubuntu
。请进行相应更改。
下面的文件有几个user-data
与您的不同之处。
grub_device: true
设置为磁盘,而不是grub_device: false
- type: disk id: disk-mmcblk0 ptable: gpt match: size: largest preserve: false name: '' grub_device: true wipe: superblock-recursive
添加了一个小的未格式化的分区
flag: bios_grub
。- type: partition id: partition-0 device: disk-mmcblk0 size: 4194304 wipe: superblock flag: bios_grub number: 1 preserve: false grub_device: false
来自科廷文献关于bios_grub
:
如果 curtin 的主机系统已使用 UEFI 启动,则 curtin 会将 grub 安装到 esp 分区。如果系统安装介质已使用 MBR 启动,则 grub 将安装到磁盘的 MBR 上。但是,在具有 gpt 分区表的磁盘上,MBR 后没有足够的空间供 grub 存储其第二阶段 core.img,因此需要一个带有 bios_grub 标志的小型未格式化分区。此分区应放在磁盘的开头,大小应为 1MB。它不应包含文件系统或安装在系统上的任何位置。
grub_device: false
为所有分区设置,但 UEFI 安装使用的 ESP 分区除外。对于此分区,grub_device: UEFI
设置为。这实际上只是一个占位符,将使用 进行编辑early-commands
,如下所述。- type: partition id: partition-1 device: disk-mmcblk0 size: 111149056 wipe: superblock flag: boot number: 2 preserve: false grub_device: UEFI
early-commands
文件中的使用将根据计算机是 UEFI 还是 BIOS 来user-data
修改文件。这将修改上面定义的设置。autoinstall.yaml
grub_device: UEFI
请看以下内容:
early-commands:
- |
if [ -e "/sys/firmware/efi" ]; then
sed -i -e "s/grub_device: UEFI/grub_device: true/" /autoinstall.yaml
else
sed -i -e "s/grub_device: UEFI/grub_device: false/" /autoinstall.yaml
fi
这样做的目的是autoinstall.yaml
根据条件编辑文件。据我了解,该文件是在安装过程中创建的,位于 Live Installation 的根目录中。这是您的文件和安装程序填写的默认自动安装未回答/未配置问题autoinstall.yaml
的组合。user-data
检查文件是否/sys/firmware/efi
存在:
if [ -e "/sys/firmware/efi" ]; then
如果属实:
表示系统为 UEFI
替换
grub_device: UEFI
为grub_device: true
使用sed
:sed -i -e "s/grub_device: UEFI/grub_device: true/" /autoinstall.yaml
否则:
表示系统为 BIOS
替换
grub_device: UEFI
为grub_device: false
使用sed
:sed -i -e "s/grub_device: UEFI/grub_device: false/" /autoinstall.yaml
就这样。early-commands
运行后,安装将继续。
完整文件如下user-data
:
#cloud-config
autoinstall:
version: 1
identity:
hostname: ubuntu-server
password: $6$5lpwCLsKLEzMkSJc$keOAhA6aO/5RocGThmhVA7LSNuW911Rx5HHXFEa75oGK20cEdAAgn14H5f5nGeq6QgcSyLPrWcg1.JvjXbhrN/
realname: Ubuntu User
username: ubuntu
storage:
config:
- type: disk
id: disk-mmcblk0
ptable: gpt
match:
size: largest
preserve: false
name: ''
grub_device: true
wipe: superblock-recursive
- type: partition
id: partition-0
device: disk-mmcblk0
size: 4194304
wipe: superblock
flag: bios_grub
number: 1
preserve: false
grub_device: false
- type: partition
id: partition-1
device: disk-mmcblk0
size: 111149056
wipe: superblock
flag: boot
number: 2
preserve: false
grub_device: UEFI
- type: format
id: format-0
volume: partition-1
fstype: fat32
preserve: false
- type: partition
id: partition-2
device: disk-mmcblk0
size: 5GB
wipe: superblock
number: 3
preserve: false
grub_device: false
- type: format
id: format-1
volume: partition-2
fstype: ext4
preserve: false
- type: partition
id: partition-3
device: disk-mmcblk0
size: -1
wipe: superblock
number: 4
preserve: false
grub_device: false
- type: dm_crypt
id: dm_crypt-0
volume: partition-3
preserve: false
key: 'ubuntu'
- type: lvm_volgroup
id: lvm_volgroup-0
devices:
- dm_crypt-0
preserve: false
name: ubuntu-vg
- type: lvm_partition
id: lvm_partition-0
volgroup: lvm_volgroup-0
size: -1
preserve: false
wipe: superblock
name: ubuntu-lv
- type: format
id: format-2
volume: lvm_partition-0
fstype: btrfs
preserve: false
- type: mount
id: mount-0
device: format-0
path: /boot/efi
- type: mount
id: mount-1
device: format-1
path: /boot
- type: mount
id: mount-2
device: format-2
path: /
early-commands:
- |
if [ -e "/sys/firmware/efi" ]; then
sed -i -e "s/grub_device: UEFI/grub_device: true/" /autoinstall.yaml
else
sed -i -e "s/grub_device: UEFI/grub_device: false/" /autoinstall.yaml
fi
如果您在 UEFI 和 BIOS 计算机上安装,然后进行比较,您会注意到分区方案相同。UEFI 安装将有一个未使用的bios_grub
分区,而 BIOS 安装将有一个未使用的 ESP 分区安装在/boot/efi
。/boot/efi
在 BIOS 安装中将为空,而在 UEFI 安装中将有文件。
以下安装是使用 ISO 完成的:ubuntu-22.04.3-live-服务器-amd64.isouser-data
。这是解压后添加上述文件/nocloud
然后重新打包的。
EFI 安装:
$ sudo parted /dev/sda
GNU Parted 3.4
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 26.8GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 5243kB 4194kB bios_grub
2 5243kB 116MB 111MB fat32 boot, esp
3 116MB 5485MB 5369MB ext4
4 5485MB 26.8GB 21.4GB
$ lsblk -o name,fssize,fsused,fsavail,fstype,mountpoint
NAME FSSIZE FSUSED FSAVAIL FSTYPE MOUNTPOINT
loop0 53.4M 53.4M 0 squashfs /snap/snapd/19457
loop1 112M 112M 0 squashfs /snap/lxd/24322
loop2 63.5M 63.5M 0 squashfs /snap/core20/1974
sda
├─sda1
├─sda2 104.3M 6M 98.3M vfat /boot/efi
├─sda3 4.8G 129.6M 4.4G ext4 /boot
└─sda4 crypto_LUKS
└─dm_crypt-0 LVM2_member
└─ubuntu--vg-ubuntu--lv 19.9G 3G 16G btrfs /
$ df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 491M 1.1M 490M 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 20G 3.0G 17G 16% /
tmpfs 2.4G 0 2.4G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda3 4.9G 130M 4.5G 3% /boot
/dev/sda2 105M 6.1M 99M 6% /boot/efi
tmpfs 491M 4.0K 491M 1% /run/user/1000
$ ls /boot/efi
EFI
BIOS 安装:
$ sudo parted /dev/sda
GNU Parted 3.4
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 26.8GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 5243kB 4194kB bios_grub
2 5243kB 116MB 111MB fat32 boot, esp
3 116MB 5485MB 5369MB ext4
4 5485MB 26.8GB 21.4GB
$ lsblk -o name,fssize,fsused,fsavail,fstype,mountpoint
NAME FSSIZE FSUSED FSAVAIL FSTYPE MOUNTPOINT
loop0 63.5M 63.5M 0 squashfs /snap/core20/1974
loop1 53.4M 53.4M 0 squashfs /snap/snapd/19457
loop2 112M 112M 0 squashfs /snap/lxd/24322
sda
├─sda1
├─sda2 104.3M 512B 104.3M vfat /boot/efi
├─sda3 4.8G 128.6M 4.4G ext4 /boot
└─sda4 crypto_LUKS
└─dm_crypt-0 LVM2_member
└─ubuntu--vg-ubuntu--lv 19.9G 3G 16G btrfs /
$ df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 492M 1.1M 491M 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 20G 3.0G 17G 16% /
tmpfs 2.4G 0 2.4G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda3 4.9G 129M 4.5G 3% /boot
/dev/sda2 105M 512 105M 1% /boot/efi
tmpfs 492M 4.0K 492M 1% /run/user/1000
$ ls /boot/efi