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無差別。
參考:http://www.arm9home.net/read.php?tid-5610.html
?????? http://www.arm9home.net/read.php?tid-5645.html
轉載于:https://www.cnblogs.com/zjfdbz/archive/2013/01/26/2877675.html
總結
以上是生活随笔為你收集整理的ramdisk根文件系统+initramfs的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: viewController详解
- 下一篇: ECSHOP设置默认配送方式和默认支付方