ramdisk根檔案系統+initramfs 這幾天做了下ramdisk根檔案啟動實驗,小結下。 測試環境:Ubuntu 12.04 首先我認為先製作根檔案系統好,因為配置核心中有一項跟你製作的ramdisk大小有關。這裡我是直接使用原先製作好的根檔案系統。 1. 製作ramdisk根檔案系統鏡像 首先安裝ext2檔案系統的製作工具: #sudo apt-get install genext2fs 跳轉到你的rootfs檔案系統所在目錄,執行如下命令 #genext2fs -b 4096 -d rootfs ramdisk -b是指製作的ramdisk大小為4096K位元組 -d是指要製作成ramdisk的根檔案系統目錄 最後的ramdisk是製作出來的ramdisk的名字,當然可以改名的。 註: 若出現genext2fs: couldn't allocate a block (no free space)這樣的錯誤,則修改4096為8192 #gzip -9 -f ramdisk 該ramdisk以最優方式壓縮為ramdisk.gz 2. 配置核心 首先解壓核心到工作目錄,然後進入核心目錄,執行如下語句。 #sudo su #make menuconfig (如ubuntu下的使用者不能執行該命令則先執行如下命令 sudo apt-get install libncurses5-dev) General setup-->[*] Initial RAM filesystem and RAM disk support --> [*]Optimize for size Device Drivers-->Block devices--><*>RAM block device support (4096)Default RAM disk size (kbytes) //如果你之前製作的ramdisk是8192kb的,則寫成8192 File system --> <*> Second extended fs support //提供核心對ext2檔案系統的支援 退出儲存配置。 3.編譯核心 執行如下命令: #make clean #make uImage 編譯後產生的核心映像uImage位於目前的目錄下。將其拷貝到/nfs目錄下 #cp uImage /nfs 4.用網線和串口線串連好開發板和電腦(暫不開啟開發板),開啟minicom: #sudo minicom 接通開發板的電源,當出現如下字元後Hit any key to stop autoboot ,敲擊鍵盤空格鍵進入uboot。 6.使用uboot命令配置環境變數 #setenv serverip 10.0.0.1 //對應主機IP地址 #setenv ethaddr 00:26:6c:5a:a7:51 說明:該硬體地址是自己主機的硬體地址,在另一個終端下執行ifconfig eth0 查看 #setenv ipaddr 10.0.0.2 //開發板IP地址 #setenv bootargs initrd=0x81000000,0x200000 root=/dev/ram rw console=ttyS2,115200n8 mem=64M init=/linuxrc 說明:意思為從ramdisk啟動,ramdisk壓縮檔起始地址在記憶體位址0x81000000處,檔案大小為0x200000。 這裡真的是相當的鬱悶..... 我一開始下載完之後,總是在Uncompressing Linux....................................那裡就停住了,搞了幾天也不明所以.... 主要是看的幾篇文章在console=ttySx後面都沒有寫傳輸速率,我也就沒寫。最後在後面加了個傳輸速率就好了.. 坑爹... 雖然還是不懂,為什麼沒寫明傳輸速率就不行了.. 知道的跟我講解下~~ #saveenv 然後複位下開發板,再次進入uboot。 7.在另一個終端下執行如下命令配置主機ip地址 #sudo ifconfig eth0 10.0.0.1 8.繼續回到minicom下測試網路是否可用 #ping 10.0.0.1 若列印輸出語句host 10.0.0.1 is alive 表明網路可用 9.使用uboot下載核心和ramdisk並燒寫。 #nfs 0x82000000 10.0.0.1:/nfs/uImage #nfs 0x81000000 10.0.0.1:/nfs/ramdisk.gz 說明:ramdisk.gz的必須是你參數裡設定的initrd對應的地址。 10.啟動核心 #bootm 0x82000000 PS:如果啟動的時候出現如下問題:Failed to execute /linuxrc. Attempting defaults...Kernel panic - not syncing: No init found. Try passing init= option to kernel. 原因可能是setenv bootargs initrd=0x81000000,0x200000 root=/dev/ram rw console=ttyS2,115200n8 mem=64M init=/linuxrc中的ramdisk大小設定問題,將0x200000改成0x400000。 如果想將uImage和ramdisk進行燒寫,可執行如下命令: 燒寫uImage(燒寫地址根據自己的開發板): #nand erase 00280000 400000 //擦除從0x00280000起大小為400000的空間 #nand write 82000000 00280000 400000 //從0x82000000讀取400000大小內容到0x00280000 燒寫ramdisk: #nand erase 00780000 400000 #nand write 81000000 00780000 400000 並設定啟動命令: #setenv bootcmd nand read 82000000 00280000 400000 \; nand read 81000000 00780000 400000 \; bootm 82000000 initramfs根檔案系統啟動 現在基於Linux的發行版通常採用initramfs代替initrd,架構更簡單,應用也更靈活一些。 首先需要做好rootfs這個簡單的根檔案系統目錄。唯一需要修改的是initramfs根檔案系統啟動時執行的第一個程式是init,而不是linuxrc,所以在製作的根檔案系統中需要添加一個init檔案,相應的linuxrc檔案就不再需要了。按照如下方式修改根檔案系統 #cd /nfs/rootfs #ln -s bin/busybox init這樣就為busybox建立了一個軟連結init,這個檔案就是我們要建立的init檔案。 然後配置核心只需配置如下選項即可: [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support (/nfs/rootfs) Initramfs source file(s) //括弧中寫明你的rootfs路徑編譯產生uImage即可。 在設定uboot環境變數時,只需要改變bootargs變數 #setenv bootargs console=ttys2,115200n8 mem=64M 其他步驟與ramdisk無差別。