制作和挂载ramdisk根文件系统

主机平台:Linux CentOS 6.5

arm平台:粤嵌GEC210开发板(S5PV210


1.建立根文件按系统相关目录和文件

(1)首先创建一个目录作为根文件系统的根目录,这里假设为rootfs

#mkdir rootfs
(2)在rootfs,创建下面目录:bin  dev  etc  lib   mnt  proc  sbin  sys  tmp  usr   var;然后在usr目录下创建目录:bin sbin lib
#cd rootfs
#mkdir bin  dev  etc  lib   mnt  proc  sbin  sys  tmp  usr   var
#mkdir /usr/bin  /usr/sbin  /usr/lib
(3)建立dev下的设备文件

进入dev目录

执行

#cd dev
#mknod -m 666 console c 5 1
#mknod -m 666 null c 1 3
4)建立etc的配置文件:

/etc/inittab文件:

#/etc/inittab
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r


/etc/fstab文件:

#/etc/fstab
proc            /proc   proc    defaults    0   0
tmpfs           /tmp    tmpfs   defaults    0   0

/etc/init.d/rcS

#! /bin/sh
PATH=/sbin:/bin:/usr/bin:/usr/sbin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
mount -a


2 .安装busybox

(1)下载busybox(下载地址:www.busybox.net

(2)解压后,进入目录,修改Makefile文件

ARCH  ?=arm

CROSS_COMPILE ?=arm-linux-

(3)执行make menuconfig,修改配置

配置主要有两个部分:

第一部分是Busybox Setting,主要是busybox设置选项,修改:

General Configuration  --->  Don't use /usr 选中此项,如果不选这项,默认安装在当前系统的/usr目录下的

Build Options ---> Build BusyBox as Aa static binary (no share libs):选择此项,编译时静态链接C库

Build Options --->(arm-linux-) Cross Compiler prefix 这里也修改成你的交叉编译器的前缀

Installation Options ---> What kind of applet links to install 这里选择各命令链接到busybox的方式,这里选择默认的soft-links

Installation Options ---> ()BusyBox installoation prefix:此项选择busybox的安装位置,即rootfs的路径,如:/tmp/rootfs

第二部分是Applets,就是各种命令了,根据情况选择安装,这里就保持默认配置。

(4)编译、安装

执行 make && make install

安装后,会建议你将busybox加上SUID权限

#cd rootfs
chmod u+s bin/busybox



3.制作ramdisk

有两种方法:

第一种:genext2fs工具

1)下载genext2fs,下载地址:http://genext2fs.sourceforge.net

2)编译,并将genext2fs文件放到 /bin 或者 /sbin下

(3)进入rootfs的上级目录

(4)执行genext2fs生成randisk文件

#genext2fs -b 4096 -d rootfs ramdisk

参数:

- b:指要制作的根文件系统的大小,单位为KB

-d:这你将要制作成ramdisk的根文件系统目录

最后为你要生成的ramdisk的文件名

(5)制作压缩档

#gzip -9f ramdisk


第二种:

(1)创建4096K字节的空白映像文件

# dd if=/dev/zero of=/tmp/ramdisk bs=1k count=4096
4096+0 records in
4096+0 records out
4194304 bytes (4.2 MB) copied, 0.0276143 s, 152 MB/s

(2)格式化该映像文件

# mke2fs -F -v -m 0 /tmp/ramdisk 
mke2fs 1.41.12 (17-May-2010)
fs_types for mke2fs.conf resolution: 'ext2', 'small'
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
1024 inodes, 4096 blocks
0 blocks (0.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=4194304
1 block group
8192 blocks per group, 8192 fragments per group
1024 inodes per group

Writing inode tables: done                            
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

(3)创建临时挂在点
#mkdir /mnt/loop

(4)挂载映像文件

#mount -o loop /tmp/ramdisk /mnt/loop/

(5)复制根目录下所有文件到 /mnt/lo op挂载点下

#cp -arf rootfs/* /tmp/loop

(6)卸载映像文件:

#umount /mnt/loop

(7)压缩映像文件

#gzip -9f ramdisk


4.配置内核

(1)System Type  ---> Initial RAM filesystem and RAM disk (initramfs/initrd) support 选中此项,添加对ramdisk的支持

(2)Device Drivers  ---> Block devices  --->(4096)  Default RAM disk size (kbytes) 这里的数值最好与你的ramdisk大小相同

(3)File systems  --->  Second extended fs support 选中此项,添加对ext2文件系统的支持

(4)保存,编译


6.将ramdisk烧写到开发板的flash或者SD卡里


7.设置uboot环境变量bootargs这里假设从ram里启动ramdisk,若从其它设备启动,根据实际情况改变参数)

setenv bootargs ‘initrd=0x31000000,0x400000 root=/dev/ram0 console=ttySAC0 mem=64M init=/linuxrc’
一般需要修改的只有initrd这个参数,第一个数为ramdisk在内存中的地址,第二个数为ramdisk的长度

执行:

#saveenv

保存环境变量到启动设备




好了,到这里所有工作基本上就做完了,复位开发板,看一下能不能挂载,本人就挂载不成功,出现

kernel panic - not syncing:Attempted to kill init

调试发现,文件系统是挂载成功的,但执行busybox的命令时出错

首先说一下网上的解决办法:

在内核配置中添加EABI的支持,选中下面两项(具体原因与EABI这个东西相关,因为本人不太解,这里不赘述,网上可以找到相关资料

Kernel Features  ---> Use the ARM EABI to compile the kernel
Kernel Features  ---> Allow old ABI binaries to run with this kernel (EXPERIMENTAL)  

但依然会出现上面的错误

之后用了各种方法,居然在换了编译器后成功了。后面通过file命令看了下文件类型:

用 arm-cortex_a8-linux-gnueabi-4.7.3编译的busybox:

setuid ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, stripped

用 arm-none-linux-gnueabi-4.5.1编译的busybox:

setuid ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 3.10.xx, stripped
而我用的内核是 2.6.35.9,难道是因为这个原因?编译出来的程序适用的内核版本与交叉编译器有关?上网搜了下没有找到相关的资料,这就以后再研究了。




好了,这次就写到这里吧。



























你可能感兴趣的:(嵌入式arm+linux)