如何將你的文件系統(tǒng)轉(zhuǎn)換為 Btrfs
引言
這篇概述文章將告訴你為何以及如何遷移你的當(dāng)前分區(qū)到 Btrfs 文件系統(tǒng)。如果你對(duì)此感興趣,請(qǐng)閱讀這篇分步指南來完成。
從 Fedora 33 開始,新安裝的 Fedora 操作系統(tǒng)默認(rèn)文件系統(tǒng)為 Btrfs。我確信大部分用戶現(xiàn)在已經(jīng)聽說了它的優(yōu)勢:寫時(shí)復(fù)制、內(nèi)置校驗(yàn)、靈活的壓縮方式、簡易的快照和回滾方式。它確實(shí)是一個(gè)現(xiàn)代化的文件系統(tǒng),為桌面存儲(chǔ)帶來新的功能。
在升級(jí)到 Fedora 33 后,我想利用 Btrfs 的優(yōu)勢,但對(duì)我個(gè)人來說,我不想因?yàn)椤爸皇菫榱烁淖兾募到y(tǒng)”而去重裝整個(gè)系統(tǒng)。我發(fā)現(xiàn)(只有)寥寥無幾的具體如何做轉(zhuǎn)換的教程,所以我決定在這里分享我的詳細(xì)經(jīng)驗(yàn)。
小心!
這樣做你是在玩火。希望你閱讀以下內(nèi)容時(shí)不要感到驚訝:
在編輯分區(qū)和轉(zhuǎn)換文件系統(tǒng)時(shí),你的數(shù)據(jù)可能會(huì)被破壞和丟失。最終,你可能會(huì)得到一個(gè)不能啟動(dòng)的操作系統(tǒng),并面臨數(shù)據(jù)恢復(fù)的風(fēng)險(xiǎn)。你可能會(huì)無意刪除你的分區(qū),或者以其它方式破壞了你的操作系統(tǒng)。
這些轉(zhuǎn)換過程即使對(duì)于生產(chǎn)系統(tǒng)來說也是安全的 —— 前提是你提前做好了計(jì)劃,對(duì)關(guān)鍵數(shù)據(jù)做好了備份和回滾計(jì)劃。作為一個(gè) 可以執(zhí)行超級(jí)權(quán)限的系統(tǒng)管理員,你可以在沒有限制、沒有任何常規(guī)安全防護(hù)措施的情況下,做任何事情。
安全的方式:重裝 Fedora
重裝操作系統(tǒng)是轉(zhuǎn)換文件系統(tǒng)到 Btrfs 的 “官方” 方式,推薦給大多數(shù)用戶使用。因此,如果在這個(gè)教程中有那么一點(diǎn)不確定,就選擇這種方式。步驟大致如下:
- 備份你的主文件夾和你系統(tǒng)中可能會(huì)用到的任何數(shù)據(jù),比如 ?
?/etc?
?。(編者按:虛擬機(jī)也是這樣) - 將已安裝的安裝包以列表形式保存到到文件中。
- 重新安裝 Fedora,刪除你當(dāng)前的分區(qū),并選擇新的 Btrfs 默認(rèn)分區(qū)方案。
- 恢復(fù)主文件夾的內(nèi)容,并使用軟件包列表文件重裝軟件包。
對(duì)于詳細(xì)的步驟和命令,請(qǐng)看一位社區(qū)用戶在 ask.fedoraproject.org 站點(diǎn)的評(píng)論。如果正確完成,你將得到一個(gè)和之前一樣的操作系統(tǒng),使丟失數(shù)據(jù)的風(fēng)險(xiǎn)最小化。
轉(zhuǎn)換的利弊
讓我們快速澄清一下:這種文件系統(tǒng)轉(zhuǎn)換有什么優(yōu)勢和劣勢?
優(yōu)勢:
- 當(dāng)然,不需要重新安裝!你的系統(tǒng)里的所有文件和之前一模一樣。
- 技術(shù)上來說,沒有備份的情況下,就地進(jìn)行是可能的。
- 你會(huì)學(xué)到許多關(guān)于 Btrfs 的知識(shí)!
- 如果所有都按計(jì)劃進(jìn)行,會(huì)是相當(dāng)快的一個(gè)過程。
劣勢:
- 你必須熟悉終端環(huán)境和 shell 命令。
- 你可能會(huì)丟失數(shù)據(jù),參見上文。
- 如果出了什么問題,你得自己解決。
特別之處:
- 你需要大約 20% 的可用磁盤空間才能成功轉(zhuǎn)換。但對(duì)于完整的備份和重裝方式,你可能需要的空間更多。
- 你可以在轉(zhuǎn)換過程中自定義你分區(qū)的所有參數(shù),但如果選擇重裝,你也可以從 Anaconda 自定義。
LVM 怎么辦?
在近期幾次 Fedora 安裝中,LVM 布局一直是默認(rèn)的。如果你有一個(gè)帶有多個(gè)分區(qū)(例如 ??/?
?? 和 ??/home?
?)的 LVM 分區(qū)布局,你得以某種方式合并它們,來獲得 Btrfs 所有性能。
如果選擇這樣做,你可以單獨(dú)轉(zhuǎn)換分區(qū)到 Btrfs 文件系統(tǒng),同時(shí)保留卷組。然而,遷移到 Btrfs 文件系統(tǒng)的優(yōu)勢之一是擺脫 LVM 分區(qū)布局強(qiáng)加的限制。你也可以利用 Btrfs 文件系統(tǒng)提供的收發(fā)功能在轉(zhuǎn)換后來合并分區(qū)。
了解 Btrfs
建議閱讀以下內(nèi)容對(duì) Btrfs 文件系統(tǒng)是什么有一個(gè)基礎(chǔ)的了解。如果你沒有把握,只有選擇重裝 Fedora 這種安全的方式。
必須了解的:
- Fedora Magazine:Btrfs 來到 Fedora 33
- Btrfs 系統(tǒng)管理指南, 尤其是 關(guān)于子卷和 flat 子卷布局。
- btrfs-convert 指南
有用的資源:
- man 8 btrfs – 命令行界面
- man 5 btrfs – 掛載參數(shù)
- man btrfs-convert – 要用到的轉(zhuǎn)換工具
- man btrfs-subvolume – 管理子卷
轉(zhuǎn)換步驟
創(chuàng)建一個(gè)實(shí)時(shí)鏡像
由于不能轉(zhuǎn)換已掛載的文件系統(tǒng),我們將通過 Fedora 實(shí)時(shí)鏡像Live Image進(jìn)行。安裝 Fedora 鏡像寫入工具,然后 “燒錄” Fedora 33 到你的 U 盤中來創(chuàng)建實(shí)時(shí)鏡像。
釋放磁盤空間
??btrfs-convert?
? 會(huì)在分區(qū)的剩余空間重新創(chuàng)建文件系統(tǒng)的元數(shù)據(jù),同時(shí)保持所有已有的 ext4 文件系統(tǒng)數(shù)據(jù)還在它當(dāng)前的位置上。
不幸的是,所需的剩余空間的大小無法提前知道:如果沒有足夠的空間,轉(zhuǎn)換將會(huì)失?。ǖ粫?huì)破壞數(shù)據(jù))。這里有一些釋放空間有用的方法:
- 利用 ?
?baobab?
? 來識(shí)別大容量的文件和文件夾,然后移除。如果可能的話,不要手動(dòng)刪除主文件夾以外的文件。 - 清理舊的系統(tǒng)日志:?
?journalctl –vacuum-size=100M?
?。 - 如果你正使用 Docker,請(qǐng)小心地使用類似 ?
?docker volume prune?
??、??docker image prune -a?
? 這樣的工具。 - 清理 GNOME Boxes 之類的虛擬機(jī)內(nèi)不用的鏡像。
- 清理不用的軟件包和 Flatpak 包:?
?dnf autoremove?
??、??flatpak remove –unused?
?。 - 清理軟件包緩存:?
?pkcon refresh force -c -1?
??、??dnf clean all?
?。 - 如果你有把握,你可以謹(jǐn)慎的清理 ?
?~/.cache?
? 文件夾。
轉(zhuǎn)換到 Btrfs
備份你所有有價(jià)值的數(shù)據(jù),確保你的系統(tǒng)已完全更新,然后重啟到實(shí)時(shí)鏡像。運(yùn)行 ??gnome-disks?
?? 工具找到你所擁有的設(shè)備的路徑,比如 ??/dev/sda1?
?(如果你在使用 LVM,它可能看起來有所不同)。檢查文件系統(tǒng)然后執(zhí)行轉(zhuǎn)換:(編者按:以下命令使用 root 用戶運(yùn)行,謹(jǐn)慎使用?。?/p>
$ sudo su -
# fsck.ext4 -fyv /dev/sdXX (請(qǐng)?zhí)鎿Q為你的具體的設(shè)備路徑)
# man btrfs-convert (閱讀它)
# btrfs-convert /dev/sdXX (請(qǐng)?zhí)鎿Q為你的具體的設(shè)備路徑)
這將會(huì)花十幾分鐘甚至幾個(gè)小時(shí),依據(jù)分區(qū)的大小和是機(jī)械硬盤還是固態(tài)硬盤。如果你看到錯(cuò)誤,你可能需要更多剩余空間。作為最后的手段,你可以嘗試 ??btrfs-convert -n?
?。
怎樣回滾?
如果因?yàn)槟承┰蜣D(zhuǎn)換失敗,你的分區(qū)將保持在 ext4 文件系統(tǒng)或者它之前的狀態(tài)。如果你想在成功轉(zhuǎn)換之后回滾,簡單如下:
# btrfs-convert -r /dev/sdXX
警告! 如果你做了以下這些事情之一,你將永久失去回滾的功能:碎片整理、均衡或者刪除 ?
?ext2_saved?
? 子卷。
由于 Btrfs 文件系統(tǒng)的寫時(shí)復(fù)制特性,你可以安全的復(fù)制/移動(dòng)甚至刪除文件、創(chuàng)建子卷,因?yàn)?nbsp;??ext2_saved?
? 會(huì)保持引用舊數(shù)據(jù)。
掛載和檢查
現(xiàn)在這個(gè)分區(qū)應(yīng)該已經(jīng)有了 Btrfs 文件系統(tǒng)。掛載它然后查看你的文件……和子卷!
# mount /dev/sdXX /mnt (請(qǐng)?zhí)鎿Q為你的具體的設(shè)備路徑)
# man btrfs-subvolume (閱讀它)
# btrfs subvolume list / (使用 -t 以表格方式查看)
因?yàn)槟阋呀?jīng)閱讀了 ??相關(guān)的手冊(cè)頁???,你應(yīng)該知道創(chuàng)建子卷快照是安全的,并且有 ??ext2-saved?
? 子卷作為你之前數(shù)據(jù)的簡易備份。
創(chuàng)建子卷
我們希望實(shí)現(xiàn)一個(gè)“扁平”子卷布局,這和 Anaconda 默認(rèn)創(chuàng)建的布局相同:
toplevel (卷根目錄,不能被默認(rèn)掛載)
+-- root (子卷根目錄,被掛載到 /)
+-- home (子卷根目錄,被掛載到 /home)
你可以跳過這個(gè)步驟,或者使用一個(gè)不同的布局。這種特殊結(jié)構(gòu)的優(yōu)勢是你可以輕松的創(chuàng)建 ??/home?
? 的快照,并且對(duì)每個(gè)子卷使用不同的壓縮和掛載參數(shù)。
# cd /mnt
# btrfs subvolume snapshot ./ ./root2
# btrfs subvolume create home2
# cp -a home/* home2/
這里我們已經(jīng)創(chuàng)建了兩個(gè)子卷。??root2?
?? 是一個(gè)完整的分區(qū)快照,而 ??home2?
?? 開始是一個(gè)空子卷,然后我們往里復(fù)制內(nèi)容。(這個(gè) ??cp?
? 命令不會(huì)重復(fù)數(shù)據(jù),所以會(huì)很快。)
- 在 ?
?/mnt?
?? 目錄(頂層子卷),刪除除了 ??root2?
??、??home2?
?? 和 ??ext2_saved?
? 之外的所有內(nèi)容。 - 重命名 ?
?root2?
?? 和 ??home2?
?? 子卷為 ??root?
?? 和 ??home?
?。 - 在 ?
?root?
?? 子卷里,清空 ??home?
?? 目錄,以便之后我們能夠掛載 ??home?
? 子卷。
如果都做對(duì)了,那就很簡單了!
修改 fstab 分區(qū)表
為了重啟之后掛載新卷,必須要修改 ??fstab?
?,用新的行來代替舊的 ext4 文件系統(tǒng)掛載行。
你可以使用 ??blkid?
? 命令來找到你的分區(qū)的 UUID。
UUID=xx / btrfs subvol=root 0 0 (請(qǐng)?zhí)鎿Q為你的具體 UUID)
UUID=xx /home btrfs subvol=home 0 0 (請(qǐng)?zhí)鎿Q為你的具體 UUID)
(注意如果指向的是同一個(gè)分區(qū),那么這兩個(gè) UUID 是相同的。)
這些都是新安裝的 Fedora 33 的默認(rèn)值。在 ??fstab?
?? 中,你也可以選擇自定義壓縮和添加類似 ??noatime?
? 這樣的參數(shù)。
可以查看 ??關(guān)于壓縮參數(shù)的維基頁面??? 和 ??man 5 btrfs?? 了解所有相關(guān)的參數(shù)。
chroot 到系統(tǒng)
如果你曾經(jīng)做過系統(tǒng)恢復(fù),我想你肯定知道這些命令。這里,我們將得到一個(gè) 基本上 在你系統(tǒng)里的 shell 提示符,可以訪問網(wǎng)絡(luò)。
首先,我們必須重新掛載 ??root?
?? 子卷到 ??/mnt?
?? 目錄,然后掛載 ??/boot?
?? 和 ??/boot/efi?
? 分區(qū)(它們可能有所不同,這取決于你的文件系統(tǒng)布局):
# umount /mnt
# mount -o subvol=root /dev/sdXX /mnt (請(qǐng)?zhí)鎿Q為你的具體的設(shè)備路徑)
# mount /dev/sdXX /mnt/boot (請(qǐng)?zhí)鎿Q為你的具體的設(shè)備路徑)
# mount /dev/sdXX /mnt/boot/efi (請(qǐng)?zhí)鎿Q為你的具體的設(shè)備路徑)
然后我們繼續(xù)掛載系統(tǒng)設(shè)備:
# 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 及內(nèi)核
最容易的方法就是重裝 GRUB 和 內(nèi)核,因?yàn)樗瓿闪怂斜匾呐渲?—— 現(xiàn)在我們可以訪問網(wǎng)絡(luò)了。所以,在 chroot 環(huán)境內(nèi)部:
# 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 的系統(tǒng),這里是適用的。如果你是 BIOS 的系統(tǒng),請(qǐng)查看下面的文檔。重啟之前,讓我們查看是否一切正常:
# cat /boot/grub2/grubenv
# cat /boot/efi/EFI/fedora/grub.cfg
# lsinitrd /boot/initramfs-$(uname -r).img | grep btrfs
你應(yīng)該在 ??grubenv?
?? 和 ??grub.cfg?
?? 有正確的分區(qū) UUID 或指向(??grubenv?
?? 可能沒有更新,如有必要可以編輯它),并在 ??grub.cfg?
?? 中看到 ??insmod btrfs?
? 配置和在 initramfs 鏡像中有 btrfs 模塊。
參見: Fedora 系統(tǒng)管理指南中的 ??重裝 GRUB 2??? 和 ??驗(yàn)證初始 RAM 磁盤鏡像?? 。
重啟
現(xiàn)在系統(tǒng)能夠正常啟動(dòng)。如果不能,別慌,回到實(shí)時(shí)鏡像修復(fù)這個(gè)問題。最壞的情況下,你可以從那里重裝 Fedora 。
首次啟動(dòng)之后
檢查你的新 Btrfs 文件系統(tǒng)一切都正常。如果你覺得沒問題,你需要回收舊的 ext4 快照使用的空間,進(jìn)行碎片整理和平衡子卷。后兩者可能要花一些時(shí)間,并且相當(dāng)耗費(fèi)資源。
對(duì)此你必須這樣掛載頂級(jí)子卷:
# mount /dev/sdXX -o subvol=/ /mnt/someFolder
# btrfs subvolume delete /mnt/someFolder/ext2_saved
然后,當(dāng)機(jī)器有空閑時(shí)間時(shí),運(yùn)行這些命令:
# btrfs filesystem defrag -v -r -f /
# btrfs filesystem defrag -v -r -f /home
# btrfs balance start -m /
最后,有一個(gè) “非寫時(shí)復(fù)制” ??屬性??,對(duì)于新系統(tǒng),這個(gè)屬性是為虛擬機(jī)鏡像文件夾自動(dòng)設(shè)置的。如果你使用虛擬機(jī)的話,可以設(shè)置它:
# chattr +C /var/lib/libvirt/images
$ chattr +C ~/.local/share/gnome-boxes/images
這個(gè)屬性只會(huì)對(duì)在這些文件夾里的新文件生效。復(fù)制鏡像并刪除原鏡像,你可以通過 ??lsattr?
? 確認(rèn)結(jié)果。
總結(jié)
我真心希望你發(fā)現(xiàn)這個(gè)教程是有用的,并且能夠?qū)κ欠裨谀愕南到y(tǒng)上轉(zhuǎn)換為 Btrfs 做出謹(jǐn)慎而明智的決定。祝你成功轉(zhuǎn)換!