網頁

2005年12月17日 星期六

Install FreeBSD6 on X41 tablet (1)

據說下學期的文獻是留朕恤老師,當然要來巴結一下,至於為什麼,這個故事以後再講。

其實不只這個原因,機八鴨在 X31 上玩 FreeBSD 玩了好一陣子了,雖然他很機八都沒留 blog or wiki ,不過總是還有人可以指點,在遇到困難上面會快很多 XD。我從拿到 X31 就一直喊說要玩玩到都已經被搶走了還是沒玩到,於是乎趁這裡拜比較悠哉,就鐵了心試著來裝 FreeBSD 到 laptop 上。

沒想到困難重重啊,一開始把 combo 機接上去之後很高興的把 FreeBSD 6.0 Release Disc1 丟進去,想說大概三分鐘就可以搞定,之後再慢慢 make 就好,沒想到給我的是這張畫面:

x41t_FreeBSD6_crash_on_BTX_Loader

真是歡樂到一個不行。然後試了漂長輩助教以及機八鴨的 combo 也是不行,發生同樣的情況,於是跑去抓其他舊的版本(因為據機八鴨說他在 FreeBSD6 RC 的 iso 也是開不起來,不過症狀不太一樣),從 5.1 5.2.1 5.3 5.4 都試了,其中好像只有 5.3 沒有畫面一直跑而是 hang 住,其他都一樣的情形。總不會要我用 4.X 試吧?於是一氣之下跑去抓 FreeSBIE、pfsense、DragonFlyBSD,結果還是都一樣。於是只好請教 google ,看到比較可能的情形是說:FreeBSD 6 Released BTX loader issue - BTX loader 不支援 USB 裝置造成的。如我上一篇所說,難不成要如此之嗎?

由於「邪」太過於麻煩,還要先裝 Linux ,如果讓我一不小心裝 gentoo 上去大概就黏住那就不能巴結老鄧了 ,所以我選擇了「惡」

PXE 這東西事實上並不陌生,約在四五年前幫高中做電腦教室的時候就已經玩了一次,那時 google 打 PXE 可以說東西少的可憐,所以必須從 Intel、Realtek 那邊挖資料,然後 try and error 想辦法慢慢兜,連螃蟹卡的 boot rom 都要自己燒,還常常會有某版不能配某版的問題,實在是超麻煩。不過很有趣就是了,尤其是把整套系統兜出來之後,透過 PXE Server 開機,派 PCDOS 開機檔,然後用 config.sys 和 autoexec.bat 搭配寫開機選單,再加上 ghost server/ghost preload partition 的配置,可以說撐得上當時自己很滿意的作品。不過可惜的是當時沒有寫 doc 的觀念,只有自己習慣性的隨手寫了幾個 TXT 檔,然後跟著 server backup 起來。只是我沒想到用三台 server 做交互備份的情況下還能夠爛的如此徹底。在一年多後的某天,看到網路上有人也在搞這些東西,可是解的都不怎麼漂亮、或是說不完整,覺得把那些東西拿出來寫 doc 或分享應該不錯,才發現竟然一點文件、一點成果都不剩。

其實說穿了技術性不高,只是那時幾乎沒現成的工具的情況下苦工不少,全部不見了還真有點可惜。這次 build PXE Server 就非常快了。參考了終極流行(toppop)金蟬脫殼這篇、以及 mount iso 的方法、還有 Diskless FreeBSD 5.2.1 release PXE DHCP NFS NIS 。大概的步驟不外乎是:

Mount ISO
mdconfig -a -t vnode -f /your/iso/image/6.0-RELEASE-i386-disc1.iso -u 0
mount -t cd9660 /dev/md0 /mnt/freebsd6

Install DHCPD
cd /usr/ports/net/isc-dhcp3-devel
make install clean

Modify RC.CONF
該開的東西要開

ee /etc/rc.conf
inetd_enable=yes

dhcpd_enable="YES" # dhcpd enabled?
dhcpd_flags="-q" # command option(s)
dhcpd_conf="/usr/local/etc/dhcpd.conf" # configuration file
dhcpd_ifaces="" # ethernet interface(s)
dhcpd_withumask="022" # file creation mask

nfs_server_enable="YES"

EDIT dhcpd.conf
ee /usr/local/etc/dhcpd.conf
在 host or network 裡加上:
filename "pxeboot";
option root-path "192.168.200.254:/";
next-server 192.168.200.254;

如果 tftp server 跟 dhcp server 不同台的話就由 next-server 指過去,要改 root-path 的話用 root-path 改。
改完重跑: /usr/local/etc/rc.d/isc-dhcpd.sh restart

EDIT inetd.conf
ee /etc/inetd.conf
把註解取消並改後面 boot 路徑
tftp dgram udp wait root /usr/libexec/tftpd tftpd -l -s /home/tftp
檔名由 dhcpd.conf 的 filename 指定,所以 tftpd 只要給路徑。
改完重跑: /etc/rc.d/inetd restart

EDIT exports
ee /etc/exports
#/usr -alldirs -ro
/home/tftp/freebsd60 -ro -maproot=root -network=192.168.200.0 -mask=255.255.255.0
#/mnt/freebsd6 /mnt/freebsd6 -maproot=root x41tablet
/usr -ro -maproot=root -alldirs -network=192.168.200.0 -mask=255.255.255.0
#/diskless_ro -ro -maproot=0 -network 192.168.1.0 -mask 255.255.255.0
/ -ro -maproot=root -alldirs -network=192.168.200.0 -mask=255.255.255.0

改完記得重跑 mound -r
kill -HUP `cat /var/run/mountd.pid`

就會動了,不過跑起來一直 hang 在 rootfs:

freebsd_x41t_pxe_hang.PNG
找了半天不知道怎麼回事,ping 的到但是服務都沒繼續往下跑。感覺上他的 fstab 都沒有吃,花了好幾個小時實在是累了於是就放大絕招。用 VMWARE 灌進去。

在機八鴨的教誨之下:
[上午 04:57:02] (鴨)...: 我現在跟你說要用entire disk 阿
[上午 04:57:17] (鴨)...: 所以醬子相對來說會比較危險一點
[上午 04:58:16] (鴨)...: 你現在的步驟是...
把vmware 的vmdk 幹掉
重新新增一個physical disk
選entire disk
[上午 04:58:31] (鴨)...: 開vmware 起來之後把freebsd 裝完
[上午 04:58:59] (鴨)...: 裝好以後趁除/d9 還可以開起來的時候 dd 把 512 byte 讀出來
[上午 04:59:28] (鴨)...: 讀完以後 windows 的partition 設回來active
[上午 04:59:37] (鴨)...: 降子應該就好了

很順利的搞定了。而且全部都在 vmware 當中搞定(危險動作請勿模仿啊 XD,搞爛恕不負責)。因為我之前就已經用工具先把磁區分好了:

partition_x41.PNG
所以在裝的時候小心,不要安裝 MBR ,然後再割分割區的時候直接用 T 把 type 設成 165 (freebsd) 然後進去切 slice 就好了。至於這裡我沒有割 /swap 因為打算跟 windows 共用 2G 的那塊 fat32 。另外在 loader 的部份為了簡單直接用 NT 的 loader ,可以參考 FreeBSD 的 FAQ 有關 NT Loader 的部份,或是 MicrosoftWindowsBootManager,我是照 debian 那個方法下了:
dd if=/dev/ad0s1c of=/root/BootSector.FreeBSD bs=512 count=1

然後把 BootSector.FreeBSD 想辦法傳出來丟到根目錄後改 boot.ini 加上:
C:\BootSector.FreeBSD="FreeBSD"

並且到 FreeBSD 裡面用 fdisk -t -a -1 ad0 把 Windows XP 的 partition 設回 active ,就可以重開看成果(或是準備炸的亂七八糟了)。