【问题标题】:systemd-nspawn send command with boot flagsystemd-nspawn 发送带有引导标志的命令
【发布时间】:2017-09-27 09:10:33
【问题描述】:

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

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

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

【问题讨论】:

  • 能不能不开机再用machinectl?
  • 我试了一下,但我不明白如何从脚本中管理它。我可以使用 machinectl 登录,但它与上面的命令相同。你介意多解释一下你的想法吗?

标签: bash systemd systemd-nspawn


【解决方案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

【讨论】:

    【解决方案2】:

    与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
    

    然后您可以使用屏幕的内容功能写入您想要发送的任何内容:

    这是一个 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 ":-)"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多