Рейтинг@Mail.ru

Наши друзья и партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

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

Поделиться: