2021年10月8日 星期五

glabman: 一個人一天架好一間 linux (+ windows?) 電腦教室

M212 教室所有電腦一開機就進入 pdmenu 是的, 暑假我在跌跌撞撞當中完成了這個壯舉。 如果再來一次, 有這篇事後心得文可以參考, 說不定半天就可以完成, 或許還能附贈 Windows。

一、 環境及前置作業

  1. 教室內網要順暢, 最好有 DHCP。
  2. 假設所有電腦的硬體配備都相同。
  3. 硬碟可以是空的完全沒有作業系統
  4. 除了想要安裝 Linux 之外, 如果還想要加裝 Windows, 那麼每部電腦最好有兩顆硬碟, 處理起來比較簡單。
  5. 準備4顆 貴哥版的 grml Linux 開機隨身碟。 以 UEFI 開機的電腦來說可以把 grml 的 iso 檔裡面的所有目錄與檔案複製到隨身碟的根目錄、 進到 live/grml64-small 把 *.squashfs 改名為 root.squashfs (當初我製作新版光碟時忘記改 *.squashfs 的名字了 orz) 、 把 uefi-boot-files*.tgz 在隨身碟的根目錄解壓縮、 最後在 EFI/BOOT/extlinux.conf 設定檔裡面加上這一段, 並且把原先的 default forgetful 改成 default grml 即可:
    label grml
            menu label grml64 small g20C
            kernel /boot/grml64small/vmlinuz
            append initrd=/boot/grml64small/initrd.img boot=live live-media-path=/live/grml64-small toram=root.squashfs
    
    其中的 toram=root.squashfs 把整個 grml linux 載入記憶體, 開機完成後便可以拔下隨身碟。
  6. 準備好 linux 映像檔。 可以是 fsarchiver 的映像檔開機光碟裡的 squashfsbtrfs 的 snapshot 或是 ZFS 的 snapshot, 總之你自己知道該如何下指令還原就可以。
  7. 如果要裝Windows也要先準備好Windows的企鵝龍映像檔
  8. 為老師機準備一顆大容量的開機隨身碟或可開機 ssd 外接硬碟, 上面裝有舒適熟悉的 linux 環境。 例如我這次我用的是 貴哥版的 linux mint。 把上述的作業系統映像檔都放進去, 也把 pdmenuudpcastmcnc.py 等等套件以及小程式都先裝好。

二、 網路版的autoexec.bat

古代的 dos 跟 windows 作業系統有一個機制, 讓你設定開機時要叫電腦做哪些事, 只需要把這些指令寫入 c:\autoexec.bat 就可以了。 Linux 上面的 /etc/rc.local 也有相同的效果。

Grml Linux 的開機選項當中, 有一個 netscript 可以指定一開機馬上就去下載網路上的某個程式來執行。 比方說你在 EFI/BOOT/extlinux.conf 裡面做這樣的設定:

label grml
        menu label grml64 small g20C
        kernel /boot/grml64small/vmlinuz
        append initrd=/boot/grml64small/initrd.img boot=live live-media-path=/live/grml64-small toram=root.squashfs netscript=https://v.im.cyut.edu.tw/glabman/startup  getfile.retries=20 

那麼它一開機就會試著去我的伺服器下載並執行我寫的 startup 這個 script, 最多嘗試 20 次 (一開始網路可能還沒通,會失敗幾次) 最後進入pdmenu。 隨便信任網路上的程式碼當然會有很大的資安風險, 用 root 的身份執行更加危險! 還好這裡我們只是要讓每一部學生機執行老師機上面的程式碼, 所以讀者可以先下載並研讀這裡面很簡單的小 scripts, 把裡面的 IP 位址跟上述的 netscript 選項裡的 IP 位址都改成你自己教室裡的老師機。 這樣還可以把教室對外的網路線拔掉, 安裝過程會更安全。

三、 行動

先用兩顆隨身碟同時啟動兩部電腦。 因為要按 del 並且設定 UEFI 等等動作, 大約只能一次同時照顧兩部電腦。 一旦進入 linux 開機流程, 要把 grml 的整個 squashfs 載入記憶體需要花好幾十秒, 這時可以趁著等待再拿另外兩顆隨身碟啟動下兩部電腦。 第三與第四部進入開機流程之後, 前兩顆已經完全載入記憶體, 並且顯示從老師機那邊抓回來的 pdmenu 畫面。 此時可以把最早兩部電腦上面的隨身碟拔下來, 拿去啟動第五第六部電腦, 最後整間電腦教室都停在 pdmenu 畫面。

先拿兩三部學生機測試 pdmenu 裡面的 netcat 選項可否 接受老師機的齊步走指揮。 如果成功就可以拿它同步指揮整間教室的所有電腦。 暑假我在安裝的時候還不會使用 netcat 廣播指令, 所以需要把 「分割硬碟、 建立 lvm、 格式化、 用 udpcast 平行快速配送大型檔 ...」 等等動作分別寫成 pdmenu 裡面的好幾個選項。 每執行一個選項都要跑遍整間電腦教室裏的每一部機器, 按快速鍵和 Enter。 還有很多時候需要在老師機修正 pdmenu 選單檔、 重新建立 glabman.tgz 壓縮檔 tar czf glabman.tgz $(file * | perl -ne 'print "$1\n" if /^(\S+): .*text/') 、 再逐一到每一部學生的機器前面執行 Reload glabman (以便抓回並解壓縮新版的 glabman.tgz) 跟 Reload glabman (叫 pdmenu 載入新版的選單) 這兩個選項。 如果改用 netcat, 這些時間都可以省下來。 另外, 目前的貴哥版 grml linux 並沒有安裝 clonezilla, 還好也可以用 netcat 廣播指令的方式處理。

有沒有哪一所學校想要建立Linux教室呢? 歡迎寄 email 詢問, 也許下個暑假我就到你們學校表演一次!

沒有留言:

張貼留言

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