LINUX.ORG.RU
ФорумAdmin

Выгрузка из initrd

 , , , ,


0

1

Значит имеем - загрузившуюся систему с флешки из первого раздела с корнем в initrd в режиме read only. Задача - сделать chroot на физически корень флешки, в котором собственно и лежит файл /boot/initrd/initrd.gz. Проблема - на что делать chroot? В dev пусто, так как mknod не может создать устройство, ибо фс read only. А initrd по идее загрузить в rw нельзя. Получается проблема курицы и яйца - для того что сделать chroot нужна фс rw, а для того что бы получить фс rw нужен chroot. Как быть, что нужно написать в chroot что бы перейти в корень флешки? И еще вопрос, я как-то читал что initrd должен в идеале сам загружать основной корень, как его заставить это сделать?


intrd у вас самосборный ? Вот ссылка, почитайте: http://en.gentoo-wiki.com/wiki/Initramfs .

initrd загружается в память и доступен на запись. Для того, что бы /dev не был пустой нужно монтировать devtmpfs и запускать mdev, но это уже опционально.

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

Я не понимаю, почему ядро не понимает параметр root. Пишу белым по черному е: linux /boot/kernel/bzImage root=UUID=много букоф Результат - грузит initrd и все. При загрузке без initrd получаю kernel panic c ответом что ядро не понимает что идет в параметре root.

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

Может всё же так ?

title GNU Linux
kernel /boot/kernel/bzImage root=UUID=много букоф
initrd /boot/initrd

Насчёт «root=UUID=...» ядро его и не поёмёт, его должен сначала Initrd разобрать, определить раздел по UUID, смонтировать его и сделать 'switch_root'. Я же вам дал ссылку, почитайте.

Вот код, который должен присутствовать в сценарии init в initrd:

uuidlabel_root() {
    for cmd in $(cat /proc/cmdline) ; do
        case $cmd in
        root=*)
            dev=${cmd#root=}
            type=${dev%%=*}
            if [ $type = "LABEL" ] || [ $type = "UUID" ] ; then
                mount -o ro $(findfs "$dev") /mnt/root
            else
                mount -o ro ${dev} /mnt/root
            fi
            ;;
        esac
    done
}
что бы обработать UUID или LABEL.

Само ядро с UUID или LABEL работать не умеет.

kostik87 ★★★★★
()

А initrd по идее загрузить в rw нельзя

Параметр ядра «rw» пробовали? Какая ФС у initrd? Не лучше ли сделать initramfs?

я как-то читал что initrd должен в идеале сам загружать основной корень, как его заставить это сделать?

Написать программу, которая загружает основной корень, и запустить её из этого initrd (на самом деле initramfs).
Подробнее см. в initramfs популярных дистрибутивов.

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

root=UUID=много букоф

Ядро linux пока не умеет UUID, насколько я знаю. Параметр ядра root=UUID=... читает скрипт в initramfs.
Вы можете указать root=/dev/sdXY, и система запустится (ядро прочитает строку «sdXY» и переведёт его в своё внутреннее представление имени устройства).

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

6) PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF representing the
+ * unique id of a partition if the partition table provides it.

Это UUID раздела, а не файловой системы.

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

Вы как собирали поддержку контроллера дисков вашей материнской платы, монолитно в ядре или модульно ?

Если модульно нужно подгрузить соответствующий модуль. Т.е. прописать в сценарий init в initramfs загрузку соответствующего модуля.

А вот фиг.

Не надо мне ставить претензии в том, что у вас что-то не получается. Вся причина в том что вы что-то ещё не так сделали и указали мало вводных данных.

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