1

在我的 Debian 开发机器中,我设置了一个 systemd-nspawn 环境来定制嵌入式 systemd。

我可以通过以下方式从脚本向该容器发送命令:

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 标志启动 systemd-nspawn
  2. 登录
  3. 发出命令
4

2 回答 2

1

screen

你必须为你的来宾容器应用一个补丁,在我的例子中,我必须使用 gentoo 的规范,使我能够以 root 身份登录而无需密码

请注意,在没有密码的情况下以 root 身份启用控制台登录以进行自动魔法冒险的说明因发行版而异。请检查您的发行版文档。更具体地说, 如果您使用的是 OpenRC ,则在agettyOR上。inittab

就我而言,我使用的是/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 的 stuff 功能写入您想要发送的任何内容:

它是一个黑客,但我无法让“棘手的方式”正常工作。至少不是在来宾决定接管控制台设备的 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 ":-)"
于 2019-07-14T10:57:28.343 回答
1

systemd-nspawn -D $MOUNTPATH -b arg1 arg2

systemd-nspawn -D $MOUNTPATH /bin/init arg1 arg2

/bin/init 是这里的一个例子,可以是任何初始化系统(如 /usr/lib/systemd/systemd)。
它是自动检测到的。

如果您使用--boot,那么您将失去对容器中第一个程序的控制。

初始化系统将运行您的程序。但是你必须遵循你的 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
于 2017-11-01T10:20:51.357 回答