Что такое корневая файловая система
На этом уроке мы рассмотрим иерархию файловой системы Linux, а также познакомимся с назначением различных каталогов.
Если вы ранее пользовались только Windows, то структура файловой системы Linux может показаться вам особенно чуждой: нет привычного обозначения C:\ и букв дисков, их заменили каталог / и другие папки, большинство из которых имеют странные имена, состоящие из трех букв.
Причина всего этого в том, что в Linux используется свой FHS (сокр. от «Filesystem Hierarchy Standard» = «Стандарт иерархии файловой системы»). FHS определяет структуру и содержание/назначение каталогов в дистрибутивах Linux. Благодаря данному стандарту структура каталогов во всех дистрибутивах Linux является (почти) одной и той же.
Структура каталогов в Linux
Напомню, что Linux основан на системе Unix и, следовательно, заимствует из нее свою иерархию файловой системы. Аналогичную структуру каталогов вы найдете в Unix-подобных операционных системах, таких как BSD и macOS. Однако в дальнейшем я буду использовать именно термин Linux вместо Unix.
/ — корневая директория
Поскольку все остальные каталоги или файлы происходят от корня, абсолютный путь к любому из них начинается с корневой директории. Например, если у вас есть файл в /home/user/documents , то вы можете догадаться, что структура каталогов идет от root->home->user->documents .
С помощью rm -rf / вы просите свою систему принудительно и рекурсивно удалить содержимое корневого каталога. Поскольку в корневом каталоге содержатся все файлы и папки ОС, то данной командой вы стираете все данные, и ваша Linux-система просто должна исчезнуть (теоретически).
Большинство дистрибутивов Linux не запустят эту команду без ключа --no-preserve-root . Но в любом случае, не стоит ради любопытства пытаться выполнить эту команду.
/bin — binaries (двоичные файлы)
Каталог /bin содержит двоичные файлы многих основных программ и утилит (ls, cp, cd и т.д.), которые должны присутствовать при монтировании системы в однопользовательском режиме. Приложения, такие как Firefox, хранятся в /usr/bin , в то время как важные системные программы и утилиты, такие как оболочка bash, находятся в /bin .
Примечание: Монтирование файловой системы — это системный процесс, подготавливающий раздел диска к использованию операционной системой.
/boot — boot files (загрузочные файлы)
Каталог /boot содержит файлы, необходимые для загрузки системы. Например, здесь хранятся файлы загрузчика GRUB и ваши ядра Linux. Однако конфигурационные файлы загрузчика находятся не здесь — они лежат в /etc вместе с другими конфигурационными файлами.
/cdrom — исторически сложившаяся папка для CD-ROM
Каталог /cdrom не является частью FHS, но вы все равно можете встретить его, например, в Ubuntu или других дистрибутивах Linux. Это временное место для компакт-дисков. Однако стандартное расположение временных носителей находится внутри каталога /media .
/dev — device files (файлы устройств)
Различные устройства воспринимаются и отображаются системой Linux в виде файлов, хранящихся в каталоге /dev. Стоит отметить, что это не настоящие файлы, какими мы их привыкли воспринимать, а специальный тип (интерфейс), используемый операционной системой для взаимодействия с устройствами. Например, файл /dev/sda представляет собой первый SATA-диск в системе. Если вы хотите разбить его на разделы, то можете запустить редактор разделов и попросить его отредактировать файл /dev/sda . Файл /dev/sr — это CD-ROM, а файл /dev/wlan , как вы наверняка уже догадались, соответствует беспроводному сетевому интерфейсу. Также в этом каталоге могут содержаться специальные файлы псевдоустройств, которые на самом деле не сопоставляются с реальным оборудованием, например:
/dev/random — генератор случайных чисел;
/dev/zero — источник бесконечной последовательности нулевых байтов.
/etc — configuration files (конфигурационные файлы)
Каталог /etc содержит основные конфигурационные файлы системы, используемые администратором системы и её службами, такие как файл паролей и файлы настроек сетей. Обычно их можно редактировать вручную в текстовом редакторе. Если вам нужно внести изменения в конфигурацию системы (например, изменить имя хоста), то именно здесь вам стоит искать необходимые файлы. Обратите внимание, что каталог /etc содержит общесистемные конфигурационные файлы; пользовательские конфигурационные файлы находятся в домашнем каталоге каждого пользователя.
/home — личные каталоги пользователей
Каталог /home является хранилищем домашних папок пользователей системы, в которых те хранят свои личные файлы, заметки, утилиты и пр. Домашний каталог содержит пользовательские данные и пользовательские файлы конфигурации.
При создании нового пользователя в системе Linux, обычно для него создается соответствующий домашний каталог (и группа, но об этом позже). Предположим, что в вашей системе уже есть два пользователя: alice и bob. Тогда их домашние каталоги будут иметь пути /home/alice и /home/bob соответственно. Обратите внимание, что каждый (обычный) пользователь имеет доступ на запись только в свою домашнюю папку. Например, у пользователя bob не будет доступа к каталогу /home/alice и наоборот.
/usr — user binaries and program data (пользовательские двоичные файлы и программные данные)
Каталог /usr содержит исполняемые файлы, файлы библиотек и заголовочные файлы большинства пользовательских программ. По этой причине практически все они доступны только для чтения (для обычного пользователя).
/usr/bin — основные пользовательские утилиты;
/usr/sbin — дополнительные утилиты для администрирования и настройки системы;
/usr/lib — библиотеки утилит из /usr/bin и /usr/sbin ;
/usr/share — содержит документацию или общие для всех библиотек данные.
/lib — каталог совместно используемых библиотек
Каталог /lib содержит библиотеки, необходимые двоичным файлам в каталогах /bin и /sbin .
/sbin — системные утилиты
Каталог /sbin аналогичен каталогу /bin . Он содержит основные двоичные файлы утилит системного администрирования, которые, обычно, предназначены для запуска привилегированным (root) пользователем (ifconfig, dhclient, dmidecode, init и т.д.).
/tmp — временные файлы
Как следует из названия, в каталоге /tmp хранятся временные файлы используемых приложений (вы тоже можете задействовать данный каталог для размещения своих временных файлов).
Но обратите внимание, что при перезагрузке вашей системы содержимое каталогов в /tmp удаляется. Некоторые Linux-системы могут в любое время автоматически удалить старые файлы, поэтому не храните здесь ничего важного.
/var — файлы изменяемых данных
Каталог /var (сокр. от «variable») является доступным для записи аналогом каталога /usr . Файлы журналов, кэш программ, информация об очереди печати, общая информация с момента запуска системы — всё это пишется в каталог /var .
Файлы, хранящиеся здесь, не очищаются автоматически. По этой причине данный каталог представляет большой интерес для системных администраторов, ищущих информацию о поведении своей системы. Например, если вы хотите ознакомиться с глобальным системным журналом Linux, то просто посмотрите содержимое файла /var/log/syslog .
/proc — файлы процессов
Каталог /proc похож на каталог /dev , потому что он содержит не обычные файлы, а специальные файлы, предоставляющие информацию о запущенных процессах и состоянии ядра. Содержимое каталога /proc используется рядом утилит для получения системной информации этапа времени выполнения.
Например, если вы хотите проверить информацию о процессоре в Linux, то можете просто обратиться к файлу /proc/cpuinfo . Если вы хотите проверить использование памяти вашей системы Linux, посмотрите на содержимое файла /proc/meminfo .
/opt — optional software (дополнительное ПО)
Каталог /opt содержит подкаталоги для дополнительных пакетов программного обеспечения. Обычно он используется проприетарным программным обеспечением, которое не подчиняется стандартной иерархии файловой системы, например, проприетарная программа при установке может сохранить свои файлы в /opt/application .
/root — the home directory of the root (домашняя папка root-пользователя)
Каталог /root — это домашний каталог пользователя root. Вместо того, чтобы быть расположенным в /home/root , он находится в /root . Стоит отметить, что следует отличать данный каталог от каталога / , который, в свою очередь, является корневым каталогом всей системы.
/media — mount point for removable media (точка монтирования съемных носителей)
При подключении съемного носителя, такого как USB-диск, SD-карта или DVD-диск, для них автоматически создается соответствующая папка в каталоге /media. При помощи такой папки вы можете получить доступ к содержимому съемного носителя.
/mnt — mount directory (точка монтирования файловых систем)
Каталог /mnt похож на каталог /media , но вместо автоматического монтирования съемного носителя, /mnt используется системными администраторами для ручного монтирования различных файловых систем.
Примечание: Исторически сложилось, что каталог /mnt — это место, где системные администраторы монтировали временные файловые системы во время их использования. Например, если вы монтируете раздел Windows для выполнения некоторых операций восстановления файлов, вы можете смонтировать его в /mnt/windows . Однако вы также можете монтировать файловые системы и в отличном от /mnt месте системы.
/srv — service data (служебные данные)
/run — application state files (файлы текущего состояния приложений)
Каталог /run предоставляет приложениям стандартное место для хранения временных файлов и данных, которые требуются для работы различных процессов с момента запуска системы (сокеты, идентификаторы процессов и пр.). Данные файлы не сохраняются в /tmp по той причине, что из /tmp они могут быть удалены.
/lost+found — recovered files (восстановленные файлы)
Каждая файловая система Linux имеет каталог /lost+found. Если файловая система выходит из строя, то при следующей загрузке будет выполнена её проверка. Все найденные поврежденные файлы будут помещены в каталог /lost+found , так что вы сможете попытаться восстановить как можно больше данных.
Mount namespaces изолируют ресурсы файловых систем. Это по большей части включает всё, что имеет отношение к файлам в системе. Среди охватываемых ресурсов есть файл, содержащий список точек монтирования, которые видны процессу, и, как мы намекали во вступительном посте, изолирование может обеспечить такое поведение, что изменение списка (или любого другого файла) в пределах некоторого mount namespace инстанса M не будет влиять на этот список в другом инстансе (так что только процессы в M увидят изменения)
Точки монтирования
Вам может быть интересно, почему мы так сфокусировались на кажущимся произвольно выбранном файле, содержащим в себе список точек монтрирования. Что в нём такого особенного? Список точек монтирования даёт процессу полное описание доступных файловых систем в системе и, поскольку мы пребываем на территории Linux с мантрой всё есть файл, видимость почти каждого ресурса диктуется этим описанием: от фактических файлов и устройств до информации о том, какие другие процессы также запущены в системе. Таким образом, это даёт огромный выигрыш в безопасности для isolate , позволяющий точно указывать о каких именно частях системы будут в курсе команды, которые мы хотим выполнить. Пространства имён mount в сочетании с точками монтирования являются очень мощным инструментом, который позволит нам этого достичь.
Мы можем видеть точки монтирования, видимые для процесса с id $pid посредством файла /proc/$pid/mounts — его содержимое одинаково для всех процессов, принадлежащих к тому же mount namespace, что и $pid :
В списке, полученном на моей системе, видно устройство /dev/sda1 , смонтированное в / (ваше может быть другим). Это дисковое устройство, на котором размещена корневая файловая система, которая содержит всё что нужно для запуска и правильной работы системы, поэтому было бы здорово, если бы isolate запускала команды без ведома о таких файловых системах.
Давайте начнём с запуска терминала в его собственном mount namespace:
Строго говоря, нам не понадобится доступ уровня суперпользователя для работы с новыми пространствами имён mount, поскольку мы добавим процедуры настройки user namespace из предыдущего поста. В результате в этом посте мы предполагаем, что только команды unshare в терминале выполняются от суперпользователя. Для isolate в таком предположении необходимости нет.
Хммм, мы всё еще можем видеть тот же самый список, что и в корневом mount namespace. Особенно после того, как в предыдущем посте стало ясно, что новый user namepace начинается с чистого листа, может показаться, что флаг -m , который мы передали unshare , не дал никакого эффекта.
Процесс шелла фактически выполняется в другом mount namespace (мы можем убедиться в этом, сравнив файл симлинка ls -l /proc/$$/mnt с файлом другой копии шелла, работающей в корневом mount namespace). Причина, по которой мы все еще видим тот же список, заключается в том, что всякий раз, когда мы создаем новый mount namespace (дочерний), в качестве дочернего списка используется копия точек монтирования mount namespace, в котором происходило создание (родительского). Теперь любые изменения, которые мы вносим в этот файл (например, путём монтирования файловой системы), будут невидимы для всех других процессов.
Однако изменение практически любого другого файла на этом этапе будет влиять на другие процессы, поскольку мы всё ещё ссылаемся на те же самые файлы (Linux только делает копии особых файлов, таких как список точек монтирования). Это означает, что сейчас у нас минимальная изолированность. Если мы хотим ограничить то, что будет видеть наш командный процесс, мы должны сами обновить этот список.
Теперь, с одной стороны, поскольку мы пытаемся позаботиться о безопасности, мы могли бы просто сказать нах* всё и сделать в isolate полную очистку содержимого этого списка перед выполнение команды. Но это сделает запуск команды бесполезным, поскольку каждая программа, по крайней мере, зависит от ресурсов, вроде файлов операционной системы, которые, в свою очередь, обеспеченны какой-то файловой системой. С другой стороны, мы могли бы просто выполнить команду как есть, расшарив на неё те же файловые системы, что содержат необходимые системные файлы. Но это сводит на нет цель этого производимого нами дальше изолирования.
Лучшее решение — предоставить программе собственную копию зависимостей и системных файлов, которые требуются для запуска целиком в "песочнице", чтобы она могла вносить в них какие-либо изменения, не влияя на другие программы в системе. По лучшему сценарию мы можем поместить эти файлы в файловую систему и смонтировать её как корневую файловую систему (в корневой каталог / ) до выполнения ничего не подозревающей программы. Идея заключается в том, что поскольку всё, что доступно процессу, должно достигаться через корневую файловую систему, и поскольку мы будем точно знать, какие файлы мы туда помещаем для командного процесса, мы будем спокойны, зная, что он должным образом изолирован от остальной системы.
Хорошо, в теории это звучит хорошо и для реализации этого мы сделаем следующее:
- Создадим копию зависимостей и системных файлов, необходимых команде.
- Создадим новый mount namespace.
- Заменим корневую файловую систему в новом mount namespace на ту, которая содержит копии наших системных файлов.
- Выполним программу в новом mount namespace.
Корневые файловые системы
Уже на шаге 1 возникает вопрос: какие системные файлы нужны команде, которую мы хотим запустить? Мы могли бы порыться в нашей собственной корневой файловой системе и, задаваясь этим вопросом по каждому файлу, с которым мы столкнемся, брать только те, на которые ответ положительный, но это выглядит больно и излишне. Кроме того, какую команду будет выполнять isolate , мы изначально не знаем.
Вот если бы только у людей уже была такая же проблема и они собрали набор системных файлов, в целом достаточный, чтобы служить базой прямо из коробки для большинства программ? К счастью, есть много проектов, что реализовали это! Одним из них является проект Alpine Linux (его основное предназначение, это когда вы начинаете свой Dockerfile с FROM alpine:xxx ). Alpine предоставляет корневые файловые системы, которые мы можем использовать для наших целей. Если вы последуете инструкциями, то сможете получить копию их минимальной корневой файловой системы ( MINI ROOT FILESYSTEM ) для x86_64 здесь. Последней версией на момент написания поста и которую мы будем использовать, является v3.10.1 .
В каталоге rootfs есть знакомые файлы, прям как в нашей собственной корневой файловой системе в / , но убедитесь, насколько он минимален — многие из этих каталогов пусты:
Отлично! Мы можем дать команду, которая запустится в копии этого окружения, и она может быть даже sudo rm -rf / , но нас это не будет волновать, а никто другой не пострадает.
Pivot root
Имея наш новый mount namespace и копию системных файлов, мы хотели бы смонтировать эти файлы в корневом каталоге нового mount namespace не выбивая землю из под наших ног. Linux предлагает нам системный вызов pivot_root (есть соответствующая команда), который позволяет нам контролировать то, что именно процессы видят как корневую файловую систему.
Команда принимает два аргумента: pivot_root new_root put_old , где new_root — это путь к файловой системе, будущей вскоре корневой файловой системой, а put_old — путь к каталогу. Это работает так:
- Монтирование корневой файловой системы вызывающего процесса в put_old .
- Монтирование new_root в качестве корневой файловой системы в / .
Давайте посмотрим на это в действии. В нашем новом mount namespace мы начинаем с создания файловой системы из наших файлов alpine:
Затем мы делаем pivot root:
Наконец, мы размонтируем старую файловую систему из put_old , так что вложенный шелл не сможет получить к ней доступ.
При этом мы можем запускать любую команду в нашем шелле, и она будут работать с использованием нашей специфичной корневой файловой системы alpine, пребывая в неведении об инструментарии, что привел к её запуску. И наши драгоценные файлы в старой файловой системе находятся вне пределов досягаемости.
Реализация
Мы можем повторить в коде то, что делали выше, заменив команду pivot_root соответствующим системным вызовом. Сначала мы создаем наш команды процесс в новом mount namespace, добавляя флаг CLONE_NEWNS для clone .
Затем мы создаём функцию prepare_mntns которая, получив путь до каталога, содержащего системные файлы ( rootfs ), настраивает текущий mount namespace посредством pivoting'а корневого каталога текущего процесса на rootfs , что мы создали ранее.
Нам нужно вызвать эту функцию из нашего кода и это должно быть выполнено нашим командным процессом в cmd_exec (поскольку он работает в новом mount namespace) до фактического начала выполнения команды.
Давайте попробуем это:
Этот вывод показывает что-то странное: мы не можем проверить список монтирования, за который так тяжело боролись, и ps говорит нам, что нет процессов, запущенных в системе (нет даже текущего процесса или самого ps ?). Более вероятно, что мы что-то сломали при настройке mount namespace.
PID Namespaces
Мы уже несколько раз упоминали каталог /proc в этой серии постов, и если вы были знакомы с ним, то, вероятно, не будете удивлены тому, что вывод ps оказался пустым, поскольку мы видели ранее, что каталог был пуст в этом mount namespace (когда мы получили его из корневой файловой системы alpine).
Каталог /proc в Linux обычно используется для доступа к специальной файловой системе (называемой файловой системой proc), которой управляет сам Linux. Linux использует его для предоставления информации обо всех процессах, запущенных в системе, а также другой системной информации, касающейся устройств, прерываний и так далее. Всякий раз, когда мы запускаем такую команду, как ps , выдающую сведения о процессах в системе, она обращается к этой файловой системе для получения информации.
Другими словами, нам нужно завести файловую систему proc . К счастью, в основном для это потребуется лишь сообщить Linux, что она нам нужна, причем желательно смонтированная в /proc. Но пока мы не можем этого сделать, поскольку наш командный процесс всё ещё зависит от той же файловой системы proc , что и isolate и любой другой обычный процесс в системе. Чтобы избавиться от этой зависимости, нам нужно запустить его внутри собственного PID namespace.
PID namespace изолирует ID процессов в системе. Одним из следствий тут является то, что выполняющиеся в разных пространствах имён PID процессы могут иметь одинаковые идентификаторы процесса, не конфликтуя друг с другом. Допусти, мы изолируем это пространство имён потому, что мы хотим обеспечить как можно большую изолированность нашей запущенной команде. Однако более интересная причина, по которой мы рассматриваем это здесь, заключается в том, что монтирование файловой системы proc требует привилегий пользователя root, а текущий PID namespace принадлежит пользователю root, где у нас нет достаточных привилегий (если вы помните из предыдущего поста, root у командного процесса на самом деле не root). Итак, мы должны работать в PID namespace, владельцем которого является пользователь пространства имён, которое считает наш командный процесс запущенным от root.
Мы можем создать новый PID namespace, передав CLONE_NEWPID для clone :
Затем мы добавляем функцию prepare_procfs , которая настраивает файловую систему proc, монтируя её в текущих пространствах имён mount и pid.
Наконец, мы вызываем функцию прямо перед размонтированием put_old в нашей функции prepare_mntns , после того, как мы настроили mount namespace и перешли в корневой каталог.
Мы можем воспользоваться isolate для очередного запуска:
Это выглядит намного лучше! Шелл считает себя единственным процессом, запущенным в системе и работающем с PID 1(поскольку это был первый процесс, запущенный в этом новом PID namespace)
В этом посте были рассмотрены два пространства имён и isoated получил в итоге две новые фичи. В следующем посте мы посмотрим на изолирование в пространствах имён Network . Там нам придётся иметь дело с некоторой сложной низкоуровневой сетевой конфигурацией, чтобы попытаться включить сетевое взаимодействие между процессами в разных пространствах имён network.
Создание корневой файловой системы.
Обзор.
Корневая файловая система должна содержать все необходимое для поддержки полной 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 -блочного файла можно использовать команду:
После того, как вы выбрали один из этих вариантов, подготовьте DEVICE :
Эта команда обнуляет устройство.
Так что Ваша команда выглядит так:
( Если вы используете петлевое устройство, вместо DEVICE должно быть подставлено имя используемого файла на диске.)
Команда mke2fs автоматически обнаружит доступное пространство и соответственно сконфигурируется. Параметр `` -m═0 '' предотвращает от резервирования пространства для root, и, таким образом, обеспечивает больше используемого пространства на диске.
Затем, примонтируйте устройство: ( Если каталог монтирования /mnt не существует - Вы должны создать его.) В следующих секциях, все имена каталогов назначения полагаются относительно /mnt .
Заполнение файловой системы.
Существует разумный минимальный набор каталогов для вашей корневой файловой системы: [1] :
/dev -- Устройства, требуемые для ввода/вывода
/proc -- каталог-заглушка, необходимый для файловой системы proc
/etc -- системные конфигурационные файлы
/sbin -- критичные системные исполняемые файлы
/bin -- необходимые исполняемые файлы, часть предполагаемой системы
/lib -- общие библиотеки, для обеспечения средств динамической поддержки (run-time)
/mnt -- точка монтирования для поддержки других дисков
/usr -- дополнительные утилиты и приложения
Три из этих каталогов должны быть пусты на корневой файловой системе, т.о. они должны быть просто созданы командой mkdir . Каталог /proc - просто заглушка, в которой размещается файловая система proc. Каталоги /mnt и /usr - всего лишь точки монтирования для использования после того, как загрузочная/корневая система будет запущена. Следовательно, эти каталоги должны быть только созданы.
Оставшиеся четыре каталога описаны в следующих секциях.
Каталог /dev содержит специальные файлы для всех устройств, которые обязательно используются в любой Linux системе. Сам каталог - обычный каталог, и может быть создан mkdir обычным способом. Однако специальные файлы устройств, должны быть созданы особым образом, используя команду mknod .
Если Вы хотите пойти трудным путем, используйте ls -l , для вывода старших(major) и младших (minor) чисел нужных вам устройств, и создайте их на дискете, используя mknod .
Как только устройства скопированы, проверьте, что все необходимые специальные устройства помещены на спасательную дискету. Например, если Вы предполагаете с загрузочной дискеты обращаться к вашим ленточным устройствам. Вам надо скопировать все файлы ленточных устройств ftape .
Обратите внимание, что для каждого файла устройства требуется один inode, и inode может быть дефицитным ресурсом, особенно для файловой системы дискеты. Вам следует быть переборчивым при копировании файлов устройств. Например, если у Вас нет SCSI дисков, Вы можете с уверенностью игнорировать /dev/sd* ; если Вы не предполагаете использовать последовательный порт, вы может игнорировать /dev/ttyS* .
Если при копировании файлов вы получаете ошибку No space left on device , а df показывает что свободное место все еще есть, возможно, вы исчерпали inodes. Использование inodes вам покажет df -i
Каталог /etc содержит конфигурационные файлы. Его предполагаемое содержимое зависит от состава предполагаемых к использованию программ. На большинстве систем, они могут быть разделены на три группы:
Требуемые всегда, такие как rc , fstab , passwd .
Которые могут потребоваться, но не обязательно.
На моих корневых дискетах я ограничился 15 конфигурационными файлами. Можно уменьшить мою работу, разделив их на три набора файлов:
Те, которые я должен сконфигурировать для загрузочной/корневой системы:
rc.d/* -- скрипты запуска системы и изменения уровня выполнения
fstab -- список монтируемых файловых систем
inittab -- параметры init процесса, - первого запускаемого во время начальной загрузки процесса.
gettydefs -- параметры для процесса init , первого запускаемого при загрузке процесса.
Те, которые я должен привести в порядок для загрузочной системы:
passwd -- список необходимых пользователей, домашних каталогов, и т.д.
termcap -- база данных возможностей терминалов.
Если безопасность важна, passwd , и shadow должны быть урезаны, чтобы избежать копирования паролей пользователей вне системы, и, таким образом, при загрузке с дискеты нежелательные входы в систему будут отвергаться.
termcap , база данных терминалов, обычно несколько сотен килобайт. Версия этого файла на вашей загрузочной дискете должна быть урезана, чтобы содержать параметры только используемого Вами терминала(ов), обычно это всего лишь элемент linux или linux-console .
Остальные. В данный момент они работают, так что я их оставлю.
Помимо этого, мне остается сконфигурировать всего лишь два файла, и их содержимое удивительно невелико.
fstab должен содержать, по крайней мере: Вы можете скопировать элементы из вашего существующего fstab , но Вам не следует автоматически монтировать все разделы вашего жесткого диска; используйте для них ключевое слово noauto . Когда используется загрузочная дискета, Ваш жесткий диск может быть поврежден или мертв.
Ваш inittab должен быть изменен так, чтобы строка sysinit выполняла rc , или любой другой основной сценарий начальной загрузки, который будет использоваться. Также, если Вы хотите запретить пользователям входить в систему по последовательным портам, закомментируйте все записи для getty , которые в конце строки содержат устройства ttys или ttyS . Оставьте порты tty , чтобы Вы могли входить в систему с консоли.
Обратите внимание, что некоторые программы не могут быть размещены в другом месте, так как другие программы жестко связаны с их расположением. Например, в моей системе, /etc/shutdown жестко связан с /etc/reboot . Если я перемещу reboot в /bin/reboot , и затем подам команду shutdown , она не выполнится, так как не сможет найти файл reboot .
Большинство теперешних систем использует каталог /etc/rc.d/ , содержащий сценарии оболочки для различных уровней выполнения. Минимум - одиночный rc скрипт, но может быть проще скопировать из вашей существующей системы inittab и каталог /etc/rc.d , и сократить сценарии оболочки в каталоге rc.d , для удаления всего, не относящегося к окружению системной дискеты.
/bin и /sbin
В этом случае Вам нужна libc-2.1.1.so . Чтобы найти другие библиотеки, Вы должны пройтись по всем исполняемым файлам, которые Вы планируете включить, и командой ldd проверить их зависимости. Например: Каждый файл справа - нужен. Имейте в виду, что перечисленные библиотеки могут быть символическими ссылками.
Обеспечение PAM и NSS.
Ваша система может требовать динамически загружаемые библиотеки, которые не видны ldd . Если вы их не предусмотрите, у Вас могут возникнуть проблемы при входе в систему или использовании вашего загрузочного диска.
PAM (Pluggable Authentication Modules)
Если ваша система использует PAM (Pluggable Authentication Modules), Вы должны это предусмотреть в вашем загрузочном диске. PAM - изощренный модульный метод идентификации пользователей и управления их доступом к службам. Простой способ проверки того, использует ли ваша система PAM, состоит в запуске ldd для исполняемого файла login . Если выдаваемая информация включает libpam.so - вам нужен PAM.
К счастью, безопасность не имеет значения для загрузочных дисков, т.к. если кто-либо имеет физический доступ к машине, он может сделать все, что захочет. Следовательно, вы можете фактически запретить PAM, создав в вашей корневой файловой системе простой файл /etc/pam.conf , который выглядит примерно так: Также скопируйте в вашу корневую файловую систему файл /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 , который выглядит так: Это указывает, что каждая служба будет использовать только локальные файлы. Также Вы должны включить /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 .
Некоторые заключительные подробности.
Перенос.
Представленная здесь структура каталогов - только для использования в корневой дискете. Реальные Linux системы имеют более полный и четкий набор правил размещения файлов, называемый Стандарт Файловой Иерархии (File Hierarchy Standard).
Если вы работаете с Windows , структура файловой системы Linux может показаться особенно чуждой. Диск C:\ и буквы диска исчезли, их заменили каталоги / и загадочно звучащие каталоги, большинство из которых имеют трехбуквенные имена.
Стандарт иерархии файловой системы ( FHS - Filesystem Hierarchy Standard ) определяет структуру файловых систем в Linux и других UNIX-подобных операционных системах. Однако файловые системы Linux также содержат некоторые каталоги, которые еще не определены стандартом.
Обратите внимание, что мы не говорим здесь о файловой системе, которая является техническим шаблоном, используемым для хранения данных на диске. Структура каталогов, которую мы рассмотрим, применима к большинству дистрибутивов Linux независимо от того, какую файловую систему они используют.
Типы содержимого
Это основные типы контента, хранящегося в файловой системе Linux.
- Постоянный (Persistent) - это содержимое, которое должно быть постоянным после перезагрузки, например, параметры конфигурации системы и приложений.
- Время выполнения (Runtime) - контент, созданный запущенным процессом, обычно удаляется перезагрузкой
- Переменный/динамический (Variable/Dynamic) - это содержимое может быть добавлено или изменено процессами, запущенными в системе Linux.
- Статический контент (Static) - остается неизменным до тех пор, пока не будет явно отредактирован или перенастроен.
/ - Корневой каталог (root)
Все в вашей системе Linux находится в каталоге / , известном как root или корневой каталог. Вы можете думать о каталоге / как о каталоге C:\ в Windows, но это не совсем так, поскольку в Linux нет букв дисков. В то время как другой раздел будет расположен вD:\ в Windows, этот другой раздел появится в другой папке в / в Linux. Если вы посмотрите на структуру каталогов, вы поймете, что она похожа на корень дерева.
Поскольку все остальные каталоги или файлы происходят от корня, абсолютный путь к любому файлу проходит через корень. Например, если у вас есть файл в /home/user/documents , вы можете догадаться, что структура каталогов идет как root -> home -> user -> documents .
/bin - Основные пользовательские двоичные файлы
Каталог /bin содержит основные пользовательские двоичные файлы (программы), которые должны присутствовать при монтировании системы в однопользовательском режиме.
Приложения, например такие как браузер Firefox, хранятся в /usr/bin , а важные системные программы и утилиты, такие как оболочка bash , находятся в /bin . Каталог /usr может храниться в другом разделе - размещение этих файлов в каталоге /bin гарантирует, что в системе будут эти важные утилиты, даже если другие файловые системы не смонтированы.
/bin непосредственно содержит исполняемые файлы многих основных команд оболочки, таких как ps , ls , ping , grep , cp .
Каталог /sbin аналогичен - он содержит важные двоичные файлы системного администрирования. /sbin содержит iptables , reboot , fdisk , ifconfig , swapon
/boot - Статические загрузочные файлы
Каталог /boot содержит файлы, необходимые для загрузки системы - например, здесь хранятся файлы загрузчика GRUB и ваши ядра Linux. Однако файлы конфигурации загрузчика не находятся здесь - они находятся в /etc вместе с другими файлами конфигурации.
/cdrom - Точка монтирования для компакт-дисков
Каталог /cdrom не является частью стандарта FHS , но вы все равно найдете его в Ubuntu и других операционных системах. Это временное место для компакт-дисков, вставленных в систему. Однако стандартное расположение временных носителей находится в каталоге /media .
/dev - Файлы устройства
Linux представляет устройства в виде файлов, а каталог /dev содержит ряд специальных файлов, представляющих устройства. Это не настоящие файлы в том виде, в каком мы их знаем, но они отображаются как файлы - например, /dev/sda представляет собой первый диск SATA в системе. Второй диск будет называться /dev/sdb . Если вы хотите его разбить, вы можете запустить редактор разделов и указать ему отредактировать /dev/sda . В итоге получим что первым разделом этого диска будет /dev/sda1 , а вторым - /dev/sda2 .
Этот каталог также содержит псевдоустройства, которые представляют собой виртуальные устройства, которые на самом деле не соответствуют оборудованию. Например, /dev/random производит случайные числа. /dev/null - это специальное устройство, которое не производит вывода и автоматически отбрасывает весь ввод - когда вы перенаправляете вывод команды на /dev/null , вы отбрасываете его.
/etc - Файлы конфигурации
Каталог /etc содержит файлы конфигурации, которые обычно можно редактировать вручную в текстовом редакторе. Обратите внимание, что каталог /etc/ содержит общесистемные файлы конфигурации (например имя хоста) - пользовательские файлы конфигурации находятся в домашнем каталоге каждого пользователя.
/home - Домашние папки
Каталог /home содержит домашнюю папку для каждого пользователя. Например, если ваше имя пользователя - bob, у вас есть домашняя папка, расположенная в /home/bob . Эта домашняя папка содержит файлы данных пользователя и пользовательские файлы конфигурации. Каждый пользователь имеет право записи только в свою домашнюю папку и должен получить повышенные права (стать пользователем root ) для изменения других файлов в системе.
/lib - Основные общие библиотеки
Каталог /lib содержит библиотеки, необходимые для основных двоичных файлов в папке /bin и /sbin . Библиотеки, необходимые для двоичных файлов в папке /usr/bin , находятся в /usr/lib .
Имена файлов библиотеки: ld* или lib*.so.* .
Поскольку вы, вероятно, используете 64-битную операционную систему, то у вас есть пара каталогов: /lib , /lib32 и /lib64 . Те библиотеки, которые не содержат кода, специфичного для версии процессора, находятся в папке /lib . Те, которые зависят от версии, находятся в каталогах /lib32 (32-бит) или /lib64 (64-бит), в зависимости от ситуации.
/lost+found - Восстановленные файлы
В каждой файловой системе Linux есть каталог /lost+found . В случае сбоя файловой системы проверка файловой системы будет выполнена при следующей загрузке. Любые найденные поврежденные файлы будут помещены в каталог lost+found , чтобы вы могли попытаться восстановить как можно больше данных.
/media - Съемный носитель
Каталог /media содержит подкаталоги, в которых монтируются съемные носители, вставленные в компьютер. Например, когда вы вставляете компакт-диск в свою систему Linux, внутри каталога /media автоматически создается каталог. Вы можете получить доступ к содержимому компакт-диска внутри этого каталога.
Например, /media/cdrom для CD-ROM (если он не расположен в корне), /media/floppy для дисководов гибких дисков, /media/cdrecorder для рекордера компакт-дисков
/mnt - Временные точки монтирования
Исторически сложилось так, что каталог /mnt - это то место, где системные администраторы монтируют временные файловые системы во время их использования. Например, если вы монтируете раздел Windows для выполнения некоторых операций по восстановлению файлов, вы можете подключить его в /mnt/windows . Однако вы можете монтировать другие файловые системы в любом месте системы.
/opt - Дополнительные пакеты
Каталог /opt содержит подкаталоги для дополнительных пакетов программного обеспечения. Он обычно используется проприетарным программным обеспечением, которое не подчиняется стандартной иерархии файловой системы - например, проприетарная программа может выгружать свои файлы в /opt/application при ее установке.
/proc - Файлы ядра и процессов
Каталог /proc похож на каталог /dev , потому что он не содержит стандартных файлов. Он содержит специальные файлы, которые представляют информацию о системе и процессе.
Это псевдофайловая система, содержащая информацию о запущенном процессе. Например: каталог /proc/ содержит информацию о процессе с этим конкретным pid . Также тут можно получить текстовую информацию о системных ресурсах. Например узнать аптайм /proc/uptime , проверить информацию о процессоре /proc/cpuinfo или проверить использование памяти вашей системой Linux /proc/meminfo .
Читайте также: