在我的Debian开发机器中,我设置了一个systemd -n派生环境,用于定制嵌入式系统。
我可以通过脚本向这个容器发送命令,方式如下:
systemd-nspawn -q --bind /usr/bin/qemu-arm-static -D $MOUNTPATH /bin/bash << EOF
apt-get update
apt-get -y upgrade
EOF现在,我需要做同样的工作,但是使用-b (boot)标志启动容器。在脚本里还能做到吗?
现在,我手动执行以下操作:
发布于 2017-11-01 10:20:51
-D $MOUNTPATH -b arg1 arg2
只是和
-D $MOUNTPATH /bin/init arg1 arg2
/bin/init就是这里的一个例子,可以是任何init系统(如/usr/lib/systemd/systemd)。
这是自动检测到的。
如果您使用--boot,那么您将失去对容器中第一个程序的控制。
Init系统将运行您的程序。但是你必须遵守你的init系统的指令。创建init.rc脚本或systemd服务。
另一个“棘手的方法”是:
systemd-nspawn xxxx --boot
sleep 5s
systemd-run -M xxxx /bin/bash << EOF
apt-get update
apt-get -y upgrade
EOF发布于 2019-07-14 10:57:28
用screen
您必须向客户容器应用修补程序,在我的例子中,我必须使用gentoo的规范,使我能够在没有密码的情况下以root身份登录
请注意,对于您的自动冒险,启用控制台-以root用户身份登录的说明随发行版而不同。请查看您的发行版文档。更具体地说,如果您使用的是
agetty或inittab,则在OpenRC上。在我的例子中,我使用的是/usr/lib/systemd/systemd,所以我就是这样使用agetty的
# reset the root password
sed -i -e 's/^root:\*/root:/' /mnt/etc/shadow 2>/dev/null
# patch agetty to autologin as root.
mkdir /mnt/etc/systemd/system/console-getty.service.d
cat <<EOF > /mnt/etc/systemd/system/console-getty.service.d/autologin.conf
[Service]
ExecStart=
ExecStart=-/sbin/agetty --noclear --autologin root --keep-baud console 115200,38400,9600 $TERM
EOF然后,您可以使用屏幕的内容功能来编写您想要发送的任何内容:
这是一个黑客,但我无法使“棘手的方式”正常工作。至少在客人决定接管控制台设备的系统中没有。这可能不是最好的解决方案,但它是一个有效的解决方案。屏幕可能是资源密集型的,所以我肯定不会把这称为“最佳方式”,而只是“工作方式”。
# SCREEN POWERUP
screen -AmdS myguest /bin/bash
screen -S myguest -p 0 -X stuff $'systemd-nspawn -D /mnt --machine my-pc -b 3 --link-journal host'$(echo -ne '\015')
read -t 5
# ------ put whatever you want here: -------
# screen -S myguest -p 0 -X stuff $'yourBashCommandsGoHere'$(echo -ne '\015')
# GUEST AND SCREEN SHOTDOWN
screen -S myguest -p 0 -X stuff $'poweroff'$(echo -ne '\015')
read -t 1
screen -S myguest -p 0 -X stuff $'exit'$(echo -ne '\015')
# Done
echo ":-)"https://stackoverflow.com/questions/46443863
复制相似问题