LINUX.ORG.RU

Booting kernel failed при загрузке самодельного Live-Debian

 ,


1

1

Ох... В общем, у меня задача сделать Live систему Debian полностью размещенную в initramfs. Что я делаю: 1. Создаю виртуальную машину в VirtualBox, устанавливаю туда Debian и ряд пользовательских приложений - тут все стандартно и ничего интересного. 2. Далее из виртуального диска .vdi выделяю образ .img:

vboxmanage clonemedia --format RAW mydisk.vdi mydisk.img
Утилитой fdisk выявляю стартовый сектор и размер сектора:
fdisk mydisk.img
умножаю стартовый сектор на размер сектора и полученное {ЗНАЧЕНИЕ} использую при монтировании:
mount -o loop,offset={ЗНАЧЕНИЕ} /mydisk.img /mnt
Ну, соответственно, в mnt лежит содержимое жесткого диска виртуалки с Debian'ом - все тоже стандартно. 3. Дальше я все из mnt (не знаю зачем, от греха подальше) копирую во временную директорию, в которой буду создавать initramfs (пускай это будет /ird), и удаляю оттуда ядро(-а) и initrd, а также всю директорию boot (там лежит GRUB2 установленного Debian'а - он, как я понимаю, нафиг не нужен). 4. Ну и пакую все в cpio+gzip:
find . | cpio -H newc -o | gzip > initramfs.gz
5. Делаю директорию для создания Live-CD (допустим /livecd) и помещаю туда директорию isolinux, в которой лежат: boot.cat hdt.c32 isolinux.bin isolinux.cfg ldlinux.c32 libcom32.c32 libgpl.c32 libmenu.c32 libutil.c32 memdisk vesamenu.c32 ну и, естественно initramfs.gz (initrd, который сделал в п. 4) и vmlinuz-5.10.0-9-amd64 (ядро). boot.cat делаю просто утилитой dd (заполняю нулями до 2 кБ). isolinux.cfg имеет следующее содержание:
DEFAULT MyLive
LABEL MyLive
linux /isolinux/vmlinuz-5.10.0-9-amd64
APPEND initrd=/isolinux/initramfs.gz rw
Писал его сам, не судите строго. Не хотел бездумно переписывать чужие. Остальные файлы тупо взял из существующего isolinux'а от Live-Debian с официального сайта, каюсь. 6. Создаю образ:
genisoimage -o disk.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -J -R /{полный путь к директории livecd}
Образ создается без ошибок, я даже потом проверяю что на .iso все внутри лежит как надо (путем подмонтирования его в loop-режиме). 7. Самое интересное. Создаю в VirtualBox виртуалку БЕЗ жесткого диска, в виртуальный CD «сую» свой disk.iso и запускаю машину. Дальше происходит следующее:
ISOLINUX 6.03 20171018 ETCD Copyright (C) 1994-2014 H. Peter Anvin et al
То есть как минимум ISOLINUX цепляется успешно!
Loading /isolinux/vmlinuz-5.10.0-9-amd64...ok
Раз «ok» - значит, надо понимать, загрузка ядра произошла успешно?...
Loading /isolinux/initramfs.gz...ok
Опять же - говорит «ok»! А потом вот такая шляпа:
Booting kernel failed: Invalid argument
boot:
*********************************** *** Я голову сломал, что он от меня хочет - я никаких аргументов не передавал в ядро... Очень прошу помочь - в каком направлении думать, где я ошибся. Ну или, как вариант, с удовольствием приму помощь по созданию подобного Live-дистрибутива на коммерческой основе (формат взаимодействия и стоимость оговорим в личке)!

Жуть какие костыли. Неужели нет штатного способа напихать произвольное количество пакетов в initramfs?

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

Может быть и есть. Но я пошел самым очевидным способом.

dima9kin ()

fdisk mydisk.img
mount -o loop,offset={ЗНАЧЕНИЕ} /mydisk.img /mnt

Рекомендую использовать kpartx. Эта программа сама к loop подключит, разделы найдёт и создаст файлы устройств для этих разделов.

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

О! Спасибо за наводку - а то я с этим подмонтированием .vdi раздела мучался 2 дня:)) Спасибо еще раз!

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

Как таковая цель - создать пользовательский (то есть с набором нужных приложений и удобными настройками xfce4) дистрибутив Debian-LIVE. Раньше я создавал эту шляпу с помощью respin - на новых Debian-ах она у меня не работает. Такая же фигня с Linux Live Kit. Да и, честно говоря, надоело пользоваться какими-то непонятными пакетами, без понимания принципа создания Live-системы. Ну, а почему именно пошел по архитектуре «запихнуть всю систему в initramfs» - да просто потому, что это мне показалось намного проще собирать, чем классическую LiveCD, где так же нужен маленький initramfs, а паровозом к нему еще отдельно паковать основную ФС в filesystem.squashfs, настраивать init и так далее. Если у меня не идет ничего в простой связке Ядро+Initramfs - то уж классическую LiveCD я вечность буду собирать! Кроме того, когда все в initramfs - меньше изнашивается привод - при загрузке все ведь помещается в RAM и там крутится до перезагрузки.

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

Ну, а почему именно пошел по архитектуре «запихнуть всю систему в initramfs» - да просто потому, что это мне показалось намного проще собирать, чем классическую LiveCD

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

Если есть желание исследовать, то пожелаю удачи. Меня на такое не хватает.

Если просто нужен live-cd, то у дебиана есть live-build, который выдаст и iso, и образ/tar для флешки, и архив для net-boot. Кроме прочего созданный iso может работать в памяти, если ядру передать опцию toram

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

А можно чуть поподробнее про Live-build от Debian? Это инструмент создания именно пользовательской (с возможностью предварительной установки приложений) версии Live-дистрибутива? И это именно официальный инструмент от разработчиков Debian’а - или очередная самоделка вроде respin? P.S. Заранее прошу извинить за, возможно, глупые вопросы - но не хочется пойти в очередной раз в тупиковом направлении…

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

Это инструмент создания именно пользовательской (с возможностью предварительной установки приложений) версии Live-дистрибутива?

любой. Запускаешь lb configure и получаешь «проект» с которым можешь работать. В одни каталоги складываешь файлы, где указываешь какие пакеты ставить, в другие каталоги складываешь скрипты, которые будут выполняться при сборке или при запуске системы и т.д. Ман там довольно обширный, пакет называется live-manual-{pdf,html,…}.

И это именно официальный инструмент от разработчиков Debian’а - или очередная самоделка вроде respin?

насколько я знаю — да. Они им официальные live-сборки делают. Например есть простейший образ с xfce

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

Весьма вероятно, судя по тому, что успел прочитать. Спасибо Вам огромное!

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

Да, мануал там обширный. В общем, думаю либо live-build, либо booty - что то точно решит мою задачу. Всем спасибо!

dima9kin ()

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

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

Погодите, а разве есть предел для размера initramfs?!? Я был уверен, что единственный лимит - это физический объем оперативки (он в разы в моем случае превышает размер initramfs - 2.2 ГБ initramfs против 16 ГБ выделенной на виртуальную машину RAM). Это очень важный момент для меня - есть ли какие то иные ограничения для initramfs кроме объема ОЗУ? Заранее благодарю за внимание!

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

еще есть https://studioexpress.opensuse.org/ там можно делать образы «лайв-линукса»(прямо в вебинтерфейсе) с любыми пакетами (свои пакеты надо собрать в своем аккаунте в ихнем билдсервисе и потом добавить при создании лайв образе)… не знаю может это не то что автору нужно, какаято черная магия в первом посте

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

Загрузчик хотя бы 64битный? Даже если да - вся ли память ему доступна? А вдруг там размер где-то в int хранится?

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

Загрузчик 100% 64-разрядный. А вот как посмотреть вся ли память ему доступна? Ну и что значит «размер памяти хранится в int»? Если не сложно в кратце просветите, пожалуйста.

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

Где-нибудь при передаче парметров в ядро передаётся размер initrd, но как знаковое 32битное целое, тогда 2.2гб может не влезть

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

Так, это уже кое что. А где можно почитать - как именно осуществляется передача параметров в ядро при загрузке? Потому что это явно осуществляется не на уровне загрузчика isolinux (там всего один конфигурационный файл и в нем нет ничего подобного). Других конфигурационных файлов нет в образе диска тупо нет. А внутри initramfs конечно дохрена всякой всячины - но чтобы ее передать ядру - логично предположить, что сперва initramfs нужно смонтировать - а этого не происходит. Вот и вопрос - как тогда могут передаваться какие либо параметры ядру? Откуда они берутся, если изначально на iso-диске лежат ТОЛЬКО ядро, initramfs (который согласно гипотезе НЕ МОНТИРУЕТСЯ из-за неверно передаваемых ядру параметров) и загрузчик isolinux с одним единственным конфигурационным файлом в три строчки?… Замкнутый круг. Кроме того, образ initramfs всего 2.2 ГБ, а 32-хразрядным числом можно адресовать почти в два раза больше…

dima9kin ()

задача сделать Live систему Debian полностью размещенную в initramfs

Внутри рабочей и настроенной системы выкидываем из fstab монтирование корня (это важно), делаем

find -xdev -print0 | cpio -o --null -H newc | gzip > rootfs.cpio.gz
Затем берём ядро - vmlinuz из /boot и этот самый rootfs.cpio.gz, кидаем на флешку или куда там ещё, и подсовываем их загрузчику с опцией ядра rdinit=/sbin/init. В systemd-boot это выглядит так:
linux   /vmlinuz
initrd  /rootfs.cpio.gz
options rdinit=/sbin/init

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

Ого! Завтра буду пробовать, спасибище огромное! Если не сложно - а что сортирует (находит) команда

find -xdev -print0
? Я имею в виду - почему мы не используем просто
find .
прямо в корневом каталоге? Почему не пакуем всю настроенную систему в initramfs? Как подсунуть ядру нужную опцию силами isolinux'а я, полагаю, разберусь. А вот в чем физический смысл этой опции rdinit=/sbin/init? Еще раз огромное спасибо что подсказали куда смотреть и пытаться двигаться!

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

-xdev «не искать в примонтированных ФС»

-print0 «выдать список на упаковку»

rdinit=/sbin/init «запустить init непосредственно из initramfs»

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

Да, мне это важно. Потому что если смогу засунуть систему в initramfs то, во-первых, решу текущую задачу. А, во-вторых, есть шанс (пусть и не большой) провернуть нечто подобное с системой Android, ибо архитектурно она схожа. А это позволит получить Live-phone. А он прям позарез уже много лет нужен. Очень неудобно быть привязанным к компу.

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

В общем, через ту ошибку, которую в начале выдавал - успешно перевалил я! Спасибо за наводку. Теперь, правда, выдает другую ошибку:

end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown -block(0,0)
Если у кого есть идеи - буду очень признателен!

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

UPD: Сейчас прогнал запуск с параметром ядра boot_delay=9 и обнаружил интересную строчку:

Initramfs unpacking failed: uncompression error
Freeing initrd memory
Очевидно, что ядро не может распаковать initramfs - что может быть вызвано либо отсутствием поддержки выбранного алгоритма сжатия ядром (но я применял самый обычный gzip+cpio) либо неправильной паковкой самого initramfs (но тут тоже паковал ведь простыми системными утилитами...) Опять же - за идеи, как протестировать архив initramfs и/или поддержку ядром методов распаковки - буду признателен!

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

В том дистрибутиве защита от дурака стоит , фактически надо более менее опыт и благодарность автору и он тебе подскажет

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

Сразу ряд вопросов возникает: 1. «В том дистрибутиве» - это в Debian, правильно? То есть если взять иной дистрибутив (какой?), который более, скажем так, гибок - то вероятность того, что рассмотренная выше связка заработает - выше, так? 2. Не очень понял про «благодарность автору» - если речь идет об авторах Debian'а, то, боюсь, им моя благодарность до одного причинного места. А если имеется в виду автор поста - то я в самом первом сообщении писал, что я С УДОВОЛЬСТВИЕМ ГОТОВ ПЛАТИТЬ за помощь, проблема лишь в том, что никто в личку с подобными предложениями сотрудничества не обращался... Ну, а если речь идет о чисто человеческой благодарности, то я невероятно благодарен КАЖДОМУ, кто обратил внимание на мою тему, кто не прошел мимо и поделился частичкой своего опыта.

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

Тупо потому, что мне он показался самым ПРОСТЫМ. Куча функций мне совершенно без надобности - поэтому и брал самое простое. Если Вы считаете, что вероятность запустить конструкцию через GRUB2 выше - попробую GRUB’ом. Просто мне немного странно, что проблема может быть в загрузчике. Вечером начну тогда с конфигом GRUB2 разбираться

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

А, ну и потому, что запускать такой Live будут ИСКЛЮЧИТЕЛЬНО с DVD диска, никаких флешек и так далее. Мне показалось, что isolinux прям именно для этого и создан))

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

ЗАРАБОТАЛО!!!!! Я дол…б: не проверил, что gzip запаковал с ошибкой! Перепаковал заново - и, ву а ля - все работает. Весь Дебиан 11 лежит в RAM, все работает! Спасибо всем, кто откликнулся, кто помогал мне в этом деле! Ребят, вы лучшие!

dima9kin ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.