2026年7月17日 星期五

如何用debootstrap來重裝Ubuntu(附帶安全啓動處理)

  為何我會選擇用debootstrap安裝系統?有很多原因,容許我逐一展開。第一,Ubuntu的官方安裝器無法分配LVM或是Btrfs的掛載點(當然,你也可以用其他風味版,例如Kubuntu,來獲得不同的安裝器以分配LVM或是Btrfs的掛載點,但這樣就不是GNOME桌面就是了),這或許是因為新手易用所做的取捨吧,但我覺得我都選擇了手動分配掛載點,應該要有彈性給我選擇才是,而且在22.04以前(再次強調,「以」有「包含」的意思),舊版的安裝器是可以分配LVM掛載點,開倒車有些不好;第二,我覺得Ubuntu預設安裝有些臃腫,為了方便開箱即用,因此打包了很多,加上我的電腦強制需要安全啓動(Secure Boot),因此我選擇Ubuntu/Debian、Fedora/RHEL系列,方便處理安全啓動的發行版;第三,我可以體驗像是Arch Linux安裝方式,而且最小安裝的Ubuntu是沒有snap,這對於某些人是福音吧,說來也有趣,我一開始是相對支持snap的,但後來Debian用久了,掌握了backports倉庫作為補充的技巧,所以也沒有那麼想要依賴snap了(你應該參考:〈修正Debian上Telegram鼠標變小的問題〉來知道為什麼),經過實測,系統開機速度5秒不到(從GRUB選單按下enter開始計算),夠輕量了吧? 

  我將會先簡單提一下我的分區情形,闡述一些步驟的原理(比較像是Ivon文章教學在我這裡情況的修改,原諒我沒有創新)。還有,我會着重一下關於最小安裝GNOME以及軟體的選擇,這裡我想展現我的哲學和品味。順帶一提,你應該要先準備好Ubuntu安裝ISO,本文是用Ubuntu 26.04。 

分區介紹和簡單分析 

  如果你是已經有Linux,則可以先看自己的分區結構,若沒有,請先進入Ubuntu的LiveCD,並打開終端機,後面的操作和終端機是無法脫鉤的。還有,你可以不用關掉安全啓動,因為我這裏的做法會順便解決這個問題。 

  1. 開啓終端機,查看分區。這個語法是「List Block」的縮寫。
    $ lsblk 
  2. 你應該得到下列訊息
    xiong@Ubuntu:~$ lsblk
    NAME             MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
    nvme0n1          259:0    0 476.9G  0 disk 
    ├─nvme0n1p1      259:1    0   512M  0 part /boot/efi
    ├─nvme0n1p2      259:2    0    16M  0 part 
    ├─nvme0n1p3      259:3    0 128.2G  0 part 
    ├─nvme0n1p4      259:4    0    46G  0 part 
    ├─nvme0n1p5      259:5    0   954M  0 part /boot
    ├─nvme0n1p6      259:6    0     1G  0 part 
    └─nvme0n1p7      259:7    0   149G  0 part 
      ├─Linux-debian 252:0    0  55.9G  0 lvm  /
      └─Linux-home   252:1    0  93.1G  0 lvm  /home
     
  3. 我們來一一介紹我的分區結構。不過,在此之前,我先講一下父目錄和子目錄,這二者是相對關係的,舉例來說,「下載」資料夾裡面還有一個叫做「學習資料」的資料夾,那麼「下載」是「學習資料」的父目錄,「學習資料」是「下載」的子目錄。 
  4. 我的這臺筆電是NVMe硬碟,裝置代號是nvme0n1,0表示這是第一顆NVMe硬碟,因為NVMe硬碟支持硬體分割成多個不同的磁碟(電腦看起來像是多顆不同硬碟,是命名空間的應用),因此n1表示這是第一個命名空間(一般家用一顆硬碟就是一個命名空間)。 
  5. 後面的p1是指這個硬碟的第一個分割區,以此類推。並且,分割區都是掛載在/dev目錄下的一個裝置,畢竟「萬物皆文件」。 
  6. /dev/nvme0n1p1是這臺電腦的ESP分區,大小是512MB,用來作為UEFI開機引導的分區。我這臺電腦是Windows雙系統(還是有不得已的時候,像是LINE),因此這個ESP分區務必小心,以免開不了機。在Linux中,是掛載在/boot/efi。 
  7. /dev/nvme0n1p5是我的/boot分區,如果你是用LVM或是Btrfs,建議獨立出一個/boot分區,方便開機。像是Ubuntu在Ubuntu 26.04精簡了GRUB(為了安全),這個分區獨立出來還是很必要的。Ubuntu/Debian系列大概1GB就夠了,Fedora/RHEL和SUSE系列建議2GB以上。 
  8. Linux-debian是我的LVM裡面的根目錄(/)的分區,分區代號是/dev/Linux/debian,也可以用/dev/mapper/Linux-debian表示。Linux是我的LVM的Volume Group的名稱,debian是我的LVM的Volume Group裡面的Logic Volume的名稱
    (小知識:「/」是一個分區,表示根目錄) 
  9. Linux-home是我的家目錄(/home)的分區,分區代號是/dev/Linux/home或是/dev/mapper/Linux-home。 
  不知道你有沒有覺得,我的這個分區有點像是菊花鏈,分區竟然還可以掛載在分區的下面,舉例來說,ESP分區掛載在/dev/nvme0n1p5下面。這是很重要的觀察點,這意味着後面掛載分區的絕對順序,以免損壞分區資料。我們是利用樹狀目錄的方式為這些分區找一個名正言順的位置,來方便我們管理,但也因為類似電腦資料夾那樣的管理方式,舉例來說,刪掉其中一個父目錄會導致下面的子目錄也跟着被刪掉,有着連根拔起的效果! 

進入liveCD掛載分區 

  有了上一節的概念,我們來開始掛載分區。當然,你得要先進入LiveCD,並打開終端機。我們會把硬碟的分區掛載在/mnt下面(mnt是mount的縮寫,其實你掛載在別的位置也不是不行,但我這裡依循使用習慣,以及潛在DAC權限的分配,你可以看看:〈AppArmor和簡單的電腦安全採取行動〉)。如果你是用Btrfs,你應該參考:〈Ubuntu 22.04 LTS debootstrap install.md - GitHub〉、〈Debian + btrfs安裝指南(Windows雙系統指南)〉,來看看btrfs怎麽掛載。務必依序操作。 

  1. 讓系統讀取現在LVM的狀態
    sudo pvscan
    sudo vgscan
    sudo lvscan
     
  2. 格式化舊的根目錄的分區和舊的/boot分區。mkfs是make filesystem的縮寫,ext4是檔案系統的種類,你也可以用btrfs之類的。我沒有強烈的快照要求以及為了成熟性的考量,而且LVM可以用簡單卷(Thin Volume)來做快照(snapshot)
    sudo mkfs.ext4 /dev/Linux/debian
    sudo mkfs.ext4 /dev/nvme0n1p5 
  3. 掛載根目錄到/mnt
    sudo mount /dev/Linux/debian /mnt 
  4. 建立boot資料夾在/mnt下方,-p表示不論父子目錄關係
    sudo mkdir -p /mnt/boot 
  5. 掛載/boot分區
    sudo mount /dev/nvme0n1p5 /mnt/boot 
  6. 建立efi資料夾在boot下方,用來掛載ESP
    sudo mkdir -p /mnt/boot/efi 
  7. 掛載ESP到/boot/efi下方
    sudo mount /dev/nvme0n1p1 /mnt/boot/efi 
  8. 建立home資料夾在根目錄下方,掛載家目錄分區
    sudo mkdir -p /mnt/home 
  9. 掛載家目錄
    sudo mount /dev/Linux/home /mnt/home 

準備工具 

  建議LiveCD先連網,我們需要下載一些套件,但安裝時可以不連網。我們需要的工具是debootstrap、arch-chroot(手動傳統chroot很麻煩,所以我用arch的chroot工具來方便) 

  • 安裝所需工具
    sudo apt install debootstrap arch-install-scripts 

安裝基本系統 

  如果你有用過Debian的GUI安裝界面,我相信你對於「安裝基本系統」這個步驟應該不陌生,沒錯,debootstrap是用來安裝基本系統的,主要是把一些系統運作所需的工具解壓縮到分區裡面(這也為何我們需要格式化部分分區) 

  1. 安裝基本系統,Ubuntu 26.04的代號是resolute。這個步驟不會動到/boot、/boot/efi、/home,會建立/etc、/usr等目錄存放關鍵元件
    sudo debootstrap resolute /mnt 
  2. 將分區狀況寫入fstab。fstab是系統用來識別掛載點和分區關係的文件,存在於/etc/fstab
    genfstab -U -p /mnt | sudo tee /mnt/etc/fstab 
  3. 我們進入實體機的系統裡面,並且獲取root身份來完成後續系統安裝和設定,這個步驟是chroot(Change Root)。注意,此時的基本系統是沒有Linux內核的。
    sudo arch-chroot /mnt 

安裝內核 

  Ubuntu針對LTS有兩種內核,一種是GA,另一種是HWE(Hardware Enablement)內核。前者是這個版本發佈哪一版的內核,這個內核的版本就是固定的,只會發佈安全補丁,後者是類似Debian的backports倉庫的內核,半年升級一次,跟著最新版本的Ubuntu內核走,舉例來說,Ubuntu 26.10發佈了,我要是用Ubuntu的HWE內核,我的Ubuntu 26.04就可以使用26.10的Linux內核。對於一般桌面用戶,如果你是打算使用Ubuntu LTS、兩年升級一次系統,我會很推薦用HWE內核,以獲得最新的驅動、較好的效能提升 

  1. 安裝nano編輯器
    sudo apt update
    sudo apt install nano
     
  2. 修改source,先使用nano編輯器打開
    sudo nano /etc/apt/sources.list 
  3. 輸入下列內容
    deb [trusted=yes]  http://tw.archive.ubuntu.com/ubuntu resolute          main restricted universe
    deb [trusted=yes]  http://tw.archive.ubuntu.com/ubuntu resolute-security  main restricted universe
    deb [trusted=yes]  http://tw.archive.ubuntu.com/ubuntu resolute-updates   main restricted universe
     
  4. 【可選】我比較喜歡DEB22格式的source,因此我們還可以執行下列指令
    sudo apt modernize-sources 
  5. 保存並離開nano編輯器,更新一下源和基本系統的一些元件
    sudo apt update && sudo apt full-upgrade 
  6. 安裝內核、必要組件(像是LVM管理器、EFI管理工具)。「--no-install-recommends」參數表示不安裝其他建議的依賴,採取最小安裝依賴、僅安裝必要依賴
    apt install --no-install-recommends linux-image-generic-hwe-26.04 linux-headers-generic-hwe-26.04 linux-firmware initramfs-tools efibootmgr lvm2 

安裝桌面環境和我推薦的日常使用的基本軟體 

  如果你要省事一點,可以安裝ubuntu-desktop(Ubuntu定製的GNOME桌面)或是原生GNOME(vanilla-gnome-desktop),但我想要最小安裝GNOME桌面,因此這一步就很重要了。 

  1. 安裝最基本的GNOME桌面。得益於GNOME是一套完整的桌面環境,基本功能都是有的,如果你是用KDE,可能連螢幕截圖工具都沒有(這主要是開發者的依賴打包的選擇,KDE的模組化程度高,這也是優點)
    apt install --no-install-recommends gnome-core 
  2. 安裝網路管理工具。預設的Ubuntu是使用netplan,但這個不好用且桌面環境對於NetwokManager的支援度比較好。
    apt install network-manager network-manager-gnome 
  3. 安裝藍牙和音效模組
    apt install pipewire wireplumber bluez gnome-bluetooth-common 
  4. 安裝安全工具
    apt install xdg-desktop-portal-gnome polkitd apparmor ufw apparmor-profiles-extra apparmor-profiles 
  5. 安裝閉源解碼器。你應該參考:〈Linux優化雜談:主要面向Debian和Fedora
    apt install intel-media-va-driver-non-free 
  6. 安裝tuned電源管理器。如果你安裝TLP,可以參考:〈Linux的電源管理TLP(for tlp 1.9)
    apt install tuned tuned-ppd 
  7. 安裝中文字型和系統中文語言包
    apt install fonts-noto-cjk language-pack-zh-hant 
  8. 安裝輸入法,我推薦ibus-rime(開機後再裝也可以)
    apt install ibus-rime 
  9. 安裝推薦的軟體(個人喜好),依序是終端模擬器、文書處理、看圖軟體、影片播放軟體、郵件客戶端、GNOME Tweaks、GNOME插件管理器
    apt install gnome-console libreoffice nomacs vlc evolution gnome-tweaks gnome-shell-extension-manager 

  此時的系統是沒有瀏覽器和snap,而firefox使用apt安裝會跳轉去安裝snap。我選擇使用deb安裝,因此你應該參考Mozilla官方的說明,複製貼上指令,並且安裝Firefox,這部分我就不贅述。如果你不排斥snap,可以直接執行apt install firefox即可。請參考:〈在 Linux 安裝 Firefox - Mozilla〉 

用戶設定、個人化設定 

  我的家目錄的資料夾是xiong,下列步驟攸關我們怎麽取回家目錄的使用權限,以恢復絕大多數的資料。 

  1. 設定主機名稱
    echo "Ubuntu" > /etc/hostname
    echo "127.0.0.1 localhost" >> /etc/hosts
    echo "::1 localhost" >> /etc/hosts
    echo "127.0.1.1 Ubuntu" >> /etc/hosts
     
  2. 設定時區,我是選擇Asia/Taipei
    dpkg-reconfigure tzdata 
  3. 設定區域和語言。用空白鍵選取語言編碼,我是勾選en_US.UTF-8 UTF-8、zh_TW.UTF-8 UTF-8,因爲我偏好英文界面,因此第二步的展示語言我選擇en_US.UTF-8,如果你要中文,就選擇zh_TW.UTF-8 
    dpkg-reconfigure locales 
  4. 新增使用者。-d 指定家目錄路徑,-m 若不存在才建立,-s 指定預設 Shell。
    useradd -d /home/xiong -m -s /bin/bash xiong 
  5. 設定密碼,應該要和舊密碼一致。其實沒有也沒關係,下一步就有奪權的步驟。
    passwd xiong 
  6. 家目錄所有權轉移(奪權)。chown是Change Owner的縮寫
    chown -R xiong:xiong /home/xiong 
  7. 將該使用者加入sudo群組,以便使用sudo指令
    usermod -aG sudo xiong 

啓動必須服務 

  1. 啓用GDM顯示管理器、網路管理器
    systemctl enable gdm.service
    systemctl enable NetworkManager.service
     
  2. 啓動Apparmor
    systemctl enable apparmor 
  3. 設定防火牆,我們允許kde-connect的端口(1714~1764)、ssh、https服務
    ufw default deny incoming
    ufw default allow outgoing
    ufw allow ssh
    ufw allow http
    ufw allow https
    ufw allow 1714:1764/tcp
    ufw allow 1714:1764/udp
    ufw enable 
  4. 下載帶有簽章的GRUB和安全啓動的密鑰管理器
    apt install grub-efi-amd64-signed shim-signed 
  5. 安裝GRUB到系統中
    grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu --recheck 
  6. 更新GRUB設定
    grub-mkconfig -o /boot/grub/grub.cfg 
  7. 刪掉舊的啓動選項,以我來說是debian
    sudo rm -rf /boot/efi/EFI/debian 
  8. 列出NVRAM裡面的開機選項,我們要刪掉多餘的開機選項,以免主機板的開機選項被塞滿
    efibootmgr 
  9. 會有下列結果
    BootCurrent: 0001
    BootOrder: 0001,0002,0000
    Boot0001* ubuntu
    Boot0002* debian          <-- 這是舊的、想刪掉的
    Boot0000* Windows Boot Manager

    ... 
  10. 執行下列命令,刪掉舊的開機選項。-B是指刪除的意思。
    efibootmgr -b 0002 -B 

收尾 

  1. 退出chroot
    exit 
  2. 逐步卸載分區
    sudo umount /mnt/boot/efi
    sudo umount /mnt/boot
    sudo umount /mnt/home
    sudo umount /mnt
     
  3. 重新啓動電腦,選擇ubuntu開機。 

我的碎碎唸 

  我第一次用debootstrap安裝系統,花了我兩個小時,因為電腦有重要資料,因此花了點時間確認這些指令、掛載順序是否有問題。裝完系統占用不到6GB,啓動超快,系統組件精簡的像是毛坯屋,這我很尬意。我這次安裝主要是我想征服debootstrap和嘗試掛載LVM、嘗試最小安裝系統。我寫這篇文章最主要的目的是記錄我的征服歷程,方便日後回顧,我也打算在Telegram上的Ubuntu社群分享這篇文章,作為回報,因為我有從上面得到一些解答。 

  不過,最麻煩的是,Thunderbord只支援snap安裝,Mozilla不打算釋出deb包,Debian上的是社群打包,所以我改用evolution。還有,之前用Ubuntu Server安裝Ubuntu,GNOME桌面會有動畫缺失,這次沒有,真是可喜可賀,而且也沒有Server版開啓的一些服務占用到啓動時間。 

參考資料 

沒有留言:

張貼留言