Как получить initrd, сделанный из архива cpio, загруженного в качестве корневого устройства grub2 дистрибутивно? - PullRequest
0 голосов
/ 01 декабря 2018

Я собираю систему LFS (Linux From Scratch) на виртуальной машине, и до сих пор мне удалось получить работоспособную настольную систему, загружающуюся с известного устройства, в моем случае / dev / sda1.Я сейчас пытаюсь сделать живую систему, которая загружается из образа ISO.Вместо того, чтобы использовать / dev / sr0 в качестве корня, возможно, что я уже установил, возможно (и, поскольку он более вероятно будет использоваться с USB-накопителя, чем с реального CD-ROM, слишком негибким), я решилпри загрузке в корень initrd.Идея состоит в том, чтобы использовать его как системный корень вместо того, чтобы использовать его в качестве временного корня для загрузки «реального» корня, и, поскольку он уже находится в памяти, это избавляет меня от необходимости устанавливать корень tmpfs, скопировать все файлы,и переключитесь на него.

Ранее я экспериментировал с изображением squashfs, так как видел, что Ubuntu, похоже, использует это и имеет то, что мне нужно: корень небольшого размера, быстрее загружаемый, использующий меньше памятии работает быстро (xz - SSLLOOWW для извлечения, а gzip - медленная загрузка).Сначала у меня были проблемы с загрузкой, поэтому я переключился на initrd на базе cpio.После некоторых начальных проблем из-за отсутствия файлов в архиве мне удалось его загрузить.

Я оставил это на время (около месяца назад) для выполнения других задач в системе.Я потерял исходные настройки GRUB2 и конфигурацию ядра, поэтому продолжил делать это снова, но я столкнулся с кирпичной стеной.Я надеюсь, что кто-то здесь может знать, что мне не хватает.

Когда я загружаюсь, я никогда не вижу сообщения о загрузке файла initrd, он идет прямо к загрузке, распаковке и загрузкеядро.И это приводит к панике ядра с сообщением

VFS: cannot open root device "(null)" or unknown-block (1,0): error -6
Please append the correct "root=" boot option; here are the available partitions:

Не отображаются разделы, и после этого следует сообщение «Паника ядра», просто повторяющееся в первой строке.Если я использую «rootfstype = ramfs», я получаю:

VFS: mounted root (ramfs filesystem) readonly on device 0:15.
devtmpfs: error mounting -2

По сути, он монтирует файловую систему EMPTY ramfs от имени пользователя root, поэтому монтировать devtmpfs не удается, так как запись / dev не существует.Но наверняка я использовал эту опцию загрузки раньше.

Вот мой конфиг GRUB 2:

menuentry = "LFS (inird test)" {
        linux   /boot/kernel/initrd/linux ro rdinit=/etc/init
        initrd  /boot/kernel/initrd/root.cpio.gz
}

Да, запись / boot / kernel / initrd / directory существует, linux - это ядро ​​(bzimageфайл, созданный путем компиляции ядра), а root.cpio.gz - мой сжатый корневой архив cpio для initrd.

Вот файл .config моего ядра (извините, я не могу вставить его здесь).

Если вам нужна дополнительная информация, не стесняйтесь спрашивать.Это ты.

1 Ответ

0 голосов
/ 02 декабря 2018

ОК, мне удалось решить проблему!Очевидно, это была не конфигурация ядра, GRUB2 или даже последовательность загрузки.Это был сам архив initrd.Глубоко в недрах конфигурации ядра Linux лежал ответ: архив должен быть собран с помощью опции cpio --newc.В том, что я построил вручную, не было этой опции, поэтому ядро ​​игнорировало архив и просто продолжало обычную процедуру загрузки.

Это произошло потому, что мне удалось наткнуться на старый скрипт, который я использовал для сборки, и увиделвсе варианты в нем для cpio.Я проверил гораздо более свежий скрипт, который я спешно собрал, и дважды проверил документацию ядра (а также файлы init / do_mounts.c и init / initramfs.c) и понял, что происходит.Я попробовал это с исправлениями, и теперь система без проблем загружается в initrd!: D

...