Initramfs для Live CD дистрибутива Linux

Вопрос или проблема

У меня проблемы с созданием initramfs для ISO live cd. Я не знаю, что не так со скриптом init в initramfs, ниже вы можете увидеть скриншоты попыток загрузки ядра и initramfs: первый скриншот — загрузка в VM с UEFI, второй скриншот — VM с устаревшей прошивкой (BIOS):
В 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 заключаются в следующем:

  1. Начальная загрузка ядра и initramfs: Ядро Linux загружается в память и затем разворачивает initramfs, который содержит временную корневую файловую систему и скрипт init. Этот скрипт выполняет ранние стадии инициализации, такие как монтирование основных файловых систем.

  2. Поиск и монтирование корневой файловой системы: init должен обнаружить носитель с файловой системой Live CD (обычно в формате SquashFS или CramFS) и смонтировать его.

  3. Переключение корня (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:

  1. Добавьте диагностику и логи: Улучшите скрипт, добавив больше сообщений и диагностик, чтобы видеть, на каком этапе он может застрять. Например, вывод информации о доступных устройствах (ls /dev), а также результатов каждого монтирования.

  2. Проверка возвращаемого статуса: Убедитесь, что все команды монтирования и mknod проверяют успешность выполнения, например, через $? и соответствующим образом логируют ошибки.

  3. Проблемы UEFI/BIOS: Обратите внимание, что разные методы загрузки (UEFI vs BIOS) могут приводить к различным доступным устройствам и именам устройства. Убедитесь, что список предполагаемых устройств охватывает все возможные ситуации.

  4. Обработка ошибок: Скрипт должен адекватно реагировать на ситуации, когда тот или иной ресурс не обнаружен или занят, возможно, предоставив пользователю возможность вручную вмешаться.

  5. Тестирование в различных средах: Попробуйте загрузить Live CD в различных конфигурациях виртуальных машин и с физического носителя, чтобы выявить другие потенциальные проблемы.

  6. Скриптовые инструменты отладки: Ознакомьтесь с использованием set -x, чтобы включить трассировку выполнения скрипта, на этапе создания окончательного initramfs.

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

Оцените материал
Добавить комментарий

Капча загружается...