Mk-boot-usb: 可開機 usb 碟製作速成

English version


注意:這是 08g 或更舊版的網頁; 新版網頁請見頁面左上角黃色方塊內的連結。 Follow the links in the yellow block at the upper left corner for English pages.


摘要

Mk-boot-usb 是一個用來製作可開機 usb 碟的小小 perl script。 您只需要決定要把 usb 碟切成幾塊, 各留多少空間, 它就會把整顆 usb 碟清空, 切成數個分割, 建立檔案系統, 安裝開機管理員 grub, 並安裝一個極小的 linux, 讓您的 usb 立即變成可開機隨身碟。 Mk-boot-usb 的目的是要讓製作可開機 usb 碟的程序變得極迅速簡便, 極易驗證。 之後如果您想安裝比較有用的 linux 版本, 只需要 (1) 把您所挑選的 Live CD 所有檔案全部拷貝到適切的分割 (2) 修改 grub 的設定檔, 就可以用了。 自從 08g 版開始, 它還具有自我複製的功能: 第一顆可開機隨身碟製作好之後, 灌入 mk-boot-usb, 就可以用它來複製更多相同的可開機隨身碟, 而這些隨身碟也就跟著都有自我複製功能!

這個程式會把您的隨身碟上所有的資料清除; 如果您不小心, 甚至可能會把電腦本身的硬碟, 以及接到電腦上的所有其他儲存裝置, 全部都清得一乾二淨! 此外, 這支程式在撰寫時, 完全沒有把潰客入侵等等與安全性相關的議題列入考量。 請自行斟酌使用。

如果您對推廣自由軟體的興趣甚於技術本身, 請放心略過技術細節 (請找一位略通 linux 命令列的朋友支援技術部分即可), 直接前往這一節: 「讓 mk-boot-usb 幫您推廣自由軟體!」

下載

下載點 在這裡; md5sum: 637b899ab4d0cb8adbfbe3535da44681; 更新記錄; 新版釋出的消息將以留言方式貼在 這帖。 本程式以 GNU General Public License 第三版或更新的版本開放授權大眾使用。

從 08g 版開始, 您可以直接在根目錄底下解壓縮, 執行檔就放在 /usr/sbin/mk-boot-usb ; 其他相關的系統與資料檔案都放在 /usr/share/mk-boot-usb 底下, 包含 ttylinux。 (應該說 mk-boot-usb 已變成 ttylinux 的非官方包裝紙才對。) 這樣可省去許多麻煩, 例如網路連線的需求, 及無法在 unionfs 上用 -o loop 掛載檔案系統的問題, ... 等等。

軟體需求及功能限制

Mk-boot-usb 用到以下套件/指令: perl, sfdisk, mkfs (mkfs.vfat and mkfs.ext2), grub。

也建議您安裝 qemu, 這樣製作完成之後, 就可立即測試是否成功。

Mk-boot-usb 在 Ubuntu 的衍生版本 Edubuntu 上面開發。 有聽說在 Fedora 上面執行 mk-boot-usb, 可以成功安裝 grub, 但最後的 usb 碟卻無法開機。 如果您在 *ubuntu 系列以外的版本上成功, 請分享您的經驗。

這支程式在撰寫時, 完全沒有把潰客入侵等等與安全性相關的議題列入考量

製作第一顆可開機隨身碟

製作第一顆隨身碟稍微麻煩一點, 要讀這一節跟下一節。 感謝 Eating 寫了圖文並茂的文章, 詳盡解釋所有步驟: 製作 LINUX 的開機 USB 碟 (舊版: 1, 2)。 因為本頁面的文字會隨著版本更新而更正, 所以建議以本頁面文字為主, 不清楚之處再輔以該頁的圖片, 應更容易上手。 又, 勤益科大朱孝國老師製作一份 簡報

首先請打開終端機, 變身成 root。 以 ubuntu 為例, 下 sudo bash 指令, 並打您自己的密碼。 若是 fedora, 可能是下 su 並打 root 的密碼; 不過請見上面關於 fedora 的問題。 然後取消 「自動掛載抽取式儲存裝置」 功能。 以 ubuntu 7.10 為例, 在「系統」「偏好設定」「抽取式儲存裝置」 底下, 把所有選項都取消掉。 若是 ubuntu 8.04, 則要用 ubuntu 身份 (而不是用 root 身份) 執行 gconf-editor 指令, 選進 apps/nautilus/preferences, 把 media_automount 和 media_automount_open 的勾清除掉。

假設您有一支 1GB 的 usb 碟, 且您想將 Damn Small Linux 4.2.5 與 slax 6.0.0 裝進去 (當然 ttylinux 是我們原本就會替您安裝的)。 太好了! Mk-boot-usb 內建的 grub 選單恰好已有適用於這兩片 Live CD 的選項, 所以這是最簡單的情況; 也因此建議初次使用者先拿這兩個版本測試。

那我們就留大約 60MB 給 DSL, 240MB 給 slax; 剩下大約 700MB 可用來儲存資料。

首先請確認這支 usb 碟 沒有插在電腦上。 接著將下載回來的檔案在根目錄下解壓縮, 並執行:

        cd /
        tar xzf ~/mk-boot-usb-08g.tgz
        mk-boot-usb

Mk-boot-usb 會請您 此時才插入 usb 碟。 然後請等幾秒鐘, 看見 usb 碟上的燈閃了幾下, 又停下來。 此時如果跳出檔案總管視窗, 則表示您先前忘記取消自動掛載 usb 碟的功能。 請按 ctrl-c 中斷, 詳讀本節最前面, 再重來一次。 如果沒有跳出檔案總管視窗, 您就可以按 Enter 繼續執行。 此時 mk-boot-usb 會比較您插入 usb 碟前後的 /dev/sd*, 看看到底那個裝置才是您要清空並安裝可開機 linux 的 usb 碟。

接著 mk-boot-usb 會把您的 usb 碟上的所有分割都看過一遍, 並列出每個分割上最近修改的五個檔案, 讓您確認這真的是即將清除的 usb 碟沒錯。 然後它會印出此 usb 碟的真實大小 (單位為 MB), 並要求您輸入一組以空格分開的數字, 這些數字的總和必須恰為印出的數字。 這是為了再次確認抓到正確的 usb 碟 (或至少抓到大小一模樣的 usb 碟 :-) )。 例如它秀出 968, 則您可敲入:

        668 60 240

在您同意繼續之後, 它會建立一個 vfat 的主分割區, 大小為 668MB, 用以安裝 grub 與 ttylinux; 又會建立兩個 ext2 的邏輯分割區, 大小分別為 60MB 與 240MB。 (usb 碟速度太慢, 不適合用 ext3。) 注意: 實際切出來的分割大小可能略有出入, 因為切割時以 8032.5 KB 為單位。

如果您的系統裝有 qemu, 現在就可以下指令: qemu -usb /dev/sdy (當然 sdy 要依實際狀況改成別的名字)。 注意: 用 mk-boot-usb 所製作出來的隨身碟, 經常被認成是硬碟。 若在其他開機選單找不到您的可開機隨身碟, 可以進入 BIOS 的 "harddisk priority" 選單找找看。 Ttylinux 的登入帳號密碼都是 root。 恭喜您! 您已經有一顆可開機隨身碟。 當然 ttylinux 只有英文, 也沒有圖形界面, 沒什麼太多好玩的東西。 所以還要繼續照著下一節做。

其實您也可以用批次方式執行, mk-boot-usb 就不會一直問問題。 請見原始碼前幾頁, 關於命令列選項的註解。 這個使用模式很危險, 尤其是 -d 選項一定不可以弄錯, 不然後果不堪設想, 請小心使用!

把您自己挑選的 Live CD 裝到其他分割

如果您要安裝的是 DSL 4.2.5, 只需要把 Live CD 上的所有檔案目錄全部拷貝到 usb 碟的一個空的分割上, 並修改 usb 碟的主分割區裡面的 /boot/grub/menu.lst 設定檔。 Grub 的語法中, 第一個主分割區叫做 (hd0,0); 而第一個邏輯分割區叫做 (hd0,4)。 (為什麼是 hd0...? 因為以 usb 開機時, 它自己一定是系統認得的第一個裝置。) 除此之外, 不需要再改其他任何地方了。

Slax 6.0.0 的做法完全相同。 順便一提, slax 會把您操作過程當中所有的修改都寫入它所在分割的 /slax/changes 目錄當中。 試想: 這是一套將 400MB 左右內容塞入 200MB 空間的 Live CD 版 Linux; 而現在它卻若無其事地直接寫入 usb 碟, 完全沒有被它的 「唯讀出身」 所限制; 使用者完全不必做任何設定! Slax 真是帥呆了!

關於 *ububtu 系列的 Live CD 的提醒: (1) 根目錄下有一個隱藏目錄 /.disk 拷貝到可開機 usb 碟時別漏掉了! 感謝 misivic 的 提醒。 (2) 如果照著 Live CD Persistence 的說明多做幾步 (直接跳到 'Creating the "casper-rw" File System' 那一節), 您也可以讓您這份來自 live CD 的 ubuntu 變成可讀寫的。 也就是說, 您可以在上面新增套件, 彷彿是在用一個安裝到硬碟的系統一樣! (3) 使用 qemu 測試 mk-boot-usb 所製作的 *ubuntu 系列 Live USB 時, 可以成功地帶到圖形介面一下子, 但最後掉入 busybox 命令列。 我在幾部實機測試 (包含 eeepc), 倒是可以正常開機。 真希望 Ubuntu 方面有人可以把 /casper/initrd.gz 修改一下, 至少可以加個 log 功能, 這樣它掉入 busybox 時, 至少比較容易做 bug report。 詳見 這篇

順便提到花蓮縣網所製作的 otg linux。 這是從原本正常安裝在桌機上的 ubuntu, 採用 tux2live 處理, 改裝出來的中文教育版 Live DVD。 (也因此有上述 qemu 的問題) 因為我的聽眾多半是老師, 所以打算將來演講時就盡量裝這套, 也因此從 08d 版開始, 將它納入開機選單。 如果您喜歡 otg-linux, 但 mk-boot-usb 做出來的 usb 碟無法進入 otg-linux, 您也可改用他自己的可開機 usb 安裝程式: pc_hd-otg-ins.sh.

若您選擇安裝其他版本的 Live CD, 則還需要將光碟上原本的 isolinux (或 syslinux) 語法翻譯成 grub 的 menu.lst 語法。 請對照 DSL (或 slax) 的 grub 語法與 isolinux 語法, 作為翻譯的範例。

其實您也可以在 Windows 下進行光碟至隨身碟的拷貝, 只要安裝 explore2fsext2fsd 就行了; 不過要讓 Microsoft Windows 在我的 linux 分割上毛手毛腳? 要是我, 可會格外謹慎。

把您正在使用的 Linux 系統安裝到 usb 碟上

Linux 新手請略過此節。

比方說您想將日常使用的 ubuntu 桌面裝到 usb 碟上。 首先, 您的 usb 碟必須夠大, 因為一般的 Live CD 都有壓縮過; 但若希望安裝完的系統可以自己再加裝套件, 則最簡單的方法就是不要壓縮, 通常總會用掉 2G 多, 因此建議要用 4G 的隨身碟。 其次, 用其他 linux 開機 (例如用一張 Live CD 或用您剛剛製作的 live usb 進入 slax) 並將您的 ubuntu 分割整個拷貝到 usb 碟的一個空的 ext2 分割。 (ext3 太慢) 相信走到這個地步, 您早已清楚如何修改隨身碟主要分割區的 /boot/grub/menu.lst。

剩下來的最重要修改都集中在標的分割區的 /etc/fstab 檔:

  1. 因為每次開機可能都在不同的電腦, 無法給一個固定的 /dev/sda5 之類的 device name, 所以應以 UUID 或 LABEL 的方式掛載根目錄
  2. 以 tmpfs 的方式掛載 /var 與 /tmp
  3. 移除其他大部分的內容
  4. 在所有 ext2 條目的 option 欄位加上 noatime

還遺漏了什麼嗎? 請大家補充囉!

複製可開機 USB 碟

* * * 開始之前, 容我提醒您: 要為他人複製可開機 USB 碟之前, 請先謹慎想清楚您自己的隱私資料! 請確認來源碟上沒有任何私密資料, 諸如即時通好友名單或個人帳號密碼等等。 "Information wants to be free", 資訊一旦釋出, 如覆水難收, 後悔都來不及。 * * *

如果您有數支一模一樣的隨身碟 (相同型號, 相同大小), 您可輕易地複製。 先用 mk-boot-usb 將其中一支製作成可開機 USB 碟。 比方說這支是 /dev/sdx, 而另一支空白的是 /dev/sdy, 則可用指令: dd < /dev/sdx > /dev/sdy 複製, 另一支也就變成一模一樣的可開機 USB 碟。

如果是不一樣的隨身碟呢? 我試著把兩支不同廠牌, 但同為 2GB 的隨身碟 對拷, 結果開機時 grub 只載一半, 印出 "grub ", 就當掉了。 如果您知道為什麼, 請指教, 謝謝!

沒關係, 從 08g 版開始, 您可以很輕鬆地複製不同廠牌型號的可開機隨身碟:

  1. 用裝有 mk-boot-usb 的隨身碟開機, 就叫它 W 吧。
  2. 執行 ls /dev/sd? 查看系統認到幾顆硬碟/隨身碟
  3. 插入另一顆預先製作好的可開機隨身碟 X。 請確認 X 本身也裝有 mk-boot-usb, 這樣用它複製出來的 Y 才可以再度去複製別人 :-)
  4. 等幾秒後 (通常 X 碟的燈會閃幾下) 再次執行 ls /dev/sd? 查看系統新看到的碟叫什麼名字? 例如叫做 /dev/sdx 這顆就是將被複製的來源碟。
  5. 執行 mk-boot-usb -s /dev/sdx 然後在它提示之後插入 [將被清空重灌的] 隨身碟 Y, 按 Enter 之後, 就開始複製程序。 您可以去喝杯咖啡運動個一二十分鐘, 順利的話, 回來時, Y 就變成 X 的複製品了 :-)

可否略過 W, 直接用 X 開機, 並把 X 複製到 Y 呢? 我用的是上面提到的 otg linux 來做這件事; 請記得它是用 tux2live 處理 ubuntu 製作出來的, 其中採用到 unionfs 技術。 我無法從程式當中掛載 X 的分割, 懷疑與 unionfs 有關。 (給 Linux 高手: 我很有興趣知道 slax 能否避開這個問題, 因為它不用 unionfs 而改用 aufs; 但我沒時間玩 slax) 沒關係, 只要在執行 mk-boot-usb 之前, 手動把 /dev/sdx 的所有分割預先掛載好, 一樣可以複製。 (從別的頁面被直接帶到此節的 Linux 新手: 可以請教身旁略懂 Linux 的朋友, mount 與 df 指令的用法與意義; 這個動作只要做一次; 複製第二顆, 第三顆, ... 就不必再重複這個動作了。)

補充說明:

  1. mk-boot-usb 會膽小地拒絕從大碟複製到小碟, 所以您不能將 2G 的碟複製到 1G 的碟。
  2. mk-boot-usb 可以將小碟複製到大碟, 多出來的空間就留給最前面的 vfat 資料分割。
  3. 但是如果目的地太大 (超過 32GB), mk-boot-usb 也會膽小地拒絕, 因為它怕不小心把機器內建的硬碟給毀了。
  4. 複製前請確認 X (來源碟) 的每個分割都不要太滿 (90% 以下), 因為 (1) 同樣號稱 2G, 隨身碟的大小還是有些微差異 (2) 即便 Y 比 X 大還是有風險: 因為對 Y 切分割的動作並不完全精確, 最後與 X 的各分割大小可能有些許差異。 如果 X 的某些分割太滿, 複製到 Y 時, 有可能會裝不下。

我朋友 chungyu 說我製造了一個電影 「駭客任務」 當中的史密斯先生。 我想 mk-boot-usb 和影集 「星鑑迷航記」 當中的 Borg 也蠻像的 :-) 還有在全民之間 (合法或非法) 傳染的 Microsoft Word(s) 也很像。 不過 mk-boot-usb 和這三者最大的不同, 在於它將 「是否要複製」 的決定權留給每個人, 而不像這三者用暴力或欺騙將自己強迫加諸於受害者身上。 微軟用盡各種方法阻撓 linux 和其他自由軟體。 不過就像侏羅紀公園說的: 「生命會找到它的出路」 linux 跟生命一樣, 不只找到它的出路, 也會不停地繁衍 ;-) 請幫助它在微軟的荒漠帝國裡用力繁衍。

* * * 最後, 再提醒您一次: 請先謹慎想清楚您自己的隱私資料, 避免外洩!

讓 mk-boot-usb 幫您推廣自由軟體!

試想: 下次您舉辦 linux 安裝大會之類的活動時, 將不再需要請與會者攜帶笨重的大電腦來; 只需要請他們帶 usb 碟來就夠了! 如果他們急著想現場驗證的話, 才需要帶筆記電腦來測試。

其實它的應用也不限 linux 安裝大會這種電腦玩家的活動。 只要十分鐘, 就可以現場向非技術聽眾展示製作可開機隨身碟! 比方說吧, 下次您在任何數/理/化/美/音/工教育軟體的研習場合 (對象不是電腦老師, 而是想用電腦融入教學的各學科老師) 甚至是 「資訊科技與人權」 這類完全非技術的演講場合, 不妨要求主辦單位公告, 請聽眾自備空白隨身碟。 如果您運氣好, 現場還可以有一位不太害怕命令列的助教幫忙, 那您在演講時, 他就可以當場為每一位聽眾製作可開機隨身碟。 如果是研習場合 (每位學員有電腦可用) 只要在研習結束前, 花十五分鐘介紹如何設定 BIOS 以改用用隨身碟開機就 ok 了。 再進一步請聽眾記得: 下次購買電腦時, 要帶著這個 usb 去店家測試。 這有兩個效果: (1) 確認買到支援 linux 的硬體 (2) 讓店員開開眼界。 又, 建議順便把 portable appsU-Portable-Platform 也裝到隨身碟的第一主要分割區。

以後我的演講 就要這麼做 :-) 這就是當初我寫 mk-boot-usb 的原始動機。 祝大家推廣快樂!

問題與討論?

呵呵我沒力正式維護一個計畫; 但歡迎大家提出指教。 請前往 部落格此篇 留言。