我编写了几个脚本来下载、定制和准备 Raspberry Pi 的 Raspbian 映像。因为根文件系统将以只读方式挂载,所以我必须在第一次运行目标之前创建 ssh 密钥。
我发现 ssh 密钥生成是由服务处理的/etc/systemd/system/multi-user.target.wants/regenerate_ssh_host_keys.service
(顺便说一下,完全相同的文件也放置在 下/lib/systemd/system/regenerate_ssh_host_keys.service
)。
这是它的内容:
[Unit]
Description=Regenerate SSH host keys
Before=ssh.service
[Service]
Type=oneshot
ExecStartPre=-/bin/dd if=/dev/hwrng of=/dev/urandom count=1 bs=4096
ExecStartPre=-/bin/sh -c "/bin/rm -f -v /etc/ssh/ssh_host_*_key*"
ExecStart=/usr/bin/ssh-keygen -A -v
ExecStartPost=/bin/systemctl disable regenerate_ssh_host_keys
[Install]
WantedBy=multi-user.target
因此,我将在 nspawn 容器内执行这些命令,以便在配置期间生成密钥。
问题是它在寻找/dev/hwrng
,/dev/urandom
但现阶段我还没有。此外,我无法使用 systemctl 禁用该服务,因为在容器内我没有运行 dbus。还有其他方法可以禁用它吗?如果可能的话,我不想删除文件本身......
答案1
您可以通过删除文件然后创建符号链接来mask
手动提供服务/etc/systemd/...
/etc/systemd/system/multi-user.target.wants/regenerate_ssh_host_keys.service
to/dev/null
而不是符号链接
/lib/systemd/system/regenerate_ssh_host_keys.service
像这样 :
ln -s /etc/systemd/system/multi-user.target.wants/regenerate_ssh_host_keys.service /dev/null
当您取消屏蔽服务时,它会创建返回到/usr/lib/systemd/system/filename
.以下是揭开它的方法:
systemctl umask regenerate_ssh_host_keys.service
或者重新创建符号链接。
ln -s /etc/systemd/system/multi-user.target.wants/regenerate_ssh_host_keys.service /lib/systemd/system/regenerate_ssh_host_keys.service
PS:记得删除符号链接/dev/null