Как загрузить корневую файловую систему, хранящуюся в виде файла образа раздела на загрузочном 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 во время жизненного сеанса, обеспечение лучшего вывода при отладке в жизненном сеансе, ...)?