[分享] 在ZFS檔案系統上安裝完整Manjaro
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 feature@allocation_classes=enabled \
-o feature@async_destroy=enabled \
-o feature@bookmarks=enabled \
-o feature@embedded_data=enabled \
-o feature@empty_bpobj=enabled \
-o feature@enabled_txg=enabled \
-o feature@extensible_dataset=enabled \
-o feature@filesystem_limits=enabled \
-o feature@hole_birth=enabled \
-o feature@large_blocks=enabled \
-o feature@lz4_compress=enabled \
-o feature@project_quota=enabled \
-o feature@resilver_defer=enabled \
-o feature@spacemap_histogram=enabled \
-o feature@spacemap_v2=enabled \
-o feature@userobj_accounting=enabled \
-o feature@zpool_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 --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=Manjaro
grub-mkconfig -o /boot/grub/grub.cfg
如果使用的是 systemd-boot 的話, 執行
bootctl install
然後建立 /boot/loader/entries/manjaro5.10.conf 的 entry 設定檔, 內容大約如下
title Manjaro Linux 5.10
linux /vmlinuz-5.10-x86_64
initrd /amd-ucode.img
initrd /intel-ucode.img
initrd /initramfs-5.10-x86_64.img
options zfs=zroot/manjaro/root rw
此設定檔也可以透過安裝 systemd-boot-manager 並執行sdboot-manage gen 來自動産生
接著啟動必要的 systemd 服務使系統能自動掛載 ZFS datasets
systemctl enable zfs.target
systemctl enable zfs-import-cache
systemctl enable zfs-mount
systemctl enable zfs-import.target
接著啟動顯示管理員 (display manager) 的服務使系統能直接在開機時進入桌面環境
以 KDE 版本為例, 其預設的顯示管理員為 SDDM, 因此我們啟動
systemctl enable sddm.service
最後, 我們需要在系統産生 hostid 的設定檔, 否則系統在關機或重開機的過程中會無法卸載 ZFS
執行
zgenhostid $(hostid)
至此為止, 系統已安裝完成且可正常運作. 下一步我們將客製化系統.
# 6. 設置系統並新增一般使用者
以下的設置流程應該也適用其他發行版. 我們將設定鍵盤配置, 系統語言, 時區, 系統時鐘, 主機名稱, 主機名稱設定檔, 開啟管理員權限, 網路功能, 時間同步功能及 Root 密碼
接著上面的流程, 我們還是在 chroot 環境之下
6.1 鍵盤配置
鍵盤配置的清單位於 /usr/share/kbd/keymaps 底下. 鍵盤配置的設定檔位於 /etc/vconsole.conf 預設為 US 鍵盤, 內容為
KEYMAP=us
FONT=
FONT_MAP=
若想改用其他如德國鍵盤配置, 將 us 改為 de 即可
6.2 系統語言
編輯 /etc/locale.gen 檔案, 將想使用的語言 ( 如 zh-TW.UTF-8) 去掉註解, 然後執行
locale-gen
然後編輯 /etc/locale.conf 檔案, 將 LANG 參數設定為指定的語言
6.3 時區
時區列表位於 /usr/share/zoneinfo/ 之下. 如要設定為臺灣時區, 我們可將 /usr/share/zoneinfo/Asia/Taipei 符號連結到 /etc/localtime
ls -sf /usr/share/zoneinfo/Asia/Taipei /etc/localtime
6.4 系統時鐘
讓系統使用 UTC 加上時區資訊的方式記錄時間
hwclock --systohc --utc
6.5 主機名稱
設定主機名稱
echo 主機名稱 > /etc/hostname
6.6 主機名稱設定檔
編輯 /etc/hosts, 內容大約如下
127.0.0.1 localhost
::1 localhost
127.0.1.1 主機名稱.localdomain 主機名稱
如果系統使用靜態 IP 連接網路的話, 將 127.0.1.1 改成該 IP 即可
6.7 設定管理員權限
此步驟是為了讓 wheel 群組的成員有管理員權限
執行
visudo
然後找到 %wheel ALL=(ALL) ALL 的行並移除開頭的註解符號
按 ESC+shift+z+z 存檔並離開
6.8 開啟網路功能
systemctl enable NetworkManager
6.9 開啟時間同步功能
systemctl enable systemd-timesyncd
6.10 設定 Root 密碼
passwd
6.11 建立一般使用者
useradd -m -G lp,network,power,sys,wheel -s /bin/bash 使用者名稱
passwd 使用者名稱
若不想讓使用者有管理員權限的話, 不要加入 wheel 群組即可
至此我們已完成所有系統設定. 可輸入 exit 離開 chroot 環境
# 7 卸載檔案系統並匯出 ZFS pool
ZFS pool 必須要先匯出, 否則在重開機後掛載將出現問題
首先先卸載非 ZFS 檔案系統 (如 /boot)
sudo umount 掛載點
再來卸載所有 ZFS datasets
sudo zfs unmount -a
最後匯出所有 ZFS pool
sudo zpool export <zfs-pool-name>
接著就能重新開機, 系統應當能正常運作並進入桌面環境了.
# 設定例行性資料擦洗
例行性資料擦洗 (data scrubbing) 是維持 ZFS pool 良好的秘訣. 使用者可自行建立 systemd 服務與計時器來安排例行性資料擦洗
Arch Linux 及其分支發行版可安裝 AUR 套件 systemd-zpool-scrub.
該套件會建立 zpool scrub 的 systemd 服務及計時器, 預設為每週排程
啟動計時器的指令為
sudo systemctl enable zpool-scrub@<zfs-pool-name>.timer
========心得========
ZFS 是個先進的檔案系統, 有許多優秀的功能能防止資料損毀, 並提供了相當的彈性.
以上的流程主要為 Manjaro, 但在準備磁碟分割及 ZFS dataset 的部份應適用於各發行版. 使用者可在安裝系統及客製化的部份根據各發行版自行調整.
希望以上教程能幫助推廣 ZFS 在 Linux 上的普及.
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 109.171.229.79 (沙烏地阿拉伯)
※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1623083242.A.53A.html
※ 編輯: dobedobedo (109.171.229.79 沙烏地阿拉伯), 06/08/2021 00:29:04
推
06/08 01:37,
3年前
, 1F
06/08 01:37, 1F
※ 編輯: dobedobedo (109.171.229.79 沙烏地阿拉伯), 06/08/2021 02:52:57
推
06/08 18:57,
3年前
, 2F
06/08 18:57, 2F
→
06/08 18:58,
3年前
, 3F
06/08 18:58, 3F
我看到的資訊是 Btrfs 目前的穩定性還不夠 (尤其是在RAID上), 且不支援 native encryption. 有些工具如 btrfs check 還會造成磁碟問題.
XFS 的話看到是對大檔案的處理速度相當快, 但不適合用於儲存很多小檔案.
ZFS 大概只是因為 licence 問題所有比較沒有普及, 但他在功能上應該算得上最先進的. 他在設計時就是 128 位元架構, 所以不用擔心未來系統擴充的問題.
※ 編輯: dobedobedo (109.171.229.79 沙烏地阿拉伯), 06/08/2021 22:23:49
推
06/08 23:28,
3年前
, 4F
06/08 23:28, 4F
推
06/09 00:17,
3年前
, 5F
06/09 00:17, 5F
以家用使用者來說 EXT4 沒什麼問題. 使用其他檔案系統只是為了更優化的效能及其他資料管理的目的.
※ 編輯: dobedobedo (109.171.229.79 沙烏地阿拉伯), 06/09/2021 21:28:02
推
06/11 01:58,
3年前
, 6F
06/11 01:58, 6F
→
06/11 11:32,
3年前
, 7F
06/11 11:32, 7F
→
06/11 14:33,
3年前
, 8F
06/11 14:33, 8F
推
06/11 23:28,
3年前
, 9F
06/11 23:28, 9F
推
06/13 16:33,
3年前
, 10F
06/13 16:33, 10F
→
06/13 16:35,
3年前
, 11F
06/13 16:35, 11F
→
06/13 16:35,
3年前
, 12F
06/13 16:35, 12F
推
06/13 22:12,
3年前
, 13F
06/13 22:12, 13F
→
06/13 22:13,
3年前
, 14F
06/13 22:13, 14F
→
06/13 22:14,
3年前
, 15F
06/13 22:14, 15F
推
06/13 22:41,
3年前
, 16F
06/13 22:41, 16F
推
06/15 14:03,
3年前
, 17F
06/15 14:03, 17F
→
06/15 15:56,
3年前
, 18F
06/15 15:56, 18F
推
06/16 05:24,
3年前
, 19F
06/16 05:24, 19F
→
06/16 05:26,
3年前
, 20F
06/16 05:26, 20F
→
06/16 13:44,
3年前
, 21F
06/16 13:44, 21F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
Linux 近期熱門文章
23
129
PTT數位生活區 即時熱門文章