Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Основное отличие автономного дистрибутива от NFS-дистрибутива в том, что корневая файловая система автономного дистрибутива расположена на дискете. Главная проблема такого дистрибутива – небольшой объем дискеты. Поэтому приходится запаковывать root-fs для записи на дискету и распаковывать при загрузке ядра в память. Такая схема позволяет уместить на дискету гораздо больше информации и избежать другого неприятного недостатка дискеты (и в меньшей степени компакт-диска) – неспешности операций ввода/вывода.
Формирование корневой файловой системы – процесс, требующий определённых навыков, поэтому я более подробно остановлюсь на этом этапе создания автономного дистрибутива.
Как ядро определяет, какое устройство использовать в качестве root-fs? Во-первых, исследуется параметр root (если ядру не передано никаких параметров, то оно начинает исследовать блочные устройства и ищет первую ext2-fs), далее используется параметр initrd (initial ram disk).
Внимание: для поддержки initrd необходимо включить опцию Block devices –> Initial RAM disk support.
Этот параметр указывает на компрессированную файловую систему, которая распаковывается в память и используется в качестве root-fs на этапе инициализации ядра (в дальнейшем корневая ФС может измениться, что полезно, например, для загрузки модульного ядра, когда основной корневой раздел имеет ФС, которая не вкомпилирована в ядро; в этом случае единственным выходом является создание initrd, содержащего необходимые модули).
Что представляет из себя initrd, и как его создавать? На самом деле initrd – это обычное устройство, на котором расположена корневая ФС. Создание ramdisk не должно представлять особых проблем. Для начала необходимо создать некомпрессированный образ ram-диска (он должен быть достаточных размеров, обычный размер – 3 Мб.):
# dd if=/dev/zero of=/tmp/initrd.img bs=1024 count=3072
Изначально мы заполняем весь образ 0, поэтому при сжатии лишние нули места занимать не будут (самая плохая идея – копировать в образ /dev/random, т.к. никакому сжатию он не подвергается, и размер ram-диска может существенно превышать фактический размер дискеты.
Далее создаем ext2fs (обратите внимание на число inode):
# mke2fs -N 360 -m 0 /tmp/initrd.img
монтируем образ (в ядре должна быть включена поддержка loop devices – см. на странице Block devices -> Loop device support):
# mount -t ext2 -o loop /mnt/tmp /tmp/initrd.img
Недавно я обнаружил одну занимательную вещь: если создать 3 Мб ram-диск и записать на него 3 Мб данных, а потом стереть 1 Мб, то сожмется такой файл очень слабо, т.к. изначально весь образ был заполнен нулями, а после удаления на месте файлов нули не пишутся, что намного уменьшает эффективность архивации. Поэтому для экспериментов лучше не использовать образ, а поколдовать где-нибудь на основной файловой системе, а потом все перенести на ram-диск при помощи cp с флагами -dpR (cp -dpR ./* /mnt/tmp).
После этого можно приступать к созданию файловой структуры корневого раздела нашей дискеты. Для начала создаем все необходимые каталоги:
n /bin n /sbin
n /dev n /tmp
n /etc n /usr
n /lib n /usr/bin
n /proc n /usr/sbin