Btrfs 支持已經包含在linux和linux-lts的內核中。php
要使用一些用戶空間工具的話,須要安裝 不在 base 包組中的並且基礎操做必須的 btrfs-progs 軟件包。html
若是你須要從 Btrfs 文件系統引導(好比說你的內核和內存盤在一個 Btrfs 的分區上),請檢查你的 啓動引導器 是否支持 Btrfs。node
下文展現瞭如何建立一個新的 Btrfs 文件系統。要將一個 ext3/4 分區轉換爲 Btrfs,請參考 #從 Ext3/4 轉換。要使用無分區的配置,請參考 #無分區 Btrfs 磁盤。linux
查閱 mkfs.btrfs(8) 以獲取更多信息。git
在分區 /dev/partition
上建立一個 Btrfs 文件系統:github
# mkfs.btrfs -L mylabel /dev/partition
Btrfs 的默認塊大小爲 16KB。 要使用更大的 blocksize 數據/元數據的話,能夠經過指定 -n
來修改 nodesize
,正如本例所示的設置爲 16KB:算法
# mkfs.btrfs -L mylabel -n 16k /dev/partition
多個設備能夠用來建立一組 RAID。支持的RAID級別有 RAID 0,RAID 1,RAID 10,RAID 5 和 RAID 6。數據和元數據的 RAID 等級能夠獨立地用 -d
和 -m
參數指定。默認狀況下元數據使用鏡像 (RAID1),而數據則會被條帶化 (RAID0)。參閱 Btrfs Wiki:在多個設備上使用 btrfs 或查閱 mkfs.btrfs
的手冊頁得到更多信息.shell
# mkfs.btrfs -d raid0 -m raid1 /dev/part1 /dev/part2 ...
要將多個 Btrfs 設備做爲一個池使用的話,你須要將 udev
鉤子或者 btrfs
鉤子加入到 /etc/mkinitcpio.conf
中。查閱 Mkinitcpio (簡體中文)#經常使用鉤子以獲取更多信息。緩存
RAID 中有關於維護多設備上的 btrfs 文件系統的一些建議.多線程
默認狀況下 btrfs 對全部文件使用 寫時複製 (CoW)。參閱the Btrfs Sysadmin Guide section 以獲取實現細節以及它的優勢和缺點。
要對某個子捲上的新文件停用寫時複製,使用 nodatacow
掛載選項。這隻會影響新建立的文件,寫時複製仍然會在已存在的文件上生效。nodatacow
參數一樣會禁用壓縮。參閱 btrfs(5) 以瞭解細節。
nodatacow
and others with
datacow
. The mount option of the first mounted subvolume applies to any other subvolumes.
nodatacow
參數掛載某些子卷,而其餘的使用
datacow
參數。第一個被掛載子卷的掛載參數將會應用於其餘全部子卷。
要單文件或目錄禁用寫時複製特性,請使用下面的命令:
$ chattr +C [文件/目錄的地址(path)]
這會爲這個文件的單個引用停用寫時複製,若是這個文件不僅有一個引用(例如經過 cp --reflink=always
生成或者在文件系統快照中),寫時複製依然生效.
$ mv /path/to/dir /path/to/dir_old $ mkdir /path/to/dir $ chattr +C /path/to/dir $ cp -a /path/to/dir_old/* /path/to/dir $ rm -rf /path/to/dir_old
須要保證這個過程當中目標文件不會被使用,同時注意下面描述的 mv
或 cp --reflink
並不起做用.
默認狀況下,使用 cp
複製 Btrfs 文件系統上的文件時,會建立實際副本。要建立引用原始數據的輕量級副本,請使用 reflink 選項:
$ cp --reflink source dest
參閱 cp
的手冊頁得到關於 --reflink
標誌的更多信息。
Btrfs支持透明壓縮,這意味着分區裏的每一個文件都被自動壓縮。這不單減少了文件的大小,在某些特定的場景下(好比單線程、重文件 I/O)還提升了性能,儘管在其餘的場景下(好比多線程和/或具備大文件 I/O 的 CPU 密集型任務)顯著得影響了性能。使用更快的壓縮算法好比 zstd 和 lzo 一般能夠得到更好的性能,這個性能測試 提供了詳細的對比。
壓縮能夠經過使用掛載參數 compress
來啓用,它的可選值包括 zlib
,lzo
,zstd
或者是 no
(不啓用壓縮)。只有在加入掛載選項後建立或修改的文件纔會被壓縮。
不過也能夠在安裝之後經過 btrfs filesystem defragment -calg
(也可使用其它壓縮算法,例如 zlib
/ lzo
) 壓縮一個分區 (例如從 ext3/4 轉換之後的文件系統).
要將整個文件系統經過 zstd 從新壓縮,運行下面的命令:
# btrfs filesystem defragment -r -v -czstd /
在一個新的 btrfs 分區上安裝 Arch Linux 時,要充分利用壓縮特性,最好安裝時就啓用壓縮功能。在File systems 時使用 compress
參數: mount -o compress=lzo /dev/sdxY /mnt/
.在 時把 compress=lzo
添加到 fstab 中的根目錄中的選項上。
chattr +c
,也能夠在不使用
compress
選項的狀況下爲單個文件啓用壓縮屬性.對目錄啓用會使這個目錄下新文件自動壓縮.
zstd
這個參數的話,使用沒有 zstd
支持的舊版本內核或者 btrfs-progs 可能不能讀取或者修復你的文件系統。$ btrfs filesystem defragment -v -clzo /boot/*
"btrfs 子卷不是 (也不能看做) 塊設備,一個子卷能夠看做 POSIX 文件名字空間.這個名字空間能夠經過子捲上層訪問,也能夠獨立掛載."[1]
每一個 btrfs 文件系統都有一個 ID 爲 5 的頂層子卷。它能夠掛載爲 /
(默認狀況下),或者能夠掛載爲另外一個子卷。子卷能夠在文件系統中移動,它們經過其 ID 而不是路徑來標識。
參閱下面的連接得到更多信息:
要建立一個子卷:
# btrfs subvolume create /path/to/subvolume
要列出當前路徑 (path
) 下的子卷:
# btrfs subvolume list -p path
要刪除一個子卷:
# btrfs subvolume delete /path/to/subvolume
只是移除子卷的目錄 /path/to/subvolume
而不使用這個命令並不會刪除一個子卷.
可使用 subvol=/path/to/subvolume
或 subvolid=objectid'
掛載標誌來安裝子卷,就像文件系統分區同樣。例如,您能夠擁有一個名爲 subvol_root
的子卷,並將其掛載爲 /
。經過在文件系統的頂層建立各類子卷,而後將它們安裝在適當的掛載點,能夠模仿傳統的文件系統分區。 所以,可使用#Snapshots[broken link: invalid section]輕鬆地將文件系統(或其一部分)恢復到先前的狀態。
/
而不是使用頂層子卷 (ID=5) 掛載爲根目錄(這是默認行爲)。
參閱 Snapper#Suggested filesystem layout, Btrfs SysadminGuide#Managing Snapshots 和 Btrfs SysadminGuide#Layout 得到子卷應用的示例.
有關特定於btrfs的掛載選項的完整列表,請參閱 btrfs(5)。
若是掛載時不指定 subvol=
選項便會掛載默認子卷.要改變默認子卷:
# btrfs subvolume set-default subvolume-id /
subvolume-id 能夠經過#列出子卷列表得到.
經過 btrfs subvolume set-default
修改默認子卷將會致使文件系統的最頂層沒法訪問,除非使用 subvol=/
或者 subvolid=5
掛載參數。[3]
Btrfs中的配額支持是經過使用配額組或 qgroup 在子卷級別實現的:默認狀況下,每一個子卷都以 0/<subvolume id> 的形式分配配額組。 可是,若是須要的話,可使用任意數字建立配額組。
要使用 qgroup,你須要首先啓用它:
# btrfs quota enable <path>
今後時開始,新建立的子卷將由這些配額組控制。 爲了可以爲已建立的子卷啓用配額,首先正常啓用配額,而後使用它們的 <subvolume id> 爲每一個子卷建立一個配額組,再從新掃描它們:
# btrfs subvolume list <path> | cut -d' ' -f2 | xargs -I{} -n1 btrfs qgroup create 0/{} <path> # btrfs quota rescan <path>
Btrfs 中的配額組造成樹層次結構,其中 qgroup 附加到子卷。大小限制由每一個 qgroup 獨立配置且在並在包含給定子卷的樹中達到任何限制時應用。
配額組的限制能夠應用於總數據使用,非共享數據使用,壓縮數據使用或所有。文件複製和文件刪除可能都會影響限制,由於若是刪除原始卷的文件而且只剩下一個副本,則另外一個 qgroup 的非共享限制可能會更改。例如,新快照幾乎與原始子卷共享全部塊,對子卷的新寫入將向專用限制提高,一個卷中的公共數據的刪除將升高到另外一個卷中的專用限制。
要對 qgroup 應用限制,請使用命令 btrfs qgroup limit
。根據你的使用狀況,使用總限制,非共享限制( -e
)或壓縮限制( -c
)。
顯示文件系統使用中給定路徑的使用狀況和限制:
# btrfs qgroup show -reF <path>
將數據寫入文件系統的頻率由 Btrfs 自己和系統的設置決定。Btrfs 默認設置爲 30 秒檢查點間隔,新數據將在 30 秒內被提交到文件系統。 這能夠經過在 /etc/fstab
增長 commit
掛載參數來修改:
LABEL=arch64 / btrfs defaults,noatime,compress=lzo,commit=120 0 0
系統範圍的設置也會影響提交間隔。它們包括 /proc/sys/vm/*
下的文件,這超出了本維基文章的範圍,所以再也不贅述。 它們的內核文檔位於 Documentation/sysctl/vm.txt
。
Btrfs 文件系統可以從支持 TRIM 命令的 SSD 驅動器中釋放未使用的塊。
有關啓用和使用 TRIM 的更多信息,請參閱 Solid State Drives#TRIM。
像 df
這樣的用戶空間工具可能不會準確的計算剩餘空間 (由於並無分別計算文件和元數據的使用狀況) 。推薦使用 btrfs filesystem usage
來查看使用狀況。好比說:
# btrfs filesystem usage /
btrfs filesystem usage
在
RAID5/RAID6
設備上可能沒法正常工做。
查看 [4] 以獲取更多信息。
Btrfs 支持經過配置 掛載參數 autodefrag
來實如今線的碎片整理。要手動整理你的根目錄的話,可使用:
# btrfs filesystem defragment -r /
使用不帶 -r
開關的上述命令將致使僅整理該目錄的子卷所擁有的元數據。這容許經過簡單地指定路徑進行單個文件碎片整理。
對具備 CoW 副本(快照副本或使用cp --reflink
或 bcp 建立的文件)進行碎片整理以及使用帶壓縮算法的 -c
開關進行碎片整理可能會致使生成兩個不相關的文件從而增長磁盤使用量。
Btrfs 提供對 RAID 一類的 #多設備文件系統的原生支持.參閱 the Btrfs wiki page 得到更多信息. Btrfs 管理員手冊 提供了技術背景信息.
Btrfs Wiki 術語表中寫到 scrub 是一種 "在線文件系統檢查工具".它讀取文件系統中的文件和元數據,並使用校驗值和 RAID 存儲上的鏡像區分並修復損壞的數據.
啓動一個(後臺運行的)包含 /
目錄的文件系統在線檢查任務:
# btrfs scrub start /
檢查該任務的運行狀態:
# btrfs scrub status /
btrfs-progs 軟件包帶有 btrfs-scrub@.timer
系統單元,用來每個月運行 scrub 命令.經過添加掛載點的參數來啓用它,例如btrfs-scrub@-.timer
(/
) 或者 btrfs-scrub@home.timer
(/home
).
也能夠經過啓動 btrfs-scrub@.service
來手動運行 scrub (使用一樣的掛載點參數) ,相對於 # btrfs scrub
這麼作的優勢是會記錄在 Systemd 日誌中。
「Balance 將會經過分配器再次傳遞文件系統中的全部數據。它主要用於在添加或刪除設備時跨設備從新平衡文件系統中的數據。若是設備出現故障,餘額將爲冗餘 RAID 級別從新生成缺失的副本。」[5]。參閱 上游的 FAQ.
在單設備文件系統上,餘額對於(臨時)減小分配但未使用(元)數據塊的數量也是有用的。有時候這對於解決 "filesystem full" 故障 來講也是必須的。
# btrfs balance start / # btrfs balance status /
"快照是和特定子卷共享文件和元數據的特殊子卷, 利用了 btrfs 的寫時複製特性." 詳見 Btrfs Wiki SysadminGuide#Snapshots.
要建立一個快照:
# btrfs subvolume snapshot source [dest/]name
source
爲要建立快照的對象,[dest/]name
爲快照安放路徑。
加入 -r
參數能夠建立一個只讀快照. 爲只讀快照建立一個快照能夠得到一個只讀快照的可寫入版本.
能夠經過 send
命令發送一個快照,一般會與 btrfs 中的 receive
組成管道.例如將快照 /root_backup
(也許是/
的備份) 發送到 /backup
:
# btrfs send /root_backup | btrfs receive /backup
只能發送只讀快照,上面的命令在將子卷複製到外部設備 (例如備份驅動器) 時會頗有用.
也能夠只發送兩個快照間發生變化的部分,例如若是你已經發送了快照 root_backup
,而後又創建了一個新的只讀快照 root_backup_new
,能夠這樣完成增量發送:
# btrfs send -p /root_backup /root_backup_new | btrfs receive /backup
如今你 /backup
的快照會是 root_backup_new
.
參閱 Btrfs Wiki's Incremental Backup page 得到更多信息 (例如使用工具自動化這一過程)。
使用寫時複製,Btrfs可以複製文件或整個子卷而無需實際複製數據。可是,不管什麼時候更改文件,都會建立一個新的 「真正的」 副本。重複數據刪除更進一步,經過主動識別共享公共序列的數據塊並將它們組合到具備相同寫時複製語義的範圍內。
專用於 Btrfs 分區去重的工具包括 duperemoveAUR,bedupAUR 和 btrfs-dedup。人們可能還但願僅使用基於文件的級別對數據進行重複數據刪除,好比 rmlint 或者 jdupesAUR。有關這些程序的可用功能的概述和其餘信息,請查看上游 Wiki 條目。
此外,Btrfs開發人員正致力於帶內(也稱爲同步或內聯)重複數據刪除,這意味着在將新數據寫入文件系統時完成重複數據刪除。目前,它仍然是一個在 out-of-tree 開發的實驗。願意測試新功能的用戶能夠閱讀相關的內核 Wiki 頁。
一些在嘗試以前應該知道的限制。
Btrfs 目前尚未內建的加密支持,但將來可能加入此功能。能夠在運行mkfs.btrfs
前加密分區,參閱Dm-crypt with LUKS.
(若是已經建立了文件系統,可使用EncFS或TrueCrypt,可是這樣會沒法使用 btrfs 的一些功能。)
Btrfs 不支持交換文件,由於 Btrfs 有潛在的文件系統損壞風險,沒有加入交換文件須要的功能,參閱這裏。交換文件能夠掛載到 loop 設備中,可是性能比較差。systemd-loop-swapfileAUR[broken link: archived in aur-mirror]提供了須要的服務文件。
使用 TLP 須要特殊的預防措施,以免文件系統損壞。有關更多信息,請參閱TLP#Btrfs。
Btrfs 能在整個設備上使用,替代 MBR 或 GPT 分區表,可是並不要求必定這麼作,最簡單的方法是 在一個已存在的分區上建立 btrfs 文件系統[broken link: invalid section]. 若是你選擇用 btrfs 替代分區表, 能夠用 子卷[broken link: invalid section]模擬不一樣的分區。下列是在單個無分區設備上使用 Btrfs 文件系統的限制:
運行下面的命令把整個設備的分區表替換成 btrfs:
# mkfs.btrfs /dev/sdX
若是設備上存在分區表,則須要使用:
# mkfs.btrfs -f /dev/sdX
例如 /dev/sda
而不是 /dev/sda1
. 後一種形式會格式化現有的分區而不是替換掉原有的分區表.
像使用普通的 MBR 分區表存儲設備同樣安裝 啓動管理器, 參考 Syslinux#Manual install 或 GRUB/Tips and tricks#Install to partition or partitionless disk。
從安裝 CD 啓動,而後轉化分區:
# btrfs-convert /dev/partition
掛載轉換後的分區並修改/etc/fstab
文件,指定分區類型(type 爲 btrfs,fs_passno [最後一列] 修改成0,Btrfs在啓動時並不進行磁盤檢查). 還要注意的是分區的UUID將有改變,因此使用UUID時,更新fstab中相應的條目。 chroot
到系統並重建 GRUB 條目(若是對此過程不熟悉,參考Install from existing Linux和GRUB). 若是正在轉換根目錄,還須要在 chroot 環境中重建初始化內存盤 (mkinitcpio -p linux
). 若是 GRUB 不能啓動 (例如 'unknown filesystem' 錯誤),則須要從新安裝 (grub-install /dev/partition
) 並生成配置文件 (grub-mkconfig -o /boot/grub/grub.cfg
).
確認沒有問題後,完成轉換經過刪除備份ext2_saved
子卷,請注意,若是沒了它(備份子卷),你將沒辦法還原回 ext3/4 文件系統。
# btrfs subvolume delete /ext2_saved
最後經過 balance 回收空間.
請記住,以前安裝的某些應用程序必須適配 Btrfs。值得注意的是 TLP#Btrfs 須要特別當心以免文件系統損壞,但其餘應用程序也可能從某些功能中獲益。
要驗證Btrfs校驗和是不是硬件加速:
$ dmesg | grep crc32c
Btrfs loaded, crc32c=crc32c-intel
若是你看到 crc32c=crc32c-generic
,這頗有多是由於你的根分區是 Btrfs,你將會須要編譯 crc32c-intel
進入內核並啓用它。將 crc32c-intel
放入 mkinitcpio.conf 是 不會 生效的。
btrfs-check 不能在一個已掛載的文件系統上工做。爲了可以在不從 Live USB 啓動的狀況下使用 btrfs-check,須要將其添加到初始內存盤:
/etc/mkinitcpio.conf
BINARIES=("/usr/bin/btrfs")
以後若是啓動時出現問題,則可使用該實用程序進行修復。
查閱 Btrfs Wiki 頁 以獲取更多信息。
爲了可以引導進入快照,你必須經過 內核參數 rootflags=subvol=/path/to/subvolume
來指定子卷,同時須要修改 /etc/fstab
使用 subvol=
來指定相同的子卷。或者,子卷能夠用其 id 來指定 - 例如能夠用例如可檢索的。 btrfs subvolume list /root/path
- 和rootflags=subvolid=objectid
分別做爲內核參數subvolid= objectid
做爲 /etc/fstab
中的掛載選項。
若是使用 GRUB,則能夠在 grub-btrfs 或 grub-btrfs-gitAUR 的幫助下從新生成配置文件時使用 Btrfs 快照自動填充啓動菜單。
查閱 Systemd-nspawn#Use Btrfs subvolume as container root 和 Systemd-nspawn#Use temporary Btrfs snapshot of container 等文章。
參閱 Btrfs Problem FAQ 得到排除通常問題的信息.
Grub 2能夠啓動 Btrfs 分區,可是由於模塊比較大, grub-install 安裝的 core.img 文件超過了 MBR 與第一個分區之間的空間大小 (63 扇區/31.5KiB) .更新後的 fdisk
和 gdisk
的磁盤工具會經過第一個分區前空出 1-2M 的空間避免此問題.
若是啓動 RAID 卷設備後編輯了 /usr/share/grub/grub-mkconfig_lib 移除了 echo " search --no-floppy --fs-uuid --set=root ${hints} ${fs_uuid}"
中的引號,可能會遇到 error no such device: root
問題,從新生成 GRUB 設置文件應該能避免這個問題.
2014 年 11 月的 systemd 和 mkinitcpio 中的 bug 可能致使使用 mkinitcpio.conf
中 btrfs
hook 的用戶啓動多設備文件系統的 btrfs 卷時出現錯誤\:
BTRFS: open_ctree failed mount: wrong fs type, bad option, bad superblock on /dev/sdb2, missing codepage or helper program, or other error In some cases useful info is found in syslog - try dmesg|tail or so. You are now being dropped into an emergency shell.
一個臨時解決方案是從 HOOKS
中移除 btrfs
並把它放入 MODULES
中,經過 mkinitcpio -p linux
從新生成 initramfs 並從新啓動.
參閱 原來的論壇討論 和FS#42884 得到更多的信息和討論.
另外若是在掛載 RAID 卷組時缺乏某個卷時也有可能會發生這個錯誤.這種狀況下你須要把 degraded
加入到 /etc/fstab
中,若是根目錄在卷組上,同時須要加入 rootflags=degraded
內核參數
btrfs check
命令)仍在開發階段, 強烈建議在加上
--repair
參數運行
btrfs check
時作一個
備份.
btrfs check 能夠檢查並修復一個未掛載的 btrfs 文件系統.可是因爲它並未開發完成,它並不能修復某些錯誤 (即便這些錯誤沒致使沒法掛載).
參閱 Btrfsck 得到更多信息.