Создание корневой файловой системы включает выбор файлов, необходимых для запуска системы. В этой секции мы описываем, как создать сжатую корневую файловую систему. Менее распространенный вариант - создать несжатую файловую систему на дискете, которая непосредственно монтируется как корневая; этот вариант описан в секции Не - ramdisk Корневая Файловая система.
Корневая файловая система должна содержать все необходимое для поддержки полной Linux системы. Для этого диск должен включить минимальные требования для Linux системы:
/dev, /proc, /bin, /etc, /lib, /usr, /tmp,
sh, ls, cp, mv,
и т.д.,rc, inittab, fstab,
и т.д.,/dev/hd *, /dev/tty *, /dev/fd0,
и т.д.,Конечно, любая система становится полезной только, когда Вы можете что - нибудь на ней выполнить, и корневая дискета становится полезной, когда Вы можете делать что-то вроде:
fsck
на вашем основном корневом диске, в то время как он - не замонтирован.
cpio, tar, gzip
и ftape
.
Мы опишем, как создать сжатую файловую систему, называемую так, потому она что сжата на диске и, когда загружается, распаковывается на ramdisk. Со сжатой файловой системой Вы можете разместить много файлов (приблизительно два мегабайта) на стандартную дискету 1440КБ. Так как файловая система намного больше чем дискета, она не может поместиться на дискете. Мы должны создать ее в другом месте, сжать и затем скопировать на дискету.
Чтобы создать такую корневую файловую систему, Вам нужно достаточно большое запасное устройство, чтобы содержать все файлы перед сжатием. Вам необходимо устройство, способное хранить приблизительно четыре мегабайта. Есть несколько вариантов:
RAMDISK_SIZE = nnnКоторая определяет, сколько оперативной памяти будет выделено. Значение по умолчанию 4096КБ, которое должно быть достаточным. Вы не должны пытаться пробовать использовать такой ramdisk на машине с объемом памяти менее 8МБ. Удостоверьтесь что существует устройство /dev/ram0, /dev/ram или /dev/ramdisk. Если необходимо, создайте /dev/ram0 с
mknod
(major номер 1, minor 0).
man losetup
для инструкций о использовании петлевых устройств. Если у Вас нет losetup
, Вы
можете получить это с совместимыми версиями mount
и unmount
с util-linux
в каталоге
ftp://ftp.win.tue.nl/pub/linux/utils/util-linux/.
Если на вашей системе нет loop устройства (/dev/loop0,/dev/loop1, и т.д.), Вы должны
создать их - ``mknod /dev/loop0 b 7 0
''. Как только вы установили специальные mount
и umount
,
создайте временный файл на жестком диске с достаточной емкостью (eg, /tmp/fsfile).
Вы можете использовать команду:
dd if=/dev/zero of=/tmp/fsfile bs=1k count=nnn
для создания nnn-блокового файла.
Используйте имя файла вместо DEVICE ниже. Когда Вы даете команду монтирования, Вы должны
включить опцию ``-o loop
'' чтобы mount использовала петлевое устройство.
Например:
mount -o loop -t ext2 /tmp/fsfile /mnt
смонтирует /tmp/fsfile (через петлевое устройство) в точке монтирования /mnt
. Команда
df
должна подтвердить это.
После того, как вы выбрали одну из этих опций, подготовьте DEVICE:
dd if=/dev/zero of=DEVICE bs=1k 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
команда автоматически обнаружит доступное пространство и соответственно сконфигурируется .
-m 0
параметр предотвращает от резервирования пространства для корня, и следовательно,
обеспечивает больше используемого пространства на диске.
Затем, смонтируйте устройство:
mount -t ext2 DEVICE /mnt
( Вы должны создать каталог монтирования /mnt
, если он не существует.) В следующих секциях, все имена
каталогов назначения полагаются отностительно /mnt
.
Существует разумный минимальный набор каталогов для вашей корневой файловой системы:
/dev
-- Устройства, требуемые для ввода/вывода/proc
-- каталог-заглушка, необходимый для proc файловой системы/etc
-- системные файлы конфигурации/sbin
-- критичные системные бинарники/bin
-- базовые бинарники, часть предполагаемой системы/lib
-- общие библиотеки, для обеспечения средств динамической поддержки (run-time)/mnt
-- точка монтирования для поддержки других дисков/usr
-- дополнительные утилиты и приложения( Представленная здесь структура каталогов - только для использования в корневой дискете. Реальные Linux системы имеют более полный и четкий набор правил размещения файлов, называемый Стандарт Файловой Иерархии (File Hierarchy Standard).)
Три из этих каталогов должны быть пусты на корневой файловой системе, т.о. что они должны быть
только созданы mkdir
. Каталог /proc
- в основном заглушка, в который помещена proc файловая
система. Каталоги /mnt
и /usr
- только точки монтирования для использования после того, как
загрузочная/корневая система будет запущена. Следовательно, эти каталоги должны быть только созданы.
Оставшиеся четыре каталога описаны в следующих секциях.
/dev
каталог содержит специальные файлы для всех устройств, которые обязательно используются
в любой Linux системе. Сам каталог - обычный каталог, и может быть создан mkdir
обычным способом.
Однако специальные файлы устройств, должны быть созданы специальным способом, используя команду mknod
.
Есть более короткий путь - копировать содержимое вашего существующего каталога /dev
, и удалить
те устройства, которые Вам не нужны. Единственное требование - чтобы Вы, копируя специальные файлы
устройств, использовали -R
опцию. Это приведет к копированию каталога без попытки копировать
содержимое файлов. Убедитесь, что Вы использовали верхний регистр R. Если Вы укажете опцию со
строчной буквы -r
, Вы вероятно скопируете все содержимое всех ваших жестких дисков - или по крайней
мере столько, сколько поместится на дискете! Следовательно, соблюдайте осторожность, и используйте команду:
cp -dpR /dev /mnt
предполагается, что дискета смонтирована в /mnt
. Опции dp
гарантируют, что символические ссылки
будут копироваться как ссылки, а не как содержимое файла, и что первоначальные атрибуты файла сохранятся,
таким образом сохранится информация о владельце файла.
Если Вы хотите сделать это трудным способом, используйте ls -l
, чтобы отобразить главные(major) и
малые (minor) числа устройств для нужных вам устройств, и создайте их на дискете, используя mknod
.
Как только устройства скопированы, стоит проверить, что все требуемые специальные устройства помещены
на спасательную дискету. Например, ftape
используется для ленточных устройств, так что Вам надо
скопировать все их, если Вы предполагаете обращаться к вашим ленточным устройствам из загрузочной
дискеты.
Обратите внимание, что для каждого файла устройства требуется один inode, и inodes может быть
дефицитным ресурсом, особенно на файловой системе дискеты. Следовательно имеет смысл удалить любые
файлы устройств в /dev
каталоге дискеты, которые Вам не нужны. Много устройств очевидно не нужно на
специфических системах. Например, если у Вас нет SCSI дисков, Вы можете свободно удалить все файлы
устройств начинающиеся с sd
. Точно так же, если Вы не предполагаете использовать последовательный
порт, все файлы устройств начинающиеся с cua
можно удалить.
Убедитесь, что включили следующие файлы в этот каталог:
console, kmem, mem, null, ram, tty1
.
Этот каталог должен содержать ряд конфигурационных файлов. На большинстве систем, они могут быть разделены на три группы:
rc, fstab, passwd
.
Файлы, которые не необходимы, могут быть идентифицированы с командой:
ls -ltru
она выводит файлы в обратном порядке по дате последнего обращения, так если к каким-либо файлам не обращались, их можно не включать в корневую дискету.
На моих корневых дискетах число конфигурационных файлов до 15. Это уменьшает мою работу разделив на три набора файлов:
rc.d/*
-- скрипты запуска системы и изменения уровня выполненияfstab
-- список монтируемых файловых системinittab
-- параметры для процесса init
первого процесса запускаемого
во время начальной загрузки.
passwd
-- список пользователей, домашних каталогов, и т.д.group
-- группы пользователей.
shadow
-- пароли пользователей. У Вас может его не быть.
termcap
-- база данных свойств терминала.passwd
, и shadow
должны быть сокращены, чтобы избежать копирования
паролей пользователей вне системы, и так, чтобы, когда Вы загрузились с дискеты, нежелательные
входы в систему отвергались.
Убедитесь, что passwd
содержит по крайней мере root
. Если Вы допускаете других пользователей
ко входу в систему, убедитесь, их домашние каталоги и оболочки(shells) существуют.
termcap
, база данных терминалов, обычно несколько килобайт. Версия вашей загрузочной дискеты должна быть сокращена,
до содержимого используемого Вами терминала(ов), обычно это только запись для linux-console
.
Помимо этого, я действительно должен конфигурировать только два файла, и то, что они должны содержать, удивительно мало.
rc
должен содержать:
#!/bin/sh /bin/mount -av /bin/hostname KangarooУбедитесь, что каталоги правильны. В действительности Вы не должны выполнять
hostname
- это
только выглядит лучше, если Вы это сделаете.
fstab
должен содержать по крайней мере:
/dev/ram0 / ext2 defaults /dev/fd0 / ext2 defaults /proc /proc proc defaultsВы можете копировать записи из вашего существующего
fstab
, но Вы должны не автоматически
монтировать все ваши разделы жесткого диска; используйте noauto
ключевое слово с ними.
Ваш жесткий диск может быть поврежден или мертв, когда используется загрузочная дискета.
Ваш inittab
должен быть изменен так, чтобы sysinit
строка выполнила rc
, или любой базовый
сценарий начальной загрузки, который будет использоваться. Также, если Вы хотите запретить пользователям
на последовательных портах входить в систему, закомментируйте все
записи для getty
, которые включают устройства ttys
или ttyS
в конце строки. Оставьте tty
порты,
чтобы Вы могли входить в систему с консоли.
Минимальный inittab
файл выглядит так:
id:2:initdefault: si::sysinit:/etc/rc 1:2345:respawn:/sbin/getty 9600 tty1 2:23:respawn:/sbin/getty 9600 tty2
inittab
файл определяет то, что система будет запускаться в различных режимах включая запуск,
переход в многопользовательский режим, и т.д. Тщательно проверьте, команды указанные в inittab
;
Если init не может найти упомянутую программу, загрузочный диск будет зависать, и Вы не всегда получите сообщение об ошибке.
Обратите внимание, что некоторые программы не могут быть размещены в другом месте, потому что
другие программы жестко связаны с их расположением. Например на моей системе, /etc/shutdown
имеет жестко связан с /etc/reboot. Если я перемещаю reboot
в /bin/reboot, и затем выдаю команду
shutdown
, она не выполнится, потому что не сможет найти reboot
файл.
Для остальных, просто скопируйте все текстовые файлы в вашем /etc
каталоге, плюс все исполняемые
программы в вашем /etc
каталоге, в которых Вы не уверены, что они Вам не понадобятся. Как инструкцией,
руководствуйтесь примером, в секции
Пример каталога корневого диска. Вероятно достаточно
скопировать только эти файлы, но системы значительно отличаются, так что Вы не можете быть
уверены, что тот же самый набор файлов на вашей системе эквивалентен файлам в списке.
Единственный верный метод - начать с inittab
и выбрать то, что требуется.
Большинство систем теперь использует /etc/rc.d/ каталог, содержащий сценарии оболочки для
различных уровней выполнения. Минимум - одиночный rc
скрипт, но может быть проще скопировать
inittab
и /etc/rc.d каталог из вашей существующей системы,
и сокращать сценарии оболочки в rc.d
каталоге, чтобы удалить обработку не относящуюся к окружению системной дискеты.
Каталог /bin
- удобное место для дополнительных утилит, которые должны выполнять базовые
операции, утилиты типа ls
, mv
, cat
и dd
. См. приложение
Пример каталога корневого диска
для примерного списка файлов, которые входят в /bin
и /sbin
каталоги. Он не включает никакие
утилиты восстановления из резервных копий, типа cpio
, tar
и gzip
. Это потому, что я помещаю
их на отдельную сервисную дискету, сохраняя пространство для загрузочной дискеты. Как только
загрузочная дискета загружается, она копируется на ramdisk, оставляя дисковод свободным для
монтирования другой дискеты - сервисной дискеты. Я обычно монтирую ее в /usr
.
Создание сервисной дискеты описано ниже в секции Создание сервисного диска. Вероятно желательно хранить копию той же самой версии утилит резервирования, используемых для записи резерва, чтобы Вы не тратить впустую время, пробуя установить версии, которые не смогут прочитать ваши ленты резервирования.
Удостоверьтесь, что Вы включили следующие программы: init
, getty
или эквивалентные, login
, mount
какую-либо оболочку , способную выполнять ваши rc скрипты, ссылку от sh
к оболочке.
В /lib
Вы помещаете необходимые общедоступные библиотеки и загрузчики. Если необходимые
библиотеки не найдены в вашем /lib
каталоге система будет не способна загрузиться. Если
вам повезет, то Вы сможете увидеть сообщение об ошибках, сообщающее Вам причину.
Почти каждая программа требует по крайней мере libc
библиотеки, libc.so.N
, где N - текущий
номер версии. Проверьте ваш /lib
каталог. libc.so.N
- обычно symlink к имени файла
с полным номером версии:
% ls -l /lib/libc*
-rwxr-xr-x 1 root root 4016683 Apr 16 18:48 libc-2.1.1.so*
lrwxrwxrwx 1 root root 13 Apr 10 12:25 libc.so.6 -> libc-2.1.1.so*
В этом случае Вам надо libc-2.1.1.so
. Чтобы найти другие библиотеки, Вы должны пройти
все бинарники, которые Вы планируете включить и проверить их зависимости ldd
командой. Например:
% ldd /sbin/mke2fs libext2fs.so.2 => /lib/libext2fs.so.2 (0x40014000) libcom_err.so.2 => /lib/libcom_err.so.2 (0x40026000) libuuid.so.1 => /lib/libuuid.so.1 (0x40028000) libc.so.6 => /lib/libc.so.6 (0x4002c000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Каждый файл справа - нужен. Имейте в виду, что перечисленные библиотеки могут быть символическими ссылками.
Заметьте, что некоторые файлы очень большие и не будут просто помещаться на корневой файловой системе.
Например, libc.so
указанный выше около 4Мб. Вы должны очистить библиотеки когда копируете их
на корневую файловую систему. См. секцию
Сокращение размера корневой файловой системы для инструкций.
В /lib
Вы должны также включить загрузчик для библиотек.
Загрузчик может быть либо ld.so
(для a.out бинарников), либо ld-linux.so
(для ELF бинарников).
Новейшие версии ldd
точно говорят какой загрузчик нужен, как в примере ниже, но старые версии могу не сказать.
Если Вы не уверены какой Вам нужен, запустите команду file
на библиотеке. Например:
% file/lib/libc.so.4.7.2 /lib/libc.so.5.4.33 /lib/libc-2.1.1.so /lib/libc.so.4.7.2: Linux/i386 demand-paged executable (QMAGIC), stripped /lib/libc.so.5.4.33: ELF 32-bit LSB shared object, Intel 80386, version 1, stripped /lib/libc-2.1.1.so: ELF 32-bit LSB shared object, Intel 80386, version 1, not stripped
QMAGIC
указывает, что 4.7.2
- для a.out библиотек, и ELF
указывает, что 5.4.33
и 2.1.1
- для ELF.
Скопируйте конкретный загрузчики(и), который нужны для создаваемой корневой файловой системы. Библиотеки и загрузчики должны быть проверены тщательно вместе с включаемыми бинарниками. Если ядро не может загрузить необходимую библиотеку, ядро обычно будет зависать без сообщений об ошибках.
Ваша система может требовать некоторые динамически загружаемые библиотеки, которые не видны ldd.
Если ваша система использует PAM (Pluggable Authentication Modules) Вы должны принять некоторые меры, иначе Вы будете не способны войти в систему. PAM - изощренный модульный метод, для опознавания пользователей и их доступа к службам. Простой путь проверки использования вашей системой PAM состоит в проверке каталога /etc на вашем диске на наличие файла pam.conf или каталога pam.d; если они существуют - вы должны обеспечить минимальную поддержку PAM.(В качестве альтернативы запустите ldd для вашего исполняемого файла login; если выдаваемая информация включает libpam.so вам нужен PAM).
К счаcтью, безопасность не имеет значения для загрузочных дисков, т.к. если кто-то имеет физический доступ к машине он может сделать все, что захочет. Следовательно, по существу вы можете запретить PAM создав в вашей корневой файловой системе простой /etc/pam.conf:
OTHER auth optional /lib/security/pam_permit.so OTHER account optional /lib/security/pam_permit.so OTHER password optional /lib/security/pam_permit.so OTHER session optional /lib/security/pam_permit.so
Также скопируйте файл /lib/security/pam_permit.so
в вашу корневую файловую систему. Эта библиотека
приблизительно 8Кб, т.о. она налагает минимальные расходы.
Заметьте, что эта конфигурация разрешает любому полный доступ к файлам и службам на вашей машине. Если по некоторым причинам Вы заботитесь о безопасности вашего загрузочного диска, Вы должны скопировать некоторые или все установки PAM на вашу корневую файловую систему. Прочтите внимательно документацию на PAM и скопируйте необходимые библиотеки в /lib/security на вашей корневой файловой системе.
Вы также должны включить /lib/libpam.so на ваш загрузочный диск. Но Вы уже об этом знаете, т.к. запускали ldd для /bin/login, который показал эту зависимость.
Если Вы используете glibc (или libc6) Вы должны обеспечить name services или вы не сможете войти в систему. Файл /etc/nsswitch.conf управляет поиском по базе данных для различных служб. Если вы не планируете доступ к сетевым службам (таким как DNS, NIS поиск). Вы должны подготовить простой nsswitch.conf файл который выглядит так:
passwd: files shadow: files group: files hosts: files services: files networks: files protocols: files rpc: files ethers: files netmasks: files bootparams: files automount: files aliases: files netgroup: files publickey: files
Это указывает, что каждая служба будет иметь доступ только к локальным файлам. Вы также
должны включить /lib/libnss_files.so.1
, которая загружается динамически для
работы с обзором файлов.
Если вы планируете доступ к сети с вашего загрузочного диска, вы должны создать более
замысловатый файл nsswitch.conf. Для подробностей смотрите man страницу nsswitch. Запомните, что
Вы должны включить файл /lib/libnss_
service.so.1
для каждой указанной службы.
Если у Вас модульное ядро, Вы должны обдумать, какие модули Вы хотите загружать с вашего
загрузочного диска после загрузки. Возможно Вы захотите включить ftape
и zftape
модули,
если у Вас есть устройства резервирования на гибкой ленте, модули для SCSI устройств,
если они у Вас есть, и, возможно, модули PPP или SLIP, если Вы хотите иметь доступ к сети при аварии.
Эти модули могут быть помещены в /lib/modules. Вы должны также
включить insmod
, rmmod
and lsmod
. В зависимости от того, хотите ли Вы загружать модули
автоматически, Вы можете также включать modprobe
, depmod
и swapout
. Если Вы используете
kerneld
, включаете его наряду с /etc/conf.modules.
Однако, основное преимущество использования модулей - то, что Вы можете перемещать некритические модули на сервисный диск и загружать их когда необходимо, т.о. используется меньше пространства на вашем загрузочном диске. Если Вам, возможно, придется иметь дело с многими различными устройствами, этот подход предпочтительнее, чем формирование одного огромного ядра с многими встроенными драйверами.
Обратите внимание, чтобы загрузить сжатую ext2 файловую систему, Вы должны иметь встроенную поддержку ramdisk и ext2. Они не могут быть в модульном исполнении.
Некоторые системные программы, типа login
, жалуются, если файл /var/run/utmp и
каталог /var/log не существует.
. Так что:
mkdir -p /mnt/var/{log,run} touch /mnt/var/run/utmp
В заключение, после того, как Вы установили все библиотеки, Вам необходимо, выполнить ldconfig
,
чтобы пересоздать /etc/ld.so.cache на корневой файловой системе. Кэш сообщает
загрузчику, где найти библиотеки. Чтобы пересоздать ld.so.cache
, выдайте следующие команды:
chdir /mnt; chroot /mnt /sbin/ldconfig
chroot
необходим, потому что ldconfig
всегда пересоздает кэш для корневой файловой системы.
Как только Вы закончили создание корневой файловой системы, размонтируйте ее, скопируйте ее в файл, и сожмите:
umount /mnt dd if=DEVICE bs=1k | gzip -v9 > rootfs.gz
После окончания у Вас будет файл rootfs.gz
, который и есть ваша
сжатая корневая файловая система. Вы должны проверить размер, чтобы удостовериться, что она
поместиться на дискете; если не помещается вы должны вернуться и удалить некоторые файлы.
Некоторые подсказки содержатся в секции
Уменьшение размера корневой файловой системы.