Btrfs: поговорим о конверсии

Алексей Федорчук

Одна из уникальных особенностей btrfs — возможность конвертации в неё иной файловой системы без потери данных. Конечно, все мы знаем о том, что etx2fs можно безболезненно преобразовать в ext3fs. Но — лишь потому, что в внутренне это одна и та же файловая система, лишь с добавлением журнала. Уже в случае с ext4fs — косметическим костылём для линии ext* — конвертация оказывается невозможной, по крайней мере на современном этапе развития социализма… пардон, файловых систем. О том, чтобы преобразовать reiserfs, XFS, JFS во что угодно более иное (и наоборот), я не слышал даже разговоров.

Поэтому заявление о возможности конвертации ext2/ext3 в btrfs я поначалу воспринял несколько скептически. И скепсис мой сохранялся до момента детального знакомства ссоответствующей страницей  на сайте проекта. Из которой становится ясным механизм, каким путём это преобразование совершается.

В двух словах: утилита конвертации создаёт полную копию метаданных исходной файловой системы ext2/ext3, а блоки данных получают адресацию в нововооюразованной файловой системе btrfs. Новые же данные, записанные уже в btrfs, используют «пустые» блоки внутри бывшей ext2/ext3. Для чего, разумеется, эти блоки должны иметь место быть — то есть для целиком заполненной файловой системы конвертация, возможно, повлечёт ошибки; это голое предположение, основанное на общих соображениях, в реале я этого не проверял.

Благодаря этому возможен «откат» к предыдущему состоянию — то есть восстановление ext2/ext3 в её первозданном виде, с потерей всего, что было записано после конвертации. А можно, напротив, удалив файл образа ext2/ext3, сделать конверсию перманентной — без возможности «отката», но зато с высвобождением дискового пространства, занятого реликтами прежней файловой системы.

Столь замечательная возможность, разумеется, требовала экспериментальной проверки. Что я и не замедлил проделать — благо имелся подходящий кандидат для конверсии, раздел /home/soft, предназначенный для всякого рода программ, скачиваемых из сети и имеющий атрибуты доступа, аналогичные домашнему каталогу моего рабочего пользовательского аккаунта. С одной стороны, он достаточно интенсивно используется для создания должной нагрузки, с другой, содержимое его не представляет собой непреходящей ценности — всё, что скачано и потеряно, может быть перекачано заново.

Итак, имеем смонтированную (благодаря записи в /etc/fstab) в /home/soft файловую систему ext3 на устройстве /dev/sda7 — нетрудно догадаться, на логическом разделе в extended partition, что в значительной мере обесценивает преимущества btrfs; но, как сказал бы товарищ Сталин, другого устройства у меня не было.

Для начала вспоминаем, что конверсионная утилита не собирается по умолчанию при компиляции пакета btrfs-progs — эту процедуру надо выполнить отдельно. Отправляюсь в каталог с деревом исходников означенного пакета (см. одну из прежних заметок ) и даю команду

$ make convert

а затем, получив права root’а,

# make install convert

После этого просматриваю содержимое каталога на подлежащей отмонтированию файловой системе — дабы не забыть, с чем потом сравнивать:

$ ls -1 /home/soft/

каковое в тот момент выглядит следующим образом:

btrfs-progs-unstable/
linux-2.6.29-rc1.tar.bz2
lost+found/

Отмонтирую наличную файловую систему ext3:

# umount /home/soft

Затем, в соответствие с указаниями в документации, запускаю её проверку:

# fsck.ext3 -f /dev/sda7

где опция -f отвечает за принудительное восстановление «бита чистого размонтирования». В моём случае особой необходимости в такой процедуре не было — выполняю её чисто для порядка.

Теперь — собственно конверсия:

# btrfs-convert /dev/sda7

и монтирование новобразованной файловой системы на прежнее место:

# mount -t btrfs /dev/sda7 /home/soft/

Просмотр содержимого каталога /home/soft/ показывает, что всё, что имело место быть там ранее, сохранилось, плюс добавился подкаталог ext2_saved/ с единственным файлом — image: это тот самый образ исходной файловой системы, который и позволит выполнить обратное преобразование в неё.

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

$ cp path2/any_file /home/soft/

и убеждаюсь в том, что он благополучно скопировался:

$ ls -1 /home/soft/
any_file
btrfs-progs-unstable/
ext2_saved/
linux-2.6.29-rc1.tar.bz2
lost+found/

Затем:

# umount /home/soft
# btrfs-convert -r /dev/sda7
rollback complete.
# mount /dev/sda7 /home/soft/

И теперь просмотр каталога /home/soft/ показывает полную идентичность его содержимого исходному: каталог ext2_saved/ и файл any_file исчезли без следа.

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

# kill -9 #_процесса

оказывается невозможным, как и корректно выйти из системы, что дело у меня закончилось Reset’ом и обнулением бывшего дважды конвертированного раздела посредством

# dd if=/dev/zero of=/dev/sda7

Так что поверьте на слово — лучше этого не делать: либо уж оставайтесь на btrfs, либо откатывайтесь на ext3 и обратно не приходите…

Для себя я в итоге избрал (после указанных проб и ошибок) первый вариант. Для увековечивания которого вписал в /etc/fstab строку:

/dev/sda7      /home/soft      btrfs    defaults,noatime 1   0

И на этом пока успокоился. Разумеется, интересен вопрос о конверсии в btrfs корневой файловой системы. Но об этом как-нибудь в другой раз.

Btrfs: поговорим о конверсии: 2 комментария

  1. > Так что поверьте на слово — лучше этого не делать: либо уж оставайтесь на btrfs,
    > либо откатывайтесь на ext3 и обратно не приходите…
    Вообще если так это баг.Если останется после объявления доделаным — разработчиков пинать и еще раз пинать :)

  2. Нет, я всетаки на btrfs останусь — как-то надежнее будет!

Обсуждение закрыто.