Это старая версия документа.


Из ext* в btrfs

Btrfs содержит очень мало метаданных, которые имеют фиксированное положение, что делает относительно лёгкой разработку утилит преобразования в неё из других файловых систем. Алгоритм Copy on write позволяют btrfs сохранять неизмененную копию исходной файловой системы, а администратору позволяют отменить преобразование, даже после выполнения изменений в итоговой файловой системе btrfs (откат происходит без учета изменений в btrfs, т.е. к тому моменту когда было запущено преобразование).

Программа преобразования btrfs-convert использует libe2fs для чтения метаданных ext2-3-4 (далее для простоты ext*), и использует свободные блоки файловой системы для помещения в них метаданных новой файловой системы btrfs. Алгоритм преобразования работает так:

  1. дублируется первый 1 Мбайт устройства на свободное место;
  2. создает копии каталогов и inodes в структуре метаданных btrfs (также в свободных областях старой файловой системы);
  3. в новых inode создаются ссылки на блоки данных файлов ext*.

Таким образом создается новая структура метаданных btrfs, которая дублирует метаданные ext*, но данные файлов не дублируются на них ссылаются обе структуры метаданных. Это разделяет большую часть блоков между этими двумя файловыми системами. Поскольку btrfs использует Copy on write для всех модификаций файлов, оригинальная версии блоков данных файлов ext* сохраняются без изменений.

Первый 1 МБ устройства копируется в альтернативную область для того, чтобы в него могли быть записаны метаданные btrfs. Отмена преобразования заключается просто в восстановлении этих блоков.

Результат преобразования выглядит примерно так:

Программа конвертирования создает в btrfs снапшот со ссылками на все блоки, используемые ext*, позволяя администратору определять время, в течение которого будет сохраняться оригинальная файловая система ext*. Если администратор захочет освободить место, занимаемое реликтами ext*, снапошот можно удалить, после чего преобразование станет необратимым.

Пока снапшот ext* не удален, для хранения новых и сохранения модифицированных файлов/каталогов btrfs использует только те блоки, которые были помечены в ext* как свободные. Это означает, что преобразование может быть отменено когда угодно в любое время, с восстановлением исходной файловой системы ext*. Конвертер создает отдельный файл, содержащий все ссылки на исходную файловую систему ext*, и смещения в этом файле соответствуют смещениям на блочном устройстве. Это позволяет монтировать этот файл как loopback-устройство в режиме read only и видеть исходную файловую систему ext* одновременно с работой в файловой системой btrfs.

Пример конвертирования ext3

В примере предполагается, что вы работаете с несмонтированным разделом, если нужно преобразовать корневую файловую систему, то загрузитесь с LiveCd/USB для выполнения этих действий.
/dev/sdX в командах нужно заменить на реальное имя устройства с которым вы выполняете операции):

# Сначала проверьте целостность файловой системы ext3
fsck.ext3 -f /dev/sdX

# Преобразование ext3 в btrfs
btrfs-convert /dev/sdX

# Монтирование новообразованной файловой системы btrfs
mount -t btrfs /dev/sdX /btrfs

# Монтирование снапшота ext3
mount -t btrfs -o subvol=ext2_saved /dev/sdX /ext2_saved

# Монтирование файла образа как loopback-устройства
mount -t ext3 -o loop,ro /ext2_saved/image /ext3
В приведённом выше примере файлы в /ext3 и в /btrfs будут идентичны. Любые модификации, выполненные в /btrfs, не будут видны в /ext3. Обратное преобразование делается так:

# Отмонтируем все элементы файловой системы смонтированные ранее
unmount /ext3
unmount /ext2_saved
unmount /btrfs

# Обратное преобразование
btrfs-convert -r /dev/sdX

# Монтирование исходной файловой системы
mount -t ext3 /dev/sdX /ext3

Если вы хотите освободить место, занятое снимком исходной файловой системой ext3 (т.е. вы решили, что уже не нужно обратное преобразование), просто удалите файл /ext2_saved/image. После удаления файла образа диск будет выглядеть примерно так →

Инструкция преобразование ext4 в btrfs

Делаем на примере преобразования вынесенного в отдельный раздел /home. Для этого мы перезагружаемся с LiveCD/USB и монтируем нашу корневую систему (она нам поребуется для редактирования fstab). Запись о /home в установленной системы fstab выглядит примерно так так:

 
 # /home was on /dev/sda5 during installation
 UUID=34a5d56c-f6b3-46bb-b5f6-8b6cc15e4da3 /home           ext4   defaults            0       2

Для начала проверим файловую систему /home на наличие ошибок:

fsck.ext4 -f /dev/sda5  # ext4 т.к. раздел home выше отформатирован в её.

Преобразование из ext4 в btrfs

btrfs-convert /dev/sda5 # Он долго и упорно будет сканировать метаданные и копировать их, процесс конвертации может длиться очень долго.
                        # Не трогаем не выдергиваем ждём завершения.
                        

Новоиспеченную btrfs можно смонтировать и проверить наличие папок ext2_saved и папку пользователя (вашу).

Теперь нужно внести правки в fstab, но сначала нужно узнать новый идентификатор раздела с home:

sudo blkid
# ищем строку с нашим разделом, вот и она:
/dev/sda5: UUID="baa5d56c-f6b3-46bb-b5f6-8b6cc15e4da3" UUID_SUB="eaebe91a-5797-44d9-bc74-312316e7dbe6" TYPE="btrfs"

Теперь надо исправить тип файловой системы и UUID home раздела в fstab. Для этого откройте fstab в любом редакторе с правами root пользователя. Находим строку с нашим разделом home:

#/home was on /dev/sda5 during installation
 UUID=34a5d56c-f6b3-46bb-b5f6-8b6cc15e4da3 /home           ext4   defaults            0       2

Теперь заменяем старый UUID «34a5d56c-f6b3-46bb-b5f6-8b6cc15e4da3», на новый «baa5d56c-f6b3-46bb-b5f6-8b6cc15e4da3», меняем тип файловой системы с ext4 на btrfs, должна получиться примерно такая строка :

#/home was on /dev/sda5 during installation
UUID=baa5d56c-f6b3-46bb-b5f6-8b6cc15e4da3 /home           btrfs   defaults    0    2

Перегружаемся в основную систему, если всё сделано правильно, то вы не заметите никаких изменений. В крайнем случае [который не должен наступить] можно вернуть ext4 на место (выполнив обратное преобразование и вернув стрый UUID и тип файловой системы в строке монтирования /home в fstab).

Подчистка за конвертером

Если переход на btrfs состоялся окончательно и вы уже не планируете возвращать старую фс - то не забудьте подчистить за конвертером:

  1. Удалите подраздел со снимком ext*: btrfs subvolume delete ext2_saved
  2. Удалите системный каталог ext* lost+found (он вам больше не нужен)
  3. Проведите дефрагментацию: btrfs filesystem defragment /
  4. Выполните балансировку: btrfs balance start /

Ссылки