《2022年ramdisk作为根文件系统的配置 .pdf》由会员分享,可在线阅读,更多相关《2022年ramdisk作为根文件系统的配置 .pdf(5页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、转帖从 ramdisk根文件系统启动Linux 成功,总结一下今天做了个试验,让Linux2.6.29.4 从 ramdisk 根文件系统启动成功,总结一下。其中涉及的内容较多,很多东西不再详述,如需深入研究请查阅相关资料(百度或谷歌一下一大堆)。开发环境: Fedora 9 交叉编译工具链: arm-linux-gcc 4.3.2 with E ABI 嵌入式 Linux 内核版本: 2.6.29.4-FriendlyARM 。昨天写贴子的时候具体记不清了,今天起来启动开发板用uname -r 查一下,就是叫做 2.6.29.4-FriendlyARM ,帖子已经改好了。本文就是友善之臂的2
2、.6.29.4-FriendlyARM的那个版本的内核的基础上改的。其它版本的应该也类似,仅供参考。开发板: mini2440-128M Nand Flash Bootloader :u-boot-2009.11 具体步骤如下:1.解压内核源码树解压 linux-2.6.29-mini2440-20090708.tgz到自己的工作目录,会生成一个友善之臂修改过的并且有几个mini2440 默认配置文件的内核源码目录linux-2.6.29 。具体步骤参照友善之臂mini2440 开发板用户手册,具体不详述了。2.修改内核配置选项进入内核源码目录linux-2.6.29 目录#cp config
3、_mini2440_t35 .config #make menuconfig ARCH=arm 打开配置菜单,修改两个配置项,分别是:a): General setup- 选择 Initial RAM filesystem and RAM disk. 项b): Device Drivers-Block devices-选择 RAM block device support 项并检查 Optimize for si ze 是否被选中,如果没有则选中,此项优化内核大小,根据需要进行配置。修改( 8192)Default RAM disk size kbytes选项为(4096) Default R
4、AM disk size kbytes,之所以修改是因为我之后制作的 ramdisk 是 4096KB 大小的。当然如果你想制作8192KB 大小的 ramdisk ,这里就要对应为8192 了,以此类推。但是最小系统嘛, 是不用那么大的 ramdisk 的。此项的默认配置就是 (4096) , 以前我改过这个配置, 所以是(8192)了。如果这个大小和你做的ramdisk 不匹配,则启动时仍然会出现kernel pani c 内核恐慌,提示 ramdisk 格式不正确,挂载不上 ramdisk 。然后特别要注意的一点是,ramdisk 是一种内存虚拟磁盘技术,实质上并不是一种文件系统, 它使
5、用的文件系统时ext2文件系统。所以一定要在make menuconfig ARCH=arm的时候进入 File systems菜单,选上 Second extended fs support。以提供内核对ext2 文件系统的支持。 我以前添加过了 ext2 文件系统了,所以开始的时候在此没有说明,在此为了说明为什么有的人照着我的方法做了,但是仍然kernel panic ,特别把这一步也加上。然后保存配置退出。这样就为内核添加好了ramdisk 启动功能和 ramdisk 的驱动支持了。3.修改内核启动参数方法有二:a):修改 .config 的第 310 行,修改 CONFIG_CMDLI
6、NE =的定义修改为 CONFIG_CMDLINE =initrd=0 x31000000,0 x200000 root=/dev/ram rw init=/linuxrc console=ttySAC0 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - - mem=64M 保存。意思为从 ramdisk 启动, ramdisk 压缩文件起始地址在内存地址0 x31000000 处,文件大小为0 x200000 。此参数也可以在mak
7、e menuconfig ARCH=arm时进入 Boot options 菜单,然后在 Default kernel command string里修改。效果是一样的。b):或者不修改 .config 的的第 310 行 CMDLINE 定义 ,而是用 u-boot 的 bootargs 环境变量来传递启动参数。同样也是修改该环境变量为bootargs=initrd=0 x31000000,0 x200000 root=/dev/ram0 rw init=/linuxrc console=ttySAC0 mem=64M 并 saveenv 保存 u-boot 环境变量以上 a),b)的效果是
8、一样的。4.编译内核#make zImage ARCH=ar m CROSS_COMPILE =arm-linux- 然后是二十分钟左右的等待。编译完成后在当前目录下就出现了zImage 内核映像了。好像友善之臂把内核源码目录里的uImage 目标给注释了, 以前在论坛里看到过有人说, 直接 make uImage 好像提示没有 uImage 的目标。所以我就先制作zImage ,然后再用u-boot 的 mkimage 工具转化为uImage。其实 uImage 就是在zImage 的开头部分增加了一个64 字节的内核映像说明。5.制作 uImage 内核映像由于我使用的Bootloader
9、 是 u-boot ,所以要将 zImage 转化为 uImage,方法如下:#mkimage -A arm -O linux -T kernel -C none -a 0 x30008000 -e 0 x30008000 -n Linux kernel Image -d zImage uImage-ramdisk 说明: mkimage 工具是 u-boot 格式 uImage 内核映像制作工具。如果成功编译u-boot 之后,它会在 u-boot 源码树下的tools 目录之下。建议将其拷贝到宿主机的/sbin/目录下,以方便使用。 mkimage 使用时的具体参数不再详述,不清楚的请自己
10、查阅。6.制作 ramdisk根文件系统该过程是制作ramdisk根文件系统的核心步骤,方法如下:a)创建根文件系统目录:#cd 转入到你的工作目录。#mkdir rootfs #cd rootfs #mkdir bin dev etc lib proc sbin sys usr mnt tmp var #mkdir usr/bin usr/lib usr/sbin lib/modulesb)创建最基本的设备文件:#cd dev #mknod -m 666 console c 5 1 #mknod -m 666 null c 1 3 #cd . c)安装/etc 配置文件:这里可以直接把友善之
11、臂的root_qtopia 里的几个基本的配置文件拷贝过来,只拷贝必要的即可, 并对其内容进行删减,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - - - - - - 因为我做的 ramdisk 并不包含 Qtopia 等,全拷贝过来也没有用。我是从网上找的最小系统的etc 配置文件直接解压到我制作的根文件系统里了,并做参照友善之臂的root_qtopia 添加了一些内容,见最后的说明。操作如下:#tar etc.tar.gz -C /xxx/ro
12、otfs xxx 表示你要制作的rootfs 所在的目录。d)编译内核模块:方法是如下:进入 Linux 内核源码目录( linux-2.6.29 )#make modules ARCH=arm CROSS_COMPILE=arm-linux- e)安装内核模块:#make modules_install ARCH=arm INSTALL_MOD_PATH=/xxx/rootfs xxx 表示你要制作的rootfs 所在的目录。f)配置 busybox 进入 busybox 目录执行 #make menuconfig 进入 Busybox Settings - build Options -选
13、中Build busybox as a static binary“,即静态链接,免去拷贝大量的库文件。Installation Options - 选中 Dont use /usr ,以免 busybox 不慎被安装到宿主机系统的相应目录下,破坏宿主机系统。Busybox Installation P refix (/xxx/rootfs ),修改该选项表明编译后的busybox 将安装到该位置。g)编译、安装busybox #make ARCH=ar m CROSS_COMPILE =arm-linux- 几分钟编译完成后#make install 安装到 Busybox Installa
14、tion P refix (/xxx/rootfs )设定的目录里。当前为我要制作的根文件系统目录(/xxx/rootfs )。h)制作 ramdisk 根文件系统镜像方法如下:上 http:/ 文件系统的工具genext2fs ,这样就不用像网上大多数说的那样繁琐的制作ramdisk 映像了,当前最新版本为genext2fs-1.4.1.tar.gz 。编译生成该工具genext2fs,并将其放入宿主机的/sbin/目录下以方便使用。跳转到要制作的rootfs 的上一级目录#genext2fs -b 4096 -d rootfs ramdisk -b 是指制作的 ramdisk 大小为 40
15、96K 字节-d 是指要制作成 ramdisk 的根文件系统目录最后的 ramdisk 是制作出来的ramdisk 的名字,当然可以改名了。#gzip -9 -f ramdisk 将该 ramdisk 以最优方式压缩为ramdisk.gz 7.下载内核映像和ramdisk 映像名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 5 页 - - - - - - - - - 启动 u-boot ,暂停 u-boot 自动启动,在u-boot 命令行中键入如下命令下载内核和ramd
16、isk 映像:u-bootMINI2440# tftp 0 x32000000 uImage-ramdisk dm9000 i/o: 0 x20000300, id: 0 x90000a46 DM9000: running in 16 bit mode MAC: 08:08:11:18:12:27 operating at 100M full duplex mode Using dm9000 device TFTP from server 192.168.31.117; our IP address is 192.168.31.230 Filename uImage-ramdisk. Load
17、 address: 0 x32000000 Loading: T T # # # done Bytes transferred = 1917752 (1d4338 hex) u-bootMINI2440# tftp 0 x31000000 ramdisk.gz dm9000 i/o: 0 x20000300, id: 0 x90000a46 DM9000: running in 16 bit mode MAC: 08:08:11:18:12:27 operating at 100M full duplex mode Using dm9000 device TFTP from server 19
18、2.168.31.117; our IP address is 192.168.31.230 Filename ramdisk.gz. Load address: 0 x31000000 Loading: T T # # done Bytes transferred = 1002594 (f4c62 hex) 8)使用 ramdisk 根文件系统启动内核在 u-boot 命令行下键入如下命令启动系统:bootm 0 x32000000 # Booting kernel from Legacy Image at 32000000 . Image Name: Linux-2.6.29.4-Frie
19、ndlyARM Created: 2010-04-09 15:13:52 UTC Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1917688 Bytes = 1.8 MB Load Address: 30008000 Entry Point: 30008000 Verifying Check sum . OK Loading Kernel Image . OK OK Starting kernel . 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名
20、师精心整理 - - - - - - - 第 4 页,共 5 页 - - - - - - - - - Uncompressing Linux. . done, booting t he kernel. Linux version 2.6.29.4-FriendlyARM (rootlocalhost.loca ldomain) (gcc version 4.3 .2 (Sourcery G+ Lite 2008q3-72) ) #3 Fri Apr 9 23:13:36 CST 2010 CPU: ARM920T 41129200 revision 0 (ARMv4T), cr= c000717
21、7 CPU: VIVT data cache, VIVT instruction cache Machine: FriendlyARM Mini2440 development boardMemory policy: E CC disabled, Data cache writeback 中间过长的内容在此省略了RAMDISK: Compressed image found at block 0 VFS: Mounted root (ext2 filesystem) on device 1:0. Freeing init memory: 136K eth0: link dow n Proces
22、sing /etc/profile. Done # eth0: link up, 100Mbps, full-duplex, lpa 0 x45E1 至此系统启动成功。- 后记:由于友善之臂 mini2440 默认的配置文件是将驱动等直接编译到内核里去了,并没有使用内核模块。 所以上述第 6步制作根文件系统中的d)编译和 e)安装内核模块的步骤可以不做。我就没有编译内核模块。因为参照友善之臂的root_qtopia 根文件系统发现 /lib/modules/uname -r 里根本没有东西。 而且以前用友善之臂的config_mini2440_t35默认配置编译内核模块的时候。 发现友善只做了
23、个hello_modules 的内核模块示例。在此我们不需要使用这个hello_modules ,所以这两步就略过去了。说明: 由于最小系统里的etc 配置文件没有写自动启动网卡的脚本,所以我做的ramdisk 开始时并不能自动启动网卡。后来参照友善之臂的root_qtopia 根文件系统里的脚本做如下修改,即可自动启动脚本。修改如下:修改要制作的 ramdisk 根文件系统的rootfs 下的 /etc/init.d/rcS 文件在最下边添加如下两行命令即可自动启动网卡:/sbin/ifconfig lo 127.0.0.1 /sbin/ifconfig eth0 192.168.31.230 netmask 255.255.255.0 up 这个方法是通过分析友善之臂的root_qtopia 根文件系统的启动流程时发现的。通过分析友善之臂的root_qtopia 根文件系统,我们还能发现更多的内容。在此不在详述。锻炼一下自己分析解决问题的能力吧。呵呵。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -
限制150内