2010年4月11日 星期日

[教學]用 USB flash disk 開機(二)

WinCE驅動程式學習雜記
http://jusweny.spaces.live.com/blog/cns!88C641BFCCD350D4!2202.entry


http://phorum.study-area.org/index.php?topic=43087.0;wap2
[教學]用 USB flash disk 開機(二)

(1/1)

thyme:
或許你有疑惑,為什麼根目錄要在 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不是萬
能的。

2010年3月3日 星期三

到底什麼是成功?

http://www.books.com.tw/exep/prod/booksfile.php?item=0010327984

到底什麼是成功?
成功究竟能帶給人們什麼樣的滿足和體驗?
二十一世紀的年輕人應當如何追尋成功?
這些看似簡單的問題,卻經常令青年一代陷入迷茫和痛苦之中……