Тема4 Загрузочные диски
Загрузочный диск - в основном миниатюрная, отдельная Linux система на дискете. Она должна выполнять многие из тех же самых функций, которые выполняет полная полноразмерная Linux система. Перед попыткой создания Вы должны понять основы процесса начальной загрузки Linux.
4.1.1 Процесс начальной загрузки.
Все системы PC начинают процесс начальной загрузки, выполняя код в ROM (обозначаемый BIOS), для загрузки сектора 0; цилиндра 0 загрузочного устройства. Загрузочное устройство - обычно первый дисковод для гибких дискет (обозначается А: в DOS и /dev/fdO в Linux). BIOS затем пробует выполнить этот сектор. На большинстве загрузочных дисков, сектор 0, цилиндр 0 содержит либо:
код загрузчика - типа LILO, который находит, загружает и выполняет ядро, начиная соответствующую начальную загрузку.
начало ядра операционной системы, типа Linux.
Если Linux ядро было скопировано необработанным (raw) на дискету, первый сектор диска -является первым сектором ядра Linux. Этот первый сектор продолжит процесс начальной загрузки, загружая остальную часть ядра из устройства начальной загрузки.
Как только ядро полностью загружено, оно производит некоторую базовую инициализацию устройств. Затем пробует загрузить и монтировать корневую (root) файловую систему из
некоторого устройства. Корневая файловая система - просто файловая система, которая монтируются как "V". Ядру нужно сообщать, где искать корневую файловую систему; если оно не может найти загрузочный образ, оно останавливается.
В некоторых ситуациях — часто при загрузке с дискеты — корневая файловая система загружена в ramdisk, который является оперативной памятью (RAM), к которой обращается система, как будто это был диск. Для этого есть две причины. Во-первых, RAM - на несколько порядков быстрее, чем дискета, так что операции системы выполняются быстро; и второй
- ядро может загрузить сжатую файловую систему с дискеты и распаковать ее на ramdisk, позволяя поместить на дискете намного больше файлов.
Как только корневая файловая система загружена и смонтирована, Вы видите сообщение: VFS: Mounted root (ext2 filesystem) readonly.
и вьшолняет ^CTeMa находит bit программу на корневой файловой системе (в /bin или /sbin) svsinit и выполНШ11 ЧИТаСТ конФигУрациоиный файл /etc/inittab, ищет строку, обозначенную „у к и яет именованный скрипт. Скрипт sysinit - обычно что-нибудь вроде /etc/rc
или /etc/init.d/boot. Этот скрипт - набор команд оболочки, которые выполняют базовые действия системы, типа:
Запуск fsck на всех дисках,
Загрузка необходимых модулей ядра,
Запуск подкачки (swaping),
Инициализация сети,
Монтирование дисков, указанных в fstab.
Этот скрипт часто вызывает различные другие скрипты, для инициализации модулей. Например, в общей структуре SysVinit, каталог /etc/red/ содержит комплексную структуру подкаталогов, чьи файлы определяют, как запускать и завершать большинство служб системы. Однако, на загрузочных дисках сценарий sysinit часто очень прост.
Когда сценарий sysinit заканчивается, возвращается управление init, который затем входит в уровень запуска по умолчанию (default runlevel), определенный в inittab ключевым словом mitdefault. Runlevel строка обычно определяет программу подобную getty, которая отвечает за связь через консоль и try. Это - программа getty, которая печатает знакомое приглашение "login:". Программа getty в свою очередь вызывает login программу, чтобы проверить доступ на вход в систему и установить сеансы пользователя.
4.1.2 Типы дисков.
Сделав базовый обзор процесса начальной загрузки, теперь мы можем определять различные типы предполагаемых дисков. Мы классифицируем диски по четырем типам. Здесь и далее используется термин "диск" как дискета, если не оговорено иначе, хотя большинство обсуждаемого может применяться и для жестких дисков.
Загрузочный (boot)
Диск, содержит ядро, которое может загружаться. Диск может использоваться, для загрузки ядра, которое затем может загрузить корневую файловую систему на другом диске. Ядру на загрузочном диске обычно нужно указать, где найти корневую файловую систему. Часто загрузочный диск загружает корневую файловую систему с другой дискеты, но вместо этого, возможно, указать загрузочному диску, загружать корневую файловую систему с жесткого диска. Это обычно делается при испытании нового ядра. (Фактически, "make zdisk" создаст такой диск автоматически из исходного текста ядра).
Корневой (root)
Диск с файловой системой, содержащей необходимые файлы для выполнения Linux системы. Такой диск не обязательно содержит или ядро или загрузчик.
Корневой диск может использоваться для выполнения системы независимо от любых других дисков, как только загрузилось ядро. Обычно корневой диск автоматически копируется в ramdisk. Это делает корневой диск намного быстрее, и освобождает дисковод для сервисного диска.
Загрузочный / Корневой (boot/root)
Диск, который содержит, и ядро и корневую файловую систему. Другими словами, он содержит все необходимое для загрузки и выполнения Linux системы без жесткого диска. Преимущество этого типа диска - все требуемое находится на одном диске.
Однако постепенно увеличивающийся размер всего означает, что все более и более трудно поместить все на одной дискете, даже со сжатием.
Сервисный (utility)
Диск, который содержит файловую систему, которая не предназначена, для монтирования как корневая файловая система. Это - дополнительный диск данных. Вы можете использовать диск этого типа, для хранения дополнительных утилит, если, у Вас слишком много помещено на вашем корневом диске.
Вообще, когда мы говорим относительно "создания загрузочного диска" мы подразумеваем создание обоих boot (ядро) и root (файлы) частей. Они могут быть или одним (одиночный загрузочный/корневой диск) или отдельные (загрузочный + корневой диски). Наиболее гибкий подход для спасательных дискет в использовании отдельно корневой и загрузочной дискет, и одна или более сервисных дискет, чтобы урегулировать превышение.
Создание корневой файловой системы. Создание корневой файловой системы включает выбор файлов, необходимых для запуска системы. В этой секции мы описываем, как создать сжатую корневую файловую систему. Менее распространенный вариант - создать несжатую файловую систему на дискете, которая непосредственно хмонтируется как корневая.
Обзор. Корневая файловая система должна содержать все необходимое для поддержки полной Linux системы. Для этого диск должен включить минимальные требования для Linux системы:
базовая файловая система,
Минимальный набор каталогов: /dev, /proc, /bin, /etc, /lib, /usr, /tmp,
Базовый набор утилит: sh, Is, cp, mv, и т.д.,
r
Минимальный набор файлов конфигурации: гс, inittab, fstab, и т.д.,
Устройства: /dev/hd *, /dev/tty *, /dev/fdO, и т.д.,
Библиотеки поддержки, для обеспечения базовых функций, используемых утилит.
Конечно, любая система становится полезной только, когда Вы можете что-нибудь на ней выполнить, и корневая дискета становится полезной, когда Вы можете делать что-то вроде:
Проверить файловую систему другого устройства, например, проверить корневую файловую систему на жестком диске, у Вас должна быть возможность загрузить Linux с другого устройства - корневой дискеты. Затем Вы можете выполнить fsck на вашем основном корневом диске, в то время как он - не замонтирован.
Восстанавливать все или часть вашего основного корневого устройства, из архива используя утилиты резервирования типа cpio, tar, gzip и ftape.
Мы опишем, как создать сжатую файловую систему, называемую так, потому она что сжата на диске и, когда загружается, распаковывается на ramdisk. Co сжатой файловой системой Вы можете разместить много файлов (приблизительно два мегабайта) на стандартную дискету 1440КБ. Так как файловая система намного больше, чем дискета, она не может поместиться на дискете. Мы должны создать ее в другом месте, сжать и затем скопировать на дискету.
Создание файловой системы.
Чтобы создать такую корневую файловую систему, Вам нужно достаточно большое запасное устройство, чтобы содержать все файлы перед сжатием. Вам необходимо устройство, способное хранить приблизительно четыре мегабайта. Есть несколько вариантов:
• Использовать ramdisk (DEVICE = /dev/ramO). В этом случае используется память, чтобы имитировать дисковод. Ramdisk должен быть достаточно большой, чтобы со держать файловую систему соответствующего размера. Если Вы используете LILO, проверьте в вашем файле конфигурации (/etc/lib.conf) строчку:
RAMDISKSIZE = rum Которая определяет, сколько оперативной памяти будет выделено. Значение по умолчанию 4096КБ, которое должно быть достаточным. Вы не должны пытаться пробовать использовать такой ramdisk на машине с объемом памяти менее 8МБ. Удостоверьтесь что существует устройство /dev/ramO, /dev/ram или /dev/ramdisk. Если необходимо, создайте /dev/ramO с mknod (major номер 1, minor 0).
Если у Вас есть достаточно большой (несколько мегабайт) неиспользуемый раздел жесткого диска, это - хорошее решение.
Использовать петлевое (ioopback) устройство, которое позволяет работать с файлом на диске как с устройством. При использовании петлевого устройства Вы можете создать трех мегабайтный файл на вашем жестком диске и сформировать на нем файловую систему. Наберите man losetup для инструкций о использовании петлевых устройств. Если на вашей системе нет loop устройства (/dev/loopO,/dev/loopl, и т.д.), Вы должны создать их - "mknod /dev/loopO b 7 0м. Как только Вы установили специальные mount и umount. создайте временный файл на жестком диске с достаточной емкостью (eg, /tmp/fsfile). Вы можете использовать команду:
dd ifWdev/zero ofVtmp/fsfile bs=lk сошн=тш«
для создания ппп-блокового файла.
Используйте имя файла вместо DEVICE ниже. Когда Вы даете команду монтирования, Вы должны включить опцию "~о loop" чтобы mount использовала петлевое устройство. Например:
mount -о loop -t ext2 /tmp/fsfile /mnt
смонтирует /tmp/fsfile (через петлевое устройство) в точке монтирования /mnt. Команда df должна подтвердить это. После того, как Вы выбрали одну из этих опций, подготовьте DEVICE:
dd ifWdev/zero of=DEVICE bs=lk count=3000 Эта команда обнуляет устройство. Этот шаг важен, т.к. файловая система на устройстве будет сжата, для достижения максимальной степени сжатия все неиспользуемые части должны быть заполнены нулями.
Затем, создайте файловую систему. Linux ядро распознает два типа файловой системы для корневых дисков, которые автоматически копируются на ramdisk. Это - minix и ext2, из которых ext2 является привилегированной файловой системой. При использовании ext2, Вы можете использовать -i опцию, чтобы определить большее количество inodes чем значение по умолчанию; -i 2000 предложен так, чтобы Вы не исчерпали inodes. В качестве альтернативы, Вы можете сберечь inodes, удаляя большинство ненужных /dev файлов. mke2fs по умолчанию создаст 360 inodes на дискете 1. 44МБ. Я считаю, что 120 inodes вполне достаточно для моей текущей спасательной корневой дискеты, но если Вы включаете все устройства в /dev каталог, Вы легко превысите 360. Использование сжатой корневой файловой системы позволяет иметь большую файловую систему, и следовательно большее количество inodes по умолчанию, но Вы должны либо уменьшить число файлов, либо увеличивать число inodes. Так что Ваша команда выглядит так:
mke2fs -m 0 -i 2000 DEVICE
( Если Вы используете петлевое устройство, вместо DEVICE должно быть подставлено имя используемого дискового файла. mke2fs спросит, действительно ли Вы хотите сделать это; говорите да.)
mke2fs команда автоматически обнаружит доступное пространство и соответственно скон-фигурируется . -т 0 параметр предотвращает от резервирования пространства для корня, и следовательно, обеспечивает больше используемого пространства на диске. Затем, смонтируйте устройство: mount -t ext2 DEVICE /mnt ( Вы должны создать каталог монтирования /mnt, если он не существует.) В следующих секциях, все имена каталогов назначения полагаются относительно /mnt.
Заполнение файловой системы. Существует разумный минимальный набор каталогов для вашей корневой файловой системы:
/dev -- Устройства, требуемые для ввода/вывода
/ргос ~ каталог-заглушка, необходимый для ргос файловой системы
/etc — системные файлы конфигурации
/sbin - критичные системные бинарники
/bin ~ базовые бинарники, часть предполагаемой системы
/lib -- общие библиотеки, для обеспечения средств динамической поддержки (runtime)
/mnt - точка монтирования для поддержки других дисков
/usr - дополнительные утилиты и приложения
Представленная здесь структура каталогов - только для использования в корневой дискете. Реальные Linux системы имеют более полный и четкий набор правил размещения файлов, называемый Стандарт Файловой Иерархии (File Hierarchy Standard).
Три из этих каталогов должны быть пусты на корневой файловой системе, т.о. что они должны быть только созданы mkdir. Каталог /ргос - в основном заглушка, в который помещена ргос файловая система. Каталоги /mnt и /usr - только точки монтирования для использования после того, как загрузочная/корневая система будет запущена. Следовательно, эти каталоги должны быть только созданы.
Перенос. Как только Вы закончили создание корневой файловой системы, размонтируйте ее, скопируйте ее в файл, и сожмите:
umount /mnt
dd if=DEVICE bs=lk | gzip -v9 > rootfs.gz После окончания у Вас будет файл rootfs.gz , который и есть ваша сжатая корневая файловая система. Вы должны проверить размер, чтобы удостовериться, что она поместиться на дискете; если не помещается Вы должны вернуться и удалить некоторые файлы.
Выбор ядра. Когда у Вас есть полная сжатая корневая файловая система. Следующий шаг - создание или выбор ядра. В большинстве случаев, возможно, скопировать ваше текущее ядро и загружать дискету с него. Однако, могут быть случаи, когда Вы захотите создать отдельное.
Одна причина - размер. Если Вы формируете одиночную загрузочную дискету, ядро будет одним из самых больших файлов на дискете, так что Вы должны максимально уменьшить размер ядра. Если Вы формируете двухдисковую загрузочную + корневую дискету, это не так важно, так как ядро будет запускаться с отдельного диска. Чтобы уменьшить размер яд-па создайте его с минимальным набором средств, необходимых для поддержки желаемой системы. Это означает пропускать все, что Вам не нужно. Работа с сетями - хорошая вещь, чтобы ее исключить, также как поддержка для любых дисководов и других устройств, которые Вам не нужны при выполнении вашей загрузочной системы. Как указано ранее, ваше ядро должно иметь встроенную поддержку ramdisk, и ext2.
Определив минимальный набор средств включенных в ядро, Вы должны определить, что добавить обратно. Вероятно наиболее общее применение загрузочной дискеты - исследование и восстановление разрушенной корневой файловой системы, и чтобы сделать это, Вам нужна поддержка в ядре. Например, если ваш резерв содержится на ленте и для доступа к вашей лентопротяжке используется ftape, то если Вы теряете ваш текущий корневой диск и устройства, содержащие ftape, тогда Вы будете не способны восстановить их с ваших лент резервирования. Вы будете должны повторно установить Linux, загрузить и повторно установить ftape, и затем попробовать считать ваш резерв.
Главное - любая поддержка ввода - вывода в ядре для поддержки резервирования, должна также быть добавлена в ваше загрузочное ядро.
Процедура для фактического создания ядра описана в документации, поставляемой с ядром. Это очень просто сделать, начните с просмотра /usr/src/linux. Если создание ядра - проблема для Вас, то Вы, вероятно, не должны пытаться создавать загрузочную систему. Не забудьте сжать ядро ''make zlrnage".
Создание диска Теперь у Вас есть ядро и сжатая корневая файловая система. Если Вы создаете загрузочный/корневой диск, проверьте их размеры, чтобы убедиться, что они оба поместятся на одном диске. Если Вы делаете две дискеты загрузочную + корневую, проверьте, помещается ли корневая файловая система на одной дискете.
Вы должны решить, использовать LILO для загрузки или bootdisk ядро. Альтернатива - копировать ядро непосредственно на дискету и загружаться без LILO. Преимущество использования LILO - возможность указать некоторые параметры ядра, которое может быть необходимы для инициализации аппаратных средств (проверьте файл /etc/lilo.conf в вашей системе). Если он существует и имеет строку "append^...", Вам, вероятно, нужно это свойство. Неудобство использования LILO - усложнение создания загрузочного диска, и немного большее количество пространства. Вы должны установить маленькую отдельную файловую систему, которую мы назовем файловой системой ядра, куда Вы перенесете ядро и несколько других файлов необходимых LILO.