重新打包DebianISO实现无人应答安装(UEFI+BIOS)

之前我写过打包DebianISO的文章,但是那种打包的方法只能用在引导是BIOS的机器上,按照正常的情况,应该是UEFI+BIOS同时支持。

正好前两天给甲骨文重装系统的时候需要重新打包支持UEFI的ISO用作本地测试,所以这里把UEFI的打包过程也记录一下。

Debian的无人应答安装难就难在preseed的配置,因为没有一个完整的文档可以参考,基本上只能自己一个配置一个配置的去试,少一个配置可能就会在安装的界面弹提示框,出了提示框就不能实现无人应答安装了。

不过好在我之前已经折腾出了一个Debian10可以完美用的preseed配置,所以在甲骨文的机器上装,只需要做一下关于UEFI的支持即可。

所以这也就是为啥要在本地测试的原因,先在虚拟机内跑,虚拟机没问题了再放到甲骨文上试。不过即便是这样我也还是翻车了很多次,甲骨文的机器也删了很多台。。这里就不细说了。。

安装打包需要用到的工具:

apt -y update
apt -y install xorriso isolinux syslinux-utils p7zip-full

下载debian的iso并解压:

wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-10.9.0-amd64-netinst.iso
7z x debian-10.9.0-amd64-netinst.iso -oimlala

把install.amd目录给写权限:

chmod +w -R imlala/install.amd

解压出initrd:

gunzip imlala/install.amd/initrd.gz

bios和uefi引导需要修改的文件不同,这里只记录uefi引导需要修改的位置,bios引导的可以参考我之前的文章。

首先需要把iso内关于uefi引导的grub配置进行修改,编辑如下文件:

nano imlala/boot/grub/grub.cfg

设置一个超时时间,这里我设置为5秒,默认情况下是没有超时的,也就是说当iso挂载上去后,菜单内必须要人工手动去选择,为了实现无人应答安装,必须设置超时,过了超时时间让iso自动进入相应的grub菜单:

set timeout=5

然后把图形化安装菜单和文本安装菜单的位置调换一下,默认是图形化安装在grub菜单的第一位,为啥要调换位置?因为图形化菜单是不支持preseed的:

menuentry --hotkey=i 'Install' {
set background_color=black
linux    /install.amd/vmlinuz vga=788 --- quiet
initrd   /install.amd/initrd.gz
}
menuentry --hotkey=g 'Graphical install' {
set background_color=black
linux    /install.amd/vmlinuz vga=788 --- quiet
initrd   /install.amd/gtk/initrd.gz
}

具体改动的位置:

然后就是老套路了,新建一个preseed配置文件:

nano preseed.cfg

写入你需要的配置,下面这个配置是我经过测试的,目前可以用在debian10.9上:

# 配置语言
d-i debian-installer/locale string en_US
# 配置键盘
d-i keyboard-configuration/xkb-keymap select us
# 使用自动的方式配置网络(DHCP)
d-i netcfg/choose_interface select auto
# 配置hostname和domain
d-i netcfg/get_hostname string unassigned-hostname
d-i netcfg/get_domain string unassigned-domain
d-i netcfg/hostname string imlala
# 配置软件源
d-i mirror/country string manual
d-i mirror/http/hostname string ftp.jp.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string
# 开启root登录并设置root密码,关闭普通用户创建
d-i passwd/root-login boolean true
d-i passwd/make-user boolean false
d-i passwd/root-password password 123456
d-i passwd/root-password-again password 123456
# 设置时区为东八区
d-i clock-setup/utc boolean true
d-i time/zone string Asia/Shanghai
d-i clock-setup/ntp boolean false
# 硬盘分区,注意/dev/sda这里的设备名,要改为你自己的设备名,一般虚拟机如VMware/VirtualBox都是这个设备名
d-i partman-auto/disk string /dev/sda
d-i partman-auto/method string regular
# 手动划分分区大小
d-i partman-auto/expert_recipe string         \
boot-root ::                                \
1 1 1 free                                \
$bios_boot{ }                           \
method{ biosgrub }                      \
.                                         \
256 2 256 fat32                           \
$primary{ }                             \
$iflabel{ gpt }                         \
$reusemethod{ }                         \
method{ efi } format{ }                 \
mountpoint{ /boot/efi }                 \
.                                         \
512 3 512 ext4                            \
$primary{ }                             \
$bootable{ }                            \
method{ format } format{ }              \
use_filesystem{ } filesystem{ ext4 }    \
mountpoint{ /boot }                     \
.                                         \
1024 5 1024 linux-swap                    \
$primary{ }                             \
method{ swap } format{ }                \
.                                         \
1 4 -1 ext4                               \
$primary{ }                             \
method{ format } format{ }              \
use_filesystem{ } filesystem{ ext4 }    \
mountpoint{ / }                         \
.                                         \
# 因甲骨文的机器是efi引导,所以这里强制使用gpt分区表
d-i partman-efi/non_efi_system boolean true
d-i partman-partitioning/choose_label string gpt
d-i partman-partitioning/default_label string gpt
# 如果硬盘内之前有lvm或是raid的分区,全部删除
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/device_remove_lvm boolean true
# 下面的这些配置可以做到没有交互式的完成硬盘分区
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
# 禁止在安装的时候弹出CD/DVD扫描提示
d-i apt-setup/non-free boolean true
d-i apt-setup/contrib boolean true
d-i apt-setup/cdrom/set-first boolean false
d-i apt-setup/cdrom/set-next boolean false
d-i apt-setup/cdrom/set-failed boolean false
# 软件包选择
tasksel tasksel/first multiselect standard
# 安装额外的软件包,不更新系统
d-i pkgsel/include string openssh-server
d-i pkgsel/upgrade select none
# 禁止在安装的时候弹出popularity
popularity-contest popularity-contest/participate boolean false
# grub安装
d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean true
d-i grub-installer/bootdev string default
# 安装完成之后不要弹出安装完成的界面,直接重启
d-i finish-install/reboot_in_progress note
# 允许ssh服务使用root用户登录
d-i preseed/late_command string in-target sed -i 's/#PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config

这里详细说一下关于手动分区的配置,可能很多人不理解分区这块的配置。

分区那里的三个数字,比如说512 3 512,第一个512代表最小分区大小,第二个数字代表优先级,数字越小表示优先级越高,第三个数字代表最大分区大小。如果第三个数字设置为-1就代表剩下的空间全部划分给这个分区。

然后尤其注意这个配置:

d-i partman-efi/non_efi_system boolean true

如果在preseed内配置了这个BIOS引导直接失效,它将强制使用UEFI引导,所以如果你要UEFI+BIOS同时支持,这个配置需要从preseed中删除。

接下来把改好的配置内嵌到initrd:

echo preseed.cfg | cpio -H newc -o -A -F imlala/install.amd/initrd

重新压缩initrd:

gzip imlala/install.amd/initrd

还原install.amd目录之前的权限:

chmod -w -R imlala/install.amd

最后重新打包iso:

xorriso -as mkisofs \
-isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin \
-c isolinux/boot.cat \
-b isolinux/isolinux.bin \
-no-emul-boot \
-boot-load-size 4 \
-boot-info-table \
-eltorito-alt-boot \
-e boot/grub/efi.img \
-no-emul-boot \
-isohybrid-gpt-basdat \
-o preseed-debian-10.9.0-amd64-netinst.iso \
imlala

在虚拟机上启用uefi引导:

测试安装,文本安装选项在第一启动位:

等待5秒超时过后,自动安装开始:

参考文献:

https://wiki.syslinux.org/wiki/index.php?title=Isohybrid
https://wiki.debian.org/DebianInstaller/Preseed/EditIso

全部为采集文章,文中的 联系方式 均不是 本人 的!

发表评论