能出現(xiàn)讓人激動(dòng)的的控制臺(tái),那么系統(tǒng)移植已經(jīng)接近完成;但是不少人在最后一步出現(xiàn)問(wèn)題。
要點(diǎn)如下:
1. 在正確的位置燒寫(xiě)正確格式的文件系統(tǒng)映象:
2. 內(nèi)核支持這種文件系統(tǒng)格式
3. 文件系統(tǒng)的內(nèi)容要完備
上面說(shuō)得簡(jiǎn)單,一個(gè)個(gè)介紹。
1. 在正確的位置燒寫(xiě)正確的文件系統(tǒng)映象:
(a). 正確的位置
嵌入式開(kāi)發(fā)中,常通過(guò)bootloader燒寫(xiě)文件系統(tǒng)映象,假設(shè)寫(xiě)在flash的地址A處。
內(nèi)核啟動(dòng)時(shí),顯然要從地址A處讀取文件系統(tǒng),內(nèi)核是怎么知道的呢?通過(guò)命令行參數(shù),比如“root=/dev/mtdblock2 ”。/dev/mtdblock2 又是怎么和地址A對(duì)應(yīng)上的呢??jī)?nèi)核將flash劃分為
幾個(gè)分區(qū),這是在代碼中固定的。/dev/mtdblock2是第3個(gè)分區(qū),它的開(kāi)始地址必須是A。
在內(nèi)核啟動(dòng)時(shí),可以看到這些分區(qū)的開(kāi)始地址、結(jié)束地址,比如內(nèi)核啟動(dòng)時(shí)會(huì)有類(lèi)似下面的信息:
Creating 3 MTD partitions on "NAND 64MiB 3,3V 8-bit":
0x00000000-0x00030000 : "bootloader"
0x00050000-0x00250000 : "kernel"
0x00250000-0x03ffc000 : "root"
對(duì)于上面的內(nèi)核信息,/dev/mtdblock2對(duì)應(yīng)root分區(qū),開(kāi)始地址為0x00250000,使用bootloader寫(xiě)文件系統(tǒng)映象時(shí),燒寫(xiě)的地址必須是0x00250000
所以,要保證3點(diǎn):① bootloader燒到地址A,② 地址A是內(nèi)核某個(gè)分區(qū)的開(kāi)始地址,③ 命令行參數(shù)“root=/dev/mtdblockXXX ”是這個(gè)分區(qū)
(b). 正確格式的文件系統(tǒng)映象
不同的bootloader支持的燒寫(xiě)的文件系統(tǒng)映象格式不同、使用的燒寫(xiě)命令也可能不同,請(qǐng)注意這點(diǎn)。
另外,馬大哈們制作文件系統(tǒng)映象時(shí),使用的工具也不要弄錯(cuò)了。
最后,請(qǐng)保證這個(gè)文件系統(tǒng)映象是“真的燒寫(xiě)了”,因?yàn)槿绻鹒lash只是擦除而沒(méi)有燒寫(xiě),它也是“正確的、可以?huà)旖拥奈募到y(tǒng)”──有人碰到這個(gè)問(wèn)題,我和他答非所問(wèn)地折騰了很久。
2. 內(nèi)核支持這種文件系統(tǒng)格式
配置內(nèi)核時(shí)選上要支持的文件系統(tǒng)格式
1、2這兩個(gè)問(wèn)題如果不能保證,內(nèi)核啟動(dòng)時(shí)會(huì)出現(xiàn)類(lèi)似如下錯(cuò)誤:
VFS: Cannot open root device "mtdblock2" or unknown-block(2,0)
Please append a correct "root=" boot option
如果1、2能保證,就可以?huà)旖由衔募到y(tǒng),出現(xiàn)類(lèi)似下面的字樣時(shí),革命已經(jīng)成功了80%:
VFS: Mounted root (cramfs filesystem) readonly.
Freeing init memory: 116K
3. 文件系統(tǒng)的內(nèi)容要完備
掛接文件系統(tǒng)后,內(nèi)核就會(huì)讀取、執(zhí)行文件系統(tǒng)中的某個(gè)文件,通過(guò)它來(lái)啟動(dòng)應(yīng)用程序。這個(gè)文件要么通過(guò)命令行參數(shù)“init=xxxx”來(lái)指定,要么取默認(rèn)的文件(下面說(shuō)明)。
一般制作文件系統(tǒng)映象時(shí),都是在一個(gè)目錄(假設(shè)目錄名為rootfs)下放好各種東西:bin/,sbin/,lib/等目錄,etc/fstab等文件,然后將這個(gè)目錄制作為文件系統(tǒng)映象。
可以想象,如果這個(gè)目錄中的東西不對(duì)、不全,即使制作出了文件系統(tǒng)映象,也只是能識(shí)別出來(lái),掛接上去;但是啟動(dòng)不了──所謂啟動(dòng),不就是執(zhí)行文件系統(tǒng)中的程序嘛?
這時(shí)會(huì)有類(lèi)似以下的錯(cuò)誤:
Failed to execute /linuxrc. Attempting defaults...
Kernel panic - not syncing: No init found. Try passing init= option to kernel.
它說(shuō)得很明顯,"Failed to execute /linuxrc"──執(zhí)行/linuxrc失。
它為什么要執(zhí)行/linuxrc,還不是因?yàn)槟阍诿钚兄屑尤肓恕癷nit=/linuxrc”這個(gè)參數(shù)。
它為什么會(huì)失。吭蛴卸
一、你制作文件系統(tǒng)映象時(shí),rootfs目錄下有l(wèi)inuxrc這個(gè)文件嗎?
二、rootfs目錄的linuxrc文件是正確的嗎?
請(qǐng)好好確定這兩點(diǎn),大多數(shù)是沒(méi)有l(wèi)inuxrc文件──linuxrc是busybox自動(dòng)生成的,只要配置好就可以。
如果有l(wèi)inuxrc,那么就是它無(wú)法執(zhí)行了(解決方法在下面)。
不用linuxrc行不行?當(dāng)然行!看看內(nèi)核文件init/main.c,有如下字樣:
run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");
panic("No init found. Try passing init= option to kernel.");
就是說(shuō),它會(huì)依次嘗試執(zhí)行/sbin/init、/etc/init、/bin/init、/bin/sh這些文件,都失敗后才打印出錯(cuò)信息"No init found. Try passing init= option to kernel."。
所以,出現(xiàn)這個(gè)出錯(cuò)信息時(shí),就表明了沒(méi)有或是無(wú)法執(zhí)行這些文件:命令行參數(shù)“init=xxxx”來(lái)指定的xxx文件、/sbin/init、/etc/init、/bin/init、/bin/sh。
一、請(qǐng)檢查你的rootfs目錄,看看這點(diǎn)些文件是否存在
二、使用file命令看看它們是什么文件類(lèi)型,是否可執(zhí)行。
使用busybox時(shí),這些文件是到/bin/busybox文件的鏈接,那就看看busybox的文件類(lèi)型,可以使用下面的命令:
$ file linuxrc
linuxrc: symbolic link to `bin/busybox'
$ file bin/busybox
bin/busybox: ELF 32-bit LSB executable, ARM, version 1, for GNU/Linux 2.4.3, dynamically linked (uses shared libs), stripped
注意了:如果bin/busybox 是一個(gè)動(dòng)態(tài)鏈接的文件,還要把它用到的庫(kù)復(fù)制到rootfs中。唉,越說(shuō)越復(fù)雜了。這些庫(kù)在交叉編譯工具的相應(yīng)目錄下,如果不知道,查google,否則再發(fā)帖。
最后一點(diǎn),文件系統(tǒng)中各種配置文件、dev目錄也要正確。出現(xiàn)問(wèn)題時(shí)再在這個(gè)帖子中說(shuō)吧。這樣寫(xiě)下去真是沒(méi)完沒(méi)了。
回到這個(gè)帖子,它的內(nèi)核打印信息為:
VFS: Mounted root (cramfs filesystem) readonly.
Freeing init memory: 116K
Failed to execute /linuxrc. Attempting defaults...
Kernel panic - not syncing: No init found. Try passing init= option to kernel.
說(shuō)明文件系統(tǒng)掛接成功(VFS: Mounted root (cramfs filesystem) readonly.);
還說(shuō)明/linuxrc不存在或者不可執(zhí)行(Failed to execute /linuxrc. Attempting defaults...);
但是樓主的意思是linuxrc已經(jīng)有了,內(nèi)容為:
#!/bin/sh
echo "mount /etc as ramfs"
/bin/mount -n -t ramfs ramfs /etc
/bin/cp -a /mnt/etc/* /etc
echo "re-create the /etc/mtab entries"
# re-create the /etc/mtab entries
/bin/mount -f -t cramfs -o remount,ro /dev/mtdblock/3 /
/bin/mount -f -t ramfs ramfs /etc
exec /sbin/init
它是一個(gè)腳本,它的執(zhí)行依賴(lài)于/bin/sh,問(wèn)題轉(zhuǎn)為:/bin/sh是否存在?是否可以執(zhí)行?
用file命令看看它的類(lèi)型、是否需要?jiǎng)討B(tài)庫(kù)。
[此貼子已經(jīng)被作者于2012-2-4 19:21:35編輯過(guò)]
|