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
(загрузочный) флаг. Возможно ли сделать это внутри скрипта?
Прямо сейчас я делаю следующее вручную:
- запустить systemd-nspawn с флагом -b
- авторизоваться
- выдавать команды
- стой
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