Утилита btrfs позволяет манипулировать файловыми системами («btrfs help —full»)
btrfs versionbtrfs help [—full]btrfs device scan [—all-devices] [устройство…]# кеширование информации о файловых системах btrfs, выполнять перед монтированием многодисковых файловых систем; рекомендуется запускать в initrdbtrfs device add [—nodiscard] [—force] блочное-устройство … точка-монтирования # добавить устройство (устройства) к файловой системеbtrfs device delete блочное-устройство … точка-монтирования # отнять устройство (устройства) у файловой системы, используемые блоки перемещаются на оставшиеся устройстваbtrfs device delete missing точка-монтирования # вывести сбоящее устройство из файловой системы; возможно, что придётся монтировать с опцией degraded и добавлять новой устройствоbtrfs device ready устройство # проверить, что все составлющие файловую систему устройства в наличииbtrfs device stats [-z] устройство-или-путь # вывести или сбросить счётчики ошибок (ядро 3.5)btrfs device usage [—iec|—si|—raw| [-k|-m|-g|-t] устройство # более подробная информация об используемом месте, утилита 3.18btrfs filesystem show [—mounted | —all-devices | блочное-устройство | UUID | метка | путь] # информация о файловых системах btrfs: метка, UUID, занятое место, имеющееся и занятое место на каждом блочном устройствеbtrfs filesystem df [—iec|—si|—raw| [-k|-m|-g|-t] точка-монтирования (выводит тип дублирования данных, имеющееся и занятое место для данных, метаданных и системы (?))btrfs filesystem usage [—iec|—si|—raw| [-k|-m|-g|-t] точка-монтирования (более подробная информация об используемом месте, утилита 3.18)btrfs filesystem sync точка-монтирования # синхронизировать копии данных и метаданных, судя по скорости — заглушкаbtrfs filesystem defragment [ключи] имя-файла … (дефрагментирование [и сжатие]; не прерывается? лучше не запускать на устройстве, близком к заполнению); ключи:
-v # болтливость-r # рекурсивно, иначе только файлы в каталоге, но не каталоги-c[zlib|lzo] # безусловное сжатие, указание типа в следующей версии-f # не откладывать запись на диск и синхронизацию копий-s начало-дефрагментируемого-участка-l длина-дефрагментируемого-участка-t байт # если все сегменты больше указанного числа, то файл считается дефрагментированным
btrfs filesystem resize [устройство:][+|-]размер{k|m|g}|max путь # изменение размера смонтированной фаловой системыbtrfs filesystem label раздел-или-путь [новая-метка] # ядро 3.9btrfs scrub {start раздел-или-путь | status | cancel раздел-или-путь | resume раздел-или-путь} # чтение всех данных с проверкой контрольных сумм смонтированной файловой системы, ядро 3.0, приоритет idle с ядра 3.5; 2.3 GB/sec (stripe (raid0) над двумя RAID-6 по 18 SAS LFF дисков 4TB 7200rpm на LSI MegaRAID SAS 9266-8i + SSD cache; два одновременно запускать не надо (вымывание кеша)); ключи запуска:
-c класс-ввода/вывода -n параметр # см. ionice; по умолчанию — класс idle-B # не уходить в фоновый режим и вывести статистику по завершению-d # отдельная статистика для каждого устройства-q # без статистики-r # без попыток исправить-R # много информации-f # запускать даже если имеется запись об уже запущенной задаче
btrfs balance {start | cancel | pause | resume | status} точка-монтирования # перераспределение экстентов по кускам и устройствам после добавления или удаления устройств или смена профиля RAID (ядро 3.3); без размонтирования; не имеет отношения к балансировке дерева, сжатию и пр.; выглядит странно — только запись (100 МБ/сек, убийца SSD), полчаса (2 часа при следующем запуске) на гигабайтный чанк метаданных; resume — не с теми параметрами, с которыми запускал; ключи:
-v # вывод в syslog-d[фильтры] # только блоки данных в соответствии с фильтрами-m[фильтры] # только блоки метаданных в соответствии с фильтрами-s[фильтры] # только системные блоки в соответствии с фильтрами-f # разрешить уменьшить количество копий метаданных
фильтры (через запятую):
raid0 | raid1 | raid10 | raid5 | raid6 | dup | singleusage=проценты # участвуют только группы, заполненные менее чемdevid=идентификатор-устройстваdrange=начало..конецconvert={raid0 | raid1 | raid10 | raid5 | raid6 | dup | single}soft # не конвертировать блоки, которые уже в нужном состоянииlimit # ?
btrfs replace {start исходное-устройство-или-номер заменяющее-устройство точка-монтирования | status [-1] точка-монтирования | cancel точка-монтирования} # ядро 3.8, замена устройства без размонтирования, если исходное устройство недоступно, то использовать резервные копии, ключи:
-r # по возможности не обращаться к исходному устройству-f # затирать заменяющее устройство даже если там что-то обнаружено-B # не уходить в фоновый режим
btrfs subvolume create [-i идентификатор-группы-квотирования] [каталог/]имя-подтома # по умолчанию в текущем каталогеbtrfs subvolume delete {—commit-after | —commit-each} подтом … # команда без ключей ожидания завершается очень быстро, но место освобождается очень постепенно (при указании ключей ожидания всё равно не дожидается освобождения места), при этом размонтировать файловую систему (т.е. корректно перезагрузиться) невозможноbtrfs subvolume sync путь [идентификатор-подтома] # ждать завершения удаленияbtrfs subvolume snapshot [-i идентификатор-группы-квотирования] [-r] точка-монтирования-подтома точка-монтирования-подтома/[каталог/]имя-снимка # -r: только чтениеbtrfs subvolume list [опции] [—sort=[+|-]{rootid|gen|ogen|path}] путь-файловой-системы # вывести список подтомов и снимков (идентификатор тома для монтирования, номер поколения, идентификатора тома верхнего уровня, относительный путь), опции:
-p # выводить идентификатора тома верхнего уровня-a # выводить все подтома (?)-c # выводить номер поколения в момент создания (нет в RHEL 6)-C [+|-]поколение # фильтровать выводимый список по поколению в момент создания (в RHEL 6: -c)-g # выводить номер поколениия (нет в RHEL 6)-G [+|-]поколение # фильтровать выводимый список по поколению (в RHEL 6: -g)-t # выводить в табличном формате-s # выводить только снимки-r # выводить только тома, закрытые для записи-u # выводить UUID-q # выводить UUID тома верхнего уровня
btrfs subvolume show путь # вывести информацию о томе или снимке: имя, uuid, uuid тома верхнего уровня, время создания, идентификатор, поколение создания, поколение последнего изменения, идентификатор тома верхнего уровня, флаги, снимкиbtrfs subvolume set-default идентификатор точка-монтирования-подтома-или-снимка # монтировать этот подтом или снимок по умолчаниюbtrfs subvolume get-default путь-к-файловой-системе # вывести точку монтирования по умолчанию
btrfs subvolume find-new под-том поколение # вывод списка экстентов файлов, изменённых после указанного поколения (inode, смещение, длина, адрес на диске, пколение, флаги (COMPRESS,INLINE), имя файла); например, получение разницы между снимками (без удалений, переименований и прочих мелочей)OLD_TRANSID=`btrfs subvolume find-new «$SNAPSHOT_OLD» 9999999`OLD_TRANSID=${OLD_TRANSID#transid marker was }btrfs subvolume find-new «$SNAPSHOT_NEW» $OLD_TRANSID | sed ‘$d’ | cut -f17- -d’ ‘ | sort | uniq
btrfs send подтом | ssh хост btrfs receive точка-монтирования # пересылка подтома, ядро 3.6, подтом должен быть только для чтения, подтом должен отсутствовать на приёмном конце, нельзя вносить локальных изменений на приёмном конце, подтом на прииёмном конце закрывается от изменений после пересылки; данные пересылаются в несжатом виде (разжимаются — пересылаются — сжимаются); пересылаются не только данные, но и команды создания, удаления, переименования, изменения атрибутов и т.д., ключи:
-v[v]-e # новый формат (ядро 3.10)-p том-верхнего-уровня # посылаются только изменения между томом верхнего уровня и подтомом, можно опустить, если возможно определить по опорному снимку-c снимок # опорный снимок, если одинаковы на обоих концах, то вместо пересылки и записи будут использованы данные из опорных снимков; может быть опущен и определён автоматически-f имя-файла-хранения—max-errors 1
btrfs qgroup # настройки групп квотирования, ядро 3.6:
create идентификатор-группы-квотирования путьdestroy идентификатор-группы-квотирования путьassign подгруппа группа путьremove подгруппа группа путьshow путьlimit {размер|none} [идентификатор-группы-квотирования] путь
btrfs quota {enable подтом|disable подтом|rescan подтом} # запуск/останов квотирования; размер уже имевшихся данных не учитывается без rescan; rescan в ядре 3.10}btrfs rescue {chunk-recover | super-recover} [-y] [-v] [-h] устройство # восстановить дерево кусков или суперблокbtrfs inspect-internal inode-resolve [-v] номер путь # определить имя файла по inodebtrfs inspect-internal logical-resolve [-v] [-P] [-s размер-результата] логический-адрес путь # определить имя файла или inode (-P) по логическому адресуbtrfs inspect-internal subvolid-resolve идентификатор путь # определить имя каталога по идентификатору подтомаbtrfs inspect-internal rootid путь # определить идентификатор подтома по путиbtrfs restore устройство каталог # восстановить файлы из размонтированной файловой системы в указанный каталог, ключи
-s # восстанавливать снимки-x # восстанавливать расширенные атрибуты-v-i # игнорировать ошибки-o # затирать файлы в указанном каталоге-t байт # явное указание корня дерева-f байт # явное указание начала файловой системы-u номер-суперблока # 0, 1, 2-r идентификатор-корня-d # ?-l # вывести список корней—dry-run—path-regex регулярное-выражение [-c] # восстанавливать файлы, подпадающие под шаблон
btrfs check [ключи] устройство # вызов btrfsck при размонтированной файловой системе; предварительно рекомендуется испробовать scrub, монтирование с ro,recovery, btrfs-zero-log, btrfs restore; ключи
—super номер-копии—backup # использовать резервную копию корня—tree-root байт # явное указание смещения корня—init-csum-tree—init-extent-tree—check-data-csum # долго—qgroup-report
—repair # попытаться восстановить, каталог lost+found; (попытка починить файловую систему (из 26ТБ занято 13ТБ данных и 110 ГБ метаданных): в версии утилиты 3.12 насосал 75GB ОП, показал миллион ошибок и был убит после 30 часов ЦП; версия утилиты 3.18.1 поправила только кеш оставшегося места, потребовала 30 ГБ ОП; в версии утилиты 3.19.1 насосал 180GB ОП (раздел 58ТБ) и был убит oom-killer (быстро за счёт lvmcache)/usr/local/bin/btrfsck —repair —check-data-csum /dev/mapper/good-x136fullenabling repair modeChecking filesystem on /dev/mapper/good-x136fullUUID: e984c6f1-431d-47cf-9da2-9c4d36335837checking extents # читая по 7 МБ/сек до 10 ГБ, затем чтение пошло по 70 МБ/секFixed 0 roots.checking free space cachecache and super generation don’t match, space cache will be invalidatedchecking fs roots # полчаса без чтения, ЦП — 100%, чтение 7 МБ/сек до 30 ГБ ОПchecking csums # чтение 300 ГБ/сек, молча 12 часовchecking root refsfound 1380129128119 bytes used err is 0total csum bytes: 13207991564total tree bytes: 116377309184total fs tree bytes: 79296180224total extent tree bytes: 22198173696btree space waste bytes: 13680619315file data blocks allocated: 13633639153664 referenced 33725318455296Btrfs v3.18.1
btrfs property get [-t subvol|filesystem|inode|device] объект [имя-свойства] # в качестве объекта можно указать файловую систему (ro, label, compression), подтом или снимок(ro, compression), inode (compression, указать имя файла), устройство (не получается указать); свойство compression в RHEL 7.0 не выдаётсяbtrfs property list [-t subvol|filesystem|inode|device] объектbtrfs property set [-t subvol|filesystem|inode|device] объект имя-свойства значение # файловая система действительно переводится в режим только чтение и обратно
Сборка и установка утилит btrfs 3.18.1 из исходных пакетов в CentOS 7.0:
установить пакеты kernel-devel, libblkid-devel, libuuid-develwget ftp://ftp.pbone.net/mirror/download.fedora.redhat.com/pub/fedora/linux/updates/20/SRPMS/btrfs-progs-3.18.1-1.fc20.src.rpmrpm -iv /tmp/btrfs-progs-3.18.1-1.fc20.src.rpmyum install asciidoctar -xvf /root/rpmbuild/SOURCES/btrfs-progs-v3.18.1.tar.xzcd btrfs-progs-v3.18.1vim utils.c # /root/rpmbuild/SOURCES/btrfs-init-dev-list.patch
make installinstall -m755 -d /usr/local/bininstall mkfs.btrfs btrfs-debug-tree btrfsck btrfs btrfs-map-logical btrfs-image btrfs-zero-log btrfs-convert btrfs-find-root btrfstune btrfs-show-super /usr/local/bininstall fsck.btrfs /usr/local/bin# btrfsck is a link to btrfs in the src tree, make it so for installed file as wellln -f /usr/local/bin/btrfs /usr/local/bin/btrfsckinstall -m755 -d /usr/local/libinstall libbtrfs.so.0.1 libbtrfs.a /usr/local/libcp -a libbtrfs.so.0 libbtrfs.so /usr/local/libinstall -m755 -d /usr/local/include/btrfsinstall -m644 send-stream.h send-utils.h send.h rbtree.h btrfs-list.h crc32c.h list.h kerncompat.h radix-tree.h extent-cache.h extent_io.h ioctl.h ctree.h btrfsck.h version.h /usr/local/include/btrfs
/usr/local/bin/btrfs —versionBtrfs v3.18.1
Сборка утилит btrfs из git:
установить пакеты kernel-devel, libblkid-devel, libuuid-develgit clone git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-progs.gitcd btrfs-progsmakemake btrfs-select-supermake btrfs-zero-log
btrfs-convert — преобразоватие файловой системы ext2/ext3/ext4 в btrfs на месте.btrfs-debug-tree — вывод дерева метаданных на stdout («-r» выдаёт список подтомов, снимков и т.д.).btrfs-find-root — поиск (медленно) и вывод корней деревьев (фильтр по уровню, поколению).btrfs-image — сделать образ файловой системы с обнулёнными данными (сжать и отправить разработчикам для отладки).btrfs-map-logical — физический адрес по логическому (для отладки).btrfs-show-super — вывести информацию из суперблока (метка, поколение, корень, флаги, размеры блоков и т.д.).btrfstune — поменять некоторые параметры файловой системы, опрометчиво заданные при создании.btrfs-zero-log — очистить попорченное дерево журналов, если не получается смонтировать файловую систему (актуальность утеряна).