Журналирующие файловые системы под Linux

  Автор: © Matteo Dell'Omodarme
Перевод: © Павел В. Ступин (Кобальт).


Введение

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

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

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

  • Система "упала" перед тем, как вы сохранили файл. В этом случае все несохраненные изменения утеряны, однако старая версия файла по-прежнему на месте.

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

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

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

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

Журналирующие файловые системы, доступные под Linux, являются решением данной проблемы.

Что такое журналируюшая файловая система

Ниже предлагается информация общего характера о журналировании. За специфической информацией и техническими подробностями обращайтесь к статье Juan I. Santos Florido из Linux Gazette 55. Дополнительную информацию можно получить с freshmeat.net/articles/view/212/.

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

Теперь, если сбой происходит перед внесением записи в журнал, то первоначальная версии файла сохраняется на диске, а теряются только несохраненные изменения. Если система "падает" в момент обновления данных на диске (то есть после внесения записи в журнал), то запись в журнале показывает, что планировалось сделать. Поэтому после перезагрузки системы, прочитываются журнальные записи и прерванные операции записи на диск доводятся до своего логического конца.

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

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

Существующие журналирующие файловые системы

В этой части статьи я рассмотрю три журналирующие файловые системы.

Первая - это ext3. Система разработана Stephen Tweedie, одним из ведущих разработчиков ядра, ext3 добавляет функцию журналирования в ext2. Альфа-версия доступна на ftp.linux.org.uk/pub/linux/sct/fs/jfs/.

У Namesys есть журналирующая файловая система, которая называется ReiserFS. Ее можно найти на http://www.namesys.com/.

Первого мая 2001 компания SGI выпустила версию 1.0 своей файловой системы для Linux XFS. Вы можете найти ее на oss.sgi.com/projects/xfs/.

В этой статье я тестирую и сравниваю эти три решения с использованием двух различных программ.

Установка ext3

За техническими подробностями об ext3, пожалуйста, обращайтесь к работе Stephen Tweedie и его дискуссии.

Файловая система ext3 является прямым потомком ext2. Одной из самых ценных особенностей ext3 является 100%-ная обратная совместимость с ext2, так как ext3 - это не что иное как ext2 с поддержкой журналирования. Очевидным недостатком ext3 является то, что в ней не реализована все та функциональность современных файловых систем, которая повышает скорость манипулирования данными и качество их распределения на дисках.

ext3 существует как патч к ядру 2.2.19 kernel, так что сначала получите ядро linux-2.2.19 с ftp://ftp.kernel.org/pub/linux/kernel/v2.2/ или с одного из зеркал. Сам патч лежит на ftp://ftp.linux.org.uk/pub/linux/sct/fs/jfs/ или ftp.kernel.org/pub/linux/kernel/people/sct/ext3, или же на одном из зеркал.
Неважно какой сайт вы выбрали - вам нужно получить следующие файлы:

  • ext3-0.0.7a.tar.bz2: патч к ядру.
  • e2fsprogs-1.21-WIP-0601.tar.bz2: набор программ e2fsprogs с поддержкой ext3
Скопируйте файл ядра Linux linux-2.2.19.tar.bz2 и файл ext3-0.0.7a.tar.bz2 в каталог /usr/src и распакуйте их:
mv linux linux-old
tar -Ixvf linux-2.2.19.tar.bz2
tar -Ixvf ext3-0.0.7a.tar.bz2
cd linux
cat ../ext3-0.0.7a/linux-2.2.19.kdb.diff | patch -sp1
cat ../ext3-0.0.7a/linux-2.2.19.ext3.diff | patch -sp1
Первый .diff-файл - это копия патчей для отладчика ядра kdb (от SGI). Второй - это файловая система ext3.

Теперь сконфигурируйте ядро, сказав "YES" в пункте "Enable Second extended fs development code" (Разрешить использование дополнительного программного кода для экперименальных файловых систем) в разделе "Файловая система", а потом постройте ядро.

Когда ядро скомпилируется и установится, установите e2fsprogs:

tar -Ixvf e2fsprogs-1.21-WIP-0601.tar.bz2
cd e2fsprogs-1.21
./configure
make
make check
make install
Вот и все. Следующий шаг - это установка ext3 на раздел диска. Перезагрузитесь с новым ядром. Теперь у вас появляется выбор: либо создать новую журналирующую файловую систему, либо журналировать уже существующую.
  • Создание новой файловой системы ext3. Просто используйте mke2fs из установленного пакета e2fsprogs, и не забудьте указать ключ "-j" при запуске mke2fs.
    mke2fs -j /dev/xxx
    
    где /dev/xxx - это устройство, на котором вы будете создавать файловую системы ext3. Флаг "-j" говорит mke2fs, чтобы была создана файловая система ext3 со скрытым журналом. Можно контролировать размер журнала, используя флаг flag -Jsize=<n> (n - это нужный размер журнала в Мб).
  • Обновление существующей файловый системы ext2 до ext3. Просто запустите tune2fs:
    tune2fs -j /dev/xxx
    
    Это можно проделывать либо на смонтированной, либо на несмонтированной файловой системе. Если файловая система смонтирована, то в корне файловой системы создается файл .journal; если же нет - то скрытый inode (блок данных с информацией о файле) используется для журнала. Таким образом, все происходит без какого-то риска для жизни существующих на файловых системах данных.
Смонтировать файловую систему ext3 можно командой:
mount -t ext3 /dev/xxx /mount_dir
Так как ext3 - это по сути журналирующая ext2, то корректно размонтированная файловая система ext3, может затем быть снова смонтирована как ext2 без использования каких-то дополнительных команд.

Установка XFS

За техническими подробностями о файловой системе XFS обратитесь на cтраницу SGI о XFS для Linux или страницу публикаций на сервере SGI.
Также посмотрите страницу с FAQ .

XFS - это журналирующая файловая система для Linux, которая была разработана SGI. Это зрелый продукт, который доказал свою работоспособность, функционируя в качестве основной файловой системы на машинах, работающих под IRIX, которые поставлялись всем клиентам SGI. XFS выпущена под GPL.
XFS Linux 1.0 выпущена для ядра Linux 2.4, и я попробовал патч для 2.4.2. Таким образом, первым делом нужно раздобыть ядро linux-2.4.2 с одного из зеркал kernel.org.
Патчи лежат наoss.sgi.com/projects/xfs/download/Release-1.0/patches. Из этого каталога скачайте:

  • linux-2.4-xfs-1.0.patch.gz
  • linux-2.4.2-core-xfs-1.0.patch.gz
  • linux-2.4.2-kdb-04112001.patch.gz
Скопируйте файл ядра Linux linux-2.4.2.tar.bz2 в каталог /usr/src, перенесите существующую директорию linux в linux-old и распакуйте новое ядро:
mv linux linux-old
tar -Ixf inux-2.4.2.tar.bz2
Скопируйте все патчи в корень вашей иерархии исходников Linux (то есть в /usr/src/linux) и применительно к ним сделайте:
zcat patchfile.gz | patch -p1
Затем сконфигурируйте ядро, активизируя опции "XFS filesystem support" [Поддержка файловой системы XFS] (CONFIG_XFS_FS) и "Page Buffer support" [Поддержка страничной буфферизации] (CONFIG_PAGE_BUF) в разделе "Файловая система". Обратите внимание на то, что вам также понадобится обновить следующие системные утилиты до указанных или более поздних версий:
  • modutils-2.4.0
  • autoconf-2.13
  • e2fsprogs-devel-1.18
Установите новое ядро и перезагрузитесь
Теперь скачайте пакет инструментов для работы с xfs. Этот тарбол содержит набор программ для использования файловой системы XFS, например mkfs.xfs. Для сборки сделайте:
tar -zxf  xfsprogs-1.2.0.src.tar.gz
cd xfsprogs-1.2.0
make configure
make
make install
После установки этого пакета вы можете создать новую файловую систему XFS командой:
mkfs -t xfs /dev/xxx
Одной важной опцией, которая может вам понадобиться, является "-f", которая форсирует создание новой файловой системы, в случае если на манипулируемой партиции уже существует файловая система. Заметьте, что все данные на партиции будут уничтожены:
mkfs -t xfs -f /dev/xxx
После можно смонтировать новую файловую системы командой:
mount -t xfs /dev/xxx /mount_dir

Установка ReiserFS

За техническими деталями обращайтесь на сайт NAMESYS и на страницу с FAQ .

ReiserFS присутствует в официальной версии ядра Linux, начиная с версии 2.4.1-pre4. Для работы вам понадобятся специальные утилиты (например, mkreiserfs для создания ReiserFS на пустой партиции, resizer и др.).
Современная версия ReiserFS существует в виде патчей либо для ядер 2.2.x, либо - 2.4.x. Я тестировал патч на ядре 2.2.19

Как обычно первый шаг - это скачать стандартное ядро linux-2.2.19.tar.bz2 с зеркала kernel.org. Потом возьмите для reiserfs 2.2.19 patch. В настоящее время версия последнего патча - 3.5.33.
Пожалуйста, обратите внимание на то, что если вы выбираете патч для ядра 2.4.x, то тогда нужно также скачать тарбол с утилитами reiserfsprogs-3.x.0j.tar.gz.
Теперь распакуйте ядра и патч. Скопируйте тарболы в /usr/src и перенесите каталог linux в linux-old; затем выполните:

tar -Ixf linux-2.2.19.tar.bz2
bzcat linux-2.2.19-reiserfs-3.5.33-patch.bz2 | patch -p0
Скомпилируйте ядро, предварительно установив поддержку reiserfs в разделе "Файловая система".
Скомпилируйте и установите утилиты reiserfs:
cd /usr/src/linux/fs/reiserfs/utils
make
make install
Установите новое ядро и перезагрузитесь. Теперь можно создать новую файловую системы командой:
mkreiserfs /dev/xxxx
и смонтировать ее с помощью:
mount -t reiserfs /dev/xxx /mount_dir

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

Для тестирования я использовал Pentium III - 16 Mb RAM - 2 Gb HD c установленным Linux RedHat 6.2.
Все файловые системы работали без проблем, поэтому я затеял небольшой сравнительный анализ производительности файловых систем. В качестве первого теста, я имитировал сбой, просто выключив компьютер, чтобы проконтролировать процесс восстановления журнала. Все файловые системы прошли это испытание на ура, и во всех трех случаях машина была в норме уже через несколько секунд.

Следующим шагом в анализе было использование программы bonnie++ с http://www.coker.com.au/bonnie++/. Эта программа проводит тестирование в стиле работы с базами данных применительно к какому-то одному файлу. Тестируется создание, чтение и удаление небольших файлов, что может имитировать работу таких программ, как Squid, INN, или ПО, работающего с форматом Maildir (qmail).
Команда для тестирования была следующей:

bonnie++ -d/work1 -s10 -r4 -u0
что запускало тестирование с использованием 10 Мб (-s10) дискового пространства на файловой системе, смонтированной в каталог /work1. Таким образом, перед запуском теста, вы обязаны создать необходимую файловую систему и смонтировать ее в каталог /work1. Остальные опции отвечают за размер оперативной памяти в Мб (-r4) и за имя пользователя (-u0, то есть root). Результаты демонстрируются в следующей таблице.

Sequential Output Sequential Input Random
Seeks
Size:Chunk Size Per Char Block Rewrite Per Char Block
K/sec % CPU K/sec % CPU K/sec % CPU K/sec % CPU K/sec % CPU / sec % CPU
ext2 10M 1471 97 14813 67 1309 14 1506 94 4889 15 309.8 10
ext3 10M 1366 98 2361 38 1824 22 1482 94 4935 14 317.8 10
xfs 10M 1206 94 9512 77 1351 33 1299 98 4779 80 229.1 11
reiserfs 10M 1455 99 4253 31 2340 26 1477 93 5593 26 174.3 5

Sequential Create Random Create
Num Files Create Read Delete Create Read Delete
/ sec % CPU / sec % CPU / sec % CPU / sec % CPU / sec % CPU / sec % CPU
ext2 16 94 99 278 99 492 97 95 99 284 100 93 41
ext3 16 89 98 274 100 458 96 93 99 288 99 97 45
xfs 16 92 99 251 96 436 98 91 99 311 99 90 41
reiserfs 16 1307 100 8963 100 1914 99 1245 99 9316 100 1725 100

Два типа данных приводятся для каждого теста: скорость файловой системы (в Кб/сек) и загрузка процессора (в %). Чем выше скорость, тем лучше файловая система. Что касается загрузки процессора - то там все наоборот.
Как видно из таблицы, ReiserFS является чемпионом в управлении файлами (раздел Sequential Create и Random Create), превосходя своих конкурентов больше чем в 10 раз. Также, ReiserFS практически не уступает другим файловым системам в категориях Sequential Output и Sequential Input.

Что касается остальных файловых систем, то в их результатах разницы практически нет. Скорость XFS близка к скорости ext2, а ext3, как и ожидалось, немного медленнее ext2 (по сути это одно и то же, только ext3 тратит еще немного времени на обращение к журналу).

В качестве последнего испытания я использовал программу mongo, обнаруженную на странице тестов reiserFS на http://www.namesys.com/. Я немного поправил исходники для использования программы с тремя файловыми системами. Я вставил в перловый скрипт mongo.pl команды для монтирования и форматирования файловых систем xfs и ext3. Потом я запустил программу тестирования.
Скрипт форматирует раздел /dev/xxxx, монтирует его и запускает заданное число процессов во время каждого этапа. Этапы были следующими: Create, Copy, Symlinks, Read, Stats, Rename и Delete. Также программа определяет степень фрагментации после этапов Create и Copy.

Fragm = число_фрагментов / число_файлов
С результатами можно ознакомиться и в каталоге results в файлах:
log       - результаты, представленные в неформатированном виде.
log.tbl   - результаты для программы, осуществляющей сравнение.
log_table - результаты в виде таблицы.
Тестирование происходило таким образом:
mongo.pl ext3 /dev/hda3 /work1 logext3 1

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

В следующих таблицах представлены результаты моего анализа. Представленные данные - это время (в сек). Чем меньше значение, тем лучше файловая система. В первой таблице используются файлы со средним размером 100 байтов, во второй - 1000 байтов, а в третьей - 10000 байтов.


ext3
files=68952
size=100 bytes
dirs=242
XFS
files=68952
size=100 bytes
dirs=241
reiserFS
files=68952
size=100 bytes
dirs=241
Create 90.07 267.86 53.05
Fragm. 1.32 1.02 1.00
Copy 239.02 744.51 126.97
Fragm. 1.32 1.03 1.80
Slinks 0 203.54 105.71
Read 782.75 1543.93 562.53
Stats 108.65 262.25 225.32
Rename 67.26 205.18 70.72
Delete 23.80 389.79 85.51


ext3
files=11248
size=1000 bytes
dirs=44
XFS
files=11616
size=1000 bytes
dirs=43
ReiserFS
files=11616
size=1000 bytes
dirs=43
Create 30.68 57.94 36.38
Fragm. 1.38 1.01 1.03
Copy 75.21 149.49 84.02
Fragm. 1.38 1.01 1.43
Slinks 16.68 29.59 19.29
Read 225.74 348.99 409.45
Stats 25.60 46.41 89.23
Rename 16.11 33.57 20.69
Delete 6.04 64.90 18.21


ext3
files=2274
size=10000 bytes
dirs=32
XFS
files=2292
size=10000 bytes
dirs=31
reiserFS
files=2292
size=10000 bytes
dirs=31
Create 27.13 25.99 22.27
Fragm. 1.44 1.02 1.05
Copy 55.27 55.73 43.24
Fragm. 1.44 1.02 1.12
Slinks 1.33 2.51 1.43
Read 40.51 50.20 56.34
Stats 2.34 1.99 3.52
Rename 0.99 1.10 1.25
Delete 3.40 8.99 1.84

Цифры говорят о том, что ext3 обычно быстрее на этапах Stats, Delete и Rename, в то время как reiserFS сильнее в Create и Copy. Также обратите внимание на то, что reiserFS проявляет свои лучшие качества в случае с маленькими файлами, что и подчеркивается в документации по reiserfs.

Выводы

На сегодняшний день существует по крайней мере 2 работоспособных и надежных журналирующих файловых системы под Linux (то есть XFS и reiserFS), которые можно не боясь использовать.
ext3 все еще находится в стадии альфа-тестирования и потенциально подвержена сбоям. У меня возникло несколько проблем с ext3, когда я тестировал ее с bonnie++: система сообщала об VM-ошибках и килляла шелл, которым я пользовался.

На основании результатов тестирования, я советую в будущем установить файловую систему reiserFS (лично я это обязательно сделаю).

Matteo Dell'Omodarme

Я учусь в университете Пизы и пользуюсь Linux c 1994 года. Сейчас я занимаюсь администрированием Linux-станций в астрономическом отделении физфака, где особенно много работаю над проблемами безопасности. Мой главный почтовый адрес - это [email protected].


Copyright © 2001, Matteo Dell'Omodarme.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 68 of Linux Gazette, July 2001

Вернуться на главную страницу