systemd-nspawn send команда с флагом загрузки

На моей машине разработки 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. запустить systemd-nspawn с флагом -b
  2. авторизоваться
  3. выдавать команды
  4. стой

1 ответ

С участием screen

Вам придется применить патч к вашим гостевым контейнерам 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

Затем вы можете использовать функциональные возможности экрана, чтобы записать то, что вы хотите отправить:

Это хак, но я не мог заставить "хитрый путь" работать должным образом. По крайней мере, не в 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 ":-)"

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.rc или сервис systemd.


и еще один "хитрый путь":

systemd-nspawn xxxx --boot
sleep 5s
systemd-run -M xxxx /bin/bash << EOF
  apt-get update
  apt-get -y upgrade
EOF
Другие вопросы по тегам