2

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

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

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

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

Я могу начать загрузку в сценарии инициализации (используя 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 ответ1

5

Аннотация

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

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

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

Мое решение

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

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

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

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 в загруженной системе на USB-накопителе).

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .