在我的Debian开发机器中,我设置了一个systemd-nspawn环境来自定义嵌入式系统。
我能够通过这种方式从脚本向此容器发送命令:
systemd-nspawn -q --bind /usr/bin/qemu-arm-static -D $MOUNTPATH /bin/bash << EOF
apt-get update
apt-get -y upgrade
EOF
现在我需要做同样的事情但是使用-b
(boot)标志启动容器。仍然可以在脚本中执行此操作吗?
现在我手动执行以下操作:
答案 0 :(得分:1)
systemd-nspawn -D $ MOUNTPATH -b arg1 arg2
与
相同systemd-nspawn -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
答案 1 :(得分:1)
screen
您必须对您的guest容器agetty应用补丁,以我为例,我必须使用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
然后,您可以使用屏幕的填充功能以任何想要发送的内容进行书写:
这是一个hack,但是我无法正常工作。至少不在 来宾决定接管控制台设备的systemd-nspawn。 这可能不是最好的解决方案,但它是可行的。屏幕可能会占用大量资源,因此我绝对不会以“最佳方式”来模仿, 只是一种“工作方式”。
# 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 ":-)"