这几天做了下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