我正在尝试openssh-server
使用自动 Ubiquity 安装程序在 Xubuntu 20.04 上进行安装。根据https://help.ubuntu.com/lts/installation-guide/amd64/apbs04.html点“B.4.11. 包选择”,我可以使用
ubiquity pkgsel/include string openssh-server
它不起作用(openssh 服务器未安装)。
根据https://wiki.ubuntu.com/UbiquityAutomation我可以使用ubiquity/success_command
(或preseed/late_command
)来运行自己的命令...所以我尝试了这样的事情:
ubiquity ubiquity/success_command string \
echo 'engineer ALL=(ALL) NOPASSWD:ALL' > /target/etc/sudoers.d/99_engineer; \
chmod 440 /target/etc/sudoers.d/99_engineer; \
chroot /target apt-get update; \
chroot /target apt-get install -y openssh-server
也不起作用。这很有趣,因为 sudoers 行似乎有效 - 只是 openssh-server 没有安装...
我做错了什么?Ubuntu 20.04 做了哪些更改,但未在任何地方记录?因为整个互联网上关于 Ubuntu 18.04 的所有示例都表明上述操作应该可行。
答案1
最后,我深入研究了 Ubuntu 20.04 中使用的 Ubiquity 源代码,似乎开发人员已经删除了诸如 之类的功能pkgsel/include
。Ubuntu 文档对此只字未提。另外,我确认preseed/late_command
并未被触发。唯一能正常工作的是ubiquity/success_command
。我不知道它是否从一开始就是那样的,但是success_command
是用 运行的sh -c "commands here"
,根据我的测试,这意味着您无法在 中运行脚本ubiquity/success_command
。经过很长时间的折腾,我最终的(可行的)解决方案是使用 cron 在重启后创建一个命令,它将等待 Internet 访问(通过检查8.8.8.8
):
ubiquity ubiquity/success_command string \
mkdir -p /mnt/floppy; \
mount -t vfat /dev/fd0 /mnt/floppy; \
cp /mnt/floppy/sudoers /target/etc/sudoers.d/99_engineer; \
chmod 440 /target/etc/sudoers.d/99_engineer; \
mkdir -p /target/root; \
cp /mnt/floppy/firstboot.sh /target/root/firstboot.sh; \
chmod 750 /target/root/firstboot.sh; \
echo '@reboot root bash /root/firstboot.sh >> /var/log/firstboot.log 2>&1' >> /target/etc/crontab;
请注意,我在这里也使用了floppy_files
Packer - 这就是我可以使用的原因/dev/fd0
。
sudoers
文件:
engineer ALL=(ALL) NOPASSWD:ALL
firstboot.sh
文件:
#!/bin/bash
echo "Waiting for Internet ..."
while ! timeout 0.2 ping -c 1 -n 8.8.8.8 &> /dev/null
do
printf "%c" "."
done
echo "OK"
# Instal SSH Server
apt-get -y update
apt-get -y install openssh-server
# Remove from crontab
sed -i '/firstboot/d' /etc/crontab
顺便说一句,对于所有负责删除pkgsel/include
和其他更改的人来说,这是一个巨大的减分,这些更改到处都有记录,目前在 中不起作用automatic-ubiquity
,并且允许以简单的方式安装所需的额外东西。
答案2
我花了好几天的时间才找到答案。显然,安装程序会在安装结束时关闭网络接口。您需要打开网络接口以允许网络访问,以便它可以下载应用程序。尝试一下,但要将接口名称 ens160 更改为与您的名称匹配。
ubiquity ubiquity/success_command 字符串
字符串 ip 链接设置 dev ens160;
dhclient ens160;
apt-get update -y;
in-target apt-get install -y openssh-server;