Так как файловая система старается работать как можно более асинхронно для того, чтобы избегать узких мест при обращении к диску, то неожиданное прерывание работы файловой системы может привести к потере данных. В качестве иллюстрации можно привести следующую ситуацию: что произойдет, если ваша машина "упала" в то время, когда вы работали с документом, расположенным в стандартной для 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
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 - это нужный размер журнала в Мб). - Обновление существующей файловый системы ext2 до ext3. Просто запустите tune2fs:
tune2fs -j /dev/xxx
Это можно проделывать либо на смонтированной, либо на несмонтированной файловой системе. Если файловая система смонтирована, то в корне файловой системы создается файл .journal; если же нет - то скрытый inode (блок данных с информацией о файле) используется для журнала. Таким образом, все происходит без какого-то риска для жизни существующих на файловых системах данных.
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. Из этого каталога скачайте:
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 (лично я это обязательно сделаю).