LINUX.ORG.RU

смонтировать cpio.gz как корневую ФС

 , ,


0

1

Почему в раздел development, потому что собираю образ Yocto Project, он генерирует мне корректный blabla.cpio.gz, и если его распаковать и указать root=/dev/sdX1 то оно при помощи GRUB2 загружается успешно.

Проблема в том что я никак не могу заставить использовать initramfs архив как единственную корневую систему, что специфично для встраиваемой системы дабы флэш не марать и выдерживать внезапные ребуты или выключения:

set timeout=10
set default=0

menuentry "Yocto" {
        insmod gzio
        insmod part_msdos
        insmod ext2
        echo 'Loading kernel...'
        linux /boot/bzImage
        echo 'Loading filesystem...'
        initrd /boot/test-image-ramfs-qemux86.cpio.gz
}

В логах я вижу строчки:

Unpacking initramfs...
Freeing initrd memory: 12144k freed
Может ли это сказываться на том что у меня не загружается? Оно тупо считать что initramfs больше не нужно? Размер 12144 это ровно столько весит мой образ в сжатом виде.

Что надо указать в параметрах к ядру чтобы оно подцепило таки мой test-image-ramfs-qemux86.cpio.gz как единственную корневую систему?

Пробовал root=/dev/ram0 и многие другие вещи...

Ядро собрал сам Linux 3.9 тупо с kernel.org, поддержка initramfs и loopback есть.

★★★★★

Последнее исправление: I-Love-Microsoft (всего исправлений: 2)

Насколько я помню, требуется поддержка tmpfs в ядре, а также init в строго определённом месте (/sbin/init).

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

init у меня вообще в корне, идеально.

tmpfs не знаю, завтра посмотрю включена ли...

А параметры к ядру никакие не надо?

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

I-Love-Microsoft ★★★★★
() автор топика

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

ubuntuawp ★★
()
Ответ на: комментарий от I-Love-Microsoft

Стоп. Архив собран с -Hnewc?

Ядро сначала пытается распаковать initrd и проверяет, подойдёт он в качестве initramfs (cpio-архив формата newc, в котором есть исполняемый /sbin/init), или нет. Если нет, оно его игнорирует и пытается найти обычный корень. Параметр init= при работе с initramfs игнорируется.

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

Собирало Yocto, я верю в мудрость разработчиков.

Как проверить что архив newc? Это важная деталь.

Проверю и наличие /sbin/init ведь если у меня init в корне в полном объеме, то другого может не быть. Опять же не знал что оно его там ищет...

I-Love-Microsoft ★★★★★
() автор топика
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

zcat file.zpio.gz | file - должен сказать, что это не просто cpio archive, а SVR4 with no CRC.

Кажется, я наврал насчёт /sbin/init, так как настоящий init у initramfs должен быть в /init. Для уверенности можно сделать хардлинки: /init, /sbin/init, /linuxrc.

Можно также сверить другую информацию с https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt.

Не забыли поддержку сжатия gzip для ramdisk?

AITap ★★★★★
()

init должен быть в корне

/usr/src/initramfs-3.9.0-gentoo $ find .
.
./init
./sys
./mnt
./mnt/root
./sbin
./sbin/zpool
./sbin/zfs
./sbin/mdev
./dev
./dev/mapper
./dev/mapper/control
./dev/console
./dev/null
./dev/tty
./dev/sda1
./etc
./etc/lvm
./etc/dfs
./etc/dfs/sharetab
./bin
./bin/busybox
./usr
./usr/lib64
./usr/lib64/libmagic.so.1
./usr/lib64/libmagic.so.1.0.0
./proc
./lib64
./lib
./lib/libpthread.so.0
./lib/ld-linux-x86-64.so.2
./lib/librt.so.1
./lib/libc.so.6
./lib/libdl.so.2
./lib/libz.so.1
./lib/libzfs.so.1
./lib/libm.so.6
./lib/libzpool.so.1
./lib/libuutil.so.1
./lib/modules
./lib/modules/zcommon.ko
./lib/modules/zavl.ko
./lib/modules/zunicode.ko
./lib/modules/zfs.ko
./lib/modules/znvpair.ko
./lib/modules/spl.ko
./lib/libnvpair.so.1
./lib/libuuid.so.1
./root

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

Раз пишет " Unpacking initramfs... Freeing initrd memory: 12144k freed" значит оно распаковало и освободило... Размер 12144 у сжатого файла именно такой.

I-Love-Microsoft ★★★★★
() автор топика

When using initrd, the system typically boots as follows:

1) the boot loader loads the kernel and the initial RAM disk 2) the kernel converts initrd into a «normal» RAM disk and frees the memory used by initrd 3) if the root device is not /dev/ram0, the old (deprecated) change_root procedure is followed. see the «Obsolete root change mechanism» section below. 4) root device is mounted. if it is /dev/ram0, the initrd image is then mounted as root 5) /sbin/init is executed (this can be any valid executable, including shell scripts; it is run with uid 0 and can do basically everything init can do). 6) init mounts the «real» root file system 7) init places the root file system at the root directory using the pivot_root system call 8) init execs the /sbin/init on the new root filesystem, performing the usual boot sequence 9) the initrd file system is removed

anonymous
()
Ответ на: комментарий от anonymous
When using initrd, the system typically boots as follows:

  1) the boot loader loads the kernel and the initial RAM disk
  2) the kernel converts initrd into a "normal" RAM disk and
     frees the memory used by initrd
  3) if the root device is not /dev/ram0, the old (deprecated)
     change_root procedure is followed. see the "Obsolete root change
     mechanism" section below.
  4) root device is mounted. if it is /dev/ram0, the initrd image is
     then mounted as root
  5) /sbin/init is executed (this can be any valid executable, including
     shell scripts; it is run with uid 0 and can do basically everything
     init can do).
  6) init mounts the "real" root file system
  7) init places the root file system at the root directory using the
     pivot_root system call
  8) init execs the /sbin/init on the new root filesystem, performing
     the usual boot sequence
  9) the initrd file system is removed
anonymous
()
Ответ на: комментарий от tensai_cirno

Я нашел что в моем cpio.gz образе нет /sbin/init а только /init, а анонимус выложил что процедура загрузки должна найти /sbin/init...

I-Love-Microsoft ★★★★★
() автор топика

Проблема решена... Yocto тупо не тот образ генерировал, с не тем содержимым, не тем /init, а сам init запускался - выяснил при помощи QEMU просмотрев полный лог ядра.

Надо было просто брать текущий образ который напрямую с флэшки работает и лишь добавить строку в .bb файл:

IMAGE_FSTYPES += " cpio.gz "
и тогда няряду с обычными архивами rootfs появится такой же рабочий но в формате cpio.gz. Эх...

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

первым делом запускается скрипт /init, из которого запускается /sbin/init, являющаяся, чаще всего, бинарным файлом написанном на c

попробуйте разархивировать ваш cpio архив и поковыряйтесь в скрипте init, добавьте отладочные сообщения какие-нибудь, чтобы было ясно, где затыкается загрузка, хотя подозреваю, что дело до /init не доходит.

а параметры ядра по идее вообще не нужны, так как все параметры парсятся именно в скрипте /init, если вы собираете embeded систему, то все параметры можете руками указать в этом скрипте.

кажется уже решено.

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

Да, решено, я как вглянулся в этот init скрипт что был - а он отрабатывал live cd задачи... И именно что пытался монтировать хард, спасибо QEMU что я это увидел.

В общем, проблема решена, система из RAM работает, ну просто красота :)

Я не ожидал что в Linux всё так просто сделано в этом плане, честно. Ожидал каких-то хитрых параметров, указания какого-то root=, специальные манипуляции в init-скриптах, а оно тупо берет из GRUB2 файл, который initrd, видит что он initramfs и всё работает...

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

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

по сути чтобы смонтировать ramfs вообще ничего не надо. кроме ramfs.

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