我正在尝试指定preseed/late_command
作为启用 systemdtmp.mount
单元的 shell 脚本。执行 shell 脚本late_command
失败,错误代码为 127,令人困惑的是,这表示/bin/sh
目标上不存在该脚本。我需要在这里修改什么才能在目标上运行 late_command shell 脚本?
我的ubuntu-server-custom.seed
包含:
d-i preseed/late_command string cp \
-a /cdrom/preseed/tmp_mount.sh /target/usr/sbin/; \
chroot /target '/bin/sh /usr/sbin/tmp_mount.sh --need-target-bash --preseed-late-command';
(注:此处添加换行符只是为了方便阅读。to--flags
是sh
从https://www.virtualbox.org/ticket/18411。)
还尝试过:
in-target '/bin/sh /usr/sbin/tmp_mount.sh';
带有相同的错误消息和退出代码。
/preseed/tmp_mount.sh
存在于 ISO 中。
tmp_mount.sh
好像:
#!/bin/bash
/bin/cp -aT /usr/share/systemd/tmp.mount /etc/systemd/system/tmp.mount
/bin/chmod 644 /etc/systemd/system/tmp.mount
/bin/sed -i -r 's/^Options=.*/Options=mode=1777,noatime,noexec,nodev,nosuid,size=4G/g' /etc/systemd/system/tmp.mount
/bin/systemctl unmask tmp.mount
/bin/systemctl enable tmp.mount
/bin/echo 'tmpfs /tmp tmpfs mode=1777,noatime,noexec,nodev,nosuid,size=4G 0 0' >> /etc/fstab
/bin/echo 'tmpfs /dev/shm tmpfs defaults,nodev,nosuid,noexec 0 0' >> /etc/fstab
使用以下方法从 ISO 错误中启动:
预置命令执行失败,错误代码为 127。
我可以完成启动过程并登录。检查后/var/log/installer/syslog
我发现:
我还可以确认该脚本确实存在于目标上:
$ file /usr/sbin/tmp*
/usr/sbin/tmp_mount.sh: Bourne-Again shell script...
那么这里到底出了什么问题?
答案1
我可以通过对调用进行一些小的调整来实现这一点late_command
:
- 使用
in-target
而不是chroot /target
- 删除尾随分号(可能这被解释为文件名的一部分但不确定)
- 确保添加可执行位(不明白为什么在通过调用时需要这样做
sh
,但不管怎样,都可以)
预播的最终结果:
d-i preseed/late_command string \
cp -a /cdrom/preseed/tmp_mount.sh /target/usr/sbin/; \
in-target chmod 700 /usr/sbin/tmp_mount.sh; \
in-target /bin/sh /usr/sbin/tmp_mount.sh
请注意,这将保留/usr/sbin/tmp_mount.sh
在目标文件系统上。(我故意选择将其保留在那里。)如果需要,您可以在最后将其删除in-target /bin/rm /usr/sbin/tmp_mount.sh
。