У меня есть виртуальная машина (VMM - Xen 3.3), оснащенная двумя жесткими дисками IDE (/ dev / hda и / dev / hdb). Корневая файловая система находится в / dev / hda1, где установлен Scientific Linux 5.4. / dev / hdb содержит пустую файловую систему ext2.
Я хочу защитить корневую файловую систему от записи виртуальной машиной, используя aufs (AnotherUnionFS) для размещения файловой системы с возможностью записи поверх корневой файловой системы. Изменения в / будут записаны в файловую систему, расположенную на / dev / hdb. (Кроме того, за пределами виртуальной машины файл, поддерживающий / dev / hda, также будет иметь разрешение только для чтения, поэтому VMM также должен предотвращать изменение виртуальной машины на этом уровне.) (Цель этой настройки: иметь возможность повредить виртуальную машину с помощью программного внедрения ошибок, но сохранить образ файловой системы, чтобы быстро перезагрузить виртуальную машину до исправного состояния.)
Как мне получить сценарий инициализации initrd для выполнения необходимых подключений для создания файловой системы union?
Я пробовал 2 подхода:
Я попытался изменить сценарий nash, который создает mkinitrd, но я не знаю, что делают setuproot и switchroot и как заставить их использовать мои aufs в качестве нового корня. По-видимому, никто здесь тоже не знает. (РЕДАКТИРОВАТЬ: я беру это обратно.)
Я попытался создать LiveCD (используя linux-live-6.3.0), а затем изменил сценарий Bash / linuxrc из сгенерированного initrd, и я получил правильные монтирования, но последний / sbin / init жалуется на / dev / initctl .
В частности, my / linuxrc монтирует aufs в / union. Последние несколько строк / linuxrc фактически делают следующее:
cd /union
mkdir -p mnt/live
pivot_root . mnt/live
exec sbin/chroot . sbin/init </dev/console >/dev/console 2>&1
При запуске init выводит что-то вроде init: /dev/initctl: No such file or directory
. Что предполагается для создания этого FIFO? Я не нашел такого имени файла в исходных сценариях linuxrc и liblinuxlive.
Я попытался создать его с помощью "mkfifo / dev / initctl", но затем init пожаловался на тайм-аут открытия или записи в FIFO.
Был бы признателен за любую помощь или указатели. Спасибо.
Как ответил Фрес: init
создает /dev/initctl
.
Проблема, с которой я столкнулся, заключалась в том, что мой /linuxrc
скрипт не работал с PID 1. Таким образом, при выполнении init
, он также не работал с PID 1. init
не работает как PID 1 ведет себя как telinit
.
Получить /linuxrc
для работы с PID 1 мне понадобилось следующее в строке загрузки ядра: root=/dev/ram0 rw init=/linuxrc
, как описано в этот форум.
Теперь все работает. Когда виртуальная машина загружена, вывод mount
является
aufs on / type aufs (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
Ура! Кстати, кошерно ли отмечать мой собственный ответ как «ответ»?
Если вы уже используете решение виртуализации, зачем вам все эти проблемы? Самым простым решением было бы использовать что-то вроде LVM на вашем хосте, который уже поддерживает моментальные снимки, и предоставить моментальный снимок вашей виртуальной машине. То есть:
Если вы хотите вернуться к чистой файловой системе, удалите снимок и создайте его заново. Легко, и не нужно возиться с initrd или aufs - фактически, это не требует каких-либо изменений в гостевой ОС.
Правильное решение - использовать ZFS для виртуальной машины. Прежде чем проводить эксперимент, сделайте снимок. Требуется всего меньше секунды и одна короткая строчная команда: zfs snapshot (your volume) snapshotname. Тогда вы сможете делать что угодно, даже форматировать том. Теперь вы хотите восстановить. Одна короткая строчная команда: zfs откатить имя снимка. Если вы действительно отформатировали том, откат займет некоторое время, в противном случае - несколько секунд, чтобы завершить операцию отката. Все изменения после снимка исчезнут.
Сам init обычно создает initctl. Однако вам понадобится следующее:
/etc/inittab
должен содержать запись для initdefault
. Во-вторых, отправьте SIGUSR1
инициировать после /dev
перемонтируется в соответствующий корень, что заставит init перечитать конфигурацию.