固態硬盤使用f2fs作為根分區安裝linux


前言

在固態硬盤上,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問題記錄"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM