作者 主題: [教學]用 USB flash disk 開機(二)  (閱讀 11134 次)

0 會員 與 1 訪客 正在閱讀本文。

thyme

  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 1281
    • 檢視個人資料
[教學]用 USB flash disk 開機(二)
« 於: 2006-11-24 17:18 »
或許你有疑惑,為什麼根目錄要在 ramdisk 上呢?難道不能把隨身碟看成一個硬碟
來使用嗎?答案是可以的,您可以隨心的使用 linux。

我們假設你把隨身碟分成兩個分割區,第一個分割區是 FAT 的,第二個是 EXT2,
然後 kernel 和 initrd.img 及 syslinux 都放在第一個分割區,第二個分割區當
成我們可讀寫的根目錄(/),在 linux 跑起來時,就可以直接使用之,隨時安裝或
修改及資料都可以保存下來,不用一定要在 PC 上才能修改東西。

首先要先弄好在你隨身碟第二分割區的根目錄(/),可以把之前做的 initrd.img 內
所有東西都複製過去,若你空間夠大,你要把 PC 上所以東西都 copy 過去也成,
但是,你一定要明白,若沒有適當修改一些檔案,保證跑起來是有問題的,至於要修
改什麼,我也不太清楚,因為我也沒這麼暴力過。

要注意一點,這第二分割區(假設是在 /dev/sda2),我們是把檔案放進去,而不是
包成一個 image ,然後只寫入一個 image 檔,也就是你可以直接掛載 /dev/sda2
然後可以直接寫入。

根目錄(/)做好後,再來就是要動我們的 initrd.img 了,古人說,愈練神功,必先
自X(我指的是北冥神功),我們自己做的 initrd.img 太肥了,所以直接拷貝 PC 上
/boot/initrd.img 來使用,還是要做一些修改,首先,這個檔是 gzip 的壓縮檔,
我們先把它拷貝到 /tmp/initrd.gz ,然後用 gzip 解成 /tmp/initrd ,再掛載
看看
代碼: [選擇]

mkdir /mnt/initrd
mount -o loop /tmp/initrd /mnt/initrd
ls /mnt/initrd
....

可以參考看看,檔案很小吧,但是,五臟不全,功能只剛剛好夠一些 initrd 要做的
事而已!

首先要換的是 kernel 的 modules,通常你 PC 的 kernel 會和你隨身碟上的 kernel
不一樣,所以把 kernel module 都換一換,其實也沒有幾個,再來就是把掛載隨身碟
需要用到的 module 都放上去,諸如 usb, scsi 等等相關的都放進去,也就是能把
隨身碟掛載,然後能看到隨身碟內容的 module 的就夠了,其他什麼網路什麼的,就不
用了,留在載入根目錄(/dev/sda2)時再去做即可。

對了,還記得 syslinux.cfg 有這麼一行嗎?要把 root 改成 /dev/sda2,不能再用 /dev/ram0
代碼: [選擇]

APPEND root=/dev/sda2 initrd=initrd.img

然後,要開始改這個 /mnt/initrd 的 linuxrc 這個檔,這是原先 PC 上 linuxrc 的內容
代碼: [選擇]

#!/bin/nash
 
 echo "Loading jbd.ko module"
 insmod /lib/jbd.ko
 echo "Loading ext3.ko module"
 insmod /lib/ext3.ko
 echo Mounting /proc filesystem
 mount -t proc /proc /proc
 echo Creating device files
 mkdevices /dev
 echo Mounting sysfs
 mount -t sysfs none /sys
 echo Creating root device
 mkrootdev /dev/root
 umount /sys
 echo 0x0100 > /proc/sys/kernel/real-root-dev
 echo Mounting root filesystem
 mount -o defaults --ro -t ext3 /dev/root /sysroot
 pivot_root /sysroot /sysroot/initrd
 echo Remounting devfs at correct place if necessary
 handledevfs
 umount /initrd/proc

這不是 PC,系統不會自動幫你掛載 kernel moudle,所以要自己動手用 insmod 把你
掛載隨身碟所需要的檔一行一行掛上去,這裡要注意一下,掛載 module 的先後順序
是不能隨便亂放的,有些 module 會有相依性的問題。
好了,再來就是修改這一行
代碼: [選擇]

 mount -o defaults --ro -t ext3 /dev/root /sysroot

改成這樣
代碼: [選擇]

 mount -o defaults --rw -t ext2 /dev/root /sysroot

這邊的 /dev/root 就是你在 syslinux.cfg 內 root=/dev/xxx 傳進來的參數,你也
可以自己用暴力法改成
代碼: [選擇]

 mount -o defaults --rw -t ext2 /dev/sda2 /sysroot

(關於 linuxrc 可以參考 http://phorum.study-area.org/viewtopic.php?t=33514 )

最後有幾點要注意的,首先是在 syslinux.cfg 內的 root=/dev/xxx ,某些 kernel,
若是指定 /dev/ram0 ,則不會跑 initrd.img 內的 /linuxrc 而是跑 /etc/inittab
內指定的 sysinit 的檔。還有,你不要指望在 /linuxrc 裡面做太多事,nash不是萬
能的。