2017年5月30日 星期二

透過 pxe 網路開機載入 live cd

很久以前就想玩 pxe 網路開機; 最近想要攻佔不歸我管的 windows 電腦教室, 才開始認真學。 做壞事克服逆境真是進步的最佳動力啊! 這篇 (中文) 很詳盡; 不過如果區網內已有一個 dhcp 伺服器, 而且不能關掉, 那該怎麼辦呢? 把自己的 dhcp 服務設定成 proxy 就可以了。 本文主要參考 這篇 manski.net 的英文文章, 因為它採用 dnsmasq, 讓設定變得很簡單, 而且文章本身也寫得簡單明瞭。 最後, 本文也說明如何透過 pxe 啟動特定幾張 live cd。 (但並沒有要透過網路安裝 linux。)

如許多文件所說, dnsmasq 把網路開機所需要的服務通通包進去, 只要一個設定檔就完成, 跟古代人比起來, 現在超幸福的。 但是如果你的桌機或筆電本身又要玩虛擬機、 也已用 dnsmasq 在服務虛擬網路, 那麼兩者的設定可能會衝突。 為了簡化問題, 我決定在另一個分割上安裝 精簡版 ubuntu 然後用 kvm 虛擬機去啟動它, 獨立出來做測試。

我先用 手工精簡版的 qemu-kvm 虛擬區域網路 搭配 kvm 虛擬機來做實驗。 (需要知道如何 用 kvm 啟動單一分割 -- 啟動剛剛裝好的精簡版 ubuntu)。 以上是簡化的說法; 實際上我是在 zfs 上面開一個 zvol 來做實驗, 這樣子做快照比較方便。 你也可以考慮架一部 proxmox 虛擬環境 來作實驗。 後來我又搬到實體環境測試: D-Link DIR 300 分享器、 Lenovo x220i 筆電作為 pxe 伺服器、 Asus eeepc 900HA 作為客戶端。 對於很少在玩 kvm 的人來說, 省略虛擬環架設, 直接在實體區網裡用 ubuntu 實體機做實驗可能更快更簡單。

  1. 安裝套件: apt-get install dnsmasq pxelinux syslinux memtest86+
  2. 建立 tftp 設定檔的目錄: mkdir -p /var/lib/tftpboot/pxelinux.cfg
  3. 範例設定檔 抓回上面的目錄, 命名為 default。 /var/lib/tftpboot/pxelinux.cfg/default 。 如果不需要圖形選單, 也可以省略設定檔內的 ui vesamenu.c32 附近共四句, 還有下述的選單背景圖 starry-night.jpg。 pxelinux 的設定檔基本上跟 extlinux 的設定檔 長得很像。
  4. /var/lib/tftpboot/pxelinux.cfg 目錄下的 symlinks 在 /var/lib/tftpboot 底下建立一堆 symbolic links (捷徑):
    cd /var/lib/tftpboot
    ln -s /usr/lib/PXELINUX/pxelinux.0
    ln -s /usr/lib/syslinux/memdisk
    ln -s /usr/lib/syslinux/modules
    ln -s modules/bios/ldlinux.c32
    ln -s /boot/memtest86+.bin memtest86+
    
    最後結果如右圖。 注意: memtest86+ 不可以有附檔名。 否則 開機時螢幕會亂掉。 os 目錄? 先建好空著, 等一下才會用到。
  5. 把 starry-night.jpg 或你自選的圖片 放到 pic 目錄底下, 作為開機選單背景圖。 記得改 default 裡的 menu background 那句的檔名。
  6. 把 /etc/dnsmasq.conf 改名或搬到別處備份起來。 改用以下內容取代:
    log-dhcp
    dhcp-range=192.168.29.0,proxy
    dhcp-boot=pxelinux.0
    pxe-service=x86PC,"Network Boot",pxelinux
    enable-tftp
    tftp-root=/var/lib/tftpboot
    
    黃色部分請改成你的區網範圍。
  7. 重新啟用 dnsmasq: systemctl restart dnsmasq

就這樣, 完成了! 現在進入另一部電腦的 BIOS, 啟用網路開機 (pxe boot)。 請圖片搜尋 "bios pxe" 參考別人類似的設定畫面。 然後用網路線接上同一部分享器、 重開機。 應該會看到 "configuring ..." 之類的訊息, 隔十秒左右出現開機選單背景圖及四個選項 (memtest、 ttylinx、 HBCD、 SystemRescueCD), 最後進入藍底白字的 memtest 畫面, 完成了第一次架設網路開機服務的測試, 好想親一下網路線! 請參考 manski.net 文末的 gif 動態插圖。 如果失敗, 請見本文最後面補充說明。

再來, 到 ttylinux Hiren's Boot CD (救援用 windows xp 光碟) 抓回 iso 檔, 放到 /var/lib/tftpboot/os/ 底下, 並且確認一下 /var/lib/tftpboot/pxelinux.cfg/default 設定檔的路徑正確。 不需要重啟 dnsmasq, 只要重開 client 電腦, 就可以進入這兩張 live cd。 這裡採用 syslinux/pxelinux 的 memdisk 當作 kernel, 把 live cd 當成 initrd 。 不過這方法 只適用於 windows 的 live cd 跟 「僅需要 kernel 跟 initrd 而不需要 root file system」 的 linux live cd。 透過老舊的 (實體/虛擬) 網路啟動 HBCD, 至少要有 1G (768MB 可開, 有警告訊息) 的記憶體跟三五分鐘的耐心。

但是 ttylinux 不太實用啊。 下一個目標是 SystemRescueCD 。 在 os/ 底下建立空目錄, 並且把 iso 檔以 loopback 的方式掛載起來:

mkdir -p /var/lib/tftpboot/os/SystemRescueCD
mount .../systemrescuecd-x86-4.9.6.iso /var/lib/tftpboot/os/SystemRescueCD

再用 ifconfig 查看一下你的 pxe server 被分配到的 ip 是多少, 並且到 /var/lib/tftpboot/pxelinux.cfg/default 裡面修改 netboot=tftp:... 的 ip。 重開 (至少 1G 記憶體的) client 電腦、 選擇進入 SystemRescueCD、 看到下載 sysrcd.dat 的進度不斷地歸零、 有自信地放著它不管, 5 到 10 分鐘後就開機完成了! 以上參考 sysrcd 的 pxe 開機文件。 對, sysrcd 本身就可以當做 pxe server; 但是我想改設定檔卻找不到, 而且也完全不會用 gentoo, 最後還是改用 ubuntu 當 pxe server 比較簡單。

從這個例子可以看出: 其他的 linux livecd 也是要像這樣根據每張光碟不同的載入方式來個別設定, 才能透過網路開機。

* * * * *

補充說明:

  1. 如果 client 開機時遇到 tftp connection timed out (http://ipxe.org/4c106035) 根據 ipxe 官網文件 這個問答, 這有可能是因為它沒拿到 dhcp lease。 我把 pxe 伺服器的 dnsmasq 停掉, 再重開一次 (先 stop, 再 start, 不是直接 restart), 就成功了, 不太懂發生了什麼事。
  2. 採用 proxy dhcp server 的 pxe 開機流程請參考 規格書 的 2.2.3 節的圖 2.4 及 簡要文字說明
  3. 關於載入 SystemRescueCD 的 sysrcd.dat 要很久的問題, 有試著按照 這個建議 在 initram.igz 裡面的 init 的兩處 /bin/busybox tftp 後面加上 -b 65536 並且按照 這篇 重新打包 initram.igz, 但是結果沒太大不同, 一樣要等很久。 安裝 nginx 並且把 netboot= 改成 http 也並沒有比較快。
  4. 在 manski.net 的原文裡, 他在 dnsmasq.conf 裡面 加上 port=0 以便取消 dns 功能, 並且採用配套措施: 在 /etc/default/dnsmasq 裡加上 DNSMASQ_EXCEPT=lo 才不會讓本機查不到 dns。 我覺得 dns 服務放著讓它跑好像也沒什麼不好, 而且設定比較簡單。

* * * * *

看來網路開機的速度 (光是一部 client) 有點慢到不太能用啊~~ 好像還是隨身碟開機比較實用。 不過學會 pxe 的基本運作之後, 再要學 DRBL/LTSP/clonezilla/fog 應該就會比較進入狀況吧。

沒有留言:

張貼留言