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

Введение

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

  • «Родные» файловые системы. Имеется в виду, что файловая система поддерживает все атрибуты, свойственные Linux: права доступа, временные метки, информацию о владельце файла и т.д.;
  • «Неродные» файловые системы. То есть файловые системы, не поддерживающие атрибуты Linux;
  • Виртуальные. Это файловые системы, которые не имеют физического носителя;
  • Сетевые файловые системы.

К «родным» файловым системам можно отнести:

  • ext2
  • ext3
  • reiserfs
  • JFX
  • XFS.

Файловая система ext2

Ext2 — это одна из первых файловых систем, используемых в Linux (Если говорить более точно, то первая файловая система Linux — это minix. Но возможности этой fs весьма ограничены, и она применялась только на начальном этапе развития Linux.). Она была создана в 1993 году. Система считается очень надёжной и проверенной временем. Но, поскольку ext2 разрабатывалась в те времена, когда жёсткий диск размером 300 Мбайт считался очень большим, ей присущи некоторые ограничения. Применять эту fs для больших разделов не имеет смысла, она начнёт «тормозить», когда в разделе будет большое количество файлов. То есть ext2 считается медленной (Понятие «медленная» очень относительное. Ext2 считается медленной в Linux. Но если сравнить её со стандартной файловой системой FreeBSD, окажется, что ext2 очень даже быстрая.). Конечно, с увеличением размеров дисков, с появлением новых веяний, в файловую систему вносились изменения, улучшающие её работу и функциональность. Например, поддержка POSIX ACL. Но всё же её не коснулись глобальные изменения, позволяющие говорить:

— Да, это та самая, единственная файловая система, которая меня полностью устраивает.

Кроме того, ext2 имеет серьёзные ограничения:

  • Максимальный размер файла — 2048 Гбайт.
  • Максимальный размер файловой системы — 32768 Гбайт.
  • Максимальное количество поддиректорий в одной директории — 32768.

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

Сейчас файловую систему ext2 уже практически не используют. И дело даже не в её ограничениях, ext2 достаточно надёжная файловая система. Всё дело в скорости загрузки Linux-серверов. Необходимо, чтобы сервер работал постоянно. Но чудес не бывает, сервера иногда приходится перегружать. Ваша задача — сделать так, чтобы после падения системы они перегружались как можно быстрее. При включении сервера происходит проверка дисков. Процедура проверки файловых систем, особенно больших, — достаточно длительная процедура. Если таких файловых систем несколько, то их проверка может занять очень много времени. А сервер должен работать!

Для уменьшения времени, тратящегося на проверку, и для увеличения надёжности были разработаны журналируемые файловые системы. Если вы работали с базами данных, вам наверняка известно такое понятие как транзакция. В транзакцию объединяют несколько SQL-операторов. Система должна выполнить все операторы. Если хотя бы один из них не срабатывает, то система откатывается на начало транзакции. Если система была отключена во время выполнения транзакции, при включении, если это возможно, она пытается выполнить оставшиеся операторы или вернуться на начало транзакции.

В современные файловые системы была добавлена поддержка журнала транзакций. С точки зрения работы файловой системы все операции с файлом выглядят как одна транзакция. Если посмотреть подробнее на файловые операции в Linux, запись или изменение файла — это довольно сложная процедура, состоящая из многих действий с данными на диске. При использовании журнала транзакций, прежде чем какие-либо физические изменения будут произведены на диске, в журнале открывается новая транзакция, в которой будут записаны все действия, которые будут производиться с файловой системой. И только после того, как транзакция будет сохранена на диске, будут производится изменения в файловой системе.

Если файловая система будет отключена некорректно, программа проверки сначала смотрит журнал транзакций и на основании данных, находящихся в нём, попытается либо вернуть (откатить) систему на момент начала транзакции, или, если это возможно, завершить действия, описанные в транзакции. Учитывая то, что журнал имеет небольшой размер (в файловой системе ext3 он равен 32 Мбайт), процесс восстановления файловой системы значительно ускоряется.

Файловая система ext3

Когда возникла необходимость внедрения журналируемых файловых систем в Linux, компания RedHat разработала файловую систему ext3. В RedHat пошли путём наименьшего сопротивления — за основу взяли хорошо известную ext2 и добавили поддержку журнала.

По своему физическому устройству ext2 идентична ext3. Эта особенность позволила применять для работы с ext3 такие же утилиты (создание, проверка и настройка файловых систем), как и для работы с ext2.

Несмотря на добавление журнала, ext3 работает быстрее, чем ext2. К достоинствам ext3 следует также отнести возможность журналирования не только необходимых действий, но и данных, что не позволяют делать другие журналируемые системы. Благодаря этой особенности ext3 считается очень надёжной.

Ext3 поддерживает три режима работы:

  • Writeback — в этом режиме не происходит журналирования данных. В журнал сначала помещаются так называемые метаданные (inode файла, ссылки на блоки). Только после того, как они попали в журнал, происходит запись данных в файловую систему.
  • Ordered (режим по умолчанию) — этот режим похож на описанный выше. Единственным отличием является то, что в режиме writeback в журнал сначала помещаются все метаданные, и только после этого происходят изменения в файловой системе. А в режиме ordered при помещении информации о блоке в журнал этот блок сразу же изменяется в файловой системе. Затем в журнал помещается информация о следующем блоке, и блок записывается, и так далее. То есть данные изменяются параллельно с изменением в журнале.
  • Journal — режим полного журналирования. В журнал попадают метаданные и данные. И только после этого происходит изменение в файловой системе.

Файловая система ReiserFS

ReiserFS разрабатывается Гансом Реизером (Hans Reiser) и его компанией Namesys (http://www.namesys.com). Это очень быстрая файловая система, хорошо приспособленная для хранения большого количества маленьких файлов.

В ней удалось решить проблему размещения на диске маленьких файлов. Например, в ext2/3 для размещения файла, содержащего единственный символ, на диске будет занят целый блок. Блок ext2/3 может иметь размер от 1 до 8 Кбайт (размер зависит от объема файловой системы). А в ReiserFS в одном блоке могут быть размещены данные нескольких файлов. Более того, если размер файла очень мал, данные могут быть размещены в inode, то есть непосредственно в метаданных.

Файловая система базируется на оптимизированных деревьях (B tree). Это увеличивает скорость поиска в файловой системе и снимает вопрос ограничения количества файлов и директорий в директории.

С файлами большого размера данная файловая система тоже справляется весьма уверенно.

Для файловой системы ReiserFS версии 3.6 существуют следующие ограничения:

  • Максимальный размер файла — 8 Тбайт (для 32-битных компьютеров);
  • Максимальный размер файловой системы — 16 Тбайт.

Сейчас разрабатывается следующая версия ReiserFS — четвёртая. Ожидается, что она будет включена в ядрах версии 2.6.17 или 2.6.18.

Файловая система JFS

Эта файловая система разрабатывается компанией IBM и распространяется под лицензией GNU GPL. Описание JFS можно найти в Интернете на сайте http://jfs.sourceforge.net. JFS используется не только в Linux, но и в других операционных системах, например, в AIX и OS/2.

JFS — журналируемая файловая система. Основной её конёк — использование совместно с LVM (Logical Volume Manager). LVM позволяет объединять несколько физических разделов жёстких дисков в один логический, который затем можно разбивать на разделы как обыкновенный жёсткий диск. При этом некоторые типы LVM позволяют на лету подключать новое дисковое пространство. И если на увеличивающихся разделах использовать файловую систему ext3, в один прекрасный момент вы получите сообщение о невозможности создания нового файла. Дело в том, что при форматировании раздела в ext3 в нём заранее, в зависимости от размера, резервируется конечное количество inodes. То есть заранее известно максимальное количество файлов. Если размер файловой системы не будет увеличиваться, то этого количества inodes вполне хватает для нормальной работы. В JFS есть возможность динамического увеличения файловой системы и количества inodes. Благодаря этому свойству, при увеличении размера файловой системы не возникает ограничение на количество создаваемых файлов.

JFS имеет интересное внутренне устройство. Например, при создании файловой системы ext3 в разделе выделятся суперблок, в котором описаны параметры и корневая директория файловой системы. При создании файла выделятся дисковое пространство для inode и данных файла. В JFS раздел разбивается на так называемые агрегаты. В каждом агрегате создается свой суперблок и свой журнал. Фактически мы получаем набор файловых систем. Причём эти файловые системы при желании можно использовать отдельно! При увеличении размера файловой системы просто создаётся новый агрегат, в котором распределяется свое количество inodes (Подробно об устройстве файловой системы JFS написано тут: http://www-128.ibm.com/developerworks/library/l-jfslayout).

Для файловой системы JFS существуют следующие ограничения:

  • Максимальный размер файла ограничивается разрядностью операционной системы.
  • Максимальный размер файловой системы — 512 Тбайт.

Файловая система XFS

Файловая система XFS разрабатывалась в компании SGI (бывшая Silicon Graphics, Inc.). XFS появилась на свет в 1994 году и изначально поставлялась с операционной системой IRIX. Компания SGI славится своими рабочими станциями для производства видео, а также серверами для хранения данных. Поэтому файловая система оптимизирована для обслуживания большого количества огромных файлов и для поддержки больших директорий. Благодаря своей структуре, она так же хорошо поддерживает большое количество маленьких файлов. По своему быстродействию она сопоставима с файловой системой ReiserFS, а по надёжности превосходит файловую систему Ганса (Сколько данных было мной потеряно в файловой системе ReiserFS на пустом месте. Спасало только резервное копирование. Поэтому сейчас я ReiserFS на серверах не использую.).

Поддержка больших файлов возможна благодаря тому, что XFS — это 64-битная файловая система. А скорость работы файловой системы достигается благодаря использованию В+ деревьев для поиска и описания внутренних структур.

Внутренне устройство файловой системы достаточно сложное, и я не вижу необходимости в кратком описании ее структуры. Тем более, что в Интернете есть хорошие статьи, подробно описывающие XFS:

Файловые системы компании Microsoft

Если говорить о файловых системах компании Microsoft, в Linux поддерживаются FAT и NTFS. С FAT всё очень просто, структура файловой системы известна, поэтому в Linux она поддерживается полностью. Единственное, что необходимо учесть при использовании FAT, в Linux существует две её разновидности:

  • msdos — FAT12/16.
  • vfat — FAT32.

Поддержку FAT следует включать в том случае, если вы предполагаете использовать гибкие диски и различные USB-накопители: флеш-карты, жёсткие диски и т.д. Дело в том, что все они обычно отформатированы в FAT.

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

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

Эти файловые системы используются для хранения информации на CD- и DVD-дисках.

Изначально iso9660 была очень простой файловой системой с большим количеством ограничений. Например, имена файлов как в MS DOS, ограничение на количество вложений директорий. Поэтому для iso9660 было написано несколько дополнений, расширяющих её возможности. В том числе, дополнения, позволяющие сохранять атрибуты файлов UNIX. Все дополнения поддерживаются драйвером файловой системы, и никаких затруднений при работе быть не должно. Более того, драйвер iso9660 поддерживает, как это ни странно звучит, режим записи. Он применяется при создании образов CD-ROM.

С udf тоже не замечено особых проблем. Таким образом, работа с CD- и DVD-дисками поддерживается в Linux без каких-либо ограничений.

Файловая система proc

Относится ке разряду виртуальных фаловых систем. Очень полезная файловая система. В работе администратора вы очень часто будете обращаться к её возможностям. В одной из первых глав, рассказывающих об организации файловой системы Linux, я вкратце рассказывал о предназначении этой файловой системы. Просто напомню, что файлы, которые находятся в директории /proc — это отображение области данных ядра на файловую систему. То есть, если вы просматриваете содержимое какого-либо файла, на самом деле вы видите определённую часть области данных ядра.

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

/proc/cmdline

Содержит командную строку, переданную ядру при его запуске.

# cat cmdline
BOOT_IMAGE=Linux-2613 ro root=303
#

/proc/cpuinfo

Информация о процессоре или процессорах.

# cat cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 9
model name      : Intel(R) Pentium(R) M processor 1400MHz
stepping        : 5
cpu MHz         : 1399.050
cache size      : 1024 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 2
wp              : yes
flags           : fpu vme de pse tsc msr mce cx8 sep mtrr pge mca cmov pat clflush dts acpi mmx fxsr sse sse2 tm pbe est tm2
bogomips        : 2800.93
#

/proc/devices

Список устройств.

# cat devices
Character devices:
  1 mem
  2 pty
  3 ttyp
  4 /dev/vc/0
  4 tty
  4 ttyS
  5 /dev/tty
  5 /dev/console
  5 /dev/ptmx
  7 vcs
 10 misc
 13 input
 14 sound
 21 sg
116 alsa
128 ptm
136 pts
171 ieee1394
180 usb
226 drm
254 pcmcia

Block devices:
  3 ide0
  7 loop
  8 sd
 11 sr
 65 sd
#

/proc/dma

Использование каналов DMA.

# cat dma
 4: cascade
#

/proc/filesystems

Список поддерживаемых файловых систем.

# cat filesystems
nodev   sysfs
nodev   rootfs
nodev   bdev
nodev   proc
nodev   sockfs
nodev   pipefs
nodev   futexfs
nodev   tmpfs
nodev   inotifyfs
nodev   eventpollfs
nodev   devpts
        ext3
        ext2
nodev   ramfs
        msdos
        vfat
        iso9660
        ntfs
        udf
nodev   mqueue
nodev   usbfs
#

/proc/interrupts

Распределение прерываний.

# cat interrupts
           CPU0
  0:     850627          XT-PIC  timer
  1:       9691          XT-PIC  i8042
  2:          0          XT-PIC  cascade
  7:          2          XT-PIC  parport0
  8:          1          XT-PIC  rtc
  9:       6620          XT-PIC  acpi
 11:     238626          XT-PIC  Intel 82801DB-ICH4, yenta, yenta, eth0, eth1,
 ohci1394, ehci_hcd:usb1, uhci_hcd:usb2, uhci_hcd:usb3, uhci_hcd:usb4,
 radeon@pci:0000:01:00.0
 12:      65575          XT-PIC  i8042
 14:      11538          XT-PIC  ide0
NMI:          0
LOC:          0
ERR:          0
MIS:          0
#

/proc/modules

Список загруженных модулей.

# cat modules
irtty_sir 5248 0 - Live 0xf8a09000
sir_dev 13548 1 irtty_sir, Live 0xf8a1d000
irda 107768 1 sir_dev, Live 0xf8a3f000
crc_ccitt 1792 1 irda, Live 0xf8a04000
parport_pc 24324 0 - Live 0xf8a16000
parport 30920 1 parport_pc, Live 0xf8a0d000
uhci_hcd 30416 0 - Live 0xf89e7000
ehci_hcd 27656 0 - Live 0xf897a000
usbcore 103740 3 uhci_hcd,ehci_hcd, Live 0xf8990000
ohci1394 31092 0 - Live 0xf895e000
ieee1394 86392 1 ohci1394, Live 0xf891e000
ipw2100 78204 0 - Live 0xf8936000
ieee80211 18948 1 ipw2100, Live 0xf8918000
ieee80211_crypt 4488 1 ieee80211, Live 0xf88f8000
eepro100 26512 0 - Live 0xf8909000
pcmcia 30568 4 - Live 0xf8900000
firmware_class 7680 2 ipw2100,pcmcia, Live 0xf88f2000
yenta_socket 20748 4 - Live 0xf8879000
rsrc_nonstatic 11264 1 yenta_socket, Live 0xf8875000
pcmcia_core 34640 3 pcmcia,yenta_socket,rsrc_nonstatic, Live 0xf88e2000
#

/proc/mounts

Содержит список подключенных файловых систем.

# cat mounts
rootfs / rootfs rw 0 0
/dev/root / ext3 rw 0 0
proc /proc proc rw,nodiratime 0 0
sysfs /sys sysfs rw 0 0
none /dev ramfs rw 0 0
/dev/hda5 /usr ext3 rw 0 0
/dev/hda6 /home ext3 rw 0 0
/dev/hda1 /mnt/win ntfs ro,noatime,nodiratime,uid=0,gid=0,fmask=0177,dmask=077,nls=iso8859-1,
errors=continue,mft_zone_multiplier=1 0 0
devpts /dev/pts devpts rw 0 0
usbfs /proc/bus/usb usbfs rw 0 0
#

/proc/partitions

Содержит список разделов всех подключенных накопителей.

# cat partitions
major minor  #blocks  name

   3     0   58605120 hda
   3     1   10485688 hda1
   3     2     506520 hda2
   3     3    9775080 hda3
   3     4          1 hda4
   3     5    9775048 hda5
   3     6   28062688 hda6
#

/proc/pci

Список устройств, обнаруженных на шине PCI.

Этот файл можно использовать для диагностики причин, почему не работают некоторые устройства. Обращайте внимание на прерывания: если оно равно 0, это значит, что устройству по какой-либо причине не было выделено прерывание. Я не буду полностью приводить содержимое этого файла, он очень большой.

# cat pci
PCI devices found:
  Bus  0, device   0, function  0:
    Host bridge: Intel Corporation 82855PM Processor to I/O Controller (rev 3).
      Prefetchable 32 bit memory at 0xd0000000 [0xdfffffff].
  Bus  0, device   1, function  0:
    PCI bridge: Intel Corporation 82855PM Processor to AGP Controller (rev 3).
      Master Capable.  Latency=96.  Min Gnt=12.
  Bus  0, device  29, function  0:
    USB Controller: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) 
    USB UHCI Controller #1 (rev 1).
      IRQ 11.
      I/O at 0x1800 [0x181f].
#

/proc/swaps

Содержит список подключенных swap файлов и разделов.

# cat swaps
Filename                                Type            Size    Used    Priority
/dev/hda2                               partition       506512  0       -1
#

/proc/version

Содержит информацию о версии операционной системы и ядра Linux.

# cat version
Linux version 2.6.13-rc3-my (root@master) (gcc version 3.3.6) #3 
Tue Jul 19 22:25:23 GMT+3 2005
#

Информация о процессах

Кроме файлов в /proc находятся директории, имеющие в качестве имени число. Каждая директория описывает процесс, PID которого соответствует имени директории. Файлы в этой директории описывают параметры процесса. Содержимое одной из директория приведено ниже.

# ls /proc/4624
auxv     cwd@     exe@  maps  mounts   oom_score  seccomp  statm   task/
cmdline  environ  fd/   mem   oom_adj  root@      stat     status  wchan
#

Только несколько из приведенных в примере файлов содержат информацию, которая была бы понятна без предварительной обработки.

cmdline

Содержит аргументы командной строки.

# cat cmdline
-su
#

environ

Содержит значения переменных среды окружения процесса.

# cat environ
HZ=100TERM=xtermPATH=/usr/local/sbin:/usr/local/bin:/sbin:/usr/sbin:/bin
:/usr/binHOME=/rootSHELL=/bin/bashUSER=rootLOGNAME=rootMAIL=/var/spool/mail/root
#

status

Содержит информацию о состоянии процесса в формате понятном человеку.

# cat status
Name:   bash
State:  S (sleeping)
SleepAVG:       98%
Tgid:   4510
Pid:    4510
PPid:   4498
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 256
Groups: 0 1 2 3 4 6 10 11
VmSize:     2832 kB
VmLck:         0 kB
VmRSS:      1724 kB
VmData:      388 kB
VmStk:        88 kB
VmExe:       628 kB
VmLib:      1628 kB
VmPTE:        12 kB
Threads:        1
SigQ:   0/7168
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000010000
SigIgn: 0000000000384004
SigCgt: 000000004b813efb
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff
#

Другие директории

Коме директорий, описывающих процессы системы, в /proc могут находиться и другие директории. Ниже приведу назначение некоторых из них:

  • ide — информация об устройствах, подключенных к ide интерфейсу.
  • irq — информация о распределении прерываний.
  • net — информация о сети. Содержимое таблицы arp и таблицы маршрутизации. Статистика по сетевым интерфейсам и протоколом. И так далее.
  • scsi — информация о SCSI устройствах.
  • sys — содержит изменяемые параметры системы.

/proc/sys

Файловая система /proc/sys — это отдельная большая тема. При помощи файлов, находящихся в этой директории можно «на лету» изменять параметры системы. Достаточно записать нужное значение в определенный файл. Описывать /proc/sys я не буду, слишком много информации и слишком много надо знать, что бы понять для чего используются файлы. Поэтому я расскажу где найти документацию и описание по этой файловой системе:

  • В первую очередь — это документация к ядру. Она поставляется с исходными кодами ядра. Описание /proc/sys можно найти в файле Documentation/filesystems/proc.txt. Ей посвящена отдельная (и далеко не маленькая) глава.
  • В Интернет по адресу http://ipsysctl-tutorial.frozentux.net/ipsysctl-tutorial.html можно найти документ «Ipsysctl tutorial». И его перевод на русский язык: http://www.citforum.ru/operating_systems/linux/ipsysctl.

Файловая система sysfs

Виртуальная файловая система sysfs — это особенность ядра Linux версии 2.6. В файловой системе отображаются некоторые структуры данных ядра, в основном описывающие устройства, которые в данный момент находятся в системе.

Sysfs используется программой udev для динамического создания файлов устройств.