2023年10月20日 星期五

antix 23 的 frugal 與 persistence

想要幫幾部 2010 年前後生產的 eeepc 安裝作業系統, 於是下載好久不見的 antix (32 bit full 版) 回來測試。 因為等一下要把 antix 安裝到隨身碟上, 所以請先插入一顆空白隨身碟。 假設系統把它叫做 /dev/sdz 。 開一部 32bit 虛擬機來測試 iso 檔, 並且讓它看到 /dev/sdz: qemu-system-i386 -enable-kvm -monitor stdio -vga virtio -m 2048 -cdrom antiX-23_386-full.iso -hda /dev/sdz -boot order=dc Antix 的開機選單是我所看過的所有發行版本的 iso 檔當中最靈活的。 看 原始碼, 它是採用 Gfxboot 製作的。 (BitJam/antiX-Gfxboot) 按 F2 可以選擇語言、 按 F5 可以選擇 persistence 的型式、 ... 等等。 這一篇我們先只談 persistence 的觀念, 所以可以先什麼都不選, 直接進入預設的環境試車。 如果要變身成 root, 可以 su (密碼 root) 或 sudo bash (密碼 demo)。

一、 觀念複習

linux 開機流程 首先複習一下 linux 的開機流程以 live cd 的運作方式。 較舊的機器, 包含所有 32bit 的機器, 不包含 UEFI 那兩塊。 控制權走到最後一步時, 一般完整安裝的 linux 會把某個分割區 (/dev/sdz99 之類的) 掛載為根目錄; 而 live cd (iso 檔) 則會把某個 root.squashfs 之類的壓縮檔掛載為唯讀的根目錄, 又採用 overlayfs 在上面套疊上一層 (由記憶體所提供的) tmpfs 可讀寫層。 開機完成後, 下 df 會看到有一個 /live/aufs-ram 掛載點, 但若下 mount | grep overlay 會發現它的類型是 tmpfs, 功能是作為系統根目錄的 overlayfs 的上層, 只是名字裡有 aufs 而已。 (aufs 的歷史 有點曲折, 現在較少人在用。)

我的電腦都採用 extlinux 作為開機管理員, 因為它比較容易設定。 每次玩新版的 linux, 要 (在 LVM 裡面) 灌一個完整的新版本之前, 我都會先安裝一個 「類 live CD」 的版本作為緊急救援用, 也就是在最後一步採用硬碟上的某個 squashfs 作為根目錄。 只需要做兩件事就可以裝好, 很簡單: (1) 把 vmlinuz、 initrd.img、 root.squashfs 複製到 (同一個分割區內) 你高興的地方 (2) 在 extlinux.conf 裡面加一筆開機選項, 正確指定前兩個檔案, 以及 *.squashfs 所在目錄的位置。 Antix 把這種 "以 硬碟上的 squashfs 作為根目錄" 的安裝方式稱為 frugal install, 因為它很省硬碟空間。 Antix 的唯讀根目錄映像檔, 格式同樣是 squashfs 但檔名不是 *.squashfs 而是 linuxfs。

單純的 frugal 跟 live cd 一樣, 兩者都是沒有記憶的。 你所做的所有修改/設定都放在記憶體那個 tmpfs 裡面, 關機後就不見了。 想要保留修改/設定, 就必須在硬碟上另建一個 可讀寫、 沒有壓縮 的映像檔, 專門存放變更的部分。 開機時, 它會取代先前說的 「記憶體讀寫層」 的角色: overlayfs 會把它疊在 "linuxfs" 之上。 這個機制稱為 persistance 這篇 live CD + persistence 介紹文 適用於多數基於 debian 的 linux distro 的 live CD。

Antix 的 persistence 比較複雜一些。 它的 "root persistence" 與上述一般的 persistence 類似, 但一般 debian 系列的 OS 開機命令列上的 persistence persistence-path=... persistence-label=... 等等參數並不適用。 它的 persistence 檔名固定叫做 rootfs; 位置則可由 開機命令列參數 指定。 Antix 另外多了 "home persistence", 也就是把實體硬碟上一個名為 homefs、 可讀寫、 沒有壓縮 的映像檔掛載於 /home。 如果你對 antix 光碟上預裝的軟體都很滿意, 不需要另外把自己常用的軟體安裝到系統, 那麼可以選擇採用 home persistence 而不要採用 root persistence, 系統關機時就只有個人目錄 (/home/demo) 裡面的設定會保留下來, 也就是更可以減少惡意軟體的攻擊面。 (從外面的實體硬碟上看, 就是 homefs 這個檔案的內容會改變。) 我自己則是為了省事, 習慣只採用 root persistence 而不另外採用 home persistence。

選擇 persistence 是否要 auto save 幾種 persistence 我會說 antix 的 root persistence 與一般的 「類似」 而不是 「相同」, 是因為實際上在 antix 的 root persistence 模式底下, 根目錄的 overlayfs 的上層並不是 rootfs 映像檔而是記憶體 (tmpfs)。 這讓系統多半時候更像是無記憶的 live cd, 可以提升讀寫速度; 想到的時候再手動下 "persist-save" 指令把今日所有的變動存入 rootfs。 有夠多的記憶體 (4G 或以上) 的話, 建議採用 root persistence。

事實上初次建立 persistence 映像檔的過程當中, antix 就會問你希望何時啟動 persist-save? 全自動/半自動/手動? 我採用全自動。 事後也可以下 persist-config 指令改變儲存模式, 叫系統關機前自動儲存所有變動, 或關機前詢問用戶是否要儲存。

如果你希望每個指令所產生的效果都馬上存入硬碟、 不介意速度較慢, 或是你的記憶體很少 (1G 或更少), 無法採用 antix 標準的 root persistence, 那麼 static persistence 就比較適合你。 這等同於傳統的 persistence: overlayfs 直接把 rootfs 疊在壓縮、唯讀的 linuxfs 之上*

二、 實作: 安裝

那麼, 接下來就實作一顆 antix 23 開機隨身碟吧。

用 arandr 指令調整螢幕解析度 首先, kvm 預設的解析度很低。 還好, 因為剛剛命令列上有 -vga virtio 選項, 所以現在在虛擬機裡可以下 arandr 指令, 把解析度調高 (如圖, 從 Output => Resolution 進去, 最後要按勾勾才會生效) 、 再把 kvm 視窗拉大。

如果想要正常完整安裝 (而非 frugal install), 可以按桌面上大大的 "installer" 按鈕, 然後參考去年的這篇 Antix Linux Installation 2022, 對新版應該還是大致適用。

live-usb-maker 至於 frugal install, 比較簡單的方式是: 從主選單找到 「applications」=>「antiX」=>「Live USB Maker」 然後照著 Create MX Linux Live USB 這個三分鐘短片做, 即可把剛剛備妥的隨身碟變成 antix 開機碟。 第一分鐘是下載 (antix 的兄弟) MX linux, 可略過。 (我自己是沒用過 live-usb-maker 啦。)

如果在開機時按 F5 選擇某幾種 persistence, 系統就會把好幾個檔案拷貝/建立在目標隨身碟裡, 但是 不會安裝 boot loader! 以下介紹這條比較辛苦 (但以後很方便擴充其他發行版本) 的路。

我自己不太喜歡用 grub2, 而是偏好使用 extlinux 這個 boot loader。 請先關掉虛擬機。 按照 mbootuz 下方中文說明或是 「半自助救命碟 (講師趕時間版)」 把 extlinux 安裝到隨身碟上, 並且確認 kvm /dev/sdz 可以看到開機選單。 當然目前沒有真正的作業系統, 所以無法開機。

接下來就可以再用最上面完整的 kvm 指令再次啟動 antix 虛擬機。 開機時按 F5, 選擇你要的 persistence 型式。 我選的是 frugal_root。 系統會尋找可寫入的硬碟/隨身碟、 讓你選擇安裝目標分割區、 把 linuxfs 壓縮檔複製過去、 在該分割區上面建立 rootfs、 建立 swap 檔、 讓你更改 root 跟 demo 的密碼、 設定 persistence 何時存檔。 (見文末截圖)

設定 extlinux 這次是靠著 iso 檔才成功進入系統。 接下來要設定 extlinux.conf , 讓它可以看到安裝好的 antix 相關檔案, 下次才可以不需要 iso 檔、 讓隨身碟自己開機。 我的隨身碟切成三個分割區: 在虛擬機裡面看到的 /dev/sda1 是 mbootuz.py 安裝 extlinux 的地方; 我的安裝目標分割區是 /dev/sda2 ; /dev/sda3 是要拿來存資料的。 你也可以通通放在同一個分割, 更簡單。 請自行更改指令。 我們需要蒐集兩項資訊以便填入 extlinux.conf 設定檔: (1) /dev/sda2 的 UUID (2) linuxfs 與 rootfs 存放的路徑。 等一下查詢很長的路徑名稱時 (.../antiX-Frugal-5.10.188-antix.1-486-smp/...) 「檔案名稱快打」 (tab 鍵, file name completion) 很好用! 另外, 還需要把 vmlinuz 跟 initrd.gz 複製到 extlinux 所在的分割區, 也就是 /dev/sda1。 我把它們放在 antix23/ 子目錄底下好了。 請先 su 變身為 root, 然後執行以下:

mount /dev/sda1
df | grep -v tmpfs
mkdir /media/sda1/antix23
ls -l /media/sr0/antiX/vmlinuz /media/sr0/antiX/initrd.gz
cp /media/sr0/antiX/vmlinuz /media/sr0/antiX/initrd.gz /media/sda1/antix23/
blkid /dev/sda2
ls -l /live/boot-dev/antiX-Frugal-5.10.188-antix.1-486-smp/*fs
geany /media/sda1/boot/syslinux/extlinux.conf

最後在 geany 編輯器裡面設定 extlinux。 我的 extlinux.conf 內容長得像這樣;

default antix23
timeout 200

# comment out the following line if your syslinux is 4.x or older
path modules/bios/

ui vesamenu.c32
menu background autumn.jpg
menu resolution 800 600

label antix23
	menu label antix23
	kernel /antix23/vmlinuz
	append initrd=/antix23/initrd.gz buuid=ffffffff-ffff-ffff-ffff-ffffffffffff bdir=/antiX-Frugal-5.10.188-antix.1-486-smp persist_root

你至少要修改 buuid=... 如果你選擇不同形式的 persistence, 那麼 persist_root 也要改。 請參考 開機命令列參數 當中的 「persist=」 以及下方的 「Persistence Shortcuts」 部分。 為什麼我寫 persist_root 而不是寫 frugal_root? 因為我的隨身碟上已有 frugal antix, 不需要叫它再裝一次了啊。 詳見同一頁的 「frugal=」 以及下方的 「Frugal Shortcuts」 部分。

然後應該就可以不需要 cdrom/iso, 隨身碟就能自行開機了!

很重要的一點是: 一定要用 iso 映像檔上面的 antiX/initrd.gz ! 我最開始先試 「正常完整安裝」, 然後再試 frugal install 的時候, 直接沿用 「正常完整安裝」 版的 initrd.img-* 餵給 extlinux, 結果它既不認得上述連結裡的開機命令列參數, 也不認得傳統 debian 的各個 persistence 相關參數。 花很多時間終於找出癥結之後, 我還 在論譠貼文警告大家: iso 映像檔上面的 antiX/initrd.gz 才認得 antix 專屬的開機命令列參數。 這個特殊版本的 initrd 的原始碼應該是這個 antiX-Linux/Live-initrd-1 .. 吧?

相同的原因, 若要玩 pxe 網路開機, 則一定要用開完機之後的 /boot/initrd.img-* 才會認得 boot=live fetch=tftp://... 等等參數; iso 映像檔上面的 antiX/initrd.gz 認不得這些參數。

這種安裝方式可以在同一顆隨身碟上安裝很多個不同版本的 antix, 因為每個版本有自己專屬的目錄用來存放 linuxfs 與 rootfs。 目錄名稱也可以自行更改, 詳見 「Persistence Location」 部分。 如果要讓好幾組 persistence 共用同一個系統映像檔 linuxfs, 可以讓每個開機選項各自指定不同的 "pdir=..." 甚至不同的 "puuid=..." 但大家都指定相同的 "buuid" 加上 [相同的 "bdir=..." 或 "sq=..."]。

三、 使用時的注意事項

  1. 為了節省空間, 每次關機後, /var/cache/apt/ 會被清空。 所以每次開機之後,如果想要安裝套件, 就必須重新 apt update 一次。
  2. antix 採用 SysVinit 系統而不是 systemd 系統來管理各種服務, 所以要用 service 指令而不是 systemctl 指令。 例如平常在 ubuntu 若要啟用 ssh 服務, 要下 systemctl start ssh; 在 antix 底下則要改下 service ssh start。

現在, 請用輕巧的 antix 讓你的舊電腦重新飛起來吧! [2023/12/04] antix 23 兩種客製化方式: remaster 跟 snapshot

選擇安裝目標分割區 複製 linuxfs 建立 rootfs 之前的設定 決定 rootfs 的大小
建立 swap 檔之前的設定 設定自己的密碼 設定 persistence 何時存檔

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。