Вопрос или проблема
У меня проблемы с созданием initramfs для ISO live cd. Я не знаю, что не так со скриптом init
в initramfs, ниже вы можете увидеть скриншоты попыток загрузки ядра и initramfs: первый скриншот — загрузка в VM с UEFI, второй скриншот — VM с устаревшей прошивкой (BIOS):
Я запускаю ISO в Hyper-V. Вот код скрипта init
:
#!/busybox
# Монтирование необходимых файловых систем
mount -t proc none /proc
mount -t sysfs none /sys
mount -t tmpfs none /tmp
mount -t devtmpfs none /dev
mknod /dev/console c 5 1
mknod /dev/tty1 c 4 1
mknod /dev/tty2 c 4 2
mknod /dev/tty3 c 4 3
mknod /dev/tty4 c 4 4
mount -t devpts none /dev/pts
# Поиск корневой файловой системы
for dev in /dev/sr* /dev/sd* /dev/loop* /dev/mmcblk*; do
echo "Проверка $dev..."
if mount -o ro "$dev" /mnt 2>/dev/null; then
if [ -f /mnt/sysroot.squashfs ]; then
echo "Обнаружена корневая файловая система на $dev"
break
fi
umount /mnt
else
echo "Не удалось смонтировать $dev"
fi
done
# Проверка, найдена ли корневая файловая система
if [ ! -f /mnt/sysroot.squashfs ]; then
echo "Корень live CD не найден. Переход в оболочку..."
exec sh
fi
# Монтирование корневой файловой системы
echo "Монтирование корневой файловой системы..."
mount -t squashfs /mnt/sysroot.squashfs /sysroot
mount --bind /dev /sysroot/dev
mount --bind /dev/pts /sysroot/dev/pts
mount --bind /proc /sysroot/proc
mount --bind /sys /sysroot/sys
mount --bind /tmp /sysroot/tmp
mknod /sysroot/dev/console c 5 1
mknod /sysroot/dev/tty1 c 4 1
mknod /sysroot/dev/tty2 c 4 2
mknod /sysroot/dev/tty3 c 4 3
mknod /sysroot/dev/tty4 c 4 4
# Переход на корень и запуск реального init процесса
exec switch_root /sysroot /sbin/init
sh
sysroot.squashfs
— это rootfs live cd для загрузки. Структура initramfs:
vadim@GoldenVadim:~/Initramfs$ l
busybox* dev/ init* proc/ sys/ sysroot/ tmp/
Можете помочь мне со скриптом init
(initramfs/initrd)? Спасибо
Ответ или решение
Создание initramfs
для ISO Live CD Linux дистрибутива — задача, требующая глубокого понимания процессов загрузки операционной системы. Цель состоит в том, чтобы Live CD успешно загружался, находил корневую файловую систему и переключался на нее для дальнейшего выполнения. Для этого, в вашем скрипте init
, который исполняется при загрузке, важно правильно настроить последовательность операций по монтированию файловых систем и переключению на корневую файловую систему.
Теория
Процесс загрузки Linux включает несколько шагов, но ключевые моменты для Live CD заключаются в следующем:
-
Начальная загрузка ядра и
initramfs
: Ядро Linux загружается в память и затем разворачиваетinitramfs
, который содержит временную корневую файловую систему и скриптinit
. Этот скрипт выполняет ранние стадии инициализации, такие как монтирование основных файловых систем. -
Поиск и монтирование корневой файловой системы:
init
должен обнаружить носитель с файловой системой Live CD (обычно в формате SquashFS или CramFS) и смонтировать его. -
Переключение корня (
switch_root
): После успешного монтирования корневой файловой системы,init
используетswitch_root
, чтобы заменить текущееinitramfs
на штатную корневую файловую систему Live CD и передать управление реальному процессу инициализации (/sbin/init
).
Пример
Исходный код вашего скрипта init
уже содержит все основные инструкции для выполнения этих шагов, однако могут быть некоторые технические и логические ошибки, которые необходимо устранить:
-
Монтирование недостающих файловых систем: Ошибка может заключаться в недостающих или неправильно смонтированных файловых системах, таких как
/dev
или/tmp
. Убедитесь, что все необходимые устройства и виртуальные файловые системы смонтированы. -
Правильное создание устройства для
console
иtty
: Через командуmknod
создаются устройства, которые могут быть необходимы для дальнейшей работы скрипта и системы. -
Проверка точки монтирования корневой файловой системы: Убедитесь, что устройства, такие как
/dev/sr*
или/dev/sd*
, доступны и правильно сканируются. В некоторых системах, например, в UEFI загрузке, устройства могут отличаться. -
Switch_root: Убедитесь, что
switch_root
правильно переключает на/sysroot
и что/sysroot/sbin/init
существует и доступен для выполнения.
Применение
Вот несколько предложений и улучшений для вашего скрипта init
:
-
Добавьте диагностику и логи: Улучшите скрипт, добавив больше сообщений и диагностик, чтобы видеть, на каком этапе он может застрять. Например, вывод информации о доступных устройствах (
ls /dev
), а также результатов каждого монтирования. -
Проверка возвращаемого статуса: Убедитесь, что все команды монтирования и
mknod
проверяют успешность выполнения, например, через$?
и соответствующим образом логируют ошибки. -
Проблемы UEFI/BIOS: Обратите внимание, что разные методы загрузки (UEFI vs BIOS) могут приводить к различным доступным устройствам и именам устройства. Убедитесь, что список предполагаемых устройств охватывает все возможные ситуации.
-
Обработка ошибок: Скрипт должен адекватно реагировать на ситуации, когда тот или иной ресурс не обнаружен или занят, возможно, предоставив пользователю возможность вручную вмешаться.
-
Тестирование в различных средах: Попробуйте загрузить Live CD в различных конфигурациях виртуальных машин и с физического носителя, чтобы выявить другие потенциальные проблемы.
-
Скриптовые инструменты отладки: Ознакомьтесь с использованием
set -x
, чтобы включить трассировку выполнения скрипта, на этапе создания окончательногоinitramfs
.
Применение всех указанных выше шагов и проверка каждой фазы загрузки поможет вам достичь успешной загрузки вашего Live CD. Не забывайте о регулярном тестировании каждой версии вашего initramfs
после внедрения изменений.