[分享] 在ZFS檔案系統上安裝完整Manjaro

看板Linux作者 (DoBe)時間3年前 (2021/06/08 00:27), 3年前編輯推噓11(11010)
留言21則, 10人參與, 3年前最新討論串1/2 (看更多)
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
推 想請問大大覺得zfs btrfs xfs在一般個人使用上有
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
推 ZFS 號稱究極檔案系統
06/08 23:28, 4F

06/09 00:17, 3年前 , 5F
所以 EXT4 不好嗎?
06/09 00:17, 5F
以家用使用者來說 EXT4 沒什麼問題. 使用其他檔案系統只是為了更優化的效能及其他資料管理的目的. ※ 編輯: dobedobedo (109.171.229.79 沙烏地阿拉伯), 06/09/2021 21:28:02

06/11 01:58, 3年前 , 6F
沒辦法,Oracle家的東西,要用還是會怕怕。
06/11 01:58, 6F

06/11 11:32, 3年前 , 7F
不是有OpenZFS嗎
06/11 11:32, 7F

06/11 14:33, 3年前 , 8F
Linux 上的 ZFS 是 OpenZFS, 跟 Oracle 無關
06/11 14:33, 8F

06/11 23:28, 3年前 , 9F
激推zfs,搭lxd做測試環境snapshot回溯都超方便!!
06/11 23:28, 9F

06/13 16:33, 3年前 , 10F
zfs回溯lxd snapshot只能回溯最新的那個,更舊的就不行了
06/13 16:33, 10F

06/13 16:35, 3年前 , 11F
Feature comparison https://reurl.cc/R0X7Nr
06/13 16:35, 11F

06/13 16:35, 3年前 , 12F
btrfs還比zfs多了兩個yes
06/13 16:35, 12F

06/13 22:12, 3年前 , 13F
感謝A大分享,跳板切我都乖乖發佈.. btrfs可以自由跳?
06/13 22:12, 13F

06/13 22:13, 3年前 , 14F
如果只是要切版用copy+rename也可以,這樣就不用一個
06/13 22:13, 14F

06/13 22:14, 3年前 , 15F
一個回溯
06/13 22:14, 15F

06/13 22:41, 3年前 , 16F
看到文件了!改天來玩玩看,再次感謝A大推薦
06/13 22:41, 16F

06/15 14:03, 3年前 , 17F
要用zfs的話直上BSD吧
06/15 14:03, 17F

06/15 15:56, 3年前 , 18F
很多 Linux 上的桌面軟體 BSD 不支援唷
06/15 15:56, 18F

06/16 05:24, 3年前 , 19F
哪個BSD www
06/16 05:24, 19F

06/16 05:26, 3年前 , 20F
很多 Windows 上的桌面軟體 Linux 也不支援唷
06/16 05:26, 20F

06/16 13:44, 3年前 , 21F
我以為一般講的 BSD 是指 FreeBSD XD
06/16 13:44, 21F
文章代碼(AID): #1WlaZgKw (Linux)
文章代碼(AID): #1WlaZgKw (Linux)