LINUX.ORG.RU
ФорумAdmin

Как создать initramfs?


0

0

Кратко: как собрать initramfs? Подробнее: кто-нибудь может объяснить пошагово как собрать образ initramfs, какие файлы в него класть, как его встроить в ядро? Правильно я понимаю что нужно создать дерево /bin, /lib ..., поместить туда нужные программы, поместить туда всё что динамически связывается с этими программами (как их искать? Что-то там с ld надо было сделать, кажется), потому упаковать cpio и gzip'ом? Как писать linuxrc? Где почитать обо всём об этом на английском или русском языке?

★★★★★

Re: Как создать initramfs?

emerge genkernel
genkernel --help | less

Lumi ★★★★★ ()

Re: Как создать initramfs?

В документации к ядру Documentation/initrd.txt и man initrd. Только там написано про образ диска, но можно делать как вы и сказали cpio.gzip.

qwe ★★ ()

Re: Как создать initramfs?

man cpio, man gz, man modprobe, man mount, man bash, man pivot_root . И никакая "гента" не нужна, дошли уже жо ручки - ради такой фигни от emerge зависеть =)

e ()
Ответ на: Re: Как создать initramfs? от Lumi

Руки прямо из ума растут.

У человека LFS'ное прошлое, хочется ручками поковырять. Наверное возьму initramfs который создаст genkernel за основу и буду его разбирать на части.

Camel ★★★★★ ()
Ответ на: Re: Руки прямо из ума растут. от Lumi

Нииработает.

Что-то глохнет у меня initramfs. Вот такой у меня initramfs-list: 

# commands
dir /bin 0755 0 0
file /bin/bash /bin/bash 0755 0 0
slink /bin/sh /bin/bash 0777 0 0
file /bin/mount /root/initramfs/klibc-1.4.30/usr/utils/static/mount 0755 0 0
file /bin/cat /bin/cat 0755 0 0
file /bin/mknod /bin/mknod 0755 0 0
file /bin/run-init /root/initramfs/klibc-1.4.30/usr/kinit/run-init/static/run-init 0755 0 0

file /init /root/initramfs/scripts/init 0755 0 0
file /bin/mdadm /usr/src/mdadm-2.5.6/mdadm.static 0755 0 0

# supporting libraries
dir /lib 0755 0 0
file /lib/ld-linux.so.2 /lib/ld-linux.so.2 0755 0 0
file /lib/libc.so.6 /lib/libc.so.6 0755 0 0
file /lib/libdl.so.2 /lib/libdl.so.2 0755 0 0
file /lib/libncurses.so.5 /lib/libncurses.so.5 0755 0 0
slink /lib/libncurses.so.5.0 /lib/libncurses.so.5 0755 0 0
file /lib/libhistory.so.5 /lib/libhistory.so.5 0755 0 0
file /lib/libreadline.so.5 /lib/libreadline.so.5 0755 0 0

# supporting directories
dir /proc 0755 0 0
dir /new-root 0755 0 0

# initial device files required
dir /dev 0755 0 0
nod /dev/console 0600 0 0 c 5 1
nod /dev/null 0666 0 0 c 1 3

Ничего особенного. А вот мой файл init, который init в initramfs. Он 
должен только смонтировать то что будет корневой файловой системой и 
запустить основной init. Я его подредактировал под свою железячную 
конфигурацию, много закомментировал: 

#!/bin/bash

mount -t proc proc /proc
CMDLINE=`cat /proc/cmdline`

for param in $CMDLINE ; do
    case "$param" in
        root=*|init=*)
            eval "$param"
            ;;
    esac
done

if [ -z "$root" ] ; then
    echo "No root filesystem given to the kernel.  Append the"
    echo "correct 'root=' boot option."
    echo
    echo "Dropping to a very minimal shell.  Reboot with"
    echo "Ctrl-Alt-Delete."

    exec /bin/bash
fi

if [ -z "$init" ] ; then
    init=/sbin/init
fi

# Make the device file
mknod /dev/hda2 b 3 2
mknod /dev/hdb2 b 3 66
mknod /dev/hdc2 b 22 2
mknod /dev/hdd2 b 22 66
mknod /dev/md0  b 9 0

# last chance to fix stuff...
/bin/bash
#exec run-init /new-root $init "$@"

Вот и всё. В таком виде initramfs не монтирует корень, а передаёт мне мне ручное управление, вот что я делаю: создаю md0 -- software-RAID-0 
на котором у меня система, монтирую его в /new-root, перемещаю /proc 
как описано в LFS hint'е, пытаюсь запустить init:

# mdadm -C /dev/md0 -l linear -n 4 /dev/hda2 /dev/hdb2 /dev/hdc2 /dev/hdd2 -c 4
# mount -t reiser4 /dev/md0 /new-root
# mount -o move /proc /new-root/proc
# exec run-init /new-root /sbin/init 1

После этого получаю сообщение об ошибке и Kernel panic: 

init: /dev/initctl: no such file or directory

Устройство /dev/initctl в системе присутствует, в смысле в /new-root/dev/initctl; в initramfs, по идее, его быть не должно, но я пробовал добавить, всё равно с той же ошибкой вылетает. Таки что делать-то? Какую команду дать чтобы хоть в ручном режиме загрузится успешно? 

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