1#mkdir initrd 2#dd if=/dev/zero of=initrd.img bs=1k count=8192 3#/sbin/mke2fs -F -v -m0 initrd.img 4#mount -o loop initrd.img initrd 5#cp -av rootfs/* initrd #umount
1 initrd文件夾主要用於,在制作過程中臨時掛載ramdisk,添加文件系統。為什么要這樣呢?因為ramdisk是把內存虛擬成塊設備,其實這是很奢侈的事情,不過現在內存逐漸加大,這樣做有能提高幾十倍的速度,當然是極好的。
2 就是指定這個塊設備的大小
3 是在這個塊設備上建一個ext2文件系統,所有的塊設備上都有一個對應的設備文件系統(ext2 ext3 ext4 yaffs等)
4 就是掛載,那么為什么要掛載呢,因為塊設備無法直接被訪問,在其上要有一個虛擬的文件系統,那就是VFS,initrd只是pc機vfs的一個小的目錄。
5 掛載后把一個自己搭建好的小文件系統拷貝進去
6 最后umount。為什么要把自己做的文件系統拷貝進去呢,其實這是個小的vfs,在板子運行的時候,不能訪問pc機的虛擬文件系統啊,所有要有自己的vfs。
其實在板子起來后看到的就是你自己制作的小文件系統,操作的就是以小塊內存空間,當做塊設備使用。不過這樣你就無法訪問這塊內存空間以外的東西了。這樣就是玩玩,ramdisk的目的其實只是個過渡,在你的文件系統起來以后,可以掛在一個大的vfs,比如說android啊。(這樣就解決了udev與文件系統之間的矛盾 哦 這與steppingstone是不是很像 O(∩_∩)O哈哈~)
下面開始介紹制作ramdisk文件系統:
#mkdir rootfs #cd rootfs #mkdir bin dev etc lib proc sbin tmp usr var #chmod 777 tmp #mkdir usr/bin usr/lib usr/sbin #mkdir var/lib var/lock var/log var/run var/tmp #chmod 777 var/tmp
現在創建一些文件夾,當然暫時都是空的,這些都怎么與塊設備中的文件聯系起來呢,就是說,這些本來都是空的,大多你可以自己創建一些,不過在板子跑起來后會有很多沒見過的文件,哪兒來的呢?那就說說mount吧!
所以吧,掛載后,原來tmp中的文件找不到了就可以解釋了。如果找不到你創建的文件夾,就會直接掛到根目錄下。像proc這種記錄的都是內核輸出的信息。mount命令是在初始化代碼中的。(/etc/init.d/rcS)
然后准備一些必要的庫
把交叉編譯器下的lib拷貝過來就可以嘍。(靜態編譯busybox就不需要了啊,動態編譯還是要的)
下載busybox(http://www.busybox.net/)並解壓。
3.2 進入解壓后的目錄,配置Busybox $make menuconfig Busybox Settings > General Configuration > [*] Support for devfs Build Options > [*] Build BusyBox as a static binary (no shared libs) /* 將busybox編譯為靜態連接,少了啟動時找動態庫的麻煩 */ [*] Do you want to build BusyBox with a Cross Compiler? (/usr/local/arm/3.3.2/bin/armlinux) Cross Compiler prefix/* 指定交叉編譯工具路徑 */ Init Utilities > [*] init [*] Support reading an inittab file /* 支持init讀取/etc/inittab配置文件,一定要選上 */ Shells > Choose your default shell (ash) > /* (X) ash 選中ash,這樣生成的時候才會生成bin/sh文件 * 看看我們前頭的linuxrc腳本的頭一句: * #!/bin/sh 是由bin/sh來解釋執行的 */ [*] ash Coreutils > [*] cp [*] cat [*] ls [*] mkdir [*] echo (basic SuSv3 version taking no options) [*] env [*] mv [*] pwd [*] rm [*] touch Editors > [*] vi Linux System Utilities > [*] mount [*] umount [*] Support loopback mounts [*] Support for the old /etc/mtab file Networking Utilities > [*] inetd /* * 支持inetd超級服務器 */
這些配置看情況定吧,版本高一點點額busybox,都幫你選上了。
在busybox文件目錄下make一下,不過makefile要改一下,就是交叉編譯器哪邊,最后安裝到roofs文件路徑下。
下rootfs目錄下准備一些必要的文件:
#cd rootfs/dev
#mknod -m 600 console c 5 1
這個console叫做控制台終端,c是指char設備,5是主設備號,1是從設備號。
因為有了這個,所以你可以在pc機上看到開發板內核打印的信息。
大家應該記得,在bootargs參數中有個 console=ttyS0,而ttyS0就是串口的設備號。這樣說吧,內核原來打印的信息是給console控制台的,然后轉給串口,於是,在pc機上用串口調試工具就可以接收到打印信息了。在bootargs中還有init=/int的參數,就是說進入進入ramdisk后執行的第一個文件是根目錄下的init,也可以是linuxrc,甚至是/sbin/init。都是可以的哦。那要看你的初始化順序是怎么安排的。