Пользовательский сценарий initrd init: как создать /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 init для выполнения необходимых монтирований для создания файловой системы union?

Я пробовал 2 подхода:

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

  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.

Был бы признателен за любую помощь или указатели. Благодарю.

4 ответа

Решение

Как ответил Фрез, 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 - фактически, он не требует каких-либо модификаций гостевой ОС.

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

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

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

Другие вопросы по тегам