Linux中國

如何將你的文件系統轉換為 Btrfs

引言

這篇概述文章將告訴你為何以及如何遷移你的當前分區到 Btrfs 文件系統。如果你對此感興趣,請閱讀這篇分步指南來完成。

從 Fedora 33 開始,新安裝的 Fedora 操作系統默認文件系統為 Btrfs。我確信大部分用戶現在已經聽說了它的優勢:寫時複製、內置校驗、靈活的壓縮方式、簡易的快照和回滾方式。它確實是一個現代化的文件系統,為桌面存儲帶來新的功能。

在升級到 Fedora 33 後,我想利用 Btrfs 的優勢,但對我個人來說,我不想因為「只是為了改變文件系統」而去重裝整個系統。我發現(只有)寥寥無幾的具體如何做轉換的教程,所以我決定在這裡分享我的詳細經驗。

小心!

這樣做你是在玩火。希望你閱讀以下內容時不要感到驚訝:

在編輯分區和轉換文件系統時,你的數據可能會被破壞和丟失。最終,你可能會得到一個不能啟動的操作系統,並面臨數據恢復的風險。你可能會無意刪除你的分區,或者以其它方式破壞了你的操作系統。

這些轉換過程即使對於生產系統來說也是安全的 —— 前提是你提前做好了計劃,對關鍵數據做好了備份和回滾計劃。作為一個 可以執行超級許可權的系統管理員,你可以在沒有限制、沒有任何常規安全防護措施的情況下,做任何事情。

安全的方式:重裝 Fedora

重裝操作系統是轉換文件系統到 Btrfs 的 「官方」 方式,推薦給大多數用戶使用。因此,如果在這個教程中有那麼一點不確定,就選擇這種方式。步驟大致如下:

  1. 備份你的主文件夾和你系統中可能會用到的任何數據,比如 /etc。(編者按:虛擬機也是這樣)
  2. 將已安裝的安裝包以列表形式保存到到文件中。
  3. 重新安裝 Fedora,刪除你當前的分區,並選擇新的 Btrfs 默認分區方案。
  4. 恢復主文件夾的內容,並使用軟體包列表文件重裝軟體包。

對於詳細的步驟和命令,請看一位社區用戶在 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 實時鏡像 Live Image 進行。安裝 Fedora 鏡像寫入工具,然後 「燒錄」 Fedora 33 到你的 U 盤中來創建實時鏡像。

釋放磁碟空間

btrfs-convert 會在分區的剩餘空間重新創建文件系統的元數據,同時保持所有已有的 ext4 文件系統數據還在它當前的位置上。

不幸的是,所需的剩餘空間的大小無法提前知道:如果沒有足夠的空間,轉換將會失敗(但不會破壞數據)。這裡有一些釋放空間有用的方法:

  • 利用 baobab 來識別大容量的文件和文件夾,然後移除。如果可能的話,不要手動刪除主文件夾以外的文件。
  • 清理舊的系統日誌:journalctl –vacuum-size=100M
  • 如果你正使用 Docker,請小心地使用類似 docker volume prunedocker image prune -a 這樣的工具。
  • 清理 GNOME Boxes 之類的虛擬機內不用的鏡像。
  • 清理不用的軟體包和 Flatpak 包:dnf autoremoveflatpak remove –unused
  • 清理軟體包緩存:pkcon refresh force -c -1dnf 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 目錄(頂層子卷),刪除除了 root2home2ext2_saved 之外的所有內容。
  • 重命名 root2home2 子卷為 roothome
  • 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

你應該在 grubenvgrub.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

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國