LXF95:Тур по файловой системе Linux

Материал из Linuxformat.

Версия от 08:46, 16 декабря 2008; Crazy Rebel (Обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Содержание

Большое Linux-турне по файловой системе

Заблудились в файловой системе Linux? Отчаялись понять, в чем тут смысл? Д-р Крис Браун прописывает вам путешествие по файловой системе.

«Привет! Добро пожаловать в путешествие по файловой системе Linux. Меня зовут Ман Страницын, и на сегодня я ваш гид. Я и мой водитель автобуса, Хал Д., рады видеть вас на борту. Пара предупреждений, прежде чем мы отправимся: пожалуйста, ни в коем случае не высовывайте руки из автобуса и не удаляйте ничего, что бы ни встретилось на пути, не будучи полностью уверены в том, что делаете. Итак, отправляемся.

Рис. 1

Основные пункты экскурсии по файловой системе

Мы начинаем нашу экскурсию с корневого каталога, и, я полагаю, вы можете сказать, что отсюда, хм, много чего видно, так как это самый верхний уровень иерархии каталогов. (Дико извиняюсь, остроты сочинял не я: я лишь читаю вслух сценарий.) Любопытно, что корневой каталог, в отличие от прочих каталогов, безымянен. Вам могут сказать, что его имя – /, но это не так. Просто, записывая абсолютный путь, мы начинаем его с /, а в случае корневого каталога тут писать нечего.

Слева по ходу вы заметите каталог с именем /root. Не перепутайте: это не корневой каталог, а просто каталог с именем root [root – англ. корень, прим. пер.]. Вообще-то, это частная территория системного администратора, она же – домашний каталог суперпользователя. Мой дядя, системный администратор ОС Solaris, вечно ноет, что у него нет собственного домашнего каталога: его домашний каталог /, и он его ненавидит. А вам понравилось бы развешивать белье на главной городской площади? Можем мы осмотреть /root, Хал? Ой, похоже, что нет – полковник Линукс говорит «нет». Что ж, за спрос денег не берут, но /root – один из немногих каталогов, просмотр которых обычным пользователям запрещен. Вообще говоря, политика доступа в Linux – «смотри, но не лапай». Единственное исключение – домашние каталоги пользователей: там они могут вытворять все, что угодно.

Кстати, о полковнике Линуксе – наша следующая остановка называется /boot, место, где он живет, так что приготовьте фотоаппараты или кнопки Print Screen. Здесь находится файл с именем, похожим на vmlinuz-2.6.19, это (сжатый) образ ядра Linux. При загрузке Linux, загрузчик (обычно Grub) помещает этот файл в память и запускает его. Вы также можете заметить файл с именем типа initrd-2.6.19.img, являющийся образом стартового RAM-диска. Он содержит модули ядра, необходимые во время загрузки, до того, как будет получен доступ к самой файловой системе. Не удаляйте эти файлы, ребята, не то вы не сможете загрузиться, а я стану безработным.

А, ребята на задней площадке заметили каталог с именем lost+found. Молодцы! Вы увидите этот каталог на верхнем уровне любого раздела, содержащего файловую систему ext2 или ext3. Зачем он? Вы, небось, подумали, что это место встречи для отбившихся от BSD, ха-ха, но он нужен программе под названием fsck, проверяющей целостность файловой системы. Если fsck находит целый на вид файл, не имеющий имени, то создает запись для него в lost+found. Если честно, теперь это случается крайне редко, так что, скорее всего, lost+found просто пуст. Можете без проблем оставить его в покое.

Город настроек

Про FHS

На сайте http://www.pathname.com/fhs есть документ под названием Filesystem Hierarchy Standard (FHS) [Стандарт иерархии файловой системы]. Это не официальный документ стандартов (он слишком короток, слишком неформален и слишком легко читается, чтобы под ним подписались ANSI, IEC или ISO!), но это наиболее полное описание того, где что должно располагаться в файловой системе Unix/Linux и почему.

Ну вот, справа от вас вы можете видеть каталог, названный etc. Полагают, что исторически это имя произошло от ‘et cetera’ (в переводе, «и прочее»): туда помещалось все, что нигде больше не удалось пристроить. Мы закидывали в него что попало, но теперь он стал пристанищем большого числа конфигурационных файлов системы и скриптов. Некоторые из этих файлов критичны; например, /etc/passwd содержит информацию обо всех локальных учетных записях (включая root). Вы также можете заметить здесь /etc/inittab, который сообщает init, что делать (init – очень важная программа: при загрузке Linux только она одна автоматически выполняется ядром и отвечает за запуск всех остальных служб, включая службы входа).

Не менее важен и /etc/fstab, говорящий о том, какие еще файловые системы должны быть смонтированы. Вам лучше не шутить с ними, если вы не знаете что делаете; ошибки в этих файлах могут привести к невозможности загрузки или входа в систему. В /etc вы найдете файлы конфигурации для различных служб сети – это /etc/xinetd.conf, содержащий настройки xinetd, и /etc/syslog.conf, настраивающий syslog. Все эти файлы, кстати, хранятся в обычном текстовом формате, и именно поэтому единственный инструмент, необходимый для настройки Linux – это текстовый редактор. Мой любимый редактор Vi, но Хал говорит, что я и вообще по жизни чудик.

Поскольку /etc справа мы осмотрели, то посмотрим на /home слева. Это наш жилой район. Внутри него находятся дома-каталоги отдельных пользователей. Например, домашний каталог Хала – /home/hal (правда, Хал?). Население тут весьма умное, но все зависит от соседей. Некоторые валят все в одну директорию, другие организуют для своих файлов многоуровневые каталоги с говорящими именами. По умолчанию, внутри /home даются права просматривать, но не изменять, файлы других пользователей. Естественно, пользователи могут и запретить просмотр своих файлов. У юного Тома есть каталог с именем /home/tom/photos, доступ к которому имеет только он. Том, мы спим и видим узнать, что ты там прячешь...

Каталог /mnt Хал хочет проскочить побыстрее. Боюсь, ребята, что здесь интересного мало – лишь пустые каталоги для временно монтируемых файловых систем. Сразу после /mnt мы перемещаемся в /media, он содержит подкаталоги, используемые как точки монтирования для съемных устройств типа дискет и CD-ROM. Молодежь, кто помнит, что такое дискета? Короче, идея в том, что система горячего подключения на лету автоматически монтирует носители сюда, стоит только их вставить.

Мы исключили осмотр этого места из экскурсии после происшествия в прошлом месяце, когда Хал повел автобус в /media/cdrom просто чтобы доказать, что он пуст. Затем кто-то вставил CD, демон горячего подключения проснулся, и вдруг перед нами появилась иерархия диска с отпускными фотографиями. Это, скажу я вам, был полный шок.

Виртуальная часть экскурсии

Так, каталог, в который мы направляемся, /proc, действительно интересен, потому что на самом деле не существует. Все файлы в нем – игра воображения ядра: они не соответствуют никакой информации, реально расположенной на диске. Полковник Линукс на прошлой неделе объяснил мне, что эти внутренние структуры данных помогают следить за такими вещами, как использование памяти, и хранить информацию о каждом процессе, типа переменных окружения. В старые времена команды вроде ps (отображающая информацию о запущенных процессах) вылавливали свою добычу в образе памяти ядра. Полковника это в восторг не приводило: он говорит, что это смахивало на вскрытие живого пациента. Поэтому он пришел к мысли сделать эту информацию доступной в виде набора файлов. Таким образом, программа может разжиться необходимой информацией, просто открыв и прочитав эти воображаемые файлы – так же, как любой другой файл.

Урок истории

Имя ‘tty’ когда-то означало ‘teletype’. Телетайп – это механическое печатающее устройство с клавиатурой типа печатной машинки. В частности, одна модель, ASR33, была чрезвычайно популярна на мини-компьютерах в 1970-х, когда даже полковник Юникс был еще лейтенантом, а полковник Линукс был лишь искоркой в глазах своего родителя. Телетайп давно исчез, а имя прилипло. Сейчас tty – символьный экран любого типа.

Хал заедет в /proc, и мы там оглядимся. Вы можете вообразить, что с /proc что-то неладно: ведь если выполнить здесь ls -l, то большинство файлов будет иметь нулевой размер; но если просмотреть их содержимое при помощи cat или less, то они не пусты!

Я уже говорил, что так называемые местные файлы показывают нам содержимое внутренних структур данных ядра в виде простого текста. Например, файл cmdline покажет нам параметры, с которыми загрузилось ядро. Файл cpuinfo покажет, что знает ядро о центральном процессоре (или процессорах), на котором оно запущено. Файл meminfo расскажет нам о системе виртуальной памяти столько, сколько нам и знать-то не надо. И так далее.

Пардон, мадам, не сядете ли вы на место? Хал собирается выполнить крутой разворот, чтобы показать вам кол лекцию каталогов с именами типа 3412. Эти имена соответствуют ID процессов, а их каталоги содержат еще больше виртуальных файлов, которые обеспечивают доступ к информации о каждом процессе. Вообще-то по ним имеется документация (для справки наберите man 5 proc'), но большая часть информации столь низкого уровня, что будет малопонятна среднему туристу. В большинстве случаев лучше использовать программы типа top и ps, которые покажут вам информацию о процессах в более удобной форме.

По большей части, мы воспринимаем /proc как файловую систему только для чтения, но на самом деле в /proc/sys имеется несколько «файлов», содержащих различные параметры подстройки ядра, которые вы можете изменить, просто вписав их туда. Например, можно уменьшить параметр под названием TCP FIN TIMEOUT с 60 до 50 следующим образом:

# cd /proc/sys/inet/ipv4
# cat tcp_fin_timeout 60
# echo 50 > tcp_fin_timeout
# cat tcp_fin_timeout 50

Ну-ка, поднимите руки те, кто понятия не имеет, что такое TCP FIN TIMEOUT и зачем его менять. Вижу: большинство. Так я и думал. Для 99% из нас лучше всего даже не притрагиваться к нему.

От /proc мы спустимся по улице к /sys. Это еще одна из «виртуальных» файловых систем. Она была добавлена в ядро 2.6, чтобы упростить коду уровня ядра, например, драйверам устройств, обмен данными с программами пространства пользователя. Иерархия /sys позволяет вам увидеть состояние устройств (шины, устройства и так далее), обнаруженных ядром, и если только вы не переписываете, скажем, подсистему горячего подключения, советую полностью ее проигнорировать. Вся документация есть в книге “/proc et /sys”, написанной Оливье Доделем [Olivier Daudel] и опубликованной издательством O’Reilly... по-французски.

Остановка по требованию

Теперь мы собираемся посетить /dev. «Dev» – это сокращение от «devices» [устройства], и здесь живут странные создания. Они ведут себя не как обычные файлы. Если вы выполните здесь ls -l и внимательно посмотрите, то увидите в строке первый символ ‘b’ или ‘c’. ‘b’ – это так называемые блочные устройства, то есть устройства с блочной структурой и произвольным доступом – обычно это разделы жесткого диска. Например, вот этот малютка, /dev/hda1 – первый раздел жесткого диска, он является блочным устройством. В данной системе hda1 – корневой раздел (на вашей машине может быть по-другому, в зависимости от того, как вы устанавливали систему); собственно говоря, все что мы посетили до этого, расположено в разделе, представленном этим малышом, так что он сильно занят. Как только вы нажмете Выключить компьютер, он отправится в ванну – затем какао, и спать.

Слева вы можете видеть большое скопление так называемых tty-устройств (привет, ребята!). Это символьные устройства, представляющие собой символьные терминалы. Например, Linux обычно настроен на поддержку шести виртуальных терминалов. Из вашего графического рабочего стола вы можете перейти к ним при помощи комбинации клавиш от Ctrl+Alt+F1 до Ctrl+Alt+F6 (и вернуться на рабочий стол при помощи Ctrl+Alt+F7). Все шесть виртуальных терминалов являются устройствами, от /dev/tty1 до /dev/tty6.

Двигаемся дальше: прямо по курсу, в этой мрачной пещере, живет очень странный парень по имени /dev/null. Подобравшись поближе, мы сможем увидеть надпись над входом: «Оставь надежду всяк сюда входящий». Мы видели тех, кто входил сюда, но никто не вернулся обратно. Некоторые называют его черной дырой и используют для выбрасывания в него ненужного вывода программ. Э, кажется, мы слишком близко подъехали ко входу, Хал. Не въезжай туда… ты никогда уже... не въезжай туда, Хал! Заворачивай!

Фу, чуть не попали...

Городские задворки

Изучаем корневой раздел

Одним из принципов организации файловой системы является возможность ее рационального размещения на нескольких разделах диска (или нескольких дисках), и возможность совместного использования ее частей несколькими машинами.

Ключевым здесь является понятие корневого раздела. Во время загрузки Linux ядро подключает к себе отдельный раздел файловой системы – он и называется «корневым». Любые другие разделы, которые необходимо подключить, монтируются командой mount, обычно в соответствии с записями в файле /etc/fstab. Поскольку на ранних стадиях загрузки доступна только корневая файловая система, она должна содержать все необходимое для функционирования Linux и присоединения других частей файловой системы. В инструменты корневого раздела входят: программа init (запускающая все остальные процессы), оболочка, mount и файл /etc/fstab. Стандарт иерархии файловых систем указывает количество каталогов, которые должны находиться в корневом разделе.

Что ж, после всех этих виртуальностей вы, я уверен, хотите вновь увидеть какие-нибудь реальные файлы, и их много в том месте, которое я называю промзоной, состоящем из двух каталогов /bin и /sbin. Под bin подразумевается «binary» [двоичный]: большинство здешних файлов являются исполняемыми. Почему каталогов два? Ну, смысл в том, что запускаемое обычным пользователем, типа Vi и tar, rm и date, помещается в /bin, а то, что может запустить только суперпользователь-администратор, расположено в /sbin. Можете считать, что «s» в /sbin происходит от ‘system’ – или, возможно, ‘super-user’. Например, ifconfig (установка параметров сетевой карты) и iptables (определение правил брандмауэра) находятся в /sbin, потому что только суперпользователь имеет на них право. В большинстве дистрибутивов Linux /bin включается в пути поиска для обычного пользователя, а /sbin нет. Ясное дело, обычный пользователь может легко получить доступ к этим командам, набрав полный путь типа /sbin/iptables, но нормальной работы у него не выйдет, поскольку большинство из них и пальцем не шевельнут, если вы не супер!

Важный уголок нашей промышленной зоны называется /lib. Вообще-то это целый угол. «Lib» происходит от «library» [библио- тека], и здешние файлы являются совместно используемыми библиотеками, необходимыми системным программам в /bin и /sbin. (Если вы пришли из мира Windows, то знае те их как DLL.) Критически важная библиотека, которая используется практически везде – это стандартная библиотека С, libc.so. Если вы удалите этот файл, то почти все остановится.

Осмотром промзоны экскурсия завершается; предлагаю по-быстрому заглянуть в очень важный каталог /usr. Я должен предупредить вас, что обычно /usr находится на другом разделе, так что вы можете ощутить легкий толчок при пересечении точки монтирования. Хал, сбрось, пожалуйста, газ!

Оглядевшись в /usr, мы увидим каталоги, на вид дублирующие некоторые из корневого раздела: в частности, /usr/bin, /usr/sbin и /usr/lib. И верно, они содержат элементы того же типа, которые мы уже видели в /bin, /sbin и /lib: а именно, /usr/bin содержит пользовательские команды, /usr/sbin содержит команды системного администратора, а /usr/lib – библиотеки. Так почему же эти элементы рассованы по двум различным наборам каталогов? Ответ – в действиях по выделению разделов. Элементы /usr часто расположены на отдельном разделе, который не подключается к файловой системе практически до последних стадий процесса загрузки. Действительно критичные компоненты, используемые на ранних стадиях загрузки, должны располагаться в корневом разделе, а не в /usr.

Распределение элементов таким способом также минимизирует те части файловой системы, которые не должны затрагиваться при однопользовательской загрузке. Элементы из /bin, /sbin и /lib необходимы, а из /usr – нет. Можно также смонтировать /usr в файловую систему в режиме «только для чтения», для большей безопасности, а в сети совместно использовать /usr с одного файл-сервера, по крайней мере для машин с общей аппаратной архитектурой.

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

$ du -sh /bin /sbin /lib /usr/bin /usr/sbin /usr/lib
 4.9M /bin
 6.3M /sbin
 109M /lib
 92M /usr/bin
 5.7M /usr/sbin
 625M /usr/lib

Цифры, которые вы увидите в своей системе, конечно же, будут другими, но смысл будет тем же: большая часть элементов расположена в /usr, а корневой раздел сравнительно невелик.

Есть еще несколько каталогов вроде /var, /tmp и /opt, которые мы не посетили, но я должен вернуть вас вовремя, чтоб вы успели ухватить несколько больших загрузок с FTP-зеркала, так что мы возвращаемся в корневой каталог, откуда начали, и завершаем нашу экскурсию. Будьте осторожны, выходя из автобуса. Надеемся, вы проведете несколько минут в нашей сувенирной лавке, где сможете купить брелки для открытых ключей с пластмассовым Туксом и открытки, говорящие «Я выполнил ls -R в /proc и выжил!». До свидания!» LXF

Флора и фауна файловых систем

Имеется семь типов «существ», живущих в файловой системе. Когда вы выводите длинный список каталогов (ls -l), первый символ каждой строки говорит о типе данного элемента. Они показаны в первом столбце таблицы. Мы также выполнили подсчет популяции каждого типа в системе Ubuntu; эти значения приведены во втором столбце. Понятно, что, как выражаются продавцы автомобилей, «расход бензина на километр имеет индивидуальные отличия».

Тип Численность Описание
- 102,314 Обычный файл. Наиболее распространенный тип.
d 14,701 Каталог. Каталог – это контейнер для других элементов. Некоторые называют их папками.
l 15,258 Символьная ссылка. Это крошечные файлы, содержащие имя какого-то другого файла, вроде ярлыков в Windows. Поэтому, если, например, у меня есть символьная ссылка /etc/motd на /var/run/motd, и программа открывает /etc/motd, то ядро говорит: «Ага, это символьная ссылка. Он хотел сказать не /etc/motd, а /var/run/motd», и открывает последний. Символьные ссылки иногда называют «симлинками» (symlinks) или гибкими ссылками.
c 785 Так называемое символьное устройство (иногда также называемое raw-устройством или специальным символьным файлом). Этот элемент служит для именования устройств. Нечто вроде /dev/console соответствует реальному физическому устройству. Другие соответствуют псевдоустройствам; например, /dev/random предоставляет доступ к генератору случайных чисел ядра.
b 65 Блочное устройство. Блочные устройства – это обычно диски: скажем, /dev/hda2 – это второй раздел первого жесткого диска IDE. Вообще говоря, символьные устройства поддерживают чтение и запись последовательного потока байтов, а блочные устройства поддерживают произвольный доступ. Реальное отличие, однако, заключается в том, что ядро предоставляет блочным устройствам буферный слой, чтобы они могли читать и писать целыми блоками. Для символьных устройств этого не делается. Практически все файлы устройств обитают в /dev.
s 34 Сокеты Unix-домена. Они называются «конечными точками связи в файловой системе» и используются почти так же, как TCP- и UDP-сокеты, за исключением того, что они поддерживают лишь межпроцессное взаимодействие для запущенных процессов на той же машине.
p 7 Именованный канал. Они так редки, что их следует занести в красную книгу! Подобно сокетам Unix-доменов, это именованные конечные точки, используемые для межпроцессного взаимодействия.
Личные инструменты
  • Купить электронную версию
  • Подписаться на бумажную версию