Восстановление OpenVZ-контейнера Gentoo после обновления
by Bozaro on Окт.29, 2010, under Серверный софт
На странице http://wiki.openvz.org/Download/template/precreated есть шаблон для Gentoo.
Если его установить а потом обновить до актуальной версии, то после перезагрузки он перестанет запускать демоны. В том числе, перестанет работать SSH.
После изучения страницы http://wiki.openvz.org/Gentoo_template_creation удалось сформулировать принцип приведения контейнера в рабочее состояние.
Восстановление запуска SSH
Для начала, надо восстановить запуск демона ssh. В противном случае, сделать что-либо с виртуальной машиной затруднительно.
Если у вас есть возможность выполнить какой-либо скрипт внутри контейнера (например, через vzctl enter), то данный шаг можно пропустить.
Для этого нужно каким-либо образом закоментировать в файле /sbin/rc строку (у меня это была строка 249), добавив в начало символ решетки (#):
# try mount -n ${mntcmd:--t sysfs sysfs /sys -o noexec,nosuid,nodev}
После этого нужно перезапустить контейнер.
Исправление шероховатостей контейнера
Исправить внутренние проблемы контейнера (убрать запуск лишних скриптов и т.п.) можно скриптом:
# Make /etc/mtab a symlink to /proc/mounts
rm -f /etc/mtab
ln -s /proc/mounts /etc/mtab
# Replace /etc/fstab
echo "proc /proc proc defaults 0 0" > /etc/fstab
# Edit /etc/inittab and put a hash mark (#) at the beginning of the lines containing:
# c?:1235:respawn:/sbin/agetty 38400 tty? linux
F=/etc/inittab
sed -e 's/^c[0-9].*tty[0-9]/#\0/g' $F > $F~
chmod --reference=$F $F~ && mv -f $F~ $F
# Disable unneeded init scripts
rm /etc/runlevels/boot/checkroot
rm /etc/runlevels/boot/consolefont
# Edit /sbin/rc and put a hash mark (#) at the beginning of line 224:
# try mount -n ${mntcmd:--t sysfs sysfs /sys -o noexec,nosuid,nodev}
F=/sbin/rc
sed -e 's/^[^#]*try mount.*sysfs/#\0/g' $F > $F~
chmod --reference=$F $F~ && mv -f $F~ $F
# To ensure that this change isn't automatically overwritten on update, add the
# following to /etc/make.conf:
# CONFIG_PROTECT="/sbin/rc"
echo 'CONFIG_PROTECT="/sbin/rc"' >> /etc/make.conf
# Set up udev
mknod /lib/udev/devices/ttyp0 c 3 0
mknod /lib/udev/devices/ptyp0 c 2 0
mknod /lib/udev/devices/ptmx c 5 2
F=/etc/conf.d/rc
sed -e 's/.*RC_DEVICES=".*"/RC_DEVICES="udev"/g' $F | \
sed -e 's/.*RC_DEVICE_TARBALL=".*"/RC_DEVICE_TARBALL="no"/g' > $F~
chmod --reference=$F $F~ && mv -f $F~ $F
Надеюсь, эти изыскания помогут и не только мне