2007-08-11
計(jì)劃的任務(wù)
發(fā)現(xiàn)的問題
完成的任務(wù)
1. 不能啟動(dòng)linuxrc。
Ø 問題現(xiàn)象:
² 啟動(dòng)后提示:
Warning: unable to open an initial console.
Failed to execute /linuxrc. Attempting defaults...
Ø 解決過程:
² 加載的根文件系統(tǒng)是在2.4內(nèi)核下可以正常使用的cramfs文件系統(tǒng)。后來根據(jù)提示,發(fā)現(xiàn)根目錄下并沒有l(wèi)inuxrc文件。懷疑2.6和2.4的根文件系統(tǒng)不能通用,于是決定自己重新做一個(gè)。
² 下載了busybox-1.3.2,修改makefile的arch和cross-compiler參數(shù),make menuconfig。其中遇到的一個(gè)問題是,當(dāng)我選擇靜態(tài)編譯時(shí),好像提示編譯器庫不支持,具體忘了,用的gcc版本為gcc-4.1.1。
² 新制作的文件系統(tǒng)根目錄下有一個(gè)linuxrc文件,是一個(gè)指向busybox文件的鏈接文件。添加了網(wǎng)上說的一些目錄,etc下的文件從原來的文件系統(tǒng)下拷過來的。制作成cramfs后,就可以出現(xiàn)shell了。
2. /dev目錄下沒有設(shè)備文件。
Ø 問題現(xiàn)象:
² 加載rootfs(cramfs)后,/dev目錄下只有在上位機(jī)上創(chuàng)建的console和null。
Ø 解決過程:
² 因?yàn)橛玫膬?nèi)核2.6.22已經(jīng)取消了devfs的支持,使用的是udev。從網(wǎng)絡(luò)得知,busybox自帶了mdev,是一個(gè)精簡的udev。只要在linuxrc中添加:
mdev –s
echo /sbin/mdev > /proc/sys/kernel/hotplug
就可以了,但是我的是一個(gè)二進(jìn)制的文件,沒法添加腳本。搜索,發(fā)現(xiàn)可以用一個(gè)腳本文件覆蓋原來的linuxrc。于是都照網(wǎng)上的一個(gè)腳本寫了一個(gè),內(nèi)容如下:
#!/bin/sh
echo "mount /etc as ramfs"
/bin/mount -n -t ramfs ramfs /etc
/bin/cp -a /mnt/etc/* /etc
echo "recreate the /etc/mtab entries"
# recreate the /etc/mtab entries
/bin/mount -f -t cramfs o remount,ro /dev/mtdblock3 /
#mount some file system
echo "mount /dev/shm as tmpfs"
/bin/mount n t tmpfs tmpfs /dev/shm
#掛載/proc為proc文件系統(tǒng)
echo "mount /proc as proc"
/bin/mount -n -t proc none /proc
#掛載/sys為sysfs文件系統(tǒng)
echo "mount /sys as sysfs"
/bin/mount -n -t sysfs none /sys
#add mdev support
mdev –s
echo /sbin/mdev > /proc/sys/kernel/hotplug
exec /sbin/init
結(jié)果有出現(xiàn)了:
Warning: unable to open an initial console.
Failed to execute /linuxrc. Attempting defaults...
錯(cuò)誤。
² 為什么自己生成的可以,而添加的就不可以呢,自己生成的到底干了些什么事情呢?后來發(fā)現(xiàn),自己添加的linuxrc沒有可以執(zhí)行屬性,chmod 777后,終于可以執(zhí)行了,但是又出現(xiàn)了新的錯(cuò)誤,說找不到/etc/init.d/rcS。但是我確認(rèn)過這個(gè)文件是在的,為什么會找不到呢。于是打算看看busybox的源代碼,看看自帶的linuxrc到底干了些什么事情。
² 看了很久,就是找不到linuxrc相關(guān)的代碼,好像入口就是指向init_main的。而該入口是/sbin/init的入口啊。難道linuxrc什么都沒有做。跟蹤了一下,結(jié)果證實(shí)了我的想法,自帶的linuxrc相當(dāng)于只執(zhí)行了一句:
exec /sbin/init
于是我把linuxrc其它的語句都刪除,只保留了一句,執(zhí)行結(jié)果和自帶的文件結(jié)果一模一樣。
看來,應(yīng)該是前面那些腳本的問題了,進(jìn)入啟動(dòng)的shell,竟然發(fā)現(xiàn)/etc下面是空的,再看了下腳本,才恍然大悟,原來是語句:
/bin/mount -n -t ramfs ramfs /etc
干的好事,因?yàn)橄旅娴哪蔷淇截愓Z句沒有執(zhí)行成功,所以/etc下面就空了,而我的/mnt下面是空的,所以什么都沒有拷到。
² 修改后,重新加載發(fā)現(xiàn)我的dev下面還是什么都沒有,運(yùn)行了mdev –s后沒有效果。后來覺悟,我的/dev目錄是只讀的,如果程序要?jiǎng)?chuàng)建東西也創(chuàng)建不了啊。于是運(yùn)行:
/bin/mount –t tmpfs tmpfs /dev
現(xiàn)在可以寫了,可是mdev –s還是沒有反應(yīng),why?仔細(xì)查看了啟動(dòng)腳步,發(fā)現(xiàn)還有一個(gè)錯(cuò)誤,就是mount sysfs on /sys failed,進(jìn)而發(fā)現(xiàn)我的根目錄下并沒有sys文件夾,添加,重新燒寫,終于在/dev下發(fā)現(xiàn)了一大堆東西,高興啊。
² 這過程中還碰到的一個(gè)小問題是,我在上位機(jī)上的/etc下面發(fā)現(xiàn)一個(gè)mtab的鏈接,指向的是self/mtab,沒有任何內(nèi)容,又自認(rèn)為該文件在啟動(dòng)時(shí)是自動(dòng)創(chuàng)建的,就把它刪了,發(fā)現(xiàn)啟動(dòng)就出錯(cuò)了。啟動(dòng)時(shí)只是重新寫,而不能創(chuàng)建它,所以不能刪了它的。