Крис Касперски
Командной строке посвящается…
UFS – это основная файловая система для BSD-систем, устанавливаемая по
умолчанию. Многие коммерческие UNIX также используют либо саму UFS, либо нечто
очень на нее похожее. В противоположность ext2fs, исхоженной вдоль и поперек,
UFS крайне поверхностно описана в доступной литературе и единственным
источником информации становятся исходные тексты, в которых не так-то просто
разобраться! Существует множество утилит, восстанавливающих уничтоженные данные
(или во всяком случае пытающихся это делать), но на поверку все они оказываются
неработоспособными. Эта статья описывает основные структуры файловой системы и рассказывает
как восстанавливать данные вручную.
Немного истории
UFS ведет свою историю от S5 FS – самой первой файловой системы,
написанной для UNIX в далеком 1974 году. S5 FS была крайне простой и
неповоротливой (по некоторым данным, средняя производительность FS составляла
всего лишь 2%-5% от «сырой» производительности жесткого диска), но понятия суперблока
(super-block), файловых записей (inodes) и блоков данных (blocks) в ней уже
существовали.
В процессе работы над дистрибутивом 4.2 BSD,
вышедшим в 1983 году, S5 FS претерпела некоторые улучшения. Были
добавлены длинные имена, символические ссылки и т. д. Так родилась UFS.
В 4.3 BSD, увидевшей свет уже в 1984 году,
улучшения носили намного более радикальный, если не сказать революционный,
характер. Появились концепции фрагментов (fragments) и групп цилиндров (cylinder
groups). Быстродействие файловой системы существенно возросло, что и определило
ее название FFS – Fast File System (быстрая файловая система).
Все последующие версии линейки 4.x BSD
прошли под знаменем FFS, но в 5.x BSD файловая система вновь изменилась.
Для поддержки дисков большого объема ширину всех адресных полей пришлось
удвоить: 32-битная нумерация фрагментов уступила место 64-битной. Были внесены
и другие менее существенные усовершенствования.
Фактически мы имеем дело с тремя различными
файловыми системами, не совместимыми друг с другом на уровне базовых структур
данных, однако, некоторые источники склонны рассматривать FFS как надстройку
над UFS. «UFS (and UFS2) define on-disk data layout. FFS sits on top of UFS (1 or
2) and provides directory structure information, and a variety of disk access optimizations»
говорит «Little UFS2 FAQ» (UFS/UFS2 определяет раскладку данных на диске. FFS
реализована поверх UFS 1 или 2 и отвечает за структуру директорий и некоторые
оптимизации доступа к диску). Если заглянуть в исходные тексты файловой
системы, действительно, можно обнаружить два подкаталога – /ufs и /ffs. В /ffs
находится определение суперблока (базовой структуры, отвечающей за раскладку
данных), а в /ufs – определение inode и структуры директорий, что опровергает
данный тезис, с позиций которого все должно быть с точностью до наоборот.
Чтобы не увязнуть в болоте терминологических
тонкостей, под UFS мы будем понимать основную файловую систему 4.5 BSD, а
под UFS2 – основную файловую систему 5.х BSD.