在 Ubuntu preseed 中将 preseed/late_command 指定为 shell 脚本

在 Ubuntu preseed 中将 preseed/late_command 指定为 shell 脚本

我正在尝试指定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--flagsshhttps://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

相关内容