Под термином LiveCD понимают полноценный дистрибутив операционной системы, позволяющий загружаться прямо с исходного носителя (CD, DVD, USB Flash) без необходимости установки на жесткий диск. Вот наиболее типичные сценарии использования LiveCD:
- Независимое мобильное рабочее место
- Аварийный диск восстановления системы
- Медиа-центр: аудио, видео, интернет
- Демонстрационный диск с вашим продуктом
В этой статье рассказывается о том как приспособить LiveCD дистрибутив Mandriva One 2008 под ваши нужды. В качестве хост-системы использовалась Mandriva 2008 PowerPack. Если вы пользуетесь другой системой - не спешите уходить! Поняв основной принцип вы разберетесь и со своим дистрибутивом. Итак, приступим.
Инструменты
Для пересборки LiveCD потребуются утилиты readcd, mkisofs и cdrecord из пакета Cdrtools, а также mksquashfs из пакета squashfs-tools. Вместо Cdrtools можно так же использовать пакет Cdrkit, входящий в стандартную поставку Mandriva, но тут могут быть подводные камни. Пакета squashfs-tools в моей поставке не оказалось, поэтому пришлось его скачать: squashfs-tools-3.2-1.r2.2mdv2007.1.i586.rpm (~80 Кб).
Сборка LiveCD
Для начала создадим отдельную директорию и сохраним ее в переменной окружения LIVE_CD. Внутри этой директории и развернутся самые интересные события:
mkdir LiveCDТеперь необходимо вставить оригинальный LiveCD в CD-ROM и сохранить его в виде ISO-образа. Если у вас уже есть готовый ISO-образ то можете пропустить этот шаг:
cd LiveCD
export LIVE_CD=`pwd`
readcd dev=/dev/cdrom f="$LIVE_CD/mandriva_orig.iso"В директории LIVE_CD должен появиться файл mandriva_orig.iso Теперь создадим директорию orig_iso/ и смонтируем в нее созданный ISO-образ:
mkdir "$LIVE_CD/orig_iso"Посмотрим что внутри:
sudo mount -r -t iso9660 -o loop "$LIVE_CD/mandriva_orig.iso" \
"$LIVE_CD/orig_iso"
ls "$LIVE_CD/orig_iso"Как и следовало ожидать, внутри директории orig_iso/ мы видим содержимое оригинального компакт диска.
boot/ isolinux/ LISEZMOI.pdf loopbacks/ README.pdf
Итак, мы подошли к первому препятствию: нам необходимо вносить изменения в файловую систему iso9660, смонтировать которую можно только на чтение. Эта задача решается в два приема: во-первых, создадим в памяти файловую систему tmpfs:
mkdir "$LIVE_CD/tmp_iso"Эта файловая система доступна как на чтение так и на запись. Все что мы запишем в tmp_iso/ будет сохраняться в памяти. Теперь объединим файловые системы iso9660 (ro) и tmpfs (rw) в одну при помощи файловой системы unionfs:
sudo mount -t tmpfs none "$LIVE_CD/tmp_iso"
mkdir "$LIVE_CD/union_iso"Посмотрим что внутри:
sudo mount -o dirs="$LIVE_CD/tmp_iso=rw:$LIVE_CD/orig_iso=ro" \
-t unionfs unionfs "$LIVE_CD/union_iso"
ls "$LIVE_CD/union_iso"На первый взгляд ничего не изменилось - все те же файлы, что и на оригинальном CD. Тем не менее отличие есть: union_iso/ доступна на запись:
boot/ isolinux/ LISEZMOI.pdf loopbacks/ README.pdf
mount | grep union_isoВсе изменения которые мы сделаем в union_iso/ будут прозрачно сохраняться в памяти.
unionfs on /home/xander/LiveCD/union_iso type unionfs \
(rw,dirs=/home/xander/LiveCD/tmp_iso=rw:/home/xander/LiveCD/orig_iso=ro)
Двигаемся дальше. Давайте заглянем в папку loopbacks/ оригинального CD:
ls -lh "$LIVE_CD/orig_iso/loopbacks"Обратите внимание на размер файла distrib.sqfs - 688 мегабайт. Он занимает почти весь CD-диск. Это образ сжатой файловой системы squashfs в котором хранится файловая система LiveCD. Как и iso9660 смонтировать squashfs можно только на чтение:
-rwx------ 1 root root 688M 2007-10-09 02:01 distrib.sqfs
mkdir "$LIVE_CD/orig_sqfs"Посмортим что внутри:
sudo mount "$LIVE_CD/orig_iso/loopbacks/distrib.sqfs" -o ro,loop \
-t squashfs "$LIVE_CD/orig_sqfs"
ls "$LIVE_CD/orig_sqfs"Ага! Это действительно похоже на файловую систему LiveCD. По отработанной схеме сделаем ее доступной для записи. Сначала создадим временную файловую систему в памяти:
bin/ dev/ home/ lib/ mnt/ proc/ sbin/ tmp/ var/
boot/ etc/ initrd/ media/ opt/ root/ sys/ usr/
mkdir "$LIVE_CD/tmp_sqfs"Теперь объединим файловые системы tmpfs (rw) и squashfs (ro) при помощи файловой системы unionfs:
sudo mount -t tmpfs none "$LIVE_CD/tmp_sqfs"
mkdir "$LIVE_CD/union_sqfs"Для проверки заглянем внутрь union_sqfs/:
sudo mount -o dirs="$LIVE_CD/tmp_sqfs=rw:$LIVE_CD/orig_sqfs=ro" \
-t unionfs unionfs "$LIVE_CD/union_sqfs"
ls "$LIVE_CD/union_sqfs"Все как в orig_sqfs/, но теперь с возможностью записи:
bin/ dev/ home/ lib/ mnt/ proc/ sbin/ tmp/ var/
boot/ etc/ initrd/ media/ opt/ root/ sys/ usr/
mount | grep union_sqfsТеперь, когда все подготовительные действия выполнены, можно приступить к редактированию дистрибутива. Для примера установим на LiveCD программу Midnight Commander (на стандартном LiveCD ее не оказалось):
unionfs on /home/xander/LiveCD/union_sqfs type unionfs \
(rw,dirs=/home/xander/LiveCD/tmp_sqfs=rw:/home/xander/LiveCD/orig_sqfs=ro)
sudo urpmi --quiet --auto --root="$LIVE_CD/union_sqfs" mcДля тех кто не сталкивался с Mandriva Linux я поясню смысл последней команды. Утилита urpmi устанавливает RPM-пакеты с учетом их зависимостей. Ключ --auto просит urpmi не задавать лишних вопросов - этот режим часто используется в неинтерактивных скриптах. Ключ --quiet подавляет лишний вывод. Ключ --root заслуживает особого внимания. Поскольку в качестве хост-системы в данном примере также используется Mandriva Linux мы можем использовать RPM-репозиторий хост-системы для установки пакетов на LiveCD. Очень изящно и красиво!
Также просто можно удалить программу если она вам не нужна. В Mandriva Linux для этой цели используется утилита urpme. Давайте в качестве примера удалим OpenOffice:
sudo urpme -a --auto --root="$LIVE_CD/union_sqfs" openofficeКлюч -a заставит urpme удалить все пакеты в названиях которых есть openoffice.
При необходимости можно редактировать любые конфигурационные файлы внутри LiveCD. Все изменения попадут в итоговую систему.
Итак, допустим мы внести все необходимые коррективы в наш будущий LiveCD-дистрибутив. Что дальше? Для начала давайте пересоберем squashfs-образ с учетом всех сделанных изменений, ведь пока все они хранятся в памяти!
sudo mksquashfs "$LIVE_CD/union_sqfs" \Первая команда создает новый сжатый образ distrib_new.sqfs, а вторая - заменяет им оригинальный distrib.sqfs. Обратите внимание на сообщение Parallel mksquashfs: Using 2 processors. Приятно, что программа использует возможности многоядерных CPU.
"$LIVE_CD/distrib_new.sqfs"
Parallel mksquashfs: Using 2 processors
...
sudo mv -f "$LIVE_CD/distrib_new.sqfs" \
"$LIVE_CD/union_iso/loopbacks/distrib.sqfs"
Итак, образ squashfs пересобран и помещен в нужное место. Теперь необходимо пересобрать ISO-образ с новым файлом distrib.sqfs. Делается это следующей командой:
sudo mkisofs -quiet -o "$LIVE_CD/mandriva_new.iso" -input-charset iso8859-1 \Обратите внимание на опции -b и -c. Они необходимы для того чтобы сделать CD загрузочным. Опции -no-emul-boot, -boot-load-size 4 и -boot-info-table так же специфичны для создания загрузочных дисков. Внимательно читайте mkisofs(1).
-J -R -V "MandrivaOne" -b isolinux/isolinux.bin -c isolinux/boot.cat \
-no-emul-boot -boot-load-size 4 -boot-info-table "$LIVE_CD/union_iso"
Опции -J и -R включают расширения Joliet и Rock Ridge соответственно. Опция -V задает метку тома. Если указать метку отличную от "MandrivaOne" то система откажется загружаться. Так что лучше устанавливайте на "свой" ISO такую же метку какая была на оригинальном диске.
Итак, пересобранный образ mandriva_new.iso готов, но не спешите записывать его на болванку! Сначала проверьте его в эмуляторе, например, в VirtualBox.
Для создания новой виртуальной машины выберите Машина → Создать → Далее. Присвойте машине название и укажите тип ОС Linux 2.6. Раздел жесткого диска создавать не обязательно.
Для того чтобы "загрузиться" с ISO-образа как с CD-ROM нажмите на иконку CD/DVD-ROM, установите флажок Подключить CD/DVD и выберите опцию Файл ISO-образа. В открывшемся диалоге укажите путь к файлу mandriva_new.iso:

Теперь виртуальную машину можно запустить:

Примите поздравления! Система успешно загрузилась. Теперь ее можно записать на болванку и проверить на "настоящем" компьютере:
sudo cdrecord dev=/dev/cdrw -v -eject "$LIVE_CD/mandriva_new.iso"Перед тем как пойти на перезагрузку не забудьте отмонтировать файловые системы, созданные в процессе сборки:
sudo umount "$LIVE_CD/union_sqfs"А вот теперь:
sudo umount "$LIVE_CD/tmp_sqfs"
sudo umount "$LIVE_CD/orig_sqfs"
sudo umount "$LIVE_CD/union_iso"
sudo umount "$LIVE_CD/tmp_iso"
sudo umount "$LIVE_CD/orig_iso"
sudo rebootЗаключение
Как вы могли убедиться, приспособить LiveCD под свои нужны совсем не сложно. Все описанные команды можно оформить в виде shell-скриптов и автоматизировать процесс от начала до конца. Отмечу, что описанная методика не специфична исключительно для Mandriva Linux. Поняв основную идею вы разберетесь с любым дистрибутовом.
Ссылки
- Linux From Scratch LiveCD
- Изменение и обновление Ubuntu LiveCD
- LiveCD из Slackware в домашних условиях
- Знакомимся с RIP — делаем свой Live CD
- Создание Fedora Live CD
- Создание собственного варианта загрузочного CD Gentoo Linux
- How to edit a Linux Live CD ISO in 30 easy steps
- Creating bootable CD-ROMs
- FTP-зеркало Mandriva
Статья опубликована на портале CITKIT
