Файловые системы

Основные сведения о файлах

Данные в операционной системе Linux представляются в виде наборов данных, или, иначе, в виде файлов. Файл – ключевое понятие Linux и применяется не только к данным, но и к устройствам. Существует шесть типов файлов:

Типы файлов

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

Файловая система— это методы и структуры данных, которые используются операционной системой для хранения файлов на диске или его разделе. О файловой системе также говорят, ссылаясь на раздел или диск, используемый для хранения файлов или тип файловой системы.

Существует разница между диском или разделом и установленной на нем файловой системой. Большинство программ взаимодействуют с диском посредством файловой системы, и, следовательно, они не будут выполняться, если на разделе или диске никакая система не установлена или тип файловой системы не соответствует требуемому.

Перед тем, как раздел или диск использовать в качестве файловой системы, на нем должна быть инициализирована соответствующая файловая система. При этом на диск записываются служебные данные. Этот процесс называется созданием файловой системы.

Несмотря на некоторые различия, файловые системы Linux имеют похожую структуру. Основными понятиями файловой системы являются: суперблок (suрerblock), индексный дескриптор (inode), блок данных (data block), блок каталога (directory block) и косвенный блок (indirection block). В суперблоке содержатся сведения о файловой системе в целом, например, ее размер. Конкретные сведения определяются типом файловой системы. В индексном дескрипторе хранится вся информация о файле, кроме его имени. Имя файла хранится в блоке каталога, вместе с номером дескриптора. Запись каталога содержит имя файла и номер индексного дескриптора соответствующего файла. В этом дескрипторе хранятся номера нескольких блоков данных, которые используются для хранения самого файла. В inode есть место только для нескольких номеров блоков данных, однако, если требуется большее количество, то пространство для указателей на блоки данных динамически выделяется. Такие блоки называются косвенными. Для того чтобы найти блок данных, нужно сначала найти его номер в косвенном блоке.

В файловых системах имеется возможность создания дыр (hole) в файлах (команда lseek, см. man-руководство). Это означает, что файловая система предоставляет ложную информацию о том, что в каком-то месте в файле содержатся нулевые байты, но в действительности для этого не выделяются сектора (это означает, что файл будет занимать несколько меньше места на диске). Это часто используется особенно в небольших двоичных программах, библиотеках Linux, в некоторых базах данных и в других отдельных случаях. Дыры реализуются хранением специального значения в косвенном блоке или индексном дескрипторе вместо адреса блока данных. Это специальное значение показывает, что для данной части файла блоки данных не размещены и, следовательно, что в файле есть дыра. Таким способом в Linux реализовано довольно примитивное сжатие данных непосредственно на уровне файловой системы.

Использование дыр достаточно эффективно. На компьютере с общим дисковым пространством в 200 Мб, простые измерения показывают, что применение дыр дает экономию в 4 Мб. Однако, эти измерения проводились на системе, где было установлено относительно мало программ и отсутствовали файлы баз данных.

Типы файловых систем

Системы Slackware/MOPSLinux поддерживают несколько типов файловых систем. Наиболее важные из них рассмотрены ниже.

Наиболее богатая функциональными возможностями файловая система из семейства совместимых с Linux. На данный момент считается самой популярной системой. Она разработана с учетом совместимости с последующими версиями, поэтому для установки новой версии кода системы не требуется устанавливать ее заново.

Модернизированная и журналируемая версия файловой системы ext2.

Предыдущая версия системы ext2, несовместима с последующими версиями. В настоящее время она очень редко включается в пакеты новых поставляемых систем, т.к. большинство пользователей сейчас пользуются системой ext2.

Журналируемая файловая система. Одна из самых популярных журналируемых файловых систем для Linux.

Считается самой старой и самой надежной файловой системой, но достаточно ограниченной в своих возможностях, так у файлов отсутствуют некоторые временные параметры, длина имени файла ограничена 30-ю символами, а объем доступных данных не превышает 64 Мб на одну файловую систему.

Модифицированная версия системы minix, в которой увеличена максимальная длина имени файла и размер файловой системы.

В дополнение к рассмотренным выше, в Linux включена поддержка еще некоторых файловых систем для обеспечения обмена файлами с другими операционными системами. Эти файловые системы работают так же, как и описанные выше, но их функциональные возможности могут быть значительно ограничены по сравнению с возможностями, обычно предоставляемыми файловыми системами Linux.

Обеспечивается совместимость с системой MS-DOS (а также OS/2 и Windows NT) по файловым системам FAT12, FAT16, FAT32 и VFAT.

Основная файловая система Windows NT.

Расширяет возможности драйвера файловой системы MS-DOS для Linux таким образом, что при работе в Linux, имеется возможность работы с именами файлов нестандартной длины, просмотра прав доступа к файлу, ссылок, имени пользователя, которому принадлежит файл, а также оперирование с файлами устройств. Это позволяет использовать обычную систему MS-DOS, так, как если бы это была система Linux. Таким образом, исключается необходимость создания отдельного раздела для Linux.

Стандартная файловая система для CD-ROM. Довольно популярное развитие стандарта CD-ROM, выполненное Rock Ridge, которое обеспечивает автоматическую поддержку имен файлов нестандартной длины.

Сетевая файловая система, обеспечивающая разделение одной файловой системы между несколькими компьютерами для предоставления доступа к ее файлам.

Файловые системы OS/2.

Файловые системы Apple MacOS.

Файловая система для дисков DVD.

Файловые системы SystemV/386, Coherent и Xenix.

$ ls -l /proc
total 0
dr-xr-xr-x 4 root root 0 Jan 31 20:37 1
dr-xr-xr-x 4 liw users 0 Jan 31 20:37 63
dr-xr-xr-x 4 liw users 0 Jan 31 20:37 94
dr-xr-xr-x 4 liw users 0 Jan 31 20:37 95
dr-xr-xr-x 4 root users 0 Jan 31 20:37 98
dr-xr-xr-x 4 liw users 0 Jan 31 20:37 99
-r--r--r-- 1 root root 0 Jan 31 20:37 devices
-r--r--r-- 1 root root 0 Jan 31 20:37 dma
-r--r--r-- 1 root root 0 Jan 31 20:37 filesystems
-r--r--r-- 1 root root 0 Jan 31 20:37 interrupts
-r-------- 1 root root 8654848 Jan 31 20:37 kcore
-r--r--r-- 1 root root 0 Jan 31 11:50 kmsg
-r--r--r-- 1 root root 0 Jan 31 20:37 ksyms
-r--r--r-- 1 root root 0 Jan 31 11:51 loadavg
-r--r--r-- 1 root root 0 Jan 31 20:37 meminfo
-r--r--r-- 1 root root 0 Jan 31 20:37 modules
dr-xr-xr-x 2 root root 0 Jan 31 20:37 net
dr-xr-xr-x 4 root root 0 Jan 31 20:37 self
-r--r--r-- 1 root root 0 Jan 31 20:37 stat
-r--r--r-- 1 root root 0 Jan 31 20:37 uptime
-r--r--r-- 1 root root 0 Jan 31 20:37 version

Хотя система /proc и называется файловой, ни одна ее часть не взаимодействует с диском. Она существует только в представлении ядра. Даже если существует файл /proc/kcore, то он не занимает места на диске.

Создание файловых систем

Файловая система устанавливается, т.е. инициализируется, при помощи команды mkfs. Параметры, передаваемые программам, вызываемым mkfs, могут различаться. Наиболее важные из них рассмотрены ниже:

-t fstype

Указывается тип файловой системы.

-c

Для установки файловой системы ext2 на дискету, используется следующая последовательность команд:

 $ fdformat -n /dev/fd0H1440
Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
Formatting ... done
 $ badblocks /dev/fd0H1440 1440 > bad-blocks  
 $ mkfs -t ext2 -l bad-blocks /dev/fd0H1440
mke2fs 0.5a, 5-Apr-94 for EXT2 FS 0.5, 94/03/10
360 inodes, 1440 blocks
72 blocks (5.00%) reserved for the super user
First data block=1
Block size=1024 (log=0)
Fragment size=1024 (log=0)
1 block group
8192 blocks per group, 8192 fragments per group
360 inodes per group
Writing inode tables: done
Writing superblocks and filesystem accounting information: done

Первая команда форматирует дискету, параметр "-n" предотвращает проверку на наличие сбойных блоков. Вторая команда осуществляет поиск сбойных блоков, вывод результатов перенаправлен в файл bad-blocks. Третья команда устанавливает файловую систему с инициализацией списка найденных сбойных блоков.

Вместо использования badblocks, в команде mkfs может быть указан параметр "-c":

 $ mkfs -t ext2 -c /dev/fd0H1440
mke2fs 0.5a, 5-Apr-94 for EXT2 FS 0.5, 94/03/10
360 inodes, 1440 blocks
72 blocks (5.00%) reserved for the super user
First data block=1
Block size=1024 (log=0)
Fragment size=1024 (log=0)
1 block group
8192 blocks per group, 8192 fragments per group
360 inodes per group
Checking for bad blocks (read-only test): done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done

Указание параметра "-c" намного удобнее, чем применение команды badblocks, но ее использование необходимо для проверки файловой системы после ее установки.

Установка файловых систем на жесткий диск или его раздел аналогична установке на дискету, исключая форматирование.

Подключение и отключение файловых систем

Перед работой с файловой системой, она должна быть смонтирована. При этом операционная система выполняет некоторые действия, обеспечивающие функционирование монтируемой системы. Так как все файлы в системе Linux принадлежат одной структуре каталогов, то эта операция обеспечивает работу с новой файловой системой, как с каталогом уже смонтированной ранее файловой системы.

Рассмотрим пример:

 $ mount /dev/hda2 /home  
 $ mount /dev/hda3 /usr  

Команде mount передаются два параметра: файл устройства, соответствующий диску или разделу, на котором расположена файловая система и имя каталога, к которому будет монтироваться система. После выполнения этих команд содержимое файловых систем отображается в каталогах /home и /usr соответственно. Также можно сказать, что раздел /dev/hda2 смонтирован к каталогу /home, а /dev/hda3 к каталогу /usr. Существует различие между файлом устройства /dev/hda2 и монтируемым каталогом /home. Файл устройства предоставляет доступ непосредственно к данным, расположенным на диске, а монтируемый каталог к файлам. Такой каталог называется узлом или точкой монтирования (mount point).

Команда mount пытается сама определить тип монтируемой файловой системы. В случаях, когда тип файловой системы не определяется, нужно указать параметр "-t fstype", который задает тип файловой системы однозначно. Например, чтобы смонтировать дискету MS-DOS необходимо выполнить команду:

 $ mount -t msdos /dev/fd0 /floppy  

Монтируемый каталог должен существовать. После монтирования файловой системы все расположенные в нем файлы будут доступны. Открытые ранее файлы также будут доступны, а файлы, являющиеся жесткими ссылками из других каталогов, будут доступны с использованием имен ссылок. Таким образом, никакого ущерба не наносится и это даже может быть полезно. Например, некоторые делают каталог /tmр символической ссылкой на каталог /var/tmр. При загрузке системы, когда файловая система /var не смонтирована, каталог /tmр размещается в системе root. После того, как /var смонтирована, каталог /var/tmp, расположенный в файловой системе root, становится недоступным. Если же /var/tmp не существует в системе root, то перед монтированием /var создание и работа с временными файлами будет невозможна.

Для защиты файловой системы от записи, команда mount запускается с опцией "-r", после чего монтирование производится в режиме «только чтение» (read-only). После этого ядро пресекает любые попытки записи, включая модификацию времени доступа к файлам в индексном дескрипторе. Монтирование с защитой от записи всегда используется при работе с CD-ROM.

Очевидно, что корневая файловая система (система root) не может быть смонтирована на какую-либо другую систему. И поэтому она монтируется во время загрузки. Считается, что система root всегда установлена: если бы она не была установлена, то компьютер не смог бы загрузиться. Название файловой системы, используемой для монтирования root, либо встроено в ядро, либо устанавливается при помощи программ LILO или rdev.

Обычно система root сначала монтируется в режиме read-only. Затем запускается программа fsck для проверки ее целостности и если все в порядке, то система перемонтируется (re-mount) в режиме «чтение-запись» (read-write). Программу fsck не следует запускать на смонтированной файловой системе, потому что изменения, произведенные при ее выполнении, могут привести к повреждению системы. Так как система root сначала монтируется в режиме read-only, то после ее проверки все неполадки могут быть полностью устранены при повторном монтировании.

Во многих системах существуют и другие файловые системы, которые должны быть смонтированы во время загрузки. Их список содержится в файле /etc/fstab.

Если файловая система для работы больше не требуется, то она может быть демонтирована, т.е. отключена. Для этого используется команда umount с одним параметром. Это может быть как файл устройства, так и узел монтирования. Например, для демонтирования каталогов, рассмотренных в предыдущем примере, используются следующие команды:

 $ umount /dev/hda2  
 $ umount /usr  

После работы с приводом для гибких дисков следует каждый раз применять эту команду, так как до размонтирования системы нельзя быть уверенным, что данные были записаны на диск, а не остались в буфере. Не следует вынимать дискету, не размонтировав ее!

Для выполнения операций монтирования и демонтирования требуется наличие прав доступа пользователя root. Причин к тому много, но главное то, что разрешение монтировать кому угодно что-угодно приведет к появлению ловушек для администратора. Например, загрузки с дискеты программы /bin/sh с правами root. Однако, многие пользователи довольно часто работают с дисководом и для решения этой проблемы существует несколько способов:

Последний метод может быть реализован путем добавления в файл /etc/fstab следующей строки:

 /dev/fd0 /floppy  msdos  user,noauto 0 0  

При этом указываются файл устройства для монтирования, каталог в который монтируется устройство, тип файловой системы и опции: частота резервирования командой dumр и очередность проверки командой fsck (для указания порядка в котором файловые системы проверяются после загрузки, 0 указывает не проводить проверку).

Опция noauto запрещает автоматическое монтирование при начальной загрузке системы. Команда mount -a не смонтирует такую файловую систему. Опция user позволяет любому пользователю монтировать указанную файловую систему и, по причине защиты системы, запрещает выполнение программ и работу с файлами устройств, расположенных на смонтированной системе. После этого, любой пользователь может выполнить следующую команду:

 $ mount /floppy  

Для демонтирования системы используется команда umount с соответствующими параметрами.

Если нужно работать с дискетами, имеющими различные типы файловой системы, нужно создать разные точки монтирования. Опции для каждой точки будут своими. Например, для обеспечения работы с дискетами в форматах MS-DOS и ext2 нужно внести в /etc/fstab строки:

 /dev/fd0    /dosfloppy    msdos   user,noauto  0  0  
 /dev/fd0    /ext2floppy   ext2    user,noauto  0  0    

Проверка целостности ФС

Для проверки целостности и работоспособности файловой системы используется команда fsck. Наиболее часто возникающие трудности связаны с перебоями в питании, неполадках в оборудовании или из-за ошибок оператора (например, некорректное выключение компьютера).

Работа с поврежденной файловой системой может привести к потерям данных и другим неполадкам. Большинство систем сконфигурировано таким образом, что команда fsck запускается автоматически при загрузке системы, поэтому возможные неполадки будут обнаружены и, возможно, исправлены перед тем, как система начнет использоваться. Если файловая система довольно большая по объему, то ее проверка может занять некоторое время, что создает определенные неудобства. Для того чтобы избежать проверки всей файловой системы, применяются различные способы контроля правильности ее отключении. Первый из них связан с тем, что если существует файл /etc/fastboot, то никаких проверок не производится. Второй способ заключается в том, что в файловой системе ext2 существует специальный флажок, расположенный в суперблоке, который используется для выявления корректности демонтирования файловой системы при последнем выключении компьютера. Эта возможность используется в программе e2fsck (версия команды fsck для файловой системы ext2fs) для избежания излишней проверки файловой системы, если флажок ее целостности установлен, то система была корректно демонтирована. Использование способа, связанного с файлом /etc/fastboot, зависит от программ, запускаемых при загрузке системы, а применение команды e2fsck работает в любом случае. Для более подробной информации о такой проверке см. man-руководство по e2fsck.

Автоматическая проверка используется только для файловых систем, устанавливаемых во время загрузки. Для проверки других систем команда fsck должна выполняться отдельно.

Если fsck находит неисправность, не подлежащую восстановлению, то могут потребоваться глубокие знания и понимание работы файловых систем и их типов.

Команда fsck должна использоваться только для демонтированных систем (за исключением системы root, смонтированной в режиме read-only во время загрузки), так как при ее работе используется прямой доступ к диску и информация о внесении каких-либо изменений в файловую систему может быть недоступна операционной системе, что, обычно, приводит к нарушению ее работы.

Поиск дисковых ошибок командой badblocks

Периодически следует проводить поиск плохих блоков при помощи команды badblocks. При ее выполнении выводится список номеров найденных плохих блоков. Этот список может быть использован программой fsck для внесения изменений в структуру файловой системы во избежание использования этих блоков для хранения информации. В следующем примере показано, как это сделать:

 $ badblocks /dev/fd0H1440 1440 > bad-blocks
$ fsck -t ext2 -l bad-blocks /dev/fd0H1440
Parallelizing fsck version 0.5a (5-Apr-94)
e2fsck 0.5a, 5-Apr-94 for EXT2 FS 0.5, 94/03/10
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Check reference counts.
Pass 5: Checking group summary information.
/dev/fd0H1440: ***** FILE SYSTEM WAS MODIFIED *****
/dev/fd0H1440: 11/360 files, 63/1440 blocks

Если badblocks сообщает, что блок, который уже использовался плохой, e2fsck пробует переместить блок в другое место. В ряде случаев содержимое файла может быть повреждено, хотя обычно перемещение проходит вполне успешно.

Устранение фрагментации

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

Файловая система ext2 пытается уменьшить фрагментацию, храня все блоки в файле близко друг к другу, даже если они не могут быть сохранены в последовательных секторах. Ext2 действительно всегда распределяет свободный блок, который является самым близким к другим блокам в файле. Для ext2, следовательно, редко нужно беспокоиться относительно фрагментации.

Вспомогательные средства для файловых систем

Есть ряд простых утилит для управления файловыми системами. Утилита df показывает свободное место на диске для одной или нескольких файловых систем. Она показывает, как именно используется диск (размеры файлов и каталогов).

Утилита syncпринудительно записывает все оставшиеся в буфере блоки на диск. Процесс-демон update вызывает его автоматически. Утилита sync часто помогает избежать крупных проблем, например, если update или его вспомогательный процесс bdflush завис.

Другие вспомогательные средства для файловой системы ext2

В дополнение к программе создания файловой системы (mke2fs) и программе для ее проверки (e2fsck) файловая система ext2 имеет еще ряд полезных утилит.

Утилита tune2fsпозволяет выполнить «тонкую» настройку параметров файловой системы. Наиболее часто используются следующие настройки:

Утилита dumрe2fsвыводит сведения о файловой системе ext2, обычно из суперблока. Ниже показан типовой вывод. Часть информации в выводе техническая, и требует понимания того, как работает файловая система.

 dumрe2fs 0.5b, 11-Mar-95 for EXT2 FS 0.5a, 94/10/23
Filesystem magic number: 0xEF53
Filesystem state: clean
Errors behavior: Continue
Inode count: 360
Block count: 1440
Reserved block count: 72
Free blocks: 1133
Free inodes: 326
First block: 1
Block size: 1024
Fragment size: 1024
Blocks per group: 8192
Fragments per group: 8192
Inodes per group: 360
Last mount time: Tue Aug 8 01:52:52 1995
Last write time: Tue Aug 8 01:53:28 1995
Mount count: 3
Maximum mount count: 20
Last checked: Tue Aug 8 01:06:31 1995
Check interval: 0
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
Group 0:
Block bitmap at 3, Inode bitmap at 4, Inode table at 5
1133 free blocks, 326 free inodes, 2 directories
Free blocks: 307-1439
Free inodes: 35-360

Утилита debugfsявляется отладчиком файловой системы. Она дает прямой доступ к структурам данных файловой системы, сохраненным на диске, и может использоваться для восстановления диска, который так поврежден, что fsck не может восстановить его автоматически. Она также может использоваться, чтобы восстановить удаленные файлы.

Утилиты dumpи restoreмогут использоваться для резервирования и восстановления файловой системы ext2. Они являются специфическими версиями для ext2 традиционных для UNIX инструментальных средств.

Диски без файловых систем

Не все диски или разделы используются как файловые системы. Например, раздел swap-области не содержит файловой системы. Многие дисководы используются в режиме эмуляции ленточного накопителя, поэтому tar-файл или любой другой файл записывается непосредственно на диск без использования какой-либо файловой системы. У такого использования есть небольшое преимущество в свободном пространстве (при установке файловой системы некоторая часть дискового пространства используется для системных целей) и в совместимости с другими системами. Например, файловый формат tar является стандартным для всех систем, в то время как файловые системы на разных платформах различаются. Дискеты экстренной загрузки системы Linux также могут не содержать файловой системы.

Уход от файловых систем имеет преимущество, когда требуется создание большего объема пригодного для использования дискового пространства, так как файловая система всегда имеет некоторую систему ведения учета дискового пространства. Это также делает диски легко совместимыми с другими системами: например, формат tar одинаков на всех системах, в то время как файловые системы разные на большинстве систем.

Одна из причин использования прямого доступа к диску (без применения файловой системы) — это создание копий. Например, если диск содержит частично поврежденную файловую систему, то при возможности следует создать его копию перед тем, как пытаться что-либо сделать. Для этого можно использовать программу dd:

 $ dd if=/dev/fd0H1440 of=floppy-image
2880+0 records in
2880+0 records out
$ dd if=floppy-image of=/dev/fd0H1440
2880+0 records in
2880+0 records out

Сначала dd выполняет точную копию дискеты в файл floppy-image, а затем записывает копию обратно на диск (предполагается, что перед выполнением последней команды была вставлена другая дискета).