LINUX.ORG.RU

как влинковать initramfs в файл-образ ядра?

 , ,


1

1

The old initrd was always a separate file, while the initramfs archive is linked into the linux kernel image.

Чего я хочу добиться:
Чтобы в GRUB было две строчки: в первой строке (linux) грузилось бы ядро и неизменяемый initramfs, а во второй строчке (initrd) грузились бы настройки (всякие там mdadm.conf с конкретными UUID массивов конкретной машины).

Там же всё написано. Создаёшь файл с таким содержимым

cat << EOF > /tmp/initramfs
dir /dev 0755 0 0
nod /dev/console 0600 0 0 c 5 1
nod /dev/tty1 0600 0 0 c 4 1
nod /dev/zero 0600 0 0 c 1 5
nod /dev/mem 0600 0 0 c 1 1
dir /root 0700 0 0
dir /etc 755 0 0
file /etc/mdadm.conf /etc/mdadm.conf 644 0 0
EOF

Потом make nconfig, идёшь в General setup -> Initial RAM filesystem and RAM disk (initramfs/initrd) support, чуть ниже в CONFIG_INITRAMFS_SOURCE <Enter>, вставляешь путь до созданного файла.

https://prnt.sc/kbl36o

Собираешь ядро:

make -j5
make install modules_install
emerge @module-rebuild # Это если Gentoo

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

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

А склеить cpio-архив и образ ядра не ясно как, потому что образ ядра не является cpio-архивом.

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

Там же всё написано.

там написано как указать имя. Но не написано, как это имя будет использоваться - может он просто будет искать файл с таким именем снаружи, а не влинкует его в ядро.

И даже из твоего комментария это не ясно.

Einstok_Fair ★★☆ ()
Последнее исправление: Einstok_Fair (всего исправлений: 1)
Ответ на: комментарий от kickass

Хорошо, допустим, первый initramfs влинкуется прямо в образ ядра и с него запустится init-скрипт.

Как из этого init-скрипта получить доступ к содержимому второго initramfs, который будет указан во второй строчке grub?

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

Он при помощи /usr/src/linux/usr/gen_init_cpio

Usage:
	./gen_init_cpio [-t <timestamp>] <cpio_list>

<cpio_list> is a file containing newline separated entries that
describe the files to be included in the initramfs archive:

# a comment
file <name> <location> <mode> <uid> <gid> [<hard links>]
dir <name> <mode> <uid> <gid>
nod <name> <mode> <uid> <gid> <dev_type> <maj> <min>
slink <name> <target> <mode> <uid> <gid>
pipe <name> <mode> <uid> <gid>
sock <name> <mode> <uid> <gid>

<name>       name of the file/dir/nod/etc in the archive
<location>   location of the file in the current filesystem
             expands shell variables quoted with ${}
<target>     link target
<mode>       mode/permissions of the file
<uid>        user id (0=root)
<gid>        group id (0=root)
<dev_type>   device type (b=block, c=character)
<maj>        major number of nod
<min>        minor number of nod
<hard links> space separated list of other links to file
создаст cpio архив и вкомпилит его в ядро.

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

Даже если CONFIG_INITRAMFS_SOURCE будет пустым, он всё равно пустой cpio создаёт /usr/src/linux/usr/initramfs_data.o

Как из этого init-скрипта получить доступ к содержимому второго initramfs, который будет указан во второй строчке grub?

Как обычно, как в обычной rootfs /path/to

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

Сначала распакуется из ядра, потом, на него же, распакуются остальные по порядку из параметра grub:

linux /boot/vmlinuz
initrd /boot/initrd1
initrd /boot/initrd2
и т.д.

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