Как загрузить корневую файловую систему, хранящуюся в виде файла образа раздела на загрузочном DVD?

Я создал загрузочный компакт-диск с USB-накопителя (построенный из ядра Ubuntu 12.04 в соответствии с этим примером)

  • копирование файлов загрузочного раздела USB-накопителя (содержащего vmlinuz и initrd.img) в папку CD_root/,
  • добавление isolinux в эту папку (согласно этой инструкции)
  • копирование изображения rootfs.part корневого раздела флешки в папку и
  • используя mkisofs.

Как я могу загрузиться с DVD в образ корневого раздела?

Еще несколько подробностей и несколько более точная версия вопроса:

Я могу начать загрузку в скрипт init (используя virtualbox на хосте Ubuntu 12.04): с параметром ядра break=mountroot Я могу упасть в оболочку прямо перед изображением rootfs.part следует установить и вставить:

mkdir /run/cdrom
mount -t iso9660 /dev/sr0 /run/cdrom
losetup /dev/loop0 /run/cdrom/rootfs.part
mount -o ro /dev/loop0 /root

Как я могу достичь этой части (или ее сути монтирования /root) автоматически? Должен ли я патч initrd.img (как) или есть другие варианты, такие как, возможно, параметры ядра?

На данный момент файлы внутри rootfs.part видны в root/, (Они включают /root/sbin/init, /root/sbin/modprobe, root/lib/modules/*,...) Я попытался продолжить и смоделировать нормальную работу сценария инициализации (конечно, немного вне контекста):

udevadm control --timeout=121 --exit
mount -n -o move /dev /root/dev
mount -n -o move /run/ /root/run
mount -n -o move /sys /root/sys
mount -n -o move /proc /root/proc
exec run-init /root /sbin/init </dev/console >/dev/console 2>&1

К сожалению, это не очень далеко. Много сообщений об ошибках пропавших без вести modprobe и устройства, такие как /dev/loop0 несуществующие появляются и повторяются бесконечно. (Может быть, DVD должен быть смонтирован по-другому?)

1 ответ

Решение

Аннотация

Тем временем мне удалось решить проблему. Моя ключевая ошибка заключалась в том, чтобы смонтировать образ корневого раздела без разрешения на запись (так как он хранится на DVD). В настоящее время обычный обходной путь для этого, кажется, использует overlayfs а также tmpfs, Кроме того, похоже, что обычной практикой является использование squashfs для предоставления образа корневого раздела.

Альтернативное решение

В http://remastersys.com/ существует пакет, который может сделать резервную копию работающей системы Debian на Live-DVD. Хотя мне удалось получить его для создания загрузочного DVD, я обнаружил, что результат не удовлетворяет моим целям. (Некоторые проблемы: необходимо изменить существующую систему. Был сделан слишком большой акцент на переустановке Live-DVD и дополнительных пакетов. Было слишком много функций для настройки. При каждой загрузке DVD было две минуты ожидания некоторая конфигурация сети.) Кроме того, мне трудно понять, что на самом деле происходит. Поэтому я выбрал другой путь.

Мое решение

Далее я приведу подробности того, что я сделал как root на Ubuntu 12.04. Я отбросил все специфичные для приложения элементы, пытаясь предоставить краткий и общий пример создания загрузочного DVD-диска с USB-накопителя, загружающего Linux на основе Ubuntu Core 12.04. (Из-за удаления код, показанный ниже, не тестируется. Поэтому, пожалуйста, сообщите мне, если вы обнаружите ошибку, и я исправлю ее.)

Конфигурирование isolinux

Сначала структура файловой системы DVD создается в каталоге CD_root (ср. Изолинукс)

mkdir -p CD_root/boot/isolinux
cp /usr/lib/syslinux/isolinux.bin CD_root/boot/isolinux/

Я предполагаю, что загрузочный раздел загрузочной флешки монтируется под stick_boot/ и что загруженное ядро ​​хранится там и называется vmlinuz,

cp -a stick_boot/vmlinuz CD_root/boot/isolinux/
vi CD_root/boot/isolinux/isolinux.cfg

Содержание isolinux.cfg как следует:

PROMPT 1
TIMEOUT 30
DEFAULT Linux

LINUX Linux
    LINUX VMLINUZ
    APPEND root=/cdrom/rootfs.squash ro
    INITRD INITRD.IMG
  • Загружаемое ядро ​​должно быть указано заглавными буквами (VMLINUZ), даже если он скопирован в файловую систему CD строчными буквами.
  • То же самое относится и к INITRD.IMG,
  • Имя сжатого образа корневой файловой системы загрузочной флешки rootfs.squash должны быть указаны без таких изменений.
  • Указание имени файла сжатого изображения (вместо устройства, такого как /dev/sda1достаточно установить его, используя squashfs,

Сборка initrd

initrd.img используемый на загрузочной флешке должен быть залатан. Корни загрузочной флешки можно использовать для сборки пропатченного initrd. Он может быть защищен от постоянных изменений с помощью overlayfs а также tmpfs (так же, как они будут использоваться для предоставления доступной для записи версии сжатой корневой файловой системы, хранящейся на DVD). Я предполагаю, что корневая файловая система загрузочной флешки (которая должна быть защищена от изменений) смонтирована под stick_rootfs:

mkdir patch_tmp
mount -t tmpfs patched_files_fs patch_tmp
mkdir patch_root
mount -t overlayfs -o lowerdisk=stick_rootfs,upperdisk=patch_tmp overlayed_stick_rootfs patch_root
  • Теперь изменения могут быть внесены безопасно под patch_root/,

В initrd необходимо добавить два модуля:

cat >>patch_root/etc/initramfs-tools/modules <<!
squashfs
overlayfs
!

Во время загрузки DVD должен быть установлен под /cdrom так что сжатый образ корневой файловой системы /cdrom/rootfs.squash доступно. Это достигается с помощью следующего сценария local-premount:

vi patch_root/etc/initramfs-tools/scripts/local-premount/cdmount

Его содержание:

#!/bin/sh

PREREQ=""

prereqs()
{
    echo "$PREREQ"
}

case $1 in
# get pre-requisites
prepreqs)
    prereqs
    exit 0
    ;;
esac

# No error checking / fallbacks for brevity, here
mkdir /cdrom
mount -t iso9660 /dev/sr0 /cdrom
exit 0

Этот скрипт должен быть исполняемым:

chmod +x patch_root/etc/initramfs-tools/scripts/local-premount/cdmount

Доступное для записи представление корневой файловой системы обеспечивается хорошо документированным сценарием. root-ro который я взял с небольшими изменениями из этого немецкого / английского источника.

cp root-ro patch_root/etc/initramfs-tools/scripts/init-bottom/root-ro
chmod +x patch_root/etc/initramfs-tools/scripts/init-bottom/root-ro

Существенные изменения касаются изменений, примененных к fstab в нижней части скрипта. Я использую только одну запись для proc файловая система (я удаляю все записи для root / или же /boot):

proc /proc proc nodev,noexec,nosuid 0 0

Исправленный initrd теперь может быть собран в chroot среда на защищенной корневой файловой системе флешки:

chroot patch_root update-initramfs -c -k 3.2.0-37-generic
  • Параметр -k указывает версию загруженного ядра, загружающего initrd (вывод uname -r на загруженной системе на флешке).

Теперь исправленный initrd можно скопировать в папку isolinux:

cp patch_root/boot/initrd.img-3.2.0-37-generic CD_root/boot/isolinux/initrd.img

Изменения в stick_rootfs теперь можно отменить / забыть:

umount patch_root
umount patch_tmp

Сборка корневой файловой системы

Сжатый образ корневой файловой системы загрузочной флешки также должен быть исправлен. Снова изображение палки защищено с помощью overlayfs а также tmpfs (повторное использование уже созданных каталогов):

mount -t tmpfs patched_files_fs patch_tmp
mount -t overlayfs -o lowerdisk=stick_rootfs,upperdisk=patch_tmp overlayed_stick_rootfs patch_root

Старые файлы кэша должны быть удалены, чтобы избежать зависания / сбоя конфигурации сети при загрузке с DVD:

rm -f patch_root/etc/udev/rules.d/70-persistent-net.rules
rm -f patch_root/var/lib/dhcp/dhclient.eth?.leases

При желании, сценарий извлечения от Casper (как используется, например, на DVD, произведенных remastersys) может быть использован для извлечения DVD при выключении:

cp casper patch_root/etc/init.d/casper
chmod 755 patch_root/etc/init.d/casper
ln -s ../init.d/casper patch_root/etc/rc0.d/S89casper
ln -s ../init.d/casper patch_root/etc/rc6.d/S89casper
  • В верхней части этого скрипта требуется небольшой патч. Есть проверка, была ли система загружена каспером. Если нет, скрипт немедленно завершается. Я удалил этот чек.

Исправленное изображение теперь можно сдавить:

mksquashfs patch_root CD_root/rootfs.squash

Изменения в stick_rootfs теперь можно снова отменить / забыть

umount patch_root
umount patch_tmp

Создание образа DVD

Наконец ISO-образ dvd.iso можно создать:

mkisofs -iso-level 3 -quiet -r -V "STICK_DVD" -cache-inodes -J -l -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -joliet-long -o dvd.iso CD_root

Это все. ISO-образ готов для записи на CD / DVD.

Некоторые предупреждения

  • Я получил это решение в основном методом проб и ошибок. Таким образом, я не настолько уверен, что появляется стабильная система. (Тем не менее, до сих пор, после некоторых тестов на virtualbox и нескольких iMac, это похоже на случай.)

  • Способ предоставления доступа к содержимому загрузочного CD / DVD (см. Сценарий init /etc/initramfs-tools/scripts/local-premount/cdmount), безусловно, может быть улучшено: при наличии нескольких оптических приводов, вероятно, все они должны быть проверены (sr?, hd?, ...). Я не знаю, как напрямую определить устройство, с которого загружается CD / DVD. Я чувствую, что это должно быть возможно (возможно, оценивая /sys или же /proc?). Может быть, даже не нужно было явно устанавливать загрузочное устройство (в другой раз?)? В конце концов, к его содержимому уже обращаются при выполнении сценариев инициализации.

  • Файл /etc/fstab в сжатом образе корневого раздела, вероятно, можно использовать запись для (правильно смонтированного) CD / DVD.

  • Может быть /boot Каталог на iso-образе должен содержать обычные файлы и быть правильно смонтирован в систему life. Это может обеспечить большую гибкость при работе с жизненной системой (например: временная установка программного обеспечения, изменяющего initrd во время жизненного сеанса, обеспечение лучшего вывода при отладке в жизненном сеансе, ...)?

Другие вопросы по тегам