如何將你的文件系統轉換為 Btrfs
引言
這篇概述文章將告訴你為何以及如何遷移你的當前分區到 Btrfs 文件系統。如果你對此感興趣,請閱讀這篇分步指南來完成。
從 Fedora 33 開始,新安裝的 Fedora 操作系統默認文件系統為 Btrfs。我確信大部分用戶現在已經聽說了它的優勢:寫時複製、內置校驗、靈活的壓縮方式、簡易的快照和回滾方式。它確實是一個現代化的文件系統,為桌面存儲帶來新的功能。
在升級到 Fedora 33 後,我想利用 Btrfs 的優勢,但對我個人來說,我不想因為「只是為了改變文件系統」而去重裝整個系統。我發現(只有)寥寥無幾的具體如何做轉換的教程,所以我決定在這裡分享我的詳細經驗。
小心!
這樣做你是在玩火。希望你閱讀以下內容時不要感到驚訝:
在編輯分區和轉換文件系統時,你的數據可能會被破壞和丟失。最終,你可能會得到一個不能啟動的操作系統,並面臨數據恢復的風險。你可能會無意刪除你的分區,或者以其它方式破壞了你的操作系統。
這些轉換過程即使對於生產系統來說也是安全的 —— 前提是你提前做好了計劃,對關鍵數據做好了備份和回滾計劃。作為一個 可以執行超級許可權的系統管理員,你可以在沒有限制、沒有任何常規安全防護措施的情況下,做任何事情。
安全的方式:重裝 Fedora
重裝操作系統是轉換文件系統到 Btrfs 的 「官方」 方式,推薦給大多數用戶使用。因此,如果在這個教程中有那麼一點不確定,就選擇這種方式。步驟大致如下:
- 備份你的主文件夾和你系統中可能會用到的任何數據,比如
/etc
。(編者按:虛擬機也是這樣) - 將已安裝的安裝包以列表形式保存到到文件中。
- 重新安裝 Fedora,刪除你當前的分區,並選擇新的 Btrfs 默認分區方案。
- 恢復主文件夾的內容,並使用軟體包列表文件重裝軟體包。
對於詳細的步驟和命令,請看一位社區用戶在 ask.fedoraproject.org 站點的評論。如果正確完成,你將得到一個和之前一樣的操作系統,使丟失數據的風險最小化。
轉換的利弊
讓我們快速澄清一下:這種文件系統轉換有什麼優勢和劣勢?
優勢:
- 當然,不需要重新安裝!你的系統里的所有文件和之前一模一樣。
- 技術上來說,沒有備份的情況下,就地進行是可能的。
- 你會學到許多關於 Btrfs 的知識!
- 如果所有都按計划進行,會是相當快的一個過程。
劣勢:
- 你必須熟悉終端環境和 shell 命令。
- 你可能會丟失數據,參見上文。
- 如果出了什麼問題,你得自己解決。
特別之處:
- 你需要大約 20% 的可用磁碟空間才能成功轉換。但對於完整的備份和重裝方式,你可能需要的空間更多。
- 你可以在轉換過程中自定義你分區的所有參數,但如果選擇重裝,你也可以從 Anaconda 自定義。
LVM 怎麼辦?
在近期幾次 Fedora 安裝中,LVM 布局一直是默認的。如果你有一個帶有多個分區(例如 /
和 /home
)的 LVM 分區布局,你得以某種方式合併它們,來獲得 Btrfs 所有性能。
如果選擇這樣做,你可以單獨轉換分區到 Btrfs 文件系統,同時保留卷組。然而,遷移到 Btrfs 文件系統的優勢之一是擺脫 LVM 分區布局強加的限制。你也可以利用 Btrfs 文件系統提供的收發功能在轉換後來合併分區。
另見 《Fedora 雜誌》: 利用 LVM 回收硬碟空間、從 Btrfs 快照中恢復文件 以及 在 Btrfs 和 LVM-ext4 兩者之間做選擇。
了解 Btrfs
建議閱讀以下內容對 Btrfs 文件系統是什麼有一個基礎的了解。如果你沒有把握,只有選擇重裝 Fedora 這種安全的方式。
必須了解的:
- Fedora Magazine:Btrfs 來到 Fedora 33
- Btrfs 系統管理指南, 尤其是 關於子卷和 flat 子卷布局。
- btrfs-convert 指南
有用的資源:
- man 8 btrfs – 命令行界面
- man 5 btrfs – 掛載參數
- man btrfs-convert – 要用到的轉換工具
- man btrfs-subvolume – 管理子卷
轉換步驟
創建一個實時鏡像
由於不能轉換已掛載的文件系統,我們將通過 Fedora 實時鏡像 進行。安裝 Fedora 鏡像寫入工具,然後 「燒錄」 Fedora 33 到你的 U 盤中來創建實時鏡像。
釋放磁碟空間
btrfs-convert
會在分區的剩餘空間重新創建文件系統的元數據,同時保持所有已有的 ext4 文件系統數據還在它當前的位置上。
不幸的是,所需的剩餘空間的大小無法提前知道:如果沒有足夠的空間,轉換將會失敗(但不會破壞數據)。這裡有一些釋放空間有用的方法:
- 利用
baobab
來識別大容量的文件和文件夾,然後移除。如果可能的話,不要手動刪除主文件夾以外的文件。 - 清理舊的系統日誌:
journalctl –vacuum-size=100M
。 - 如果你正使用 Docker,請小心地使用類似
docker volume prune
、docker image prune -a
這樣的工具。 - 清理 GNOME Boxes 之類的虛擬機內不用的鏡像。
- 清理不用的軟體包和 Flatpak 包:
dnf autoremove
、flatpak remove –unused
。 - 清理軟體包緩存:
pkcon refresh force -c -1
、dnf clean all
。 - 如果你有把握,你可以謹慎的清理
~/.cache
文件夾。
轉換到 Btrfs
備份你所有有價值的數據,確保你的系統已完全更新,然後重啟到實時鏡像。運行 gnome-disks
工具找到你所擁有的設備的路徑,比如 /dev/sda1
(如果你在使用 LVM,它可能看起來有所不同)。檢查文件系統然後執行轉換:(編者按:以下命令使用 root 用戶運行,謹慎使用!)
$ sudo su -
# fsck.ext4 -fyv /dev/sdXX (請替換為你的具體的設備路徑)
# man btrfs-convert (閱讀它)
# btrfs-convert /dev/sdXX (請替換為你的具體的設備路徑)
這將會花十幾分鐘甚至幾個小時,依據分區的大小和是機械硬碟還是固態硬碟。如果你看到錯誤,你可能需要更多剩餘空間。作為最後的手段,你可以嘗試 btrfs-convert -n
。
怎樣回滾?
如果因為某些原因轉換失敗,你的分區將保持在 ext4 文件系統或者它之前的狀態。如果你想在成功轉換之後回滾,簡單如下:
# btrfs-convert -r /dev/sdXX
警告! 如果你做了以下這些事情之一,你將永久失去回滾的功能:碎片整理、均衡或者刪除
ext2_saved
子卷。
由於 Btrfs 文件系統的寫時複製特性,你可以安全的複製/移動甚至刪除文件、創建子卷,因為 ext2_saved
會保持引用舊數據。
掛載和檢查
現在這個分區應該已經有了 Btrfs 文件系統。掛載它然後查看你的文件……和子卷!
# mount /dev/sdXX /mnt (請替換為你的具體的設備路徑)
# man btrfs-subvolume (閱讀它)
# btrfs subvolume list / (使用 -t 以表格方式查看)
因為你已經閱讀了 相關的手冊頁,你應該知道創建子卷快照是安全的,並且有 ext2-saved
子卷作為你之前數據的簡易備份。
是時候閱讀 Btrfs 系統管理指南了,這樣你就不會把常規文件夾和子卷混淆了。
創建子卷
我們希望實現一個「扁平」子卷布局,這和 Anaconda 默認創建的布局相同:
toplevel (卷根目錄,不能被默認掛載)
+-- root (子卷根目錄,被掛載到 /)
+-- home (子卷根目錄,被掛載到 /home)
你可以跳過這個步驟,或者使用一個不同的布局。這種特殊結構的優勢是你可以輕鬆的創建 /home
的快照,並且對每個子卷使用不同的壓縮和掛載參數。
# cd /mnt
# btrfs subvolume snapshot ./ ./root2
# btrfs subvolume create home2
# cp -a home/* home2/
這裡我們已經創建了兩個子卷。root2
是一個完整的分區快照,而 home2
開始是一個空子卷,然後我們往裡複製內容。(這個 cp
命令不會重複數據,所以會很快。)
- 在
/mnt
目錄(頂層子卷),刪除除了root2
、home2
和ext2_saved
之外的所有內容。 - 重命名
root2
和home2
子卷為root
和home
。 - 在
root
子卷里,清空home
目錄,以便之後我們能夠掛載home
子卷。
如果都做對了,那就很簡單了!
修改 fstab 分區表
為了重啟之後掛載新卷,必須要修改 fstab
,用新的行來代替舊的 ext4 文件系統掛載行。
你可以使用 blkid
命令來找到你的分區的 UUID。
UUID=xx / btrfs subvol=root 0 0 (請替換為你的具體 UUID)
UUID=xx /home btrfs subvol=home 0 0 (請替換為你的具體 UUID)
(注意如果指向的是同一個分區,那麼這兩個 UUID 是相同的。)
這些都是新安裝的 Fedora 33 的默認值。在 fstab
中,你也可以選擇自定義壓縮和添加類似 noatime
這樣的參數。
可以查看 關於壓縮參數的維基頁面 和 man 5 btrfs 了解所有相關的參數。
chroot 到系統
如果你曾經做過系統恢復,我想你肯定知道這些命令。這裡,我們將得到一個 基本上 在你系統里的 shell 提示符,可以訪問網路。
首先,我們必須重新掛載 root
子卷到 /mnt
目錄,然後掛載 /boot
和 /boot/efi
分區(它們可能有所不同,這取決於你的文件系統布局):
# umount /mnt
# mount -o subvol=root /dev/sdXX /mnt (請替換為你的具體的設備路徑)
# mount /dev/sdXX /mnt/boot (請替換為你的具體的設備路徑)
# mount /dev/sdXX /mnt/boot/efi (請替換為你的具體的設備路徑)
然後我們繼續掛載系統設備:
# mount -t proc /proc /mnt/proc
# mount --rbind /dev /mnt/dev
# mount --make-rslave /mnt/dev
# mount --rbind /sys /mnt/sys
# mount --make-rslave /mnt/sys
# cp /mnt/etc/resolv.conf /mnt/etc/resolv.conf.chroot
# cp -L /etc/resolv.conf /mnt/etc
# chroot /mnt /bin/bash
$ ping www.fedoraproject.org
重裝 GRUB 及內核
最容易的方法就是重裝 GRUB 和 內核,因為它完成了所有必要的配置 —— 現在我們可以訪問網路了。所以,在 chroot 環境內部:
# mount /boot/efi
# dnf reinstall grub2-efi shim
# grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
# dnf reinstall kernel-core
...或者乾脆重新生成 initramfs:
# dracut --kver $(uname -r) --force
如果你是支持 UEFI 的系統,這裡是適用的。如果你是 BIOS 的系統,請查看下面的文檔。重啟之前,讓我們查看是否一切正常:
# cat /boot/grub2/grubenv
# cat /boot/efi/EFI/fedora/grub.cfg
# lsinitrd /boot/initramfs-$(uname -r).img | grep btrfs
你應該在 grubenv
和 grub.cfg
有正確的分區 UUID 或指向(grubenv
可能沒有更新,如有必要可以編輯它),並在 grub.cfg
中看到 insmod btrfs
配置和在 initramfs 鏡像中有 btrfs 模塊。
參見: Fedora 系統管理指南中的 重裝 GRUB 2 和 驗證初始 RAM 磁碟鏡像 。
重啟
現在系統能夠正常啟動。如果不能,別慌,回到實時鏡像修復這個問題。最壞的情況下,你可以從那裡重裝 Fedora 。
首次啟動之後
檢查你的新 Btrfs 文件系統一切都正常。如果你覺得沒問題,你需要回收舊的 ext4 快照使用的空間,進行碎片整理和平衡子卷。後兩者可能要花一些時間,並且相當耗費資源。
對此你必須這樣掛載頂級子卷:
# mount /dev/sdXX -o subvol=/ /mnt/someFolder
# btrfs subvolume delete /mnt/someFolder/ext2_saved
然後,當機器有空閑時間時,運行這些命令:
# btrfs filesystem defrag -v -r -f /
# btrfs filesystem defrag -v -r -f /home
# btrfs balance start -m /
最後,有一個 「非寫時複製」 屬性,對於新系統,這個屬性是為虛擬機鏡像文件夾自動設置的。如果你使用虛擬機的話,可以設置它:
# chattr +C /var/lib/libvirt/images
$ chattr +C ~/.local/share/gnome-boxes/images
這個屬性只會對在這些文件夾里的新文件生效。複製鏡像並刪除原鏡像,你可以通過 lsattr
確認結果。
總結
我真心希望你發現這個教程是有用的,並且能夠對是否在你的系統上轉換為 Btrfs 做出謹慎而明智的決定。祝你成功轉換!
歡迎在評論中分享你的經驗,或者遇到更深層次的問題,請在 ask.fedoraproject.org 提問。
via: https://fedoramagazine.org/convert-your-filesystem-to-btrfs/
作者:Gergely Gombos 選題:lujun9972 譯者:hwlife 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive