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


Глоссарий

chunk - кусок файловой системы, btrfs размечает не диск, а chunk'и внутри раздела. leaf - леана, ветка метаданных, inode, в её пишутся метаданные описывающие содержание chunk'ов и мелкие файлы. лист - кусок чанка или сам чанк, туда пишутся данные.

Из ext* в btrfs

Эта статья помечена как незаконченная.

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

Программа преобразования использует libe2fs для чтения метаданных Ext3, и использует свободные блоки в ней для помещения в них новую файловую систему Btrfs. Основной алгоритм преобразования работает так:

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

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

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

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

Пока снапшот не удален, для хранения новых модификаций Btrfs могут использоваться только те блоки, которые были помечены в Ext3 как свободные. Это означает, что преобразование может быть отменено когда угодно в любое время, с восстановлением исходной файловой системы Ext3. Конвертер создает отдельный файл, содержащий все ссылки на исходную файловую систему Ext3, и смещения в этом файле соответствуют смещениям на блочном устройстве. Это позволяет администратору монтировать этот файл как loopback-устройство в режиме read only и видеть исходную файловую систему Ext3 и преобразованную файловую систему Btrfs одновременно. (Если раздел не системный, если системный то грузимся с LiveCD и это будет описано ниже). ххх заменить на необходимый раздел Пример использования:

# Сначала запустить fsck
fsck.ext3 -f /dev/xxx

# Преобразование из Ext3 в Btrfs
btrfs-convert /dev/xxx

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

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

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

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

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

# Монтирование исходной файловой системы
mount -t ext3 /dev/xxx /ext3
Если вы хотите освободить место, занятое исходной файловой системой Ext3 и сделать преобразование постоянным, просто удалите файл /ext2_saved/image. После удаления файла образа диск будет выглядеть примерно так →

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

Делаем аналогично, я буду вести вас за руку, делаю на примере моего опыта преобразования раздела /home и прикручивания его на месте. Общий план действий, мы установили ubuntu 12.10, корень изначально отформатирован в btrfs, вот fstab:

 #        <file system>                  <mount point>    <type>   <options>          <dump>  <pass> 
 # / was on /dev/sda3 during installation 
 UUID=d094dfa1-3114-41d0-86da-5e3d91a75a35 /               btrfs   defaults,subvol=@  0       1  #корень / 
 #
 # /boot was on /dev/sda2 during installation 
 UUID=d9e3ccbf-9281-4322-ab39-f3b590b41c1a /boot           ext4    defaults           0       2 #раздел /boot обязательно отдельно и не btrfs
 #
 # /boot/efi was on /dev/sda1 during installation
 UUID=EECD-EEE1                            /boot/efi       vfat    defaults           0       1   
 #Efi потому что - [[wiki:установка_дистрибутива_на_компьютер_с_efi|Установка дистрибутива на компьютер с efi]]
 #
 # /home was on /dev/sda5 during installation
 UUID=34a5d56c-f6b3-46bb-b5f6-8b6cc15e4da3 /home           ext4   defaults            0       2
 #
 # swap was on /dev/sda4 during installation 
 UUID=eec9a7be-672b-4720-acef-70f5bd6df0c4 none            swap    sw                 0       0

Вот отличненько, первое это приводим в порядок корневой раздел, переделываем его вот в это(инфа о параметрах тут):

 # / was on /dev/sda3 during installation
 UUID=d094dfa1-3114-41d0-86da-5e3d91a75a35 /               btrfs   defaults,subvol=@,compress,autodefrag  0 0

Перезагружаем, смотрим что вышло. Запустилась? отлично, значит всё хорошо. Загружаемся с любого LiveCD образа. Инструкция составлена для преобразования раздела /home при схеме разметки как выше, в вашем случае может понадобиться изменить имена разделов

Сначала запустить fsck #Проверим диск на наличие ошибок
fsck.ext4 -f /dev/sda5 #ext4 т.к. раздел home выше отформатирован в её.

#Преобразование из Ext* в Btrfs
btrfs-convert /dev/sda5 #Он долго и упорно будет сканировать метадаты, у меня процесс конвертации длился больше получаса (300GB/500GB).
                        #Не трогаем не выдергиваем ждём завершения.
                        
#Новоиспеченную btrfs можно смонтировать через наутилус и проверить наличие папок ext2_saved и папку пользователя(вашу)
#Узнаем новый адресс раздела с home
sudo blkid
#ищем строку с нашим разделом, вот и она:
/dev/sda5: UUID="baa5d56c-f6b3-46bb-b5f6-8b6cc15e4da3" UUID_SUB="eaebe91a-5797-44d9-bc74-312316e7dbe6" TYPE="btrfs"

Теперь надо исправить неправильный адрес home в fstab. Открываем наутилус, примонтируем раздел с корнем.

sudo gedit

открываем корень, затем run → media → ищем среди подключенных дисков корневой раздел, открываем там будет папка «@», переходим etc → fstab
Отлично, находим строку с нашим разделом 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,compress,autodefrag    0 0

Перезагружаемая, если всё сделано правильно, оно загрузиться. В крайнем случае [который не должен наступить] по вышестоящей инструкции можно вернуть ext* на место.

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

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

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

Ссылки