我正在尝试配置 Ubuntu 18.04.2 的预置无人值守安装。我们的系统使用 Intel iwlwifi 驱动程序,设备名称为 wlp2s0。我们的无线使用 WPA 和 WPA2 Enterprise 安全性,采用 PEAP 身份验证,无证书。我输入用户名和密码来验证无线路由器。
我需要预先设定的措辞来允许这样做。如果没有网络连接,我的安装会在尝试访问镜像进行下载时失败。有人可以帮忙吗?
答案1
我希望您熟悉其中的许多步骤,因为您已经预先设定了。我仍在努力使这成为一个全面的答案。
请注意,该答案的主要部分将涉及 WPA2 网络,而不是关注 PEAP。
preseed/netcfg
不起作用
以下安装程序组件的预置密钥将不会在 Ubiquity 中使用,通常是因为它们不符合 Ubiquity 的操作模式:
网络配置
LVM 和 RAID 分区
基础安装程序
pkgsel/tasksel
完成安装来源:UbiquityAutomation(最后由 tsimonq2 于 2019-07-12 07:07:21 编辑)
从日志中/var/log/installer/debug
我可以告诉你,这似乎netcfg/get_hostname
仍在考虑之中。不过,这意味着我们不能像在旧版本中那样在预置文件中指定连接,例如
# wlp3s0b1 would be the device-specific wifi interface
d-i netcfg/choose_interface select wlp3s0b1
d-i netcfg/wireless_show_essids select manual
d-i netcfg/wireless_essid string myWifiName
d-i netcfg/wireless_essid_again string myWifiName
d-i netcfg/wireless_security_type select wpa
preseed/early_command
不起作用
preseed/early_command
从 casper 执行。我尝试从那里连接到 wifi,但命令似乎还不起作用。
当然preseed/late_command
对我们来说也不起作用,因为它发生在镜像设置之后。但是如果你在安装后只需要互联网来执行其他一些后期命令,那么这种方式会比我将要解释的更容易。
修改 Ubiquity 安装程序以提供第三种选择
笔记
Evan 需要添加一个“比早期命令稍晚”的预置变量,以便测试脚本可以在桌面可用时运行。UbiquityAutomation
(最后由 tsimonq2 于 2019-07-12 07:07:21 编辑)
好吧,Evan 不在,所以我们自己做吧!
安装原始 Iso 并预置
# mount iso readonly because it is readonly anyhow
sudo mount -o loop -t iso9660 ~/ubuntu.iso /mnt/myiso -o ro
# copy data to a writeable directory
mkdir ~/Downloads/iso.new
cp -ra /mnt/myiso/* ~/Downloads/iso.new
iso.new/preseeding
应用您通常的预置。我通过添加我在 中的启动参数中引用的文件来实现这一点iso.new/isolinux/isolinux.cfg
。
这是我的isolinux.cfg
。我没有修改它的开头,只是附加了从 开始的部分label install
。您也可以在menu.cfg
或中执行此txt.cfg
操作(这会被传递包含)。在这些文件中,您还应该找到可以用作模型的类似条目。
# file ~/Downloads/iso.new/isolinux/isolinux.cfg
path
include menu.cfg
default install
prompt 1
timeout 50
ui gfxboot bootlogo
label install
menu label ^LucidBrot 18.04. Hello World
kernel /casper/vmlinuz
append auto=true file=/cdrom/preseed/my.seed boot=casper debug-ubiquity automatic-ubiquity initrd=/casper/initrd DEBCONF_DEBUG=5 debian-installer/locale=en_US.UTF-8 keyboard-configuration/layoutcode=ch languagechooser/language-name=English countrychooser/shortlist=CH localechooser/supported-locales=en_US.UTF-8
请注意,即使我将从 USB 启动,路径前缀仍为/cdrom
。
另请注意,您不需要所有这些选项。您可以安全地删除任何语言或键盘选项。两个调试选项是可选的,但有助于记录日志。其余的都很重要,包括automatic-ubiquity
。
当然,应该file=
指向你的预置文件。
文件系统术语
有多个文件系统。
- 运行所有这些命令的文件系统
- 我们挂载了 iso
/mnt/myiso
并将 的内容复制到~/Downloads/iso.new
。它包含一些引导加载程序的信息。 - 该
~/Downloads/iso.new/casper/initrd
文件包含初始 RAM 文件系统,当您在 grub 中选择“安装 Ubuntu”时,该文件将被启动。 - 包含压缩文件系统的文件
~/Downloads/iso.new/casper/filesystem.squashfs
。在 initramfs 中完成一些初始设置后,将进入此文件系统。设置完成后,可以按CtrlAltF2(或F3) 并输入ubuntu
用户名来登录 tty。squashfs 包含 ubiquity 的脚本 - 安装程序。
# isohybrid and unmksquashfs
sudo apt-get install syslinux-utils squashfs-tools
# unpack the squashfs to a new dir
mkdir ~/Downloads/squashy && cd ~/Downloads/squashy
sudo unsquashfs ~/Downloads/iso.new/casper/filesystem.squashfs
# now we have a new directory "squashfs-root"
修改普遍性
根据脚本的数量,我们有几个选项,~/Downloads/squashy/squashfs-root/
但我会选择插件管理器,因为它恰好执行得相当早:在 debian-installer 获取语言环境之前,但肯定在 initramfs 部分之后。可以通过添加打印语句和查看来验证/var/log/installer/debug
。
因此打开~/Downloads/squashy/squashfs-root/usr/bin/lib/ubiquity/ubiquity/plugin_manager.py
(我想以 root 身份打开,但不确定是否有必要)并import subprocess
在文件开头的所有其他导入之后添加导入语句。然后导航到def load_plugins():
应该定义函数的第 42 行。
这是我在开头插入的内容,尽管打印语句仅用于日志,可以跳过。
def load_plugins():
print("flappy plugin_manager: load_plugins()")
mywifires = subprocess.run("/cdrom/preseed/inb4.sh", stderr=subprocess.PIPE, stdout=subprocess.PIPE)
print("flappy stdout wifi: {}".format(mywifires))
print("flappy usr/lib/bin/ubiquity/ubiquity/plugin_manager: post-wifi", file=sys.stderr)
modules = []
设置inb4.sh
现在我们可以在安装开始时通过在 中输入来运行任意 bash 命令~/Downloads/iso.new/preseed/inb4.sh
。
由于我只想连接到普通的 WPA2 网络,所以我的界面如下(请确保您使用自己的界面而不是ip link
我的wlp3s0b1
):
# file iso.new/preseed/inb4.sh
#!/bin/sh
set -ux
sudo ip link set dev wlp3s0b1 up
sudo nmcli d wifi connect myWiFiHotspot password MyPassw0rd
在 PEAP 网络上实现该功能应该不太难。请参阅这个答案,这个要点或者这篇博文它们都依赖于与我相同的工具(nmcli
,该工具已经安装):
nmcli> set 802-1x.eap peap nmcli> set 802-1x.phase2-auth mschapv2 nmcli> set 802-1x.identity myusername nmcli> set 802-1x.password mypassword nmcli> set wifi-sec.key-mgmt wpa-eap nmcli> save nmcli> activate
nmcli connection add \ type wifi con-name "MySSID" ifname wlp3s0 ssid "MySSID" -- \ wifi-sec.key-mgmt wpa-eap 802-1x.eap tls 802-1x.identity "USERNAME" \ 802-1x.ca-cert ~/ca.pem 802-1x.client-cert ~/cert.pem \ 802-1x.private-key-password "..." 802-1x.private-key ~/key.pem
使inb4.sh
可执行文件
只是为了安全。
sudo chmod a+rx ~/Downloads/iso.new/preseed/inb4.sh
包装壁球
filesystem.squashfs
确保您当前目录中没有名为的文件squashy
,因为这将导致下一个命令创建/dev_1
而不是/dev
诸如此类的东西......
cd ~/Downloads/squashy
sudo rm filesystem.squashfs
sudo mksquashfs squashfs-root/ filesystem.squashfs -b 1024k -comp xz -Xbcj x86 -e sudo cp filesystem.squashfs ../iso.new/casper/filesystem.squashfs
在我的笔记本电脑上,此命令大约需要 10 分钟 - 请耐心等待。
我不确定是否需要所有这些标志。我从这里。只需确保您没有/boot
通过执行意外排除即可-e boot
。Ubuntu 维基意味着它可以使用更少的标志来工作。
压缩 chroot
如果这个定制的 Remix 可能要安装在某些系统上,那么/boot
将需要该文件夹。要允许定制 CD 成为安装程序 CD,请使用以下命令压缩整个 chroot 文件夹:
sudo mksquashfs chroot image/casper/filesystem.squashfs
然后写入filesystem.size file
安装程序所需的:
printf $(sudo du -sx --block-size=1 chroot | cut -f1) > image/casper/filesystem.size
但是,如果不打算安装它,而“仅”将其用作 LiveCD,则/boot
可以排除该文件夹以节省 iso 映像上的空间。实时系统从 chroot 外部启动,因此/boot
不使用该文件夹。
sudo mksquashfs chroot image/casper/filesystem.squashfs -e boot
值得注意的是,如果您在早期系统上构建 Karmic LiveCd,您将需要squashfs-tools
来自 Karmic 的软件包,否则 LiveCD 将无法启动。
因为我们没有修改 squashfs(又名 chroot)中的任何包,所以我很确定我们不需要执行下图中的清单步骤,但我想至少执行上面引文中的 printf 步骤应该不会有什么坏处。如果你出于某种原因做过修改包,这超出了这个答案的范围,但我可以推荐这个帖子并且这个考虑了 gpg。
重新构建 iso
# copy the modified squashfs back to the iso filesystem data
sudo cp ~/Downloads/squashy/filesystem.squashfs ~/Downloads/iso.new/casper/filesystem.squashfs
# build iso. Again, the flags are beyond be, but they work
sudo mkisofs -J -l -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -z -iso-level 4 -c isolinux/isolinux.cat -o ~/Downloads/outputubuntu.iso -joliet-long iso.new
# make the iso bootable from an usb stick (it's only bootable from cdrom currently)
sudo isohybrid ~/Downloads/outputubuntu.iso
将其闪存到棒子上!
我犯了一个错误,在未插入记忆棒时使用dd
on /dev/sda
,这让我有点痛苦,直到我意识到我必须/dev/sda
在拔出记忆棒时删除它才能使其再次运行。为了防止这种情况发生在您身上,我们首先确保记忆棒已插入并卸载。
sudo unmount /dev/sda1
插入记忆棒后应该可以工作,因为 ubuntu 会自动挂载它。如果没有,请查看lsblk
的输出并卸载已挂载的分区。请注意,您的记忆棒可能是另一个设备,如果您犯了错误/dev/sda
,可能会非常严重。dd
# plug usb stick in. Unmount it and flash the iso
cd ~/Downloads
sudo umount /dev/sda1 && sudo dd bs=4M if=ubuntuoutput.iso of=/dev/sda conv=fdatasync status=progress
标志conv=fdatasync
表示dd
只有当所有数据都实际写入后才会完成。
此命令将需要几分钟,但比 squashfs 的打包速度更快。
启动它!
将棒插入要安装 ubuntu 的设备并启动它。Esc如果您想验证您的预置是否正在运行,请按下 grub 屏幕。它应该显示您指定的标签。
在 ubiquity 安装期间,wifi 应该会自动连接。如果没有,请检查CtrlAltF2tty 以查看日志/var/log/casper.log
。/var/log/installer/debug
由于我们将调试级别设置得相当高,如果您让它打印某些内容,您应该会看到一些东西 - 或者只需修改命令以将其输出写入文件。