Создание корневой файловой системы.

Создание корневой файловой системы предполагает отбор необходимых для запуска системы файлов. В этой секции мы описываем создание сжатой корневой файловой системы. Менее распространенный вариант - создание несжатой файловой системы на дискете, которая непосредственно монтируется как корневая; этот вариант описан в секции Разд. Не - ramdisk корневые файловые системы.>.

Обзор.

Корневая файловая система должна содержать все необходимое для поддержки полной Linux системы. Для этого диск должен удовлетворять минимальным требованиям Linux системы:

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

Мы опишем создание сжатой файловой системы, которая так называется, так как она сжата на диске и при загрузке распаковывается на ramdisk. Используя сжатую файловую систему, Вы можете разместить много файлов (приблизительно шесть мегабайт) на стандартную 1440КБ дискету. Так как файловая система намного больше, чем дискета, она не может поместиться на дискете. Мы должны создать ее в другом месте, сжать и затем скопировать на дискету.

Создание файловой системы

Для создания такой корневой файловой системы, Вам нужно достаточно большое запасное устройство, для размещения всех файлов перед сжатием. Вам понадобится устройство, способное хранить приблизительно четыре мегабайта. Есть несколько вариантов:

После того, как вы выбрали один из этих вариантов, подготовьте DEVICE:
        dd if=/dev/zero of=DEVICE bs=1k count=4096

Эта команда обнуляет устройство.

Важно: Обнуление устройства важно, т.к. файловая система будет сжата, и для достижения максимальной степени сжатия все неиспользуемые части должны быть заполнены нулями. Помните, что при перемещении или удалении файлов на файловой системе, система будет корректно освобождать блоки, но не будет их снова обнулять. Если Вы много удаляли и копировали, ваша сжатая файловая система может стать больше требуемой.

Затем, создайте файловую систему. Ядро Linux распознает два типа файловой системы для корневых дисков, которые автоматически копируются на ramdisk. Это - minix и ext2, из которых ext2 предпочтительней. При использовании ext2, для создания большего количества inodes, чем значение по умолчанию, Вы можете использовать опцию -N; для того, чтобы Вы не исчерпали inodes рекомендуется -N 2000. Или же Вы можете сберечь inodes, удалив большинство ненужных /dev файлов. Команда mke2fs по умолчанию создаст 360 inodes на дискете 1.44МБ. Я считаю, что 120 inodes вполне достаточно для моей текущей спасательной корневой дискеты, но если Вы включаете все устройства в /dev каталог, Вы легко превысите 360. Использование сжатой корневой файловой системы позволяет создать большую файловую систему, и, следовательно, большее количество inodes по умолчанию, но Вы все еще должны либо уменьшить число файлов, либо увеличить число inodes.

Так что Ваша команда выглядит так:
	mke2fs -m 0 -N 2000 DEVICE

( Если вы используете петлевое устройство, вместо DEVICE должно быть подставлено имя используемого файла на диске.)

Команда mke2fs автоматически обнаружит доступное пространство и соответственно сконфигурируется. Параметр ``-m═0'' предотвращает от резервирования пространства для root, и, таким образом, обеспечивает больше используемого пространства на диске.

Затем, примонтируйте устройство:
        mount -t ext2 DEVICE /mnt
( Если каталог монтирования /mnt не существует - Вы должны создать его.) В следующих секциях, все имена каталогов назначения полагаются относительно /mnt.

Заполнение файловой системы.

Существует разумный минимальный набор каталогов для вашей корневой файловой системы: [1]:

Три из этих каталогов должны быть пусты на корневой файловой системе, т.о. они должны быть просто созданы командой mkdir. Каталог /proc - просто заглушка, в которой размещается файловая система proc. Каталоги /mnt и /usr - всего лишь точки монтирования для использования после того, как загрузочная/корневая система будет запущена. Следовательно, эти каталоги должны быть только созданы.

Оставшиеся четыре каталога описаны в следующих секциях.

/dev

Каталог /dev содержит специальные файлы для всех устройств, которые обязательно используются в любой Linux системе. Сам каталог - обычный каталог, и может быть создан mkdir обычным способом. Однако специальные файлы устройств, должны быть созданы особым образом, используя команду mknod.

Есть более короткий путь — скопировать файлы устройств из существующего на вашем жестком диске каталога /dev. Единственное требование - чтобы Вы, копируя специальные файлы устройств, использовали опцию -R. Это приведет к копированию каталога без попыток копировать содержимое файлов. Проверьте, что Вы использовали верхний регистр R. Например:
	cp -dpR /dev/fd[01]* /mnt/dev
	cp -dpR /dev/tty[0-6]* /mnt/dev
предполагает, что дискета примонтирована в /mnt. Опции dp гарантируют, что символические ссылки будут копироваться как ссылки, а не как содержимое файла, и что первоначальные атрибуты файла сохранятся, таким образом, сохранится информация о владельце файла.

Если Вы хотите пойти трудным путем, используйте ls -l, для вывода старших(major) и младших (minor) чисел нужных вам устройств, и создайте их на дискете, используя mknod.

Как только устройства скопированы, проверьте, что все необходимые специальные устройства помещены на спасательную дискету. Например, если Вы предполагаете с загрузочной дискеты обращаться к вашим ленточным устройствам. Вам надо скопировать все файлы ленточных устройств ftape.

Обратите внимание, что для каждого файла устройства требуется один inode, и inode может быть дефицитным ресурсом, особенно для файловой системы дискеты. Вам следует быть переборчивым при копировании файлов устройств. Например, если у Вас нет SCSI дисков, Вы можете с уверенностью игнорировать /dev/sd*; если Вы не предполагаете использовать последовательный порт, вы может игнорировать /dev/ttyS*.

Если при копировании файлов вы получаете ошибку No space left on device, а df показывает что свободное место все еще есть, возможно, вы исчерпали inodes. Использование inodes вам покажет df -i

Важно: Проверьте, что включили в этот каталог следующие файлы: console, kmem, mem, null, ram0 and tty1.

/etc

Каталог /etc содержит конфигурационные файлы. Его предполагаемое содержимое зависит от состава предполагаемых к использованию программ. На большинстве систем, они могут быть разделены на три группы:

  1. Требуемые всегда, такие как rc, fstab, passwd.

  2. Которые могут потребоваться, но не обязательно.

  3. Всякий хлам.

Не существенные файлы могут быть установлены командой:
        ls -ltru
Она выводит файлы в обратном порядке по дате последнего обращения, так если к каким-либо файлам не было обращения, их можно не включать в корневую дискету.

На моих корневых дискетах я ограничился 15 конфигурационными файлами. Можно уменьшить мою работу, разделив их на три набора файлов:

  1. Те, которые я должен сконфигурировать для загрузочной/корневой системы:

    1. rc.d/* -- скрипты запуска системы и изменения уровня выполнения

    2. fstab -- список монтируемых файловых систем

    3. inittab -- параметры init процесса, - первого запускаемого во время начальной загрузки процесса.

    4. gettydefs-- параметры для процесса init, первого запускаемого при загрузке процесса.

  2. Те, которые я должен привести в порядок для загрузочной системы:

    1. passwd -- список необходимых пользователей, домашних каталогов, и т.д.

    2. group -- группы пользователей.

    3. shadow -- пароли пользователей. У Вас его может не быть.

    4. termcap -- база данных возможностей терминалов.

    Если безопасность важна, passwd, и shadow должны быть урезаны, чтобы избежать копирования паролей пользователей вне системы, и, таким образом, при загрузке с дискеты нежелательные входы в систему будут отвергаться.

    Проверьте, что passwd содержит, по крайней мере, root. Если Вы допускаете вхождение в систему других пользователей, проверьте существование их домашних каталогов и оболочек (shells).

    termcap, база данных терминалов, обычно несколько сотен килобайт. Версия этого файла на вашей загрузочной дискете должна быть урезана, чтобы содержать параметры только используемого Вами терминала(ов), обычно это всего лишь элемент linux или linux-console.

  3. Остальные. В данный момент они работают, так что я их оставлю.

Помимо этого, мне остается сконфигурировать всего лишь два файла, и их содержимое удивительно невелико.

  • 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 и /sbin

Каталог /bin - удобное место для дополнительных утилит, которые должны выполнять базовые операции, таких как ls, mv, cat и dd. Примерный список файлов, которые входят в каталоги /bin и /sbin см. в Прил. Перечень файлов образца корневого диска.>. Он не включает никаких утилит восстановления из резервных копий, таких как cpio, tar и gzip. Это потому, что я помещаю их на отдельную сервисную дискету, сохраняя пространство загрузочной дискеты. При загрузке дискеты она копируется на ramdisk, оставляя дисковод свободным для монтирования другой дискеты - сервисной дискеты. Я обычно монтирую ее в /usr.

Создание сервисной дискеты описано ниже в секции Разд. Создание сервисного диска.>. Вероятно желательно хранить копию утилит резервирования тех же версий, которые использовались для создания резерва, чтобы Вы не тратить впустую время, устанавливая версии, которые не смогут прочесть ваши резервные ленты.

Важно: Проверьте, что Вы включили программы init, getty или их эквиваленты, login, mount, какую-либо способную выполнять ваши rc скрипты оболочку, ссылку с sh на оболочку.

/lib

В /lib Вы помещаете необходимые общедоступные библиотеки и загрузчики. Если необходимые библиотеки не будут найдены в вашем /lib каталоге, система не сможет загрузиться. Если вам повезет, то Вы сможете увидеть сообщающее причину сообщение об ошибке.

Почти каждая программа требует, по крайней мере, библиотеку libc, libc.so.N, гдеN - номер текущей версии. Сверьтесь с Вашим /lib каталогом. Файл libc.so.N - обычно символическая ссылка на имя файла с полным номером версии:

% 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.

Скопируйте необходимый(е) для создаваемой корневой файловой системы загрузчик(и). Библиотеки и загрузчики должны быть тщательно проверены вместе с включаемыми двоичными файлами. Если ядро не сможет загрузить необходимую библиотеку, оно может зависать без сообщения об ошибке.

Обеспечение PAM и NSS.

Ваша система может требовать динамически загружаемые библиотеки, которые не видны ldd. Если вы их не предусмотрите, у Вас могут возникнуть проблемы при входе в систему или использовании вашего загрузочного диска.

PAM (Pluggable Authentication Modules)

Если ваша система использует PAM (Pluggable Authentication Modules), Вы должны это предусмотреть в вашем загрузочном диске. PAM - изощренный модульный метод идентификации пользователей и управления их доступом к службам. Простой способ проверки того, использует ли ваша система PAM, состоит в запуске ldd для исполняемого файла login. Если выдаваемая информация включает libpam.so - вам нужен PAM.

К счастью, безопасность не имеет значения для загрузочных дисков, т.к. если кто-либо имеет физический доступ к машине, он может сделать все, что захочет. Следовательно, вы можете фактически запретить 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, которая показала эту зависимость.

NSS (Name Service Switch)

Если Вы используете 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.X, где X равен 1 для glibc2.0 и равен 2 для glibc2.1. Эта библиотека динамически загружается для поиска по файлам.

Если вы планируете доступ к сети с вашего загрузочного диска, вы должны создать более продуманный файл nsswitch.conf. Для подробностей смотрите man страницу nsswitch. Для каждого указанного типа службы service Вы должны включить файл /lib/libnss_service.so.1

Модули

Если у Вас модульное ядро, Вы должны обдумать, какие модули Вы захотите загружать с вашего загрузочного диска после загрузки. Если у Вас есть ленточные устройства резервирования, то Вы, возможно, захотите включить модули ftape и zftape, модули для SCSI устройств, если они у Вас есть, и, возможно, модули PPP или SLIP, если хотите иметь доступ к сети при аварии.

Эти модули могут быть помещены в /lib/modules. Вы должны также включить insmod, rmmod и 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 на корневой файловой системе. Кэш сообщает загрузчику, где искать библиотеки. Это делается командой:
        ldconfig -r /mnt

Перенос.

Как только Вы закончили создание корневой файловой системы, размонтируйте ее, скопируйте ее в файл, и сожмите:
        umount /mnt
        dd if=DEVICE bs=1k | gzip -v9 > rootfs.gz
После окончания у Вас будет файл rootfs.gz. Этот файл - ваша сжатая корневая файловая система. Вы должны проверить размер и удостовериться, что она поместиться на дискете; если не помещается - вернитесь и удалите некоторые файлы. Некоторые подсказки уменьшения размера содержатся в секции Разд. Уменьшение размера корневой файловой системы>.

Примечания

[1]

Представленная здесь структура каталогов - только для использования в корневой дискете. Реальные Linux системы имеют более полный и четкий набор правил размещения файлов, называемый Стандарт Файловой Иерархии (File Hierarchy Standard).