The Linux Bootdisk HOWTO: Создание корневой файловой системы.

Next Previous Contents

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

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

## 4.1 Обзор.

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

- базовая структура файловой системы,
- Минимальный набор каталогов: `/dev, /proc, /bin, /etc, /lib, /usr, /tmp,`
- Базовый набор утилит: `sh, ls, cp, mv,` и т.д.,
- Минимальный набор файлов конфигурации: `rc, inittab, fstab,` и т.д.,
- Устройства: `/dev/hd *, /dev/tty *, /dev/fd0,` и т.д.,
- Библиотеки поддержки, для обеспечения базовых функций, используемых утилит.

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

- Проверить файловую систему другого устройства, например проверить корневую файловую систему на жестком диске, у Вас должна быть возможность загрузить Linux с другого устройства- корневой дискеты. Затем Вы можете выполнить `fsck` на вашем основном корневом диске, в то время как он - не замонтирован.
- Восстанавливать все или часть вашего основного корневого устройства из архива используя утилиты резервирования типа `cpio, tar, gzip` и `ftape`.

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

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

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

- Использовать ramdisk (DEVICE = /dev/ram0). В этом случае используется память , чтобы имитировать дисковод. Ramdisk должен быть достаточно большой, чтобы содержать файловую систему соответствующего размера. Если Вы используете LILO, проверьте в вашем файле конфигурации (/etc/lilo.conf) строчку:

              RAMDISK_SIZE = nnn

  Которая определяет, сколько оперативной памяти будет выделено. Значение по умолчанию 4096КБ, которое должно быть достаточным. Вы не должны пытаться пробовать использовать такой ramdisk на машине с объемом памяти менее 8МБ. Удостоверьтесь что существует устройство /dev/ram0, /dev/ram или /dev/ramdisk. Если необходимо, создайте /dev/ram0 с `mknod` (major номер 1, minor 0).
- Если у Вас есть достаточно большой (несколько мегабайт) неиспользуемый раздел жесткого диска, это - хорошее решение.
- Использовать петлевое (loopback) устройство, которое позволяет работать с файлом на диске как с устройством. При использовании петлевого устройства Вы можете создать трех мегабайтный файл на вашем жестком диске и сформировать на нем файловую систему. Наберите `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`.

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

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

- `/dev` -- Устройства, требуемые для ввода/вывода
- `/proc` -- каталог-заглушка, необходимый для proc файловой системы
- `/etc` -- системные файлы конфигурации
- `/sbin` -- критичные системные бинарники
- `/bin` -- базовые бинарники, часть предполагаемой системы
- `/lib` -- общие библиотеки, для обеспечения средств динамической поддержки (run-time)
- `/mnt` -- точка монтирования для поддержки других дисков
- `/usr` -- дополнительные утилиты и приложения

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

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

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

### /dev

`/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`.

### /etc

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

1. Требуемые всегда, например, e.g. `rc, fstab, passwd`.
2. Которые могут потребоваться, но не обязательно.
3. Всякий хлам.

Файлы, которые не необходимы, могут быть идентифицированы с командой:

> `

>             ls -ltru

> `

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

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

1. Те, которые я должен конфигурировать для загрузочной системы
   1. `rc.d/*` -- скрипты запуска системы и изменения уровня выполнения
   2. `fstab` -- список монтируемых файловых систем
   3. `inittab` -- параметры для процесса `init` первого процесса запускаемого во время начальной загрузки.
2. Те, которые я должен привести в порядок для загрузочной системы:
   1. `passwd` -- список пользователей, домашних каталогов, и т.д.
   2. `group` -- группы пользователей.
   3. `shadow` -- пароли пользователей. У Вас может его не быть.
   4. `termcap` -- база данных свойств терминала.
   Если безопасность важна, `passwd`, и `shadow` должны быть сокращены, чтобы избежать копирования паролей пользователей вне системы, и так, чтобы, когда Вы загрузились с дискеты, нежелательные входы в систему отвергались. Убедитесь, что `passwd` содержит по крайней мере `root`. Если Вы допускаете других пользователей ко входу в систему, убедитесь, их домашние каталоги и оболочки (shells) существуют. `termcap`, база данных терминалов, обычно несколько килобайт. Версия вашей загрузочной дискеты должна быть сокращена, до содержимого используемого Вами терминала(ов), обычно это только запись для `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` - обычно 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.

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

## 4.4 Обеспечение для PAM и NSS.

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

### PAM (Pluggable Authentication Modules).

Если ваша система использует 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, который показал эту зависимость.

### 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.1`, которая загружается динамически для работы с обзором файлов.

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

## 4.5 Модули.

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

Эти модули могут быть помещены в /lib/modules. Вы должны также включить `insmod`, `rmmod` and `lsmod`. В зависимости от того, хотите ли Вы загружать модули автоматически, Вы можете также включать `modprobe`, `depmod` и `swapout`. Если Вы используете `kerneld`, включаете его наряду с /etc/conf.modules.

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

Обратите внимание, чтобы загрузить сжатую ext2 файловую систему, Вы должны иметь встроенную поддержку ramdisk и ext2. Они не могут быть в модульном исполнении.

## 4.6 Некоторые заключительные подробности.

Некоторые системные программы, типа `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` всегда пересоздает кэш для корневой файловой системы.

## 4.7 Перенос.

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

            umount /mnt
            dd if=DEVICE bs=1k | gzip -v9 > rootfs.gz

После окончания у Вас будет файл `rootfs.gz` , который и есть ваша сжатая корневая файловая система. Вы должны проверить размер, чтобы удостовериться, что она поместиться на дискете; если не помещается вы должны вернуться и удалить некоторые файлы. Некоторые подсказки содержатся в секции Уменьшение размера корневой файловой системы.

Next Previous Contents