Hi,
最近成功的將完整的 Manjaro KDE edition 成功裝在 ZFS 檔案系統上
發現這裡關於 ZFS 的討論很少,於是想分享一下我的安裝經驗
原文發在 Manjaro 論壇上,有興趣的也可以去看看
https://t.ly/C141
希望可以多推廣 ZFS 在 Linux 上的使用.
教程上寫的比我實際的情形來得簡單許多. 比如我的 EFI 系統分割是裝在軟體磁碟陣列上, 教程中略過 RAID 設定的部份
========正文開始========
# 0. 準備 Live Media
隨便找一個支援 ZFS 的版本並下載 ISO 檔將其燒錄成可開機媒介 (USB, DVD 等)
# 1. 開機並進入 Live environment
進入 BIOS/UEFI 將你的可開機媒介啟動順序調前並開機進入 Live 環境
# 2. 準備磁碟分割
我們要將系統碟至少做下列三個分割區:
(1) EFI system partition (ESP): 檔案系統為 FAT32, 大小至少為 512 MB.
圖形介面下記得加入 esp 旗標
(2) SWAP: 檔案系統為 linuxswap, 大小依據記憶體及使用需求而異
(3) ZFS: 使用圖形介面的話將其保留為未格式化, 然後標籤為 Solaris Root
這裡推薦使用 gdisk 做磁碟分割以利於設立正確的標籤
# 3. 建立 ZFS pool 及 dataset
ZFS 檔案系統使用虛擬磁碟機的概念, 我們可以將 pool 當作 container, 而 dataset 才是我們用來掛載的檔案系統
這裡要注意的是要事先規劃好系統要使用哪種開機加載器 (GRUB 或 systemd-boot), 這將影響到建立 ZFS pool 的參數
首先以 sudo modprobe zfs 確認 zfs 模組已加載至核心
接著以 ls -lh /dev/disk/by-id 找出我們要用來建立 ZFS 的磁碟分割的 ID
再來使用下列指令來使用該磁碟分割建立 ZFS pool
sudo zpool create -f -o ashift=12 \
-O acltype=posixacl \
-O relatime=on \
-O xattr=sa \
-O dnodesize=legacy \
-O normalization=formD \
-O mountpoint=none \
-O canmount=off \
-O devices=off \
-R /mnt \
-O compression=lz4 \
<zfs-pool-name> /dev/disk/by-id/<id-to-partition-partx>
若是你要使用 GRUB 做為開機加載器的話, 使用以下指令
sudo zpool create -d -o ashift=12 \
-o [email protected]_classes=enabled \
-o [email protected]_destroy=enabled \
-o [email protected]=enabled \
-o [email protected]_data=enabled \
-o [email protected]_bpobj=enabled \
-o [email protected]_txg=enabled \
-o [email protected]_dataset=enabled \
-o [email protected]_limits=enabled \
-o [email protected]_birth=enabled \
-o [email protected]_blocks=enabled \
-o [email protected]_compress=enabled \
-o [email protected]_quota=enabled \
-o [email protected]_defer=enabled \
-o [email protected]_histogram=enabled \
-o [email protected]_v2=enabled \
-o [email protected]_accounting=enabled \
-o [email protected]_checkpoint=enabled \
<zfs-pool-name> /dev/disk/by-id/<id-to-partition-partx>
則該 ZFS pool 將只支援 GRUB 可使用的功能, 否則到後面執行 grub-install 時會失敗
若想使用完整的 ZFS 功能, 推薦使用 systemd-boot 做為開機加載器, 設定上會簡單點
接著若有其他的磁碟也想做為 ZFS 使用且該磁碟只有一個磁碟分割區的話, 那在建立 ZFS pool 時直接指定整顆磁碟 (沒有-partx) 即可.
接著我們在已建立的 ZFS pool 底下建立 datasets 用來掛載系統
sudo zfs create -o mountpoint=none <zfs-pool-name>/manjaro
sudo zfs create -o mountpoint=/ -o canmount=noauto <zfs-pool-name>/manjaro/root
datasets 的層級設計很有彈性, 唯一要注意的是要掛載在 / 的 dataset 一定要加入 -o canmount=noauto
在所有的 ZFS pool 及 dataset 都建立好後, 我們要將其先匯出再匯入, 否則之後掛載會有問題
sudo zpool export <zfs-pool-name>
sudo zpool import -d /dev/disk/by-id -R /mnt <zfs-pool-name> -N
# 4. 掛載檔案系統
先掛載做為 / 的 ZFS dataset
sudo zfs mount <zfs-pool-name>/<zfs-dataset-for-root>
若有其他 ZFS datasets 也依樣畫葫蘆將其掛載. 接著再掛載其他非 ZFS 的檔案系統及 ESP
此時注意若開機加載器使用的是 GRUB, 則將 ESP 掛載於 /mnt/boot/efi 下. 若使用 systemd-boot 的話則直接掛載在 /mnt/boot 底下即可.
接著我們要掛在於 / 的 ZFS pool 設定 bootfs 參數, 這樣系統才知道要去哪裡找系統
sudo zpool set bootfs=<zfs-pool-name>/<zfs-dataset-for-root> <zfs-pool-name>
然後為每個 ZFS pool 設定 cachefile 的位置
sudo zpool set cachefile=/etc/zfs/zpool.cache <zfs-pool-name>
最後將 zpool.cache 複製到準系統碟底下, 這樣開機時才會自動掛載 ZFS datasets
sudo mkdir -p /mnt/etc/zfs
sudo cp /etc/zfs/zpool.cache /mnt/etc/zfs/zpool.cache
接著準系統的磁碟掛載都準備好在 /mnt 之下了. 以上的準備工作應該適用於各個發行版. 接下來的安裝將會以 Manjaro 為主. 其他發行版若有手動安裝的方式應該能自行套用
# 5. 使用官方發佈的 iso-profile 及 basestrap 指令將完整系統安裝到準系統碟
如果不想像 Arch 一樣一切從基本系統開始的話, 我們可以用官方發佈的 iso-profile 將完整的系統安裝起來
首先先取得 iso-profile
git clone https://gitlab.manjaro.org/profiles-and-settings/iso-profiles.git ~/iso-profiles
底下有各個版本的 ISO 資料. 比如說我們想安裝的是 KDE 版本, 我們就查看 ~/iso-profiles/manjaro/kde 這個目錄, 底下應該有如下的檔案結構
desktop-overlay
live-overlay -> ../../shared/manjaro/live-overlay
Packages-Desktop
Packages-Live -> ../../shared/Packages-Live
Packages-Mhwd -> ../../shared/Packages-Mhwd
Packages-Root -> ../../shared/Packages-Root
profile.conf
其中最重要的是 Packages-Desktop Packages-Root 這兩個檔案, 及 desktop-overlay 資料夾
那兩個檔案中是該 版本所安裝的套件, 而 desktop-overlay 裡是 Manjaro 為該版本所預設的設定檔
需要注意的是 Packages-Root 裡面的 KERNEL 套件為核心, 使用者需自行以 linux510 之類的名稱來替換
我們接著隨便以任何方法將裡面的套件整理成清單, 要注意 KERNEL-zfs (linux510-zfs) 及 zfs-utils 這兩個套件必須在清單內以提供 ZFS 支持
接著以 basestrap 安裝所有清單內的套件
sudo basestrap /mnt <所有所需套件>
安裝完之後, 再將 desktop-overlay 裡的所有東西複製到 /mnt 底下, 系統就算基本安裝完了. 我們還得先做些基本設定以確保系統能正常運作
第一件事是編輯 /etc/fstab 以讓系統自動掛載其他非 ZFS 檔案系統, 再來是在 initramfs 中加入 ZFS 的支持, 並且安裝開機加載器及啟動必要的 systemd 服務
在進入 chroot 環境之前, 我們先以 ls -lh /dev/disk/by-uuid 找出其他分割區的 UUID
接著執行
sudo manjaro-chroot /mnt /bin/bash
以 bash 進入 /mnt 的 chroot 環境
接著編輯 /etc/fstab, 內容大概如下
# Static information about the filesystems.
# See fstab(5) for details.
# <file system> <dir> <type> <options> <dump>
<pass>
UUID=1A66-24E1 /boot vfat defaults 0 0
UUID=5af3f596-1068-457f-9d64-4db5aa649caa none swap defaults 0 0
UUID=388de0df-1d0b-4f78-b6a7-2888859d3fa1 none swap defaults 0 0
再來我們編輯 /etc/mkinitcpio.conf 檔案以對 initramfs 加入 zfs 支持
找到 HOOKS 那行, 並在 keyboard 及 filesystem 之間加入 zfs, 內容大概如下
HOOKS=(base udev autodetect modconf block keyboard zfs filesystems fsck)
接著執行 mkinitcpio -P 以重新建立 initramfs 供開機使用
接著安裝開機加載器. 如果使用 GRUB 的話, 執行
grub-install