带引导标志

时间:2017-09-27 09:10:34

标签: bash systemd systemd-nspawn

在我的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)标志启动容器。仍然可以在脚本中执行此操作吗?

现在我手动执行以下操作:

  1. 使用-b flag
  2. 启动systemd-nspawn
  3. 登录
  4. 发出命令
  5. 停止

2 个答案:

答案 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身份启用控制台登录的说明不包括   您的自动冒险的密码因分布而异。请   检查您的发行文件。更具体地说,   agettyinittab(如果您使用的是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 ":-)"