2014年1月20日 星期一

救援鳳凰 Finnix 讓救命碟恢復 「自我無性生殖」 的能力

好吧, 「鳳凰」 是我亂取的名字 (因為讀起來很像 phoenix)。 Finnix 是專為系統管理員所設計的 LiveCD, 沒中文、 沒圖形, 只有英文文字介面, 所以很精簡, 小於 180 MB。 它以 Debian 為基礎, 打包/壓縮方式類似 knoppix, 所以對我來說比較容易修改/客製 :-) 自從我淡出 slax 之後, 複製救命碟變得有點麻煩 -- 開機、 來源、 目的地總共要三支碟。 (就是只能 「幫別人無性生殖」 的意思 (咦?)) 前幾天成功地把 mk-boot-usb 裝進 finnix 裡面, 從此以後, 救命碟的用戶又可以自嗨了, 耶! [2014/10/03 更新: 建議改下載我製作的 中文版]

一、 開機

請到 這裡 下載最新版的 finnix-ckhung*.iso 。

你可以直接燒成開機光碟。

以光碟開機之後, 還可以試著進一步用 mk-boot-usb -b -v 1 -z '100+ 6400' -d /dev/sdx 製作你的第一顆空殼救命碟。 這個範例會把 /dev/sdx 切出一塊 6.4G 的 /dev/sdx5 作為存放 linux 的空間, 然後把剩下的空間 (至少要有 0.1G) 全部都留給 /dev/sdx1 的 vfat 分割。

如果你手中已有救命碟 (例如我幫你製作的舊版, 或是剛用 finnix 光碟開機所製作出來的空殼開機碟), 也可以直接把 iso 檔的內容物 (不是 iso 檔本身) 複製到某個分割裡 (比方說 /dev/sdx99 好了) 並且編輯 /dev/sdx4 掛載點之下的 /boot/grub/menu.lst 檔, 加上這幾句:

    title Finnix 109
    kernel (hd0,98)/boot/x86/linux vga=791 finnixdir=/finnix nomodeset quiet
    initrd (hd0,98)/boot/x86/initrd.xz

一般完整版 linux (例如 antix 或 SimplyMepis) 無法一邊正常運作一邊把自己複製給別人。 現在你只需要把 finnix 加到既有的救命碟上面 (只要還有任一分割有足夠的空間就 OK; 完全不需要重新分割等等), 就可以改用 finnix 開機, 然後按照 這一篇 把自己複製給別人了!

因為我經常需要把好幾個不同版本的 linux 放在同一個分割, 為了避免彼此互相干擾, 最好能讓每個版本有自己的子目錄。 例如當初若把 finnix 相關的所有檔案放在 /dev/sdx99 的 /finnix-109 子目錄 (而不是它的根目錄) 底下, 那麼根據 boot parameters 這一頁, menu.lst 就應該要這麼改:

    title Finnix 109
    kernel (hd0,98)/finnix-109/boot/x86/linux vga=791 finnixdir=/finnix-109/finnix nomodeset quiet
    initrd (hd0,98)/finnix-109/boot/x86/initrd.xz

二、 使用

開機後打 df 會看到一個 /cdrom 子目錄, 那就是 /dev/sdx99 的掛載點。

要注意的是: 除非你特別指定儲存路徑, 要不然 finnix 並不寫入隨身碟或硬碟。 比方說, 你現在所下的指令, 下次開機就全忘光了。

我所包裝的版本已有 mk-boot-usb 指令可用。 事實上你可以 cat docs/mk-boot-usb.txt 把裡面的指令剪貼出來改。

下這個指令: dpkg-query -W -f '${Installed-Size;6} ${Package}\n' | grep -v '[0-9] lib' | sort -n 看到以下最大的幾個套件:

    ...
    11513 perl
    13382 coreutils
    16103 perl-modules
    17074 nmap
    18197 binutils
    41474 smbclient

看來, 如果不需要用網路芳鄰連線的話, 還可以省下 20MB 左右。 (因為 squashfs 有壓縮; 下詳) Finnix 除了內建許多網管及系統管理套件之外, 也包含 gnupg 與 python2.7-minimal 等等套件。

如果是 dhcp 的有線連線, 當然就很容易上網沒問題。 如果是無線網卡, 則可以 這樣連線上網

三、 毫邁帥氣裸奔

如果開機時在 grub 命令列上多打一個 toram 選項, 那麼開機時會稍微頓久一點, 系統會整個拷貝到記憶體裡面去。 開完機後打 df 就看不見 /cdrom 子目錄。 這時把隨身碟拔出來, 電腦照樣可以運作。 請想像你面對著一群資工系的學生展示一部沒有機殼、 沒有軟硬碟、 沒有光碟電腦。 你用 finnix 隨身碟開機, 開完之後, 下一個執行很久的指令 (比方說, find /), 然後電腦一邊執行, 你一邊以慢~動~作~拔掉隨身碟, 而它卻繼續執行。 find 之所以執行得很慢, 那是為了配合遲緩人類。 如果 ctrl-c 切斷它, 重新執行一次並 output redirect 到檔案裡面, 學生們就會感受到這部光溜溜的機器以 DDR3 數百 MHz 當作硬碟的速度狂風般裸奔的毫邁帥氣!

但若你若按照第一節最後面, 把 finnix 放在某分割的子目錄 (而不是它的根目錄) 底下, 那麼還必須 (1) 把 md5sums 搬回根目錄底下, 並且 (2) 把其中所有路徑都加上子目錄的名稱, toram 才會成功。 以上面的設定為例, md5sums 當中原來的一句

    886b16bb9ab0b960048af31156724bef  finnix/arch/x86/root.img
就應該變成
    886b16bb9ab0b960048af31156724bef  finnix-109/finnix/arch/x86/root.img

其餘類推。

[2015/3/4 補充] 如果在隨身碟上放了好幾個不同版本的 finnix, 只要分別放在各自的目錄, 還是可以共享同一個 md5sums 檔 -- 就直接把 (加上各自不同目錄名稱後的) md5sums 檔 cat 在一起就可以了。 但是這樣系統會把所有版本 (包含用不到的版本) 的檔案全部載入記憶體, 有點浪費空間。 所以最好還是分開, 只有常用的那一個叫做 md5sums。

四、 製作你自己的 finnix

客製化 finnix 時的幾個重要目錄 如果想要自己客製 finnix, 有兩個方法。 如果只是要加幾個檔案, 採用 overlay 比較簡單; 如果還想刪除套件、 新增 (相依套件很多的) 套件, 就要改採 remastering。 以下是我的 remastering 筆記。

mount /dev/sdx99 /media/sdx99 # 掛載硬碟的某個分割作為工作磁區
# 客製化 finnix 的過程, 至少需要用到 700+200+200 MB 的空間!
mkdir /media/sdx99/finnix-build # 建立空的工作目錄
mkdir /srv/finnix
ln -s /media/sdx99/finnix-build /srv/finnix/build
cp -a /cdrom /srv/finnix/build/master
# 可以在 .../master/ 底下加入一些圖片或文件等等與系統無關的檔案
    # 如果要改系統的話...
    mkdir /srv/finnix/build/source
    cp -a /FINNIX /srv/finnix/build/source
        # 如果要改 initrd 的話...
        mkdir -p /srv/finnix/build/initrd
        cd /srv/finnix/build/initrd
        xz -d < ../master/boot/x86/initrd.xz | cpio -idm
        # 例如儘早載入某些模組 ...
        vi /srv/finnix/build/initrd/init
        # 加入兩句: modprobe ext4 ; modprobe ext3
        # 「改 initrd」 的 "如果" 結束
    export FINNIXDEV=1    # 讓等一下的 chroot 環境知道自己是在 chroot 環境裡面正在修改 finnix
    chroot /srv/finnix/build/source/FINNIX /bin/bash -l
    apt-get update
    apt-get upgrade
    apt-get remove 一些套件
    apt-get install 一些套件
    # 其他修改
    exit
    finnix-build-stage1
    # 把 /srv/finnix/build/source/FINNIX 壓縮到
    # /srv/finnix/build/master/finnix/arch/x86/root.img 去。 很久。
    # 如果要改開機選單或開機 kernel 命令列的話, 請改 /srv/finnix/build/master/isolinux.cfg
    # 「改系統」 的 "如果" 結束
finnix-build-stage2

上面的兩層 "縮排" 代表可略過的步驟。

內層的 "如果" (改 initrd) 你多半可略過。 我當初發現 finnix 若裝在 ext4 分割上, 開機會失敗; 但若裝在 ext2 分割上, 則可正確開機, 並且之後也可以掛載 ext4 分割。 最後找到出問題的 init 命令稿, 加上 modeprobe ext4modeprobe ext3 兩句就 OK 了。 如果你從我的版本開始改, 就不需要做這個修正。

chroot 結束之後的 finnix-build-stage1 會把 /srv/finnix/build/source/FINNIX/ 底下的所有東西打包壓縮成一個 squashfs 放在 /srv/finnix/build/master/finnix/arch/x86 底下叫做 root.img。 注意: 不只 /var/cache/apt/archives 底下的 *.deb 會被清空, 連 /root 底下的東西也會被清空!

最後的 finnix-build-stage2 指令會把 /srv/finnix/build/master/ 底下的所有東西打包成一個新的 iso 檔, 放在 /srv/finnix/build/ 底下。

五、 就算比亞當夏娃更孤單也能隻身恢復文明

終於找到接近完美的組合了, 超開心的啦! 以後 8G 或以上的隨身碟, 就安裝 antix + finnix; 1G 到 4G 的隨身碟, 就安裝 puppy linux + finnix。 就算全世界其他的硬碟與隨身碟都被消磁了, 只剩一支救命碟, 也可以恢復文明啦!

5 則留言:

  1. The download link of "ftp:/v.im.cyut.edu.tw/14/" is not correct because the ":" is a fullwidth colon.

    回覆刪除
    回覆
    1. 謝謝, 已更正! (我打字習慣打半型; 先前 「貼文之前半型轉全型」 的程式有 bug...)

      刪除
  2. 請問老師:我把你打包的Finnix 下載後,燒成CD。然後用這CD開機,用裡面的mbu 做了第一支切成4個分割區的可開機USB。我現在可用這個mbu USB開機,可從boot list 進入 ttylinux。之後,我按照你上面說的,把 finnix-mbu-14a.iso 的內容物(不是 iso 檔本身), 複製(用另一台圖形介面的linux)到第三個分割(也就是extion 的第二個邏輯磁碟),我的問題如下:
    1. 我如何得知這支mbu USB開機後的磁碟代碼及檔案格式代碼,也就是 kernel (hd0,98) 中的0及98?我會用 DOS 的指令,但進入ttylinux 後的指令我就不會了。在ttylinux裡,如果得知這支mbu USB 的各個預設分割
    a. hd0 或 hd1 或需要用其他代號?
    b. (hd0,98) (hd0,4),到底需要用98還是4?哪裡可以找到檔案系統的號碼表?
    謝謝!

    回覆刪除
    回覆
    1. 看了grub的文件,改好了。主分割從0開始,邏輯分割從4開始。
      title Finnix 109 + mbu-14a
      kernel (hd0,5)/finnix-mbu-14a/boot/x86/linux vga=791 finnixdir=/finnix-mbu-14a/finnix nomodeset quiet
      initrd (hd0,5)/finnix-mbu-14a/boot/x86/initrd.xz

      刪除