Назад | Перейти на главную страницу

Пользовательский сценарий инициализации initrd: как создать / dev / initctl

У меня есть виртуальная машина (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 подхода:

  1. Я попытался изменить сценарий nash, который создает mkinitrd, но я не знаю, что делают setuproot и switchroot и как заставить их использовать мои aufs в качестве нового корня. По-видимому, никто здесь тоже не знает. (РЕДАКТИРОВАТЬ: я беру это обратно.)

  2. Я попытался создать 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 на вашем хосте, который уже поддерживает моментальные снимки, и предоставить моментальный снимок вашей виртуальной машине. То есть:

  • Создайте логический том (LV), который будет содержать вашу корневую файловую систему.
  • Создать снимок этого LV
  • Настройте свою виртуальную машину для загрузки с моментального снимка.

Если вы хотите вернуться к чистой файловой системе, удалите снимок и создайте его заново. Легко, и не нужно возиться с initrd или aufs - фактически, это не требует каких-либо изменений в гостевой ОС.

Правильное решение - использовать ZFS для виртуальной машины. Прежде чем проводить эксперимент, сделайте снимок. Требуется всего меньше секунды и одна короткая строчная команда: zfs snapshot (your volume) snapshotname. Тогда вы сможете делать что угодно, даже форматировать том. Теперь вы хотите восстановить. Одна короткая строчная команда: zfs откатить имя снимка. Если вы действительно отформатировали том, откат займет некоторое время, в противном случае - несколько секунд, чтобы завершить операцию отката. Все изменения после снимка исчезнут.

Сам init обычно создает initctl. Однако вам понадобится следующее:

/etc/inittab должен содержать запись для initdefault. Во-вторых, отправьте SIGUSR1 инициировать после /dev перемонтируется в соответствующий корень, что заставит init перечитать конфигурацию.