LINUX.ORG.RU

Initrd навыворот

 ,


0

1

С технической точки зрения есть ли разница между использованием initrd и такой схемой: в корень помещается иерархия с минимумом файлов (bash, mount, кое-какие утилиты) и образ системы, ядро передаёт загрузку фейковому иниту в виде баш-скрипта, который монтирует образ системы и делает chroot blablabla /sbin/init?

Deleted

Последнее исправление: Deleted (всего исправлений: 1)

Чёт-какой-то тупняк. Initramfs это конкретно cpio архив монтируемый специальным образом. А так-то пофиг куда корень монтировать и откуда файлы брать.

anonymous
()
Ответ на: комментарий от anonymous

Меня интересует, делает ли initrd в конце своей отработки chroot? Или он как-то иначе передаёт управление корневому иниту? Если я перейду в загружаемую систему через chroot, в ней всё будет нормально работать (иксы и т.д.)?

Deleted
()
Ответ на: комментарий от Deleted

См. pivot_root.

Например, на установочном диске Slackware в initrd живёт минимальная система и установщик. Если ей запретить исполнять свой /init (rdinit=) можно грузить установленную систему, передав её корень (root=...).

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 1)

Не путай init и initrd
Init может быть хоть на NFS, а initrd может и не быть
Обычно в initrd маленький init, который чрутится в нормальную rootfs
Можно и собрать initrd-only образ, где будет bash и т.д., но делать инит на баше не стоит, потому что надо управлять процессами по нормальному
Например легкий linuxrc из busybox, или runit
Можно и на баш скрипт наваять, но что-то серьезное понадобится, начнутся проблемы

mystery ★★
()
Ответ на: комментарий от mystery

Не понял. Я не могу вместо инита подсунуть баш-скрипт, сделать что нужно и передать через чрут загрузку нормальному иниту? Почему? Разве загрузка в single mode не происходит без участия нормального инита?

Deleted
()

init в initramfs в конце:

  1. получает fd текущего корня
  2. chroot в новый корень
  3. через сохраненный fd удаляет рекурсивно все файлы в старом корне (чтобы не висели в оперативке)
  4. переносит из старого корня точки /proc, /sys, /dev, /run
  5. exec то, что передали в init= (или /sbin/init по дефолту)

Все это для удобства собрано в одной команде switch_root из util-linux (есть также в busybox), см. https://git.kernel.org/cgit/utils/util-linux/util-linux.git/tree/sys-utils/sw...

Команда pivot_root - устаревшая, использовалась во времена initrd, который был образом файловой системы, а не cpio-архивом.

deadNightTiger ★★★★★
()
Ответ на: комментарий от deadNightTiger

Окей, значит, никаких проблем быть не должно. Я думал, что там куда более сильное колдунство))

Deleted
()
Ответ на: комментарий от Deleted

Можешь, но баш не может нормально запускать и останавливать процессы
Правильнее всего взять легковесный init типа runit или linuxrc из busybox
Дистрибутивы с systemd и initrd тоже имеют systemd
Еще раз повторюсь, можно, но будут проблемы

mystery ★★
()
Ответ на: комментарий от anonymous

Когда ядро монтирует initramfs оно вызывает исполняемый файл /init в нём, который обычно простой скрипт с pivot_root и chroot в конце.

pivot_root выполняется только initrd, а initramfs выполняет скрипт с chroot (необязательно в конце).

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 1)

В общем, или я тугой и не понимаю простых вещей, или на самом деле не всё так просто, но chroot из initramfs не работает совершенно. То есть, он работает, но openrc отказывается работать в таких условиях.

Deleted
()
Ответ на: комментарий от Deleted

Ответ на комментарий:

Интересно, каковы мотивы у людей, которые требуют дотошного соблюдения правил без всяких исключений?

Это популярный метод борьбы с идиотскими правилами.

#t12769144

anonymous
()
Ответ на: комментарий от Deleted

Вы новый init через exec из bash-скрпта запускаете, у него должен быть pid 1.

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.