目錄
前言
在固態硬盤上,f2f比起ext4之類的文件系統在性能和壽命上都有較大優化。所以我決定使用f2fs來作為我debian的根分區。
碰到的問題
- 安裝debian過程中,到硬盤分區的階段沒有f2fs文件系統的選項
- grub默認不支持f2fs
- initramfs默認不支持f2fs
對策
因為grub不支持f2fs,所以boot必須和根分區獨立出來,且/boot分區的文件系統格式必須是grub能識別的。這樣grub才能引導/boot分區中的內核。然后由/boot分區中的帶f2fs模塊的initrd來識別f2fs根分區繼續完成操作系統啟動。總結起來就是 grub2 -> /boot分區 (載入內核,載入帶fsfs模塊的initrd) -->通過支持f2fs的initrd引導根分區操作系統。
安裝過程簡述:
1.使用常規流程安裝debian,要分配獨立的boot分區。進入系統后,安裝f2fs-tool, 並且更新initramfs(也就是更新initrd文件),此時,這個系統在備份操作前就已經具備識別f2fs的能力,initrd也能在引導過程中識別f2fs的根分區了。
2. 進入debian liveCD,使用tar命令備份固態硬盤linux根分區。live系統也安裝f2fs-tool, 這樣live系統就具備格式化固態硬盤linux根分區的能力。格式化固態硬盤linux根分區為f2fs后,再使用tar命令將剛才的備份恢復到f2fs的根分區。
3. 修改f2fs中的etc/fstab中的uuid,因為上面格式化操作會導致uuid變化
4. 在live系統中,chroot到固態硬盤的linux,更新grub,使之能脫離u盤獨立引導固態硬盤的操作系統。
我的實際操作步驟
0.警告
任何時候,不要相信序號,比如sda3 sda2。而是執行下面的命令,通過多個指標判斷,比如分區大小、格式等。否則數據誤刪很麻煩。
這些命令有:
fdisk -lu 或 fdisk -lu /dev/sdXn
lsblk
lsblk -f (加了-f選項后有變化,自己試一下)
blkid
1. 准備
1-為了方便和安全起見,最好准備兩個u盤,一個用於安裝操作系統,一個用於放debian liveCD。存放liveCD的U盤能讓你在電腦操作系統起不來的時候,可以救急。
2-中途涉及多次聯網的步驟,可以使用網線,也可以手機通過usb數據線共享4g流量或wifi數據到電腦(電腦能看到類似enp4s0u1的網卡就是手機usb共享4G網絡的網卡,這里的u就是usb的意思)。當然還可以用熱點共享手機的4G流量(liveCD模式下命令行連熱點的時候,沒有前兩種方式那么方便,所以我一般是用usb線連接手機共享手機的4G網絡)
2. 分區
sda1: ESP(EFI System Partition----EFI系統分區)
sda2: BOOT分區,btrfs
sda3: 根分區,btrfs
sda4, 交換分區,swap
3. 使用網絡安裝debian10
1- 我從debian官網下了個最小化的iso,大概300m,也有50M的mini.iso。之所以使用網絡安裝是因為,我發現通過網絡安裝debian的問題最少(比如字體、輸入法、中文顯示等)。
2- 刻錄安裝debian用的iso文件到U盤,這里使用dd,win下可以使用ultraISO。(同樣的方式,用liveCD的ISO刻錄到另一個u盤,作為意外救急的准備)
dd if=netinst.iso of=/dev/sdX bs=1M #注意這里是sdX(u盤),不是sdXn(u盤的某分區)。sdX是u盤,不要搞錯,否則硬盤數據丟失
3- 把刻錄好的U盤插到筆記本上,使用u盤啟動。分區的時候按照上面的方式分,記住esp分區和boot分區必須和根分區分開。建議安裝的時候,最小化安裝,首先保證流程通了,再嘗試帶桌面的全量安裝,這樣比較穩妥。
4- 安裝完系統后,進入系統,終端執行命令安裝f2fs-tools: apt install f2fs-tools
5- 在/etc/initramfs-tools/modules文件末尾添加三行:
f2fs
crc32_generic
crc32_intel
然后執行update-initramfs -u更新initrd。通過這兩個步驟,就可以保證備份根目錄前,initrd鏡像文件中存在f2fs模塊了,能支持f2fs根分區引導了。
6- 格式化剛剛安裝系統用的u盤,為下面第4大步中備份用途做准備。
4. 備份根分區
使用刻錄了**LiveCD**的U盤啟動后進入live系統
執行sudo su - 切換到root用戶
執行mkdir /tmp/3; mount /dev/sdX3 /tmp/3 (假設SSD的根分區位於sdX3, 這里把還是btrfs的根分區掛載到/tmp/3目錄)
執行mkdir /tmp/u; mount /dev/sdY1 /tmp/u (這里假設/dev/sdY1是備份u盤的第一分區, 執行完命令后,備份用的u盤就掛載到/tmp/u目錄了)
然后執行下面命令:
cd /tmp/3 #cd的ssd的根分區
tar cpf /tmp/u/root.tar . #將當前目錄(ssd的根分區)下的所有文件備份到/tmp/u/root.tar文件。注意,這里有個英文點號。此時固態硬盤根分區已經備份到備份u盤中了。繼續下面的第5大步
5. 修改固態硬盤linux根分區為f2fs
1-為了下載更快,修改live系統的軟件源 vi /etc/apt/sources.list為中科大的源。執行apt update (可能沒網絡。需要連網線,或手機通過usb數據線共享4g或wifi網絡到電腦,然后執行dhclient獲取dhcp自動配置的ip地址才能聯網)
2-執行apt install f2fs-tools 此時live系統就具備了識別和格式化f2fs的能力
3-執行umount /dev/sdX3 #取消ssd根分區的掛載,准備格式化分區為f2fs
4-執行fdisk /dev/sdX進入fdisk的交互命令中
執行p命令查看當前分區,找到固態硬盤的linux根分區(如前文說的,通過分區大小判斷是不是linux根分區)
執行d命令刪除固態硬盤linux根分區
執行n命令新建分區
執行w命令將剛才的變更寫入固態硬盤
執行mkfs.f2fs /dev/sdXn (執行前,務必使用fdisk -lu /dev/sdX來確認根分區是哪個,因為序號會在上面的分區操作中發生變化)
現在執行lsblk -f就可以看到固態硬盤的linux根分區變成f2fs格式了。
6.恢復備份
1- mount /dev/sdX3 /tmp/3
cd /tmp/3
tar xpf /tmp/u/root.tar #恢復備份
2-上面刪分區、建分區操作導致uuid變化。需要修正uuid。
執行lsblk -f或blkid命令獲取f2fs根分區的uuid
執行 vi /tmp/3/etc/fstab 找到根分區的uuid修改成正確的值。
7.更新grub:
mount /dev/sdX2 /tmp/3/boot #把ssd上的boot分區掛在到ssd根分區的boot目錄
mount /dev/sdX1 /tmp/3/boot/efi #把ssd上的esp分區掛到ssd根分區boot目錄的efi目錄下
mount --bind /dev /tmp/3/dev
mount --bind /proc /tmp/3/proc
mount --bind /sys /tmp/3/sys
mount --bind /run /tmp/3/run
chroot /tmp/3 #chroot到固態硬盤的linux
update-grub2 #可能會報錯,但是不要緊
執行poweroff,拔掉u盤,啟動即可進入操作系統。
另外: 意外有時不可避免,比如grub引導不了,initramfs無法掛載根分區等。救急操作參考本博客的另一偏隨筆:"桌面版linux問題記錄"
