Что вызывает kernel panic при установке новых утилит?

Что может быть причиной возникновения kernel panic при добавлении утилит в самодельный дистрибутив Linux? 

Я собираю дистрибутив в учебных целях и на данный момент у меня есть только ядро и initrd, в котором находятся утилиты busybox, mc и необходимые библиотеки, а также init-файл. Init выводит приветственное сообщение и запускает /bin/sh. Я решил добавить утилиты mkfs.ext4, grub-install и grub-mkconfig. 

Для этого я выполнил следующие шаги: 
1. Сначала я скопировал утилиты с помощью следующих команд:
<pre><code>cp /sbin/mkfs.ext4 initrd/bin/
cp /usr/sbin/grub-install initrd/usr/bin/
cp /usr/sbin/grub-mkconfig initrd/usr/bin/</code></pre>
2. Затем я выполнил команду ldd для каждой утилиты (кроме grub-mkconfig) и вручную перенёс все найденные библиотеки в initrd/lib/x86_64-linux-gnu.

После этих действий ядро начало выдавать следующую ошибку:
<pre><code>[   12.723299] /dev/root: Can't open blockdev
[   12.729577] VFS: Cannot open root device "" or unknown-block(0,0): error -6
[   12.730955] Please append a correct "root=" boot option; here are the available partitions:
[   12.732713] 0b00         1048575 sr0 
[   12.733226]  driver: sr
[   12.734156] List of all bdev filesystems:
[   12.734539]  ext3
[   12.734622]  ext2
[   12.734789]  ext4
[   12.735345]  squashfs
[   12.735532]  vfat
[   12.735719]  fuseblk
[   12.736165] 
[   12.736949] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
[   12.738153] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 6.8.0-45-generic #45-Ubuntu
[   12.739057] Hardware name: QEMU Ubuntu 24.04 PC (i440FX + PIIX, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
[   12.740487] Call Trace:
[   12.743510]  &lt;TASK&gt;
[   12.745903]  dump_stack_lvl+0x27/0xa0
[   12.747451]  dump_stack+0x10/0x20
[   12.747832]  panic+0x366/0x3c0
[   12.748166]  mount_root_generic+0
  • 9 января 2025 г. 19:03
Ответы на вопрос 2
Kernel panic при установке новых утилит и, в частности, при попытке запуска вашего самодельного дистрибутива Linux может быть вызван несколькими причинами. В приведенном вами сообщении об ошибке видно, что ядро не может смонтировать корневую файловую систему, из-за чего возникает panic. Давайте рассмотрим возможные причины и шаги, которые можно предпринять для их устранения.

### Причины возникновения ошибки

1. **Отсутствие параметра `root=` в загрузочных параметрах:**
   - Ваша система не знает, какое устройство использовать в качестве корневой файловой системы. Убедитесь, что вы передаете правильный параметр `root=` в конфигурации загрузчика (например, GRUB). В вашем случае это может быть что-то вроде `root=/dev/sda1` или другой подходящий раздел.

2. **Необходимые модули не загружены:**
   - Может быть, не загружены необходимые модули (например, для поддержки файловой системы, используемой на корневом разделе). Убедитесь, что все необходимые модули для вашей файловой системы (например, ext4) загружены в ваше initrd.

3. **Неправильная структура initrd:**
   - Ошибки при создании initrd могут привести к тому, что некоторые необходимые файлы или директории могут отсутствовать. Убедитесь, что структура вашего initrd правильная, и все нужные утилиты и библиотеки находятся на своих местах.

4. **Проблемы с самой файловой системой:**
   - Убедитесь, что файловая система, которую вы пытаетесь смонтировать, исправна и доступна для чтения. Запустите проверки, если это возможно.

5. **Необходимые библиотеки отсутствуют:**
   - Возможно, отсутствуют какие-то зависимости или библиотеки, необходимые для работы добавленных утилит. Убедитесь, что все библиотеки, необходимые для работы таких утилит, как `mkfs.ext4` и других, были корректно перенесены в initrd.

6. **Отсутствие или неправильная конфигурация GRUB:**
   - Если вы используете GRUB, убедитесь, что он настроен правильно и способен корректно найти и загрузить ваш initrd и ядро.

### Рекомендации по устранению проблемы

- **Проверьте параметры загрузки:**
  Убедитесь, что в конфигурации загрузчика GRUB у вас указаны правильные параметры `root=` и другие параметры, необходимые для корректной загрузки.

- **Соберите initrd заново:**
  Попробуйте заново собрать initrd, включая все необходимые модули и убедившись, что структура соответствует ожиданиям системы. Используйте утилиты, такие как `dracut` или `mkinitcpio`, чтобы упростить эту задачу.

- **Инспекция файлов:**
  Убедитесь, что все необходимые бинарные файлы и библиотеки находятся на своих местах и имеют правильные права доступа.

- **Проверьте подключенные устройства:**
  При загрузке проверьте, что ваше устройство действительно доступно, и что на нем есть корневая файловая система. Для этого вы можете загрузиться в режим восстановления или в rescue mode и посмотреть доступные устройства с помощью команды `lsblk`.

- **Консольный вывод:**
  Если возможно, активируйте дополнительный вывод информации на консоль при загрузке (`debug`), чтобы получить больше информации о происходящем в момент загрузки.

Если все вышеперечисленные шаги не помогают, рекомендуется просмотреть системные логи (если доступно) и провести дальнейшую диагностику с помощью утилит отладки.
Возьми уже любой типовой initrd, разбери его и посмотри, из чего он состоит - там довольно много всего...
Похожие вопросы