ramdisk制作過程解析


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。都是可以的哦。那要看你的初始化順序是怎么安排的。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM