Глава 9 Операции с файлами и разделами 9.1. Введение

Хорошее понимание основных принципов работы файловых систем абсолютно
необходимо для понимания того, как работает Linux. В системе все объекты ин терпретируются как файлы — файлы данных, разделы, каналы (pipes), сокеты и ус тройства. Каталог также представляет собой файл, содержащий информацию
о других файлах.
Спецификация иерархии файловых систем (FHS, Filesystem Hierarchy Standard)
была разработана как «добровольный стандарт», соблюдаемый в большин стве версий Linux. Далее перечислены обязательные элементы корневой файло вой системы Linux:
/ — корневой каталог;
/bin — важнейшие системные команды;
/boot — файлы статического загрузчика;
/dev — файлы устройств;
/etc — системные конфигурационные файлы, специфические для хоста;
/lib — общие библиотеки, необходимые для работы локальной системы;
/mnt — временные точки монтировки;
/opt — дополнительные программные пакеты (в Linux используются мало);
/ргос — текущая информация о конфигурации и состоянии ядра;
/sbin — команды администрирования системы;
/tmp — временные файлы (в нормальных системах они уничтожаются между
перезапусками);
/usr — общие файлы, данные только для чтения и двоичные файлы;
/var — файлы переменного размера (такие, как почтовые ящики и журналы).
Следующие каталоги считаются необязательными, потому что они могут на ходиться в любом месте сети, тогда как обязательные каталоги должны присут ствовать для нормальной работы компьютера:
/home — личные файлы пользователя;
/root — личные файлы суперпользователя.
Те, кого действительно заинтересует эта тема, найдут дополнительную инфор мацию в спецификации FHS. Вот лишь некоторые обстоятельства, которые долж ны учитывать пользователи Linux:
О каталоги /tmp и /var могут размещаться в отдельных разделах с целью повы шения безопасности. Если вследствие каких-то сбоев начнется неконтроли руемое заполнение этих каталогов, они будут изолированы от остальных ком понентов системы;
О каталог /home может находиться в собственном разделе или на выделен ном сервере для упрощения создания резервных копий и защиты данных
при обновлении системы. В этом случае содержимое /home останется не тронутым даже после полного уничтожения и переустановки системы
Linux;
О хранение всех конфигурационных файлов в /etc и /home упрощает создание
резервных копий. Вы можете ограничиться архивацией только содержимого
/etc и /home, а остальные компоненты восстановить с установочных дисков
системы. Но это будет означать, что при восстановлении будут потеряны об новления программ — учтите это обстоятельство при разработке чрезвычай ных планов.
Типы файлов Linux
Помните, что в Linux любой объект интерпретируется как файл. Файлы Linux
делятся на семь типов, перечисленных в табл. 9.1.
Таблица 9.1. Типы файлов
Признак типа Тип файла
Обычный файл
Каталог
Ссылка
с Символьное устройство
s Сокет
р Именованный канал
b Блочное устройство
Признак типа выводится в самом начале записи в списке файлов:
# Is -1 /dev/initctl
prw 1 root root 0 Jan 12 00:00 /dev/initctl
# Is -1 /tmp/.ICE-unix/551
srwx- 1 caria caria 0 Jan 12 09:00 /tmp/.ICE-unix/551
Тип файлов может указываться в командной строке find:
# find / -type p
# find / -type s
Если поиск занимает слишком много времени, работу команды можно пре рвать клавишами Ctrl+C.
Атрибуты файлов
Также стоит обратить внимание на атрибуты файла — например, сценария sortusers:
# Is -I sortusers
-rwxr-xr-x 1 meredydd programmers 3783 Jan 7 13:29 sortusers
Строка -rwxr-xr-x 1 meredydd programmers сообщает программисту много полез ных сведений:
О первый символ — является признаком обычного файла. Этот атрибут не мо жет изменяться пользователем. По этому признаку Linux определяет тип фай ла, поэтому с точки зрения системы расширение является лишним. Расшире ния нужны только для пользователей и приложений;
О подстрока rwx задает разрешения владельца файла;
О первая подстрока r-х задает разрешения владельца группы;
О вторая подстрока r-х задает разрешения для «всего мира», то есть для каждого,
кто имеет доступ к файлу;
О 1 — количество жестких ссылок на файл. У каждого файла имеется как мини мум одна ссылка из родительского каталога;
О в подстроке meredydd programmers содержится владелец файла и группа, кото рой принадлежит файл.
Разрешения и права владения могут изменяться командами chmod, chgrp и chown;
команда chmod изменяет разрешения, а команды chown и chgrp меняют права вла дения. Запись rwx на первый взгляд выглядит странно, но в действительности это
мнемоника: rwx=Read, Write, eXecute. В этом формате задаются разрешения для
владельца, группы и всех остальных.
Таким образом, в примере sortusers пользователю meredydd разрешается чте ние, запись и исполнение файла. Члены группы и прочие могут только читать
и исполнять файл. Хотя отредактировать файл может только сам пользователь
meredydd, ничто не мешает членам группы и другим пользователям скопировать
его содержимое.
Файл является сценарием командного процессора, для него приходится зада вать как права чтения, так и права исполнения, потому что командному процессору
требуется прочитать файл. Двоичные файлы читаются непосредственно ядром без
участия командного процессора, поэтому для них право чтения не обязательно.
Определения типов файлов
Далее типы файлов Linux будут представлены чуть более подробно.
О Обычные файлы — обычные текстовые файлы, файлы данных или двоичные
исполняемые файлы.
О Каталоги — списки файлов.
О Символьные и блочные устройства — файлы, которые могут рассматриваться
как промежуточные точки между ядром и драйверами устройств — напри мер, /dev/hda (жесткий диск IDE), /dev/ttySl (модем для последовательного
порта) и т. д. Они используются ядром для перенаправления запросов к раз личным устройствам системы.
О Локальные сонеты — связи между локальными процессами. Локальные соке ты отображаются как файлы, но запись и чтение в них возможны лишь со
стороны процессов, напрямую задействованных в передаче данных.
О Именованные каналы — также используются для локальных межпроцессных
коммуникаций. Крайне маловероятно, чтобы пользователю Linux когда-либо
пришлось иметь дело с сокетами или каналами; они используются исключи тельно системными функциями.
О Ссылки — ссылки представляют огромный интерес для пользователей Linux.
Они делятся на два типа: жесткие и мягкие. Ссылка представляет собой указа тель на файл. Жесткая ссылка в действительности может рассматриваться
как другое имя файла, поскольку она указывает на конкретный i-узел (mode).
Все жесткие ссылки, указывающие на файл, наследуют все атрибуты этого
файла — разрешения, владельца и т. д. Команда rm удаляет жесткие ссылки,
но файл остается на диске до тех пор, пока не будут уничтожены все жесткие
ссылки на него, и файл не будет освобожден всеми процессами. Жесткие ссыл ки не могут выходить за пределы файловой системы, поэтому вам не удастся
создать жесткую ссылку на сетевой диск. Мягкие ссылки связываются с име нем файла; они могут указывать на любой файл, находящийся где угодно.
В системе даже могут существовать «висячие» мягкие ссылки; они появляют ся после удаления файлов, на которые они указывают, или их переименования.
Внутреннее строение файловой системы
Приведу еще ряд полезных определений, относящихся к файловым системам.
Логический блок — минимальная единица хранения информации (в байтах),
которая может выделяться файловой системой. Один файл может состоять из не скольких блоков.
Логический том — раздел диска, диск или том, состоящий из нескольких дис ков или разделов, — любая единица хранения данных, воспринимаемая как еди ное, обособленное пространство.
Внутренняя фрагментация — неиспользуемые места, возникающие, когда файл
или его часть заполняет блок лишь частично. Например, если размер блока равен
4 Кбайт, а файл занимает 1 Кбайт, то 3 Кбайт теряются.
Внешняя фрагментация — фрагментация, возникающая в том случае, если бло ки, относящиеся к одному файлу, не занимают смежную область, а рассеиваются
по всему диску.
Экстент — смежные блоки, принадлежащие одному файлу. Файловая систе ма воспринимает экстент как единое целое, что повышает эффективность отсле живания больших файлов.
В+-деревъя — сначала появились b-деревья (сбалансированные деревья). После
усовершенствования они превратились в Ь+-деревья. Эти удобные структуры дан ных, позаимствованные из теории индексирования баз данных, заметно ускоря ют поиск и перебор в структурах данных. Файловые системы, использующие эту
концепцию, могут быстро просканировать дерево каталогов, сначала выбрать нуж ный каталог, а затем просканировать его содержимое. Файловая система ЕхГ2
выполняет последовательный поиск, который работает медленнее.
Метаданные — термин, объединяющий все данные, которые описывают или
управляют внутренними структурами данных. К этой категории относится вся
информация о файле, кроме его непосредственного содержимого: дата и время,
владелец, группа, разрешения, размер, ссылки, время модификации, время досту па, местонахождение на диске, расширенные атрибуты и т. д.
1-узел — большая часть метаданных файла содержится в i-узле, или индексном
узле. Каждому файлу ставится в соответствие уникальный номер i-узла.
Журнальные файловые системы
Старая добрая файловая система Ext2 постепенно дряхлеет. Она уже не поспева ет за пользователями, которым нужны терабайты дискового пространства, и не
обеспечивает быстрого восстановления в случае сбоев. Для большинства пользо вателей, у которых объем данных измеряется гигабайтами и менее, важнейшими
причинами для перехода на журнальную файловую систему являются быстрое
восстановление и целостность данных.
Файловые системы Linux асинхронны. Они не записывают метаданные прямо
на диск, а накапливают данные в кэше записи в памяти и осуществляют запись пери одически, в моменты низкой загрузки процессора. Такая схема повышает общее
быстродействие системы, но сбой питания или системы может привести к потере
метаданных. Если это произойдет, при активации драйвера файловой системы во
время перезапуска и при выполнении программы fsck (FileSystem Consistency checK)
будут обнаружены несоответствия. Поскольку Ext2 хранит несколько экземпляров
метаданных, обычно ей удается восстановить нормальное состояние системы.
Но у такого подхода есть недостаток — время восстановления. Fsck проверяет
абсолютно все биты метаданных. На это может потребоваться от нескольких минут
до получаса и более для больших файловых систем. Журнальным файловым системам
столь долгая проверка не нужна, потому что они ведут журналы изменений. Таким
образом, проверяются только изменившиеся файлы, а не вся файловая система.
В распоряжении пользователей Linux имеется немало замечательных журналь ных файловых систем, в том числе Ext3, ReiserFS, XFS и JFS. Ext3 — журнальная
система на базе Ext2. Системы ReiserFS, XFS и JFS способны работать с файло выми системами, объем которых на 64-разрядных платформах измеряется экза байтами. К сожалению, пользователи ia32 ограничены обычными терабайтами.
Какую файловую систему выбрать? Не существует однозначно лучшего вари анта; все они хороши по-своему. Далее приводится краткая сводка основных дос тоинств и недостатков.
Ext3 — система отличается простотой и удобством. Она прекрасно устанавли вается поверх Ext2, поэтому вам не придется строить систему с самого начала.
Система является расширением Ext2, поэтому она использует тот же пакет фай ловых утилит, e2fsprogs. Принципиальное отличие Ext3 от других файловых сис тем заключается в том, что она использует фиксированное количество i-узлов,
тогда как в других системах узлы создаются динамически. Кроме того, Ext3 поддер живает ведение журналов данных, а не только метаданных. Впрочем, за это при ходится расплачиваться более низкой производительностью и дополнительными
расходами дискового пространства. Ext3 работает в любой архитектуре, поддер живаемой системой Linux.
ReiserFS — система особенно хорошо подходит для систем с большим количе ством мелких файлов (например, почтовых серверов, использующих формат maildir,
или серверов новостей). ReiserFS обеспечивает высокоэффективное хранение фай лов; остаточные биты файлов упаковываются в листовые узлы b-дерева, что пре дотвращает напрасное расходование дискового пространства. Система отлично
масштабируется и так нее хорошо справляется с большими файлами. ReiserFS ра ботает в любой архитектуре, поддерживаемой системой Linux.
JFS — вклад IBM в Большое Соревнование Файловых Систем Linux; система
портирована из AIX и OS/2 Warp. Она поддерживает многопроцессорные систе мы, списки управления доступом (ACL) и даже — представьте! — динамическое
изменение размеров. Просто перемонтируйте файловую систему JFS с новым раз мером, и ничего больше делать не придется (правда, таким образом можно только
увеличить тома, но не уменьшить его).
XFS — разработка SGI, портированная из IRIX. XFS мыслит масштабно — за явлено, что она способна работать с файловыми системами объемами до 9 экза байт. Ее сильной стороной является обработка очень больших файлов (скажем,
гигантских баз данных). У XFS имеется одна превосходная функция, называемая
отложенным распределением. Система откладывает запись на диск и выбор блока
для записи, чтобы выбрать наибольшее возможное количество смежных блоков.
Если в системе используется большое количество временных файлов с коротким
сроком жизни, XFS может вообще никогда не выделить блоки под эти файлы.
XFS обладает интегрированной поддержкой дисковых квот, ACL, архивации и вос становления.
См. также
JFS (http://www-124.ibm.com/jfs/); XFS (http://oss.cgi.com/projects/xfs/); ReiserFS
(http://www.namesys.com); Ext2/3 (http://e2fsprogs.sourceforge.net/ext2.html); Filesystem
Hierarchy Standard (http://www.pathname.com/fhs/).