Как открыть btrfs в windows
Как читать тома btrfs на Windows изначально?
Мне нужен только доступ на чтение, а не запись байтов в файловой системе (моя система Linux приостановлено на диске).
Лучшим вариантом было бы иметь возможность экспортировать каталоги в виде архива tar, чтобы сохранить разрешения и атрибуты.
3 ответов
WinBtrfs
только потому, что эта тема появляется в Google, я хотел бы повторить ответ noctrex в рекомендации WinBtrfs (GitHub), экспериментальный драйвер Btrfs для Windows. среди других особенностей Он поддерживает:
вы можете подключить его только для чтения после установки, изменив записи реестра в в HKLM\система\CurrentControlSet на\сервисы\система Btrfs, и я нашел его очень стабильным (если немного медленным) даже с шестью смонтированными разделами Btrfs и очень частым читает с одного из них.
Он поддерживает запись на диск, но поскольку программное обеспечение все еще находится в разработке (и поставляется с важным отказом от ответственности, что «вы используете его на свой страх и риск. Я не несу ответственности за любой ущерб, который он может нанести вашей файловой системе. Не используйте этот драйвер, если у вас нет полных и обновленных резервных копий всех ваших данных»), вероятно, не рекомендуется монтировать его только для чтения. (К сожалению, по умолчанию он монтируется с включенной записью, поэтому вам нужно перейти в зарегистрируйте и измените это. В любом случае у вас обязательно должны быть резервные копии.)
Файловая система Btrfs
Операционная система Linux поддерживает достаточно широкий выбор файловых систем. В этой статье мы рассмотрим преимущества и недостатки использования файловой системы Btrfs
Содержание:
Что являет собой файловая система Btrfs?
Btrfs – это сравнительно новая файловая система для UNIX-подобных операционных систем, которая обладает многими современными функциями и в то же время обеспечивает высокую производительность.
Изначально файловая система Btrfs была разработана в качестве альтернативы ZFS. Все дело в том, что ZFS это разработка компании SunMicrosystems, соответственно она распространяется на проприетарной основе. Это противоречит философии Linux, которая предоставляется бесплатно. Кроме того, разработчики ставили перед собой цель преодолеть многие недостатки, которые присутствовали в файловых системах Linux, плюс управление Btrfs должно было быть максимально простым.
Первая версия файловой системы Btrfs появилась еще в 2007 году. Ее представила компания Oracle. Также, как и многие другие файловые системы Btrfs использовала адреса блоков данных для хранения информации. Однако структура метаданных, в которой хранились адреса блоков была организована в виде B-деревьев.
Но самым главным нововведением стало то, что теперь при внесении изменений в файлы пользователя – меняется не весь файл полностью, а только та часть, которая содержит изменения.
Использование B-деревьев позволило реализовать метод «копирования при записи», суть которого заключается в использовании общей копии блоков данных при чтении информации. Благодаря такому подходу сильно возрастает производительность файловой системы. В некоторых случаях скорость работы даже выше чем в Ext4. Кроме того, такая структура позволяет делать мгновенные снапшоты файловой системы практически без падения производительности.
На сегодняшний день файловая система Btrfs активно развивается и все чаще в интернете появляются новости о возможности использования Btrfs вместо Ext4 в новых дистрибутивах Linux. Это является причиной повышенного внимания к этой файловой системе как среди профессионалов, так и среди обычных пользователей Linux.
Возможности файловой системы Btrfs
Структура файловой системы Btrfs в виде B-деревьев позволила разработчикам внести целый ряд современных функций, которых нет, к примеру, в Ext4. Среди наиболее значимых можно выделить следующие:
1) Максимальный размер записываемого файла заметно вырос. Теперь он составляет 16 Экзабайт (вместо 1 Экзабайта в Ext4);
2) Возможность создавать снапшоты (снимки файловой системы) без потери производительности. Теперь пользователи могут создавать снапшоты для чтения или для записи;
3) Возможность провести проверку целостности файловой системы без ее размонтирования. В Btrfs проверка целостности производится при помощи нескольких команд;
4) Появился новый фоновый процесс, главной задачей которого является обнаружение и исправление ошибок. Этот же процесс автоматически производит дефрагментацию и дедупликацию данных;
5) Количиество inodes выделяется динамически. Это означает, что вы никогда не столкнетесь с ситуацией, когда у вас есть свободное пространство на диске, но вы не можете создать файл из-за отсутствия свободных inodes.
6) Использование контрольных сумм как для данных, так и для метаданных. Для их расчёта используется алгоритм crc32. Такой подход позволяет быстро определять повреждения блоков;
7) Btrfs полностью оптимизирована для установки и работы на SSD накопителях. Определение типа накопителя происходит автоматически и применяются соответствующие параметры файловой системы;
8) Появилась возможность внедрения сложных многодисковых конфигураций. То есть теперь вы можете создать некий аналог RAID 0, 1, 5, 6 или 10 используя возможности файловой системы. Уровни 5 и 6 пока что находятся на экспериментальной стадии. В будущем также планируется реализовать избыточность для отдельных файлов и папок.
9) Внедрена поддержка сжатия. Для этого используется Zlib и LZO;
10) Поддержка подтомов;
Разработчики приложили огромное количество усилий, что позволило им создать достаточно эффективную файловую систему, которая уже внедрена во многие дистрибутивы Linux, на экспериментальном уровне. Это может служить подтверждением тому, что в ближайшем будущем Btrfs будет использоваться в Linux на постоянной основе.
Структура файловой системы Btrfs
Структура файловой системы Btrfs немного отличается от структуры обычных файловых систем. Схематически она выглядит примерно следующим образом:
Эту схему следует рассматривать снизу-вверх. Сначала мы видим блоки памяти, которые выделила файловая система в соответствующем порядке. После этого они объединяются в некое логическое адресное пространство. То есть, на этом уровне каждому блоку присваивается адрес.
Затем, в ход идут метаданные и экстенты, адресация которых происходит уже на логическом уровне. На этом же уровне происходит реализация избыточности (аналог RAID 0, 1, 5, 6, 10).
Предпоследним уровнем являются субтома (Subvolumes). На этом уровне происходит инкапсуляция нижних слоев. Это дает возможность отображать данные в том виде, к какому мы все привыкли – файлы и папки.
На верхнем уровне находятся данные пользователя уже в обычном виде.
Более опытные пользователи могли заметить, что Btrfs не использует суперблок, и другие привычные всем элементы файловой системы. Все дело в том, что такая структура более эффективно использует дисковое свободное пространство накопителя и увеличивает производительность файловой системы.
Несмотря на все преимущества файловой системы Btrfs, недостатков у нее тоже немало. Об этом пойдет речь в следующем пункте этой статьи
Главные недостатки файловой системы Btrfs
Большинство преимуществ файловой системы Btrfs уже упоминались во втором пункте этой статьи в виде нововведений. Поэтому пересчитывать их второй раз — нет смысла. Мы же предлагаем рассмотреть главные недостатки Btrfs, которых тоже немало:
Несмотря на то, что плюсов заметно больше, чем минусов, мы рекомендуем тщательно все взвесить перед тем, как начать использовать ту или иную файловую систему. Это позволит избежать многих проблем в будущем.
Возможности восстановления файловой системы Btrfs
Во втором пункте этой статьи мы вскользь упоминали работу с субтомами и работу с метаданными. Давайте рассмотрим эти процессы более детально.
Начнем с того, что поскольку файловая структура Btrfs позволяет объединять несколько дисков в одно логическое пространство (некий аналог LVM) – это позволяет применять зеркалирование как для метаданных, так и для субтомов. Этот параметр настраивается при создании файловой системы.
Однако суть вот в чем: если пользователь настроил зеркалирование метаданных – в случае повреждения файла или структуры файловой системы, в качестве источника информации для восстановления будет взята одна из копий. Но самое главное, поскольку метаданные намного меньше по объему, нежели данные пользователя – производительность практически не падает.
Если в обычном RAID 1 массиве скорость записи будет в два раза ниже чем при записи на обычный диск, то в Btrfs вы практически не ощутите снижения скорости.
Помимо RAID 1 вы можете использовать все классические типы RAID массивов.
WS» и другие папки, которые можно удалить
Чтобы выбрать тип массива RAID для субтомов – прочтите статью «Что такое RAID массивы и как их использовать?» Там вы найдете много полезной информации по этому вопросу.
Еще одним важным моментом является использование контрольных сумм для данных пользователя и для метаданных. При чтении файла Btrfs постоянно их анализирует и в случае малейших несовпадений, при помощи одной из копий метаданных система автоматически восстановит информацию.
Таким образом, файловая система Btrfs позволяет эффективно выявлять скрытые повреждения и исправлять поврежденные файлы.
Как открыть накопитель Btrfs в Windows?
Нередко у пользователей Linux возникает необходимость открыть флэшку или съемный диск в операционной системе Windows — начиная от обычного копирования файлов и заканчивая более специфичными задачами. Но так или иначе, при подключении накопителя с файловой системой Btrfs вы увидите ошибку.
Все дело в том, что операционная система Windows по умолчанию может распознать только три типа файловых систем: NTFS, FAT (16, 32) и exFat. Все остальные она не понимает.
Однако есть несколько сравнительно простых способов как открыть Btrfs накопитель в Windows.
Первый (и наиболее правильный) способ заключается в использовании программы RS Partition Recovery. Вы просто устанавливаете программу и сразу же можете работать с Btrfs накопителем. Все предельно просто.
RS Partition Recovery очень проста в использовании и абсолютно не требовательна к ресурсам компьютера.
Но самое главное, RS Partition Recovery позволяет восстановить утерянные данные. Если вы случайно удалите важный файл или отформатируете накопитель – вы без проблем сможете вернуть важные данные.
На додачу, RS Partition Recovery поддерживает ВСЕ современные файловые системы, соответственно вы сможете отрыть в Windows практически любой накопитель. Независимо от типа файловой системы.
Все вышеперечисленные пункты делают программу RS Partition Recovery практически универсальным инструментом, который должен быть в арсенале каждого пользователя.
Второй способ заключается в установке специального драйвера, который обеспечит чтение файловой системы Btrfs. На сегодняшний день существуют два драйвера от разных производителей – WinBtrfs и Btrfs for Windows.
Оба этих драйвера работают, хоть и на небольшой скорости. Но самым главным недостатком этого способа является то, что нередко эти драйвера конфликтуют с драйверами устройств Windows.
Таким образом, достаточно часто вместо поддержки файловой системы Btrfs пользователи получают нерабочую Windows. Кроме того, нередко из-за конфликта драйверов система некорректно работает с Btrfs накопителем и данные повреждаются.
Также часто восстановить работоспособность системы получается только после полной переустановки Windows, что ведет к потере данных на диске С:\
Поэтому мы рекомендуем использовать первый способ, так как он более эффективен и безопасен.
Лучшие альтернативы файловой системе Btrfs?
Несмотря на то, что файловая система Btrfs обеспечивает высокую производительность и обладает всеми современными функциями, многие до сих пор боятся не хотят ее использовать, мотивируя это тем, что надежность гораздо важнее производительности.
Тут следует отметить, что на сегодняшний Btrfs достаточно надежна и уже добавлена во многие дистрибутивы Linux на тестовом уровне. Если этот довод вас не убедил – тогда лучшей альтернативой Btrfs для домашнего использования будет старая добрая Ext4.
Она проверена временем и все знают, чего от нее ожидать. Однако вам придется пожертвовать многими современными фичами. В том числе и некоторыми функциями безопасности, которые есть в Btrfs.
Если же речь идет об использовании на сервере – тогда лучшей альтернативой будет файловая система ZFS. Однако для ее использования вам придется изучить множество команд и утилит. В противном случае вы не сможете раскрыть весь ее потенциал и смысла в такой затее не будет.
Поэтому вы должны тщательно взвесить все варианты и выбрать вариант, который наиболее точно соответствует вашим требованиям.
Мы же надеемся, что смогли максимально облегчить вам выбор файловой системы для использования.
Как открыть btrfs в windows
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
WinBtrfs is a Windows driver for the next-generation Linux filesystem Btrfs. A reimplementation from scratch, it contains no code from the Linux kernel, and should work on any version from Windows XP onwards. It is also included as part of the free operating system ReactOS.
If your Btrfs filesystem is on a MD software RAID device created by Linux, you will also need WinMD to get this to appear under Windows.
See also Quibble, an experimental bootloader allowing Windows to boot from Btrfs, and Ntfs2btrfs, a tool which allows in-place conversion of NTFS filesystems.
First, a disclaimer:
You use this software at your own risk. I take no responsibility for any damage it may do to your filesystem. It ought to be suitable for day-to-day use, but make sure you take backups anyway.
Everything here is released under the GNU Lesser General Public Licence (LGPL); see the file LICENCE for more info. You are encouraged to play about with the source code as you will, and I’d appreciate a note (mark@harmstone.com) if you come up with anything nifty.
See at the end of this document for copyright details of third-party code that’s included here.
I’ve been developing this driver for fun, and in the hopes that someone out there will find it useful. But if you want to provide some pecuniary encouragement, it’d be very much appreciated:
To install the driver, download and extract the latest release, right-click btrfs.inf, and choose Install. The driver is signed, so should work out of the box on modern versions of Windows.
If you want to uninstall, from a command prompt run:
You may need to give the full path to btrfs.inf.
You can also go to Device Manager, find «Btrfs controller» under «Storage volumes», right click and choose «Uninstall». Tick the checkbox to uninstall the driver as well, and let Windows reboot itself.
If you need to uninstall via the registry, open regedit and set the value of HKLM\SYSTEM\CurrentControlSet\services\btrfs\Start to 4, to disable the service. After you reboot, you can then delete the btrfs key and remove C:\Windows\System32\drivers\btrfs.sys.
To compile with Visual C++ 2019, open the directory and let CMake do its thing. If you have the Windows DDK installed correctly, it should just work.
The user mappings are stored in the registry key HKLM\SYSTEM\CurrentControlSet\services\btrfs\Mappings. Create a DWORD with the name of your Windows SID (e.g. S-1-5-21-1379886684-2432464051-424789967-1001), and the value of your Linux uid (e.g. 1000). It will take effect next time the driver is loaded.
Similarly, the group mappings are stored in under GroupMappings. The default entry maps Windows’ Users group to gid 100, which is usually «users» on Linux. You can also specify user SIDs here to force files created by a user to belong to a certain group. The setgid flag also works as on Linux.
LXSS («Ubuntu on Windows» / «Windows Subsystem for Linux»)
The driver will passthrough Linux metadata to recent versions of LXSS, but you will have to let Windows know that you wish to do this. From a Bash prompt on Windows, edit /etc/wsl.conf to look like the following:
It will then take effect next time you reboot. Yes, you should be able to chroot into an actual Linux installation, if you wish.
The DLL file shellbtrfs.dll provides the GUI interface, but it can also be used with rundll32.exe to carry out some tasks from the command line, which may be useful if you wish to schedule something to run periodically.
Bear in mind that rundll32 provides no mechanism to return any error codes, so any of these commands may fail silently.
rundll32.exe shellbtrfs.dll,ReflinkCopy This also accepts wildcards, and any number of source files.
The following commands need various privileges, and so must be run as Administrator to work:
rundll32.exe shellbtrfs.dll,SendSubvol [-p
For the very latest versions of Windows 10, Microsoft introduced more onerous requirements for signing, which seemingly aren’t available for open-source drivers.
To work around this, go to HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CI\Policy in Regedit, create a new DWORD value called UpgradedSystem and set to 1, and reboot.
Or you could always just turn off Secure Boot in your BIOS settings.
With the shell extension installed, right-click the drive in Explorer, click Properties, and go to the Btrfs tab. There should be a button which allows you to change the drive letter.
Synology seems to use LVM for its block devices. Until somebody writes an LVM driver for Windows, you’re out of luck.
Thecus uses Linux’s MD raid for its block devices. You will need to install WinMD as well.
On very old versions of Windows (XP, Server 2003?), Windows ignores Linux partitions entirely. If this is the case for you, try running fdisk on Linux and changing your partition type from 83 to 7.
If you want to report a problem, it’d be of great help if you could also attach a full debug log. To do this, you will need to use the debug versions of the drivers; copy the files in Debug\x64 or Debug\x86 into x64 or x86. You will also need to set the registry entries in HKLM\SYSTEM\CurrentControlSet\Services\btrfs:
The driver will create subkeys in the registry under HKLM\SYSTEM\CurrentControlSet\Services\btrfs for each mounted filesystem, named after its UUID. If you’re unsure which UUID refers to which volume, you can check using btrfs fi show on Linux. You can add per-volume mount options to this subkey, which will take effect on reboot. If a value is set in the key above this, it will use this by default.
Ignore (DWORD): set this to 1 to tell the driver not to attempt loading this filesystem. With the Readonly flag, this is probably redundant.
Readonly (DWORD): set this to 1 to tell the driver not to allow writing to this volume. This is the equivalent of the ro flag on Linux.
Compress (DWORD): set this to 1 to tell the driver to write files as compressed by default. This is the equivalent of the compress flag on Linux.
CompressForce (DWORD): set this to 1 to force compression, i.e. to ignore the nocompress inode flag and even attempt compression of incompressible files. This isn’t a good idea, but is the equivalent of the compress-force flag on Linux.
CompressType (DWORD): set this to 1 to prefer zlib compression, 2 to prefer lzo compression, or 3 to prefer zstd compression. The default is 0, which uses zstd or lzo compression if the incompat flags are set, and zlib otherwise.
NoPNP (DWORD): useful for debugging only, this forces any volumes to appear rather than exposing them via the usual Plug and Play method.
ZstdLevel (DWORD): Zstd compression level, default 3.
NoTrim (DWORD): set this to 1 to disable TRIM support.
AllowDegraded (DWORD): set this to 1 to allow mounting a degraded volume, i.e. one with a device missing. You are strongly advised not to enable this unless you need to.
I’d appreciate any feedback you might have, positive or negative: mark@harmstone.com.
This code contains portions of the following software:
Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
This software is provided ‘as-is’, without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
WinBtrfs contains portions of an early version of lzo, which is copyright 1996 Markus Oberhumer. Modern versions are licensed under the GPL, but this was licensed under the LGPL, so I believe it is okay to use.
Copyright (c) 2016-present, Facebook, Inc. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
Neither the name Facebook nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS «AS IS» AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
BTRFS для самых маленьких
Доброго времени суток, Хабравчане. Я работаю в компании Veeam Software и являюсь одним из разработчиков нашего решения для бэкапа линукс систем. По роду занятий мне довелось столкнуться с BTRFS. Совсем недавно она перешла из статуса «еще не пригодно» в статус «стабильна». И пока её первые пользователи в сети обсуждали проблемные места и вопросы стабильности, мы в Veeam тыкали её палочкой и пытались бэкапить. Получалось, мягко говоря, не очень — слишком уж она другая, не похожая на традиционные файловые системы. Пришлось изучить немало аспектов и собрать множество граблей, прежде чем научились с ней работать. В процессе изучения BTRFS сумела произвести на меня впечатление как в хорошем смысле, так и не очень. Уверен, она не оставит равнодушным ни одного айтишника из мира линукс: одни будут плеваться, другие восхвалять.
Если вы слышали об этой файловой системе, но не знаете, зачем она, интересуетесь подробностями или ищете, с чего начать знакомство с ней — приглашаю под кат.
Введение
BTRFS (B-Tree Filesystem) — файловая система для Unix-подобных операционных систем, основанная на технике «Copy on Write» (CoW), призванная обеспечить легкость масштабирования файловой системы, высокую степень надежности и сохранности данных, гибкость настроек и легкость администрирования, сохраняя при этом высокую скорость работы. По крайней мере, так гласит главная вики-страничка.
Для соблюдения формальностей перечислим основные возможности btrfs:
Да, BTRFS — это молодая и современная файловая система, решающая широкий спектр задач, однако не без минусов:
Структура BTRFS
Упрощенно устройство BTRFS можно разбить на следующие уровни:
На самом низком уровне располагаются блочные устройства, представляя собой одно или несколько раздельных физических адресных пространств (таких же «физических», какими являются сами блочные устройства, но это уже детали). Посредством специальных структур аллоцированные блоки физической памяти объединяются в единое виртуальное адресное пространство.
Структуры метаданных и блоки с пользовательскими данными (экстенты) адресуются уже на логическом уровне. В результате данные, расположенные последовательно на логическом уровне, физически могут находиться на разных блочных устройствах.
Структуры метаданных можно условно разбить на уровни. Классифицировать я их, конечно, не буду — их много, и подобные низкоуровневые подробности — тема отдельной статьи. Здесь важно, что одни структуры в иерархии окажутся более высокоуровневыми, чем другие, а на самом верху окажется структура, представляющая собой сабвольюм.
Сабвольюмы — это своеобразные точки входа, или, правильнее, корневые элементы файловой системы. Они образуют отдельный слой представления данных, который инкапсулирует работу низших слоев, представляя пользовательские данные уже в привычном нам виде: директории и файлы. Кроме того, сабвольюмы являются ключевым элементом механизма CoW на BTRFS. Одинаковые файлы в двух сабвольюмах могут оказаться одним и тем же набором данных на нижележащих уровнях.
Последний слой — слой данных. Таких, какими видит их пользователь. Это файлы и директории, располагающиеся в сабвольюмах.
Но довольно теории. Пора переходить к практике!
Btrfs-progs
Это штатный комплект утилит для управления BTRFS. В зависимости от дистрибутива пакет с этими утилитами в репозитории может носить различные названия: btrfsprogs, btrfs-progs, btrfs-tools и т.п. Если же в вашем репозитарии ничего похожего не оказалось — всегда можно собрать вручную, исходники лежат недалеко — https://github.com/kdave/btrfs-progs.
Самые главные утилиты в данном пакете — это btrfs и mkfs.btrfs. Со второй, думаю, все предельно ясно — она необходима, чтобы создать BTRFS на блочном устройстве. Первая же, btrfs — это основная утилита, позволяющая делать все остальное. Этакий «швейцарский нож».
В этой статье я использовал версию v4.15.1. Утилита развивается очень активно, и от версии к версии бывают ощутимые различия. Так что если у вас не оказалось нужной команды, проверьте версию утилиты btrfs, возможно, она уже устарела.
Также, скорее всего, в пакете обнаружатся утилиты btrfsck и btrfstune.
Форматирование диска в BTRFS
На практике все проще. Начнем с одного диска.
Форматирование одного диска в btrfs происходит привычной командой:
В ответ утилита выведет в консоль параметры созданной файловой системы:
Пройдемся по представленным параметрам.
Кстати, проверить, какие возможности поддерживает текущее ядро, можно следующим вызовом:
Но есть нюанс… Немного иначе обстоят дела с твердотельными накопителями. Дело в том, что если бы мы размечали SSD диск (или флешку), то по умолчанию файловая система не стала бы дублировать метаданные. Твердотельные накопители для продления времени жизни элементов памяти могут производить дедупликацию данных. Т.е. имея две логические копии данных, по факту на носителе будет записана только одна. Как результат, при выходе сегмента памяти из строя повредятся «обе копии» данных. К тому же, записывая данные дважды, попросту быстрее расходуется ресурс SSD.
Для определения типа носителя btrfs проверяет контент файла /sys/block/DEV/queue/rotational, где «DEV» — имя проверяемого блочного устройства.
Разумеется, даже в случае SSD профиль хранения данных можно задать принудительно.
Чтобы создать инстанс btrfs на нескольких устройствах, достаточно указать их через пробел:
или же с указанием профилей:
Тут надо отметить, что носители не обязаны быть одинакового размера, даже если используется полное зеркалирование. Однако, как только на наименьшем из дисков не хватит места для выделения памяти — файловая система выдаст сообщение об отсутствии свободного пространства, хотя физически на другом носителе некоторое свободное пространство еще может оставаться.
Монтирование
Первое монтирование свежесозданной btrfs не отличается от других файловых систем:
В случае, если файловая система располагается на нескольких дисках, то для монтирования достаточно указать любой из них.
Корневой сабвольюм на btrfs присутствует всегда. Появляется он вместе с файловой системой и в дальнейшем не подлежит каким-либо изменениям.
Для монтирования любого другого сабвольюма, кроме дефолтного, существуют два способа:
указать путь от корневого сабвольюма btrfs:
либо указать ID сабвольюма:
Как уже упоминалось, один из сабвольюмов btrfs указан как монтируемый по умолчанию. Узнать, какой именно, можно, выполнив:
Установить сабвольюм, монтируемый по умолчанию, можно командой:
Путь до сабвольюма в данном случае нужен только для указания конкретного инстанса btrfs, к которому применяется команда. Кстати, это не обязательно должен быть сабвольюм, подойдет и путь до любой директории.
Команда mount принимает огромное количество опций для управления возможностями btrfs: дефрагментация, сброс кеша, сжатие, cow, логирование, баланс, поддержка ssd и еще вагон разных специфичных для btrfs вещей. Я не буду их рассматривать в рамках данной статьи, т.к. они нужны для тонкой настройки файловой системы, и в подавляющем большинстве случаев можно обойтись и без них.
Subvolume is
Сабвольюм — это ключевой элемент btrfs, исполняющий различные функции:
Создание и удаление сабвольюма производится на подмонтированной btrfs при помощи специальных команд:
Замечу, что если попытаться удалить сабвольюм средствами файлового менеджера или утилиты rm, то операция завершится с ошибкой operation not permitted (операция не разрешена).
UPD: Начиная с версии ядра 4.18.0 удаление сабвольюмов можно производить утилитой rm или средствами файлового менеджера. Видимо, это был баг, а не фича. Спасибо хабравчанину Prototik за уточнение.
После создания сабвольюма можно посмотреть его свойства:
Пройдемся по основным свойствам сабвольюма:
Если попытаться скопировать сабвольюм, например, утилитой cp, то операция копирования выполнится успешно, но в результате будет создан не сабвольюм, а обычная директория. Однако btrfs предоставляет гораздо более гибкий инструмент для создания подобных копий — снапшоты.
Snapshot is
Снапшот — это тоже сабвольюм, просто обладающий расширенными свойствами.
В этом случае файлы гарантировано останутся в том состоянии, в котором они пребывали на момент создания снапшота.
Флагом «только для чтения» так же можно управлять вручную, это работает для любого сабвольюма:
Если теперь заглянуть в свойства снапшота, то увидим заполненное поле Parent UUID:
Важной особенностью операции создания снапшота является то, что она нерекурсивна. Вместо вложенных сабвольюмов в снапшоте будут созданы пустые директории.
Обратимся к следующему примеру.
На файловой системе имеется сабвольюм «sub0», внутри которого расположен сабвольюм subA и директория dirB. Внутри каждого из них расположены fileA и fileB соответственно.
Созданный снапшот snap0 унаследует все файлы и директории своего родителя, однако, сабвольюм subA внутри снапшота не появится. Вместо него в снапшоте появится только пустая директория, т.е. содержимое сабвольюма subA унаследовано не будет.
С одной стороны, это хорошо — мы снимаем снапшот с конкретного сабвольюма, и все вложенные нас не интересуют. С другой стороны — в случае, если требуется рекурсивный снапшот, то у btrfs нет решения данной задачи. Придется искать воркэраунды.
Первый обходной путь основывается на том, что снапшот был снят без флага «только для чтения», что позволяет исправить ситуацию достаточно просто:
Если же снапшот был снят с флагом «только для чтения», то приведенный вариант не сработает, т.к. в snap0 нельзя ни удалить директорию, ни разместить снапшот. Тут вариант только один — размещать снапшоты где-то рядом с сабвольюмом snap0:
а затем монтировать snapA внутрь снапшота snap0, директория для этого уже имеется:
В любом случае важно понимать, что рекурсивные снапшоты все будут сняты в рамках разных операций, в разное время. Ни о каком атомарном снятии снапшота с нескольких сабвольюмов речи быть не может.
Copy on write
Немного о сабвольюмах и CoW-подходе. Представим, что на файловой системе присутствует сабвольюм и в нем расположен файл (возьмем идеальный случай — файл не фрагментирован). Далее с сабвольюма снимается снапшот.
На файловой системе появится новый сабвольюм (снапшот) ровно с тем же самым содержимым, которое было у исходного сабвольюма. Процесс создания снапшота проходит почти мгновенно — данные самого файла не копируются. Вместо этого создаются дополнительные метаданные, и снапшот наравне с родительским сабвольюмом становится владельцем файла. По сути, файл на диске остался один, но теперь принадлежит одновременно как сабвольюму, так и снапшоту.
Если теперь изменить файл в сабвольюме, то изменения никак не повлияют на файл в снапшоте. Если при создании снапшоту не был выставлен флаг «только для чтения», то файл в снапшоте также можно изменять.
Технически, при изменении файла записываются только эти изменения. Так что на диске будет храниться исходный файл плюс некоторая дельта, отличающая исходный файл от измененного. Если же удалить один из сабвольюмов (под вторым я имею в виду снапшот), то лишние данные, более никем не используемые, будут вычищены с диска, а на диске останется только актуальная версия файла (с точки зрения оставшегося сабвольюма).
Ключ reflink=always сообщает файловой системе, что мы хотим задействовать механизм CoW при копировании. После копирования файлы можно изменять независимо друг от друга, так что мы получаем то же самое поведение, как и после создания снапшота. Так зачем тогда нужны сабвольюмы?
Восстановление сабвольума
На просторах необъятного часто встречается вопрос: «У меня есть сабвольюм, у меня есть снапшот, как сделать реверт?» Данный подход не применим к btrfs, т.к. нет самой возможности «откатить сабвольюм». Вместо этого btrfs предлагает стратегию замены сабвольюма на его снапшот. Действительно, зачем что-то ревертить, если сам снапшот — это и есть тот объект, который мы хотим получить при помощи реверта.
Представим себе такой сценарий: на btrfs расположен сабвольюм, в котором располагаются файлы какой-либо базы данных (ну или другие важные данные). С этого сабвольюма периодически снимаются снапшоты, и в определенный момент возникает необходимость откатить данные. В этом случае мы просто избавляемся от сабвольюма и вместо него начинаем использовать снятый с него снапшот, либо — если не хотим испортить еще и эти данные — снимаем со снапшота еще один снапшот. Если оригинальный сабвольюм не был замонтирован и использовался как обычная директория, то его необходимо либо удалить либо переместить/переименовать, а на его место поместить снапшот.
В консоли это может выглядеть примерно так:
Если же сабвольюм был замонтирован и использовался через точку монтирования, то достаточно отмонтировать сабвольюм и подмонтировать на его место снапшот.
Для полноты картины попробую еще раз и немного по-другому. Сабвольюм, в котором происходят изменения — это ветка main.
При создании снапшота происходит фиксация состояния файлов на диске. С этого момента снапшот — это бранч ветки main. Все дальнейшие изменения в main никак не повлияют на снапшот. Откат же к снапшоту означает прекращение использования ветки main и полное переключение на бранч. Ветку main при этом за ненадобностью можно удалить. Таким образом, btrfs — это практически система контроля версий, но без возможности обратно смержить ветки.
Дерево файловой системы
Одним из неочевидных моментов, связанных с использованием btrfs, является то, как следует разбивать данные системы на сабвольюмы. Разумеется, какого-либо «правильного» подхода в данном вопросе не существует. Но можно выделить 3 способа организации структуры сабвольюмов: плоская структура, вложенная и смешанная.
Плоская структура означает расположение сабвольюмов плоским списком в корневом сабвольюме. Например, отдельными сабвольумами можно выделить корень файловой системы (назовем его root), пользовательскую директорию home, директорию с сайтом /var/www и базу данных, расположенную например в /var/database.
Некоторые сабвольюмы для удобства можно размещать в директориях, как, например, в случае с сабвольюмом var/www.
При таком подходе все сабвольюмы необходимо замонтировать. Сабвольюм root должен иметь точку монтирования /, а внутри себя содержать директории home и var. После монтирования root в /home должен монтироваться сабвольюм home, а в /var/www и /var/database — сабвольюмы var/www и database соответственно.
Таким образом, дерево btrfs-сабвольюмов можно произвольным образом отобразить в виртуальной файловой системе ОС, а там уже на что фантазии хватит.
В этом случае кроме корневого сабвольюма монтировать больше ничего не требуется.
Добавление/удаление диска, баланс
btrfs может похвастаться прекрасным функционалом — возможностью «на горячую» добавить блочные устройства непосредственно в процессе работы файловой системы:
Кстати, в одном вызове добавления/удаления можно указать несколько дисков.
Опять же, указываемый путь — это путь до любого сабвольюма той btrfs, к которой будет применена команда.
Проверим, сколько и какие блочные устройства находятся под управлением btrfs:
0.00B в поле used нам сообщает о том, что добавленный диск пуст. Для наполнения его данными согласно профилю записи необходимо выполнить баланс:
Команда balance перераспределяет данные на дисках согласно выбранному профилю записи. Например, в случае RAID1 баланс приведет к клонированию данных с первоначального устройства, в случае RAID0 — к более равномерному распределению данных по двум дискам, и т.д.
В результате баланса, если до этого на диске присутствовали пустоты, то данные на диске будут записаны более плотным образом, т.е. получится дефрагментация. Однако важно понимать, что это не совсем «та» дефрагментация. В данном случае команда balance не смотрит на логическое содержимое, а оперирует лишь блоками данных. Она не обращает внимание на то, что какой-либо файл размазан по диску. Вместо этого balance переносит блоки данных из одного места в другое. Т.е. файл, фрагментированный до баланса, останется фрагментированным и после него. Но! Фрагментированность на уровне блоков данных все же уменьшится, и этим можно пользоваться.
Для избежания путаницы скажем так: операция balance уменьшает фрагментированность на уровне блоков данных, но не влияет на фрагментированность файлов.
Также команда balance предоставляет возможность сменить профиль записи. Например, на диске использовался профиль DUP, а после добавления диска решили сделать полноценный RAID1. Для этого необходимо воспользоваться фильтром convert :
Вообще, основное назначение фильтров — это задание правил для операции balance: какие блоки обработать, а какие не трогать. Так, например, можно затронуть только блоки, записываемые с определенным профилем записи (фильтр profiles), или блоки занятые выше определенного процента (фильтр usage), либо затронуть только группы блоков, имеющих отношение к определенному диску (фильтр devid) и т.п. Кстати, их еще можно комбинировать. В целом возможности фильтров очень обширны и в основном необходимы для проведения выборочного баланса данных.
Фрагментация
К сожалению, btrfs «благодаря» своей архитектуре крайне подвержена такому явлению, как фрагментация. Дело в том, что данные записываются всегда в новое расположение на диске. Даже если прочитать файл, ничего не сделать с данными и записать их обратно в тот же файл, то данные попадут на диске в новую область. То же самое произойдет, если обновить данные в файле только частично — изменения запишутся в новую область на диске. Таким образом, частые изменения весьма сильно фрагментируют файлы, увеличивая «разбросанность» фрагментов, в общем случае — по нескольким дискам. Это приводит к увеличенной нагрузке на CPU и неоправданному расходу памяти. Сильнее всего фрагментированности подвержены базы данных и образы виртуальных машин.
Оценить фрагментированность файлов можно при помощи утилиты filefrag (не входит в btrfs-progs).
Она показывает количество экстентов, задействованных для хранения файла. Проще говоря — чем меньше экстентов задействовано, тем меньше фрагментированность файла.
Дефрагментацию можно применять к отдельному файлу либо к сабвольюму/директории, в т. ч. рекурсивно. Команда выглядит следующим образом:
Надо сказать, что не всегда эта команда приводит к ожидаемым результатам. Небольшие несильно фрагментированные файлы (10 — 20 экстентов) после дефрагментации могут оказаться разбиты на еще большее число частей. К тому же на некоторых версиях ядра дефрагментация btrfs приводит к поломке дедуплицированности файлов, производя их реальные физические копии. Т.е. снапшоты на физическом уровне станут полноценными копиями.
Атрибут nocow можно выставить только новому или пустому файлу. Он отключает механизм copy on write, благодаря чему btrfs при обновлении содержимого файла будет всегда работать с фиксированной дисковой областью, записывая данные поверх существующих (на физическом уровне). Из минусов nocow — он отключает еще и проверку чексуммы для данного файла. Другими словами, нет cow — нету и checksum.
Разумеется, вручную выставлять атрибут nocow каждому файлу — это дело неблагодарное. Если выставить этот флаг директории/сабвольюму, то все новые файлы, созданные в нем, унаследуют флаг автоматически. Это же касается и создаваемых вложенных директорий. Если же на момент включения атрибута в директории уже находились какие-либо данные, то на них это никак не повлияет — атрибут nocow можно выставить только новому или пустому файлу.
И еще один способ автоматического выставления флага nocow — это монтирование файловой системы с указанием опции nodatacow :
Трюки и фейлы
При использовании btrfs-progs можно не писать полное название команды:
Достаточно лишь совпадения первых символов, которые однозначно определят команду:
думаю, принцип понятен.
Создать снапшот директории, увы, btrfs не под силу, но есть обходной путь:
Если на btrfs закончилось место, то даже удаление какого-либо файла может вызывать ошибку «No space left on device». Для решения рекомендуется подключить к btrfs временный накопитель размерами желательно не менее 1GB. После чего произвести чистку данных. Затем удалить временный накопитель.
Операция balance, вызванная без указания профилей записи, неявно меняет их с dup на raid1. О чем, кстати, написано на странице Gotchas. Происходит это после добавления диска к btrfs, на которой используется профиль записи dup. Напомню, что форматирование одиночного диска в btrfs использует профиль dup по умолчанию для метаданных и системных данных.
Пожалуй, самое важное
Избегайте создания низкоуровневых клонов блочных устройств с btrfs. Будучи «умной» файловой системой, при некоторых операциях (чаще всего, при монтировании) btrfs самостоятельно перечитывает системные данные на блочных устройствах, чтобы найти все части файловой системы. Если в процессе поиска будет обнаружено два блочных устройства с одинаковыми UUID, то btrfs воспримет их как части одного и того же инстанса. Если же при этом эти два устройства окажутся оригиналом и его клоном, то после монтирования одному только драйверу известно, как будет происходить работа файловой системы, но ясно, что ничем хорошим это не закончится. В худшем случае — закончится необратимым повреждением данных.
Если же очень хочется клонировать диски с btrfs низкоуровневым способом, то необходимо соблюдать крайнюю осторожность. В общем случае клон не должен быть виден ядру ОС как блочное устройство, пока в системе присутствует оригинал, и наоборот. Обеспечив это условие, можно изменить UUID клона (ну или оригинала, тут по желанию). В этом поможет утилита btrfstune, которая поставляется вместе с пакетом btrfs-progs:
И снова: btrfstune, будучи «умной» утилитой, будет изменять UUID не только на диске, а на всей файловой системе. Это значит, что при вызове она пойдет читать все блочные устройства, дабы заменить UUID на всех устройствах, относящихся к файловой системе.
Вместо заключения
Если на данном моменте вы ничего не поняли — это нормально. Btrfs нетривиальна и сразу может не поддаться. Каждый раз, когда мне казалось, что вот теперь-то я её понял, она подкидывала сюрприз и заставляла переосмысливать существующие вещи. Не могу сказать, что я все понял и на текущий момент — в процессе написания находил что-то новое, хотя и писал уже на основе имеющегося опыта.
Я бы сравнил процесс освоения btrfs с переходом от процедурного стиля программирования к объектно-ориентированному. Первое впечатление — «вау как круто», но затем упорно продолжаешь писать процедурный код, обернутый в классы.
В статье я старался не лить воду — писать все по делу. Не смотря на это, получилось довольно объемно. Но рассказать удалось далеко не все — про btrfs можно еще писать и писать. Эта статья — лишь верхушка айсберга. Самое начало, чтобы понять её философию и начать использовать. А сейчас на этом пора заканчивать.
Спасибо, что дочитали до конца. Надеюсь, не утомил. Пишите в комментариях, о чем Вам еще бы было интересно узнать.
Делайте бэкапы, господа. И пусть они вам никогда не пригодятся.





