LINUX.ORG.RU
ФорумAdmin

initramfs rebuild

 ,


1

2

Прошу помощи у специалистов.

Пытаюсь пересобрать initramfs - делаю так :

  • распаковываю оригинальный - в папке, куда скопировал initrd.xz делаю «xz -d ./initrd.xz && cat ./initrd | cpio -i -d -H newc»

  • в этой же папке , ничего не меняя, делаю «find . -print | cpio -H newc -o | xz -z -F xz -C crc32 –x86 –lzma2=dict=8MiB > ../initramfs.cpio.xz» . Нужен именно xz, кернел понимает только его, опции «–x86 –lzma2=dict=8MiB» тоже важны, без них кернел не принимает созданную initramfs. А эти опции видно при «xz -lvv ./initrd.xz»

  • Пробую запускать под QEMU кернел и оригинальный или мой initramfs - оригинальный нормально отрабатывает /init из initramfs, а мой - выводит кучу строк «modprobe: FATAL: Error running install command for binfmt_0000» и потом «Failed to execute /init (error -8)»

  • распаковываю оба initramfs в разные папки и сравниваю их между собой :

  • размер папок по «du -sb .» одинаковый

  • делаю для папок «find . -type f -print | xargs md5sum -b > ../md5s.txt» и сравнимаю оба файла контр. сумм - отличий нет

  • делаю для папок «ls -lR» и сравниваю вывод - отличие только во времени распаковки

Т.е папки вроде бы не отличичаются, но мой initramfs не работает. Подскажите, куда копать ?



Последнее исправление: kswksw (всего исправлений: 2)

Ответ на: комментарий от t184256

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

В результате вижу такое - если извлечь из оригинального initramfs и моего initramfs cpio-архивы и сделать на них «cpio -itv» (или в mc F3) - то в оригинальном есть такое :

-rwxr-xr-x 2 1000 1000 0 Jun 6 2017 bin/busybox
-rwxr-xr-x 2 1000 1000 1579436 Jun 6 2017 bin/sh

Т.е один файл размер = 0

но при распаковке через «cpio -im» в папке ./bin вижу оба файла (по ls -ign)

17811819 -rwxr-xr-x 2 1000 1579436 июн 6 2017 busybox 
17811819 -rwxr-xr-x 2 1000 1579436 июн 6 2017 sh

т.е. размер один и иноде тот же.

А что означает цифра «2» после прав ? вроде это кол-во ссылок - но они не показаны как ссылки ? но показаны как обычные файлы

А при просмотре таким же образом моего cpio-файла - там наоборот, размер bin/sh = 0. И порядок сортировки вывода другой.

Т.е. что-то не так указываю при распаковке cpio-файла, но вот что именно ?

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

Ну если начать придираться, то не ls -al , а ls -l

И из «man ls» -

-g     like -l, but do not list owner
-i, --inode  print the index number of each file
-n, --numeric-uid-gid  like -l, but list numeric user and group IDs

Т.е показывает именно то, что я и хотел показать.

kswksw
() автор топика

Вроде бы решил проблему. Хоть и «грязно» , но сработало - удалил в папке, откуда собираю initramfs , файл /bin/busybox - и все заработало (почти:)

Т.е скрипт /init начал отрабатывать почти как надо. Дальше , думаю, сам сумею - или еще тему создам:) Тему закрываю, как решенную.

Спасибо t184256 - натолкнул на мысль.

kswksw
() автор топика

Поискал кусок кода, который упаковывает образ в Арче.

Вряд ли это поможет, просто самому любопытно было.

Не уверен, что в этом куске вообще происходит)

    pushd "$BUILDROOT" >/dev/null || return

    # Reproducibility: set all timestamps to 0
    find . -mindepth 1 -execdir touch -hcd "@0" "{}" +

    # If this pipeline changes, |pipeprogs| below needs to be updated as well.
    find . -mindepth 1 -printf '%P\0' \
        | sort -z \
        | LANG=C bsdtar --uid 0 --gid 0 --null -cnf - -T - \
        | LANG=C bsdtar --null -cf - --format=newc @- \
        | $compress "${COMPRESSION_OPTIONS[@]}" >"$compressout"

    pipestatus=("${PIPESTATUS[@]}")
    pipeprogs=('find' 'sort' 'bsdtar (step 1)' 'bsdtar (step 2)' "$compress")

    popd >/dev/null || return
wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 1)
29 февраля 2024 г.
Ответ на: комментарий от kswksw

Приветствую! Столкнулся с подобной проблемой. Хотел переупаковать «initrd» (нужна была правка скрипта «init») в Mods 455, но в итоге, при загрузке получаю: Failed to execute /init (error -2). Распаковывал «/tiny/initrd» так (перед этим скопировав его в /tmp/initrdnew/initrd.xz):

[root /tmp/initrdnew]# xz -d ./initrd.xz && cat ./initrd | cpio -i -d -H newc
[root /tmp/initrdnew]# rm ./initrd.xz

Дальше заменил «init» в этой папке на такой же, но в котором вставлены 2 строки после 64 строки файла (после done):

echo "SQUASHFS_BIN_1: ${SQUASHFS_BIN}"
echo "SQUASHFS_BIN_2: ${SQUASHFS_BIN:1:$}" 

И переупаковал:

find . -print | cpio -H newc -o | xz -z -F xz -C crc32 –x86 –lzma2=dict=8MiB > ../initrd.cpio.xz
cp -f ../initrd.cpio.xz /mnt/d/tiny/initrd

Но после подмены родного «initrd» на новый - получаем незагрузку.

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

Разобрался. Ошибка была в строке: echo «SQUASHFS_BIN_2: ${SQUASHFS_BIN:1:$}» которая вызывала сбой выполнения скрипта. Экспериментировал в загрузочном скрипте: нужно было удалить 1 символ из переменной SQUASHFS_BIN. Правильная строка: echo «SQUASHFS_BIN_2: ${SQUASHFS_BIN:1:${#SQUASHFS_BIN}}»

cs13
()