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