2005 г.

Gentoo LiveCD изнутри
Анализируем LiveCD от Gentoo Linux

Владимир Попов
Алексей Федорчук

Версия 1.1, 30 мая 2005 г.
Версия 1.0 - на Unix.ginras.ru

Вступление

В этой статье описывается внутреннее устройство инсталляционного диска Gentoo Linux, позволяющего не только выполнить не только первичную установку этого дистрибутива, но и использовать его для аварийно-восстановительных работ. А также просто для начального знакомства с системой - то есть в качестве LiveCD-дистрибутива.

Несмотря на привязку к конкретному дистрибутиву, и даже к определенному диапазону его версий - 1.4 (RC2-RC4), описанные здесь приемы применимы к LiveCD, построенному на базе почти любой иной Linux-системы.

Часть 1. От BIOS до загрузки

Не вдаваясь в подробности устройства весьма (и - заслуженно) популярного пакета syslinux Питера Анвина (Peter Anvin), включающего isolinux, отвечающий за обеспечение загрузки с компакта, отметим только: возможности загрузки CD, выполненного с использованием isolinux, определяются содержимым одноименного каталога, который имеется на каждом LiveCD, изготовленном по этой методике. Во всех пре-релизах версии 1.4 содержание его следующее.

$ ls mount_cd/isolinux
boot.cat  boot.msg  gentoo  gentoo.lss  
help.msg  initrd  isolinux.bin  isolinux.cfg

Опустим специальные файлы boot.cat, gentoo.lss и isolinux.bin. Посмотрим оставшиеся:

  • boot.msg - начальное сообщение при загрузке, ничего интересного;
  • help.msg - текст, выводимый по F2. Кроме возможностей сократить "путь загрузки" (noapic, noscsi, nonet, acpi=no), он описывает такую важную опцию загрузки, как cdcache - возможность кэшировать содержимое CD в файловой системе tmpfs, о чем будет сказано ниже;
  • gentoo - загружаемое ядро, разумеется, оно собрано с поддержкой всевозможных опций, которые могут потребоваться при инсталляции;
  • initrd - образ виртуального диска (initial ram disk), очевидно;
  • isolinux.cfg - конфигурационный файл загрузки, и определяющий, собственно, назначение всех вышеперечисленных файлов: убеждаемся в том, что файлы эти идентифицированы правильно, корневой системой сразу после загрузки станет /dev/ram0, а процесс инициализации определяется файлом /linuxrc.

В версии 1.4-rc4 в этом каталоге дополнительном можно обнаружить файл add.msg, содержащий описание дополнительных режимов загрузки, вызываемое нажатием клавиши F3. Режимы эти - загрузка графической консоли с различными разрешениями (от 800x600 до 1280x1024), реализуемой через frame buffer, чисто текстовый режим загрузки, загрузка для SMP-конфигураций, и т.д. Соответственно, и файлов образом загрузочного RAM-диска здесь оказывается несколько (initrd.800, initrd.1024, initrd.1280, initrd2).

Рассматривать все разновидности initrd мы не будем. Посмотрим только на содержимое initrd. Выполнив:

$ gzip -dc ./initrd >initrd.img

получаем образ виртуального диска, который уже можно монтировать:

$ mount ./initrd.img /mnt/initrd -t ext2 -o loop

Смотрим, что получилось:

  • /bin - всего лишь "старый добрый" busybox, заменяющий нам утилиты, ныне объдиняемые, как правило, в пакет под названием coreutils, и несколько родственных;
  • /sbin - символическая ссылка на /bin;
  • /dev - пока вполне обычный, со множеством всяких наличествующих и отсутствующих устройств; но в дальнейшем он станет точкой монтирования файловой системы устройств - devfs, каковая и будет задействована в реальности;
  • /etc - с единственным файлом fstab, который обеспечивает монтирование /dev/ram0 и proc. Тоже - понятно;
  • /keymaps содержит то, что ему и положено - раскладки клавиатуры, выбираемые в начале загрузки с LiveCD;
  • /proc, /lost+found и /tmp также в пояснениях не нуждаются;
  • в /modules находим очень интересный cloop.o (но о нём - позднее) и подкаталог storage с 29 модулями scsi-контроллеров. Этот набор, кстати, определяет вероятность определения scsi в вашей конфигурации;
  • /usr содержит символические ссылки на /bin и /sbin;
  • и, наконец, linuxrc - главный конфигурационный скрипт LiveCD-системы, который, собственно, и будет запущен на выполнение.

Именно linuxrc, как нетрудно догадаться, и становится предметом дальнейшего анализа. Назначение его - получить из LiveCD полноценную систему, поскольку при всех достоинствах busybox для полноценной работы его "маловато будет". Итак (нумерация строк дана для версии 1.4-rc2 и в более новых версиях может незначительно отличаться):

  • определение переменных (l.9-12) опускаем. Очевидно;
  • mount -oremount,rw / - l.13, монтирование "корня" в режиме чтения/записи;
  • mount /proc - l.14, монтирование /proc (потребуется для операции смены корневого каталога командой chroot);
  • команды, прокомментированные в тексте скрипта, "переописывать" не будем, определение переменных (l.17-29) - также опускаем;
  • mkdir newroot - l.40, создаём каталог, который впоследствии и станет новым "корнем";
  • mount -t tmpfs tmpfs /newroot - l.41, монтируем к нему виртуальную файловую систему (другой-то у нас и нет);
  • и создаём все необходимые подкаталоги: l.43;
  • если в каталоге /newroot/dev/ не обнаруживается .devfsd (а откуда он там возьмётся?) - монтируем devfs к /newroot/dev: l.48;
  • далее, если вы не отказались от определения SCSI, в соответствие со списком (l.134) будет предпринята попытка загрузки (командой insmod -f) всех перечисленных модулей. В результате модули поддержки обнаруженных контроллеров будут установлены (l.130-135);
  • предложение загрузить keymap (l.137) интереса не представляет - ни на какую локализацию это в дальнейшем не повлияет; напротив, выбор русской раскладки, вследствие странности оной, может только доставить неудобства;
  • после чего предпринимается попытка монтировать LiveCD (l.140): все устройства /newroot/dev/cdroms/ монтируются и проверяются на наличие на них файла /livecd.cloop. Обработку ошибочных ситуаций опускаем: полагаем LiveCD найденным и смонтированным;
  • mknod /dev/cloop b 240 0 - l.141, для работы с компрессированным образом LiveCD создаётся файл соответствующего устройства;
  • далее (l.145) при значении переменной CDCACHE="yes" (то есть если при начальной загрузке в ответ на приглашение boot> была выбрана опция cdcache, делается попытка скопировать livecd.cloop в память (виртуальную файловую систему - tmpfs) и, если эта попытка была успешной, то устанавливается модуль работы с livecd.cloop, после чего образ монтируется:
  • 	insmod /modules/cloop.o file=/newroot/mnt/cdrom/livecd.cloop
    	mount -o ro -t ext2 /dev/cloop /newroot/mnt/cloop
    	
    Это очень важный момент - он делает возможным в дальнейшем размонтирование инсталляционного CD, его извлечение из привода и замену; на этот момент tmpfs занимает всю свободную память, кроме занятой ядром и "иже с ним" (даже в 64-мегабайтной системе половина ОЗУ обычно попадает в tmpfs); отсюда: практически никогда не возникают трудности при копировании в память 70-мегабайтного livecd.cloop от Gentoo (и они весьма вероятны при попытке копирования, например, 700-мегабайтного KNOPPIX[.cloop] от knoppix); другое дело, что занимать всю tmpfs - неразумно (а вдруг, после загрузки ещё и сделать что-то захочется?); так что практический вывод: 128 и более Мбайт - вполне достаточно для работы опции cdcache (лично проверено - 386 Мбайт хватает с гарантией);
  • если же CDCACHE="no" (в том числе: и из-за неудачи при попытке копировать livecd.cloop в память), то модуль cloop.o устанавливается с параметром file=/newroot/mnt/cdrom/livecd.cloop. То есть: файл - тот же, но уже не из памяти, а непосредственно с CD ROM; и, соответственно, размонтировать последний не удастся; что касается монтирования livecd.cloop, то оно выполняется точно так же, как и в предыдущем случае (l.159-160);
  • операции копирования и создания символических ссылок (l.166-173) завершают формирование новой корневой системы;
  • а l.181-182 окончательно делают её активной корневой; запускаемый процесс - /sbin/init, то есть - нормальная загрузка.

Таков путь загрузки от BIOS до системы, подготовленной maintainer-ом для выполнения инсталляции. Что бы "улучшить"?

  • более естественным для варианта "по умолчанию" представляется отсутствие SCSI;
  • опция загрузки cdcache представляется совершенно не лишней; настолько, что её-то как раз и следовало бы сделать "умолчательной", и в ходе инициализации сообщать оператору: может он демонтировать CD ROM (успешное кэширование) или нет.

Для этого редактируются: linuxrc в initrd и help.msg в /isolinux. Разумеется, и add.msg никто не запретит отредактировать...

На уровне isolinux-livecd.cloop - всё. Разумеется, эти "возня" совершенно не обязательно предполагает "прожигание болванок". Отредактированный образ initrd прекрасно воспринимается Grub или LILO: всегда можно собственную редакцию проверить.

Дальнейшее "рукоблудие" предполагает операции с livecd.cloop: исключительно. Это будет

Часть 2. Углубленное потрошение

Таким образом, как "образуется" подготовленная maintainer-ом система, думаю, понятно. Посмотрим теперь, что же он нам, собственно, подготовил...

Любой LiveCD предполагает, что его файловая система частично находится в памяти (каталоги с динамически изменяемым содержимым - всегда, каталоги с неизменяемым содержимым - по мере возможности). Что касается первых (/proc, /var, /tmp, /home, /root etc.), то с ними всё ясно: кроме как в памяти им больше и быть негде. Что до вторых, то для обеспечения скорости доступа хорошо бы и им быть на виртуальном диске, но не всегда это возможно: потребности, как правило, обычно превосходят количество доступной RAM. И, чем дальше - тем больше. Глядишь: а для всего ПО, которое хотелось бы иметь в системе, уже и объёма CD не хватает...

Само собой напрашивается желание держать это самое ПО в компрессированном виде, независимо от того, памяти или объёма CD перестало хватать. Средств компрессии - "бери - не хочу". Вот только хотелось бы декомпрессию осуществлять "на лету", на уровне ядра, скажем... Почему - нет? Начал - Поль Рассел (Paul 'Rusty' Russel), "подхватил" известный энтузиаст LiveCD Клаус Кноппер (Klaus Knopper): и вот уже все желающие могут воспользоваться пакетом cloop с сайта Knoppix.

Как конечный продукт (после компиляции), пакет представляет собой три файла:

  • модуль ядра cloop.o, осуществляющий компрессию "на лету";
  • утилита создания компрессированных образов create_compressed_fs;
  • утилита декомпресии extract_compressed_fs.

Сборка пакета выполняется командой:

$ make KERNEL_DIR=/path/to/linux-kernel/sources

Несложно догадаться, что для компиляции требуется каталог с исходниками ядра. А точнее - конфигурационный файл /usr/src/linux/.config и подкаталог /usr/src/linux/include/linux. Маленькое "но": предполагается, что ветка ядра - xfs. Работоспособный модуль cloop.o действительно был впервые построен только для ядра ветки xfs. Однако не возбраняется и использование другого ядра, например, канонической vanilla.

Для использования модуля потребуются следующие команды:

$ mkdir -p /lib/modules/misc && cp cloop.o /lib/modules/misc/
$ depmod -a
$ mknod /dev/cloop b 240 0

Назначение команд, думается, очевидно.

Модуль загружается, например, уже приводившейся командой:

$ insmod /modules/cloop.o file=/newroot/mnt/cdrom/livecd.cloop

где параметр file указывает на компрессированный образ. Возможен и более, так сказать, современный способ загрузки:

$ modprobe cloop file=/path/to/compressed/image

Впрочем, выбор между insmod или modprobe - скорее дело привычки...

Доступ к файловой системе становится возможным, конечно же, после её монтирования. В рассматриваемом LiveCD это:

$ mount -o ro -t ext2 /dev/cloop /newroot/mnt/cloop

Что бы посмотреть, что же находится внутри livecd.cloop, воспользуемся одной из собранных утилит:

$ ./extract_compressed_fs ./livecd.cloop > livecd.loop

Полученный файл монтируем, как обычно. Например:

$ mount ./livecd.loop /mnt/loop -t ext2 -o loop

Смотрим: вполне узнаваемая gentoo-система. Те же конфигурационные файлы и каталоги. Хотим - дополняем документацией на своё усмотрение, хотим - расширяем число установленных пакетов, хотим - конфигурируем на своё усмотрение. Только сначала переносим все каталоги в какой-нибудь /home/myLiveCD, делаем всё необходимое для использования его в качестве корневого, и - chroot!

После того, как будущая LiveCD-система будет признана вполне отвечающей пожеланиям, покинем её (exit), предварительно демонтировав всё лишнее. И создадим наш новый livecd.cloop:

$ mkisofs -r /home/myLiveCD | \
create_compressed_fs - 65536 > livecd.cloop

Полученный файл, наряду с подкаталогами /gentoo и /isolinux оригинального диска, файлами README.html, quickinstall.html и любыми другими, которые мы захотим поместить на создаваемый LiveCD станут объектом компиляции, выполняемой всё той же mkisofs. Правда, опций на сей раз потребуется побольше. Но об этом - у Питера Анвина и в документации на одноименную программу - она достаточно подробна. В /isolinux не забудьте поместить результат работы на предыдущем этапе (initrd и isolinux.cfg). Всё!

Новости IT
8 мая 2026
Релиз Chrome 148

Связь с редакцией