Создание корневой файловой системы предполагает отбор необходимых для запуска системы файлов. В этой секции мы описываем создание сжатой корневой файловой системы. Менее распространенный вариант - создание несжатой файловой системы на дискете, которая непосредственно монтируется как корневая; этот вариант описан в секции Разд. Не - ramdisk корневые файловые системы.>.
Корневая файловая система должна содержать все необходимое для поддержки полной 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КБ дискету. Так как файловая система намного больше, чем дискета, она не может поместиться на дискете. Мы должны создать ее в другом месте, сжать и затем скопировать на дискету.
Для создания такой корневой файловой системы, Вам нужно достаточно большое запасное устройство, для размещения всех файлов перед сжатием. Вам понадобится устройство, способное хранить приблизительно четыре мегабайта. Есть несколько вариантов:
Использовать ramdisk ( DEVICE = /dev/ram0). В этом случае для имитации диска используется память. Ramdisk должен быть достаточного объема для размещения файловой системы соответствующего размера. Если Вы используете LILO, проверьте в вашем конфигурационном файле ( /etc/lilo.conf) строчку RAMDISK = nnn, Которая определяет максимальный объем оперативной памяти выделяемой ramdisk. Значение по умолчанию 4096КБ, которого должно быть достаточно. Вы не должны пытаться использовать такой ramdisk на машине с объемом памяти менее 8МБ. Проверьте, что у Вас есть устройства /dev/ram0, /dev/ram или /dev/ramdisk. Если их нет - создайте /dev/ram0 командой mknod (старший номер 1, младший 0).
Если у Вас есть достаточно большой (несколько мегабайт) неиспользуемый раздел жесткого диска, это приемлемо.
Использовать петлевое (loopback) устройство, которое позволяет обращаться с файлом на диске как с устройством. При использовании петлевого устройства Вы можете создать трех мегабайтный файл на вашем жестком диске и сформировать на нем файловую систему.
Для инструкций об использовании петлевых устройств, наберите man losetup. Если у Вас нет losetup, Вы можете получить ее вместе с совместимыми версиями mount и unmount из пакета util-linux в каталоге ftp://ftp.win.tue.nl/pub/linux/utils/util-linux/.
Если на вашей системе нет петлевого устройства ( /dev/loop0, /dev/loop1, и т.д.), Вы должны его создать командой `` mknod /dev/loop0 b 7 0''. Как только вы установите особые mount и umount, создайте на жестком диске достаточного объема временный файл (например, /tmp/fsfile). Для создания nnn-блочного файла можно использовать команду:
dd if=/dev/zero of=/tmp/fsfile bs=1k count= nnn |
Ниже вместо DEVICE используйте имя файла. Когда Вы даете команду монтирования, для указания mount использовать петлевое устройство Вы должны включить опцию -o loop.
После того, как вы выбрали один из этих вариантов, подготовьте 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
|
Существует разумный минимальный набор каталогов для вашей корневой файловой системы: [1]:
/dev -- Устройства, требуемые для ввода/вывода
/proc -- каталог-заглушка, необходимый для файловой системы proc
/etc -- системные конфигурационные файлы
/sbin -- критичные системные исполняемые файлы
/bin -- необходимые исполняемые файлы, часть предполагаемой системы
/lib -- общие библиотеки, для обеспечения средств динамической поддержки (run-time)
/mnt -- точка монтирования для поддержки других дисков
/usr -- дополнительные утилиты и приложения
Три из этих каталогов должны быть пусты на корневой файловой системе, т.о. они должны быть просто созданы командой mkdir. Каталог /proc - просто заглушка, в которой размещается файловая система proc. Каталоги /mnt и /usr - всего лишь точки монтирования для использования после того, как загрузочная/корневая система будет запущена. Следовательно, эти каталоги должны быть только созданы.
Оставшиеся четыре каталога описаны в следующих секциях.
Каталог /dev содержит специальные файлы для всех устройств, которые обязательно используются в любой Linux системе. Сам каталог - обычный каталог, и может быть создан mkdir обычным способом. Однако специальные файлы устройств, должны быть созданы особым образом, используя команду mknod.
Есть более короткий путь — скопировать файлы устройств из существующего на вашем жестком диске каталога /dev. Единственное требование - чтобы Вы, копируя специальные файлы устройств, использовали опцию -R. Это приведет к копированию каталога без попыток копировать содержимое файлов. Проверьте, что Вы использовали верхний регистр R. Например:
cp -dpR /dev/fd[01]* /mnt/dev cp -dpR /dev/tty[0-6]* /mnt/dev |
Если Вы хотите пойти трудным путем, используйте 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 содержит конфигурационные файлы. Его предполагаемое содержимое зависит от состава предполагаемых к использованию программ. На большинстве систем, они могут быть разделены на три группы:
Требуемые всегда, такие как rc, fstab, passwd.
Которые могут потребоваться, но не обязательно.
Всякий хлам.
ls -ltru |
На моих корневых дискетах я ограничился 15 конфигурационными файлами. Можно уменьшить мою работу, разделив их на три набора файлов:
Те, которые я должен сконфигурировать для загрузочной/корневой системы:
rc.d/* -- скрипты запуска системы и изменения уровня выполнения
fstab -- список монтируемых файловых систем
inittab -- параметры init процесса, - первого запускаемого во время начальной загрузки процесса.
gettydefs-- параметры для процесса init, первого запускаемого при загрузке процесса.
Те, которые я должен привести в порядок для загрузочной системы:
passwd -- список необходимых пользователей, домашних каталогов, и т.д.
group -- группы пользователей.
shadow -- пароли пользователей. У Вас его может не быть.
termcap -- база данных возможностей терминалов.
Если безопасность важна, passwd, и shadow должны быть урезаны, чтобы избежать копирования паролей пользователей вне системы, и, таким образом, при загрузке с дискеты нежелательные входы в систему будут отвергаться.
Проверьте, что passwd содержит, по крайней мере, root. Если Вы допускаете вхождение в систему других пользователей, проверьте существование их домашних каталогов и оболочек (shells).
termcap, база данных терминалов, обычно несколько сотен килобайт. Версия этого файла на вашей загрузочной дискете должна быть урезана, чтобы содержать параметры только используемого Вами терминала(ов), обычно это всего лишь элемент linux или linux-console.
Остальные. В данный момент они работают, так что я их оставлю.
Помимо этого, мне остается сконфигурировать всего лишь два файла, и их содержимое удивительно невелико.
rc должен содержать:
#!/bin/sh /bin/mount -av /bin/hostname Kangaroo |
fstab должен содержать, по крайней мере:
/dev/ram0 / ext2 defaults /dev/fd0 / ext2 defaults /proc /proc proc defaults |
Ваш 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 |
Обратите внимание, что некоторые программы не могут быть размещены в другом месте, так как другие программы жестко связаны с их расположением. Например, в моей системе, /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 - обычно символическая ссылка на имя файла с полным номером версии:
% 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 |
Скопируйте необходимый(е) для создаваемой корневой файловой системы загрузчик(и). Библиотеки и загрузчики должны быть тщательно проверены вместе с включаемыми двоичными файлами. Если ядро не сможет загрузить необходимую библиотеку, оно может зависать без сообщения об ошибке.
Ваша система может требовать динамически загружаемые библиотеки, которые не видны ldd. Если вы их не предусмотрите, у Вас могут возникнуть проблемы при входе в систему или использовании вашего загрузочного диска.
Если ваша система использует 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 |
Эта конфигурация разрешает любому полный доступ к файлам и службам вашей машины. Если Вы, по некоторым причинам, заботитесь о безопасности вашего загрузочного диска, скопируйте некоторые или все настройки 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 |
Если вы планируете доступ к сети с вашего загрузочного диска, вы должны создать более продуманный файл 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
|
[1] |
Представленная здесь структура каталогов - только для использования в корневой дискете. Реальные Linux системы имеют более полный и четкий набор правил размещения файлов, называемый Стандарт Файловой Иерархии (File Hierarchy Standard). |
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |