【原创】Linux 文件系统移植全解密
0赞熟悉Linux文件系统目录结构,创建自己的文件系统,通过NFS方式集成测试,用文件系统生成ramdisk文件系统映象文件。
环境:
1、 Ubuntu 10.10发行版
2、 u-boot-2010.03
3、 FS2410平台
4、 交叉编译器 arm-none-linux-gnueabi-gcc-4.3.2
【实验步骤】
一、根文件系统制作
1、 源码下载
我们选择的版本是busybox-1.17.3.tar.bz2下载路径为:
2、 解压源码
$tar xvf busybox-1.17.3.tar.bz2
3、 进入源码目录
$tar xvf busybox-1.17.3.tar.bz2
4、 配置源码
$ make menuconfig
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs)
[ ] Force NOMMU build
[ ] Build with Large File Support (for accessing files > 2 GB)
(arm-none-linux-gnueabi-) Cross Compiler prefix
() Additional CFLAGS
5、 编译
$ make
6、 安装
busybox默认安装路径为源码目录下的_install
$ make install
7、 进入安装目录下
$ cd _install
$ ls
bin linuxrc sbin usr
8、 添加其他需要目录
$ mkdirdev etc mnt proc var tmp sys root
9、 添加库
将工具链中的库拷贝到_install目录下
$ cp /home/linux/toolchain/arm-none-linux-gnueabi/lib/ ./
删除lib下的所有目录、.o文件和.a文件
对库进行瘦身以减小文件系统的大小
$ arm-none-linux-gnueabi-strip lib/*
10、 添加系统启动文件
在etc下添加文件inittab,文件内容如下:
#this is run first except when booting in single-user mode.
:: sysinit:/etc/init.d/rcS
# /bin/sh invocations on selected ttys
# Start an "askfirst" shell on the console (whatever that may be)
::askfirst:-/bin/sh
# Stuff to do when restarting the init process
::restart:/sbin/init
# Stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
在etc下添加文件fstab,文件内容如下:
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
这里我们挂在的文件系统有三个proc、sysfs和tmpfs,在内核中proc和sysfs默认都支持,而tmpfs是没有支持的,我们需要添加tmpfs的支持
修改内核配置:
File systems --->
Pseudo filesystems --->
[*] Virtual memory file system support (former shm fs)
[*] Tmpfs POSIX Access Control Lists
重新编译内核
在etc下创建init.d目录,并在init.d下创建rcS文件,rcS文件内容为:
#!/bin/sh
# This is the first script called by init process
/bin/mount -a
为rcS添加可执行权限:
chmod +x init.d/rcS
在etc下添加profile文件,文件内容为:
#!/bin/sh
export HOSTNAME=farsight
export USER=root
export HOME=root
#export PS1="\[\u@\h \W\]\$ "
export PS1="[$USER@$HOSTNAME \W]\# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH
11、 设备文件创建
根文件系统中有一个设备节点是必须的,在dev下创建console节点
$ mknod dev/console c 5 1
二、NFS测试
1、备份/source/rootfs
$ cp /source/rootfs /source/rootfs_bak -a
2、将我们的文件系统拷贝到/source目录下
$ cp _install /source/rootfs –a
3、设置uboot环境变量
# setenv bootcmd tftp 33000000 zImage\; go 33000000
# setenv bootargs root=nfs nfsroot=192.168.1.111:/source/rootfs init=/linuxrc console=ttySAC0,115200 ip=192.168.1.112
# savenv
重新启动开发板,查看是否能够正常挂载,功能是否正常
三、制作ramdisk文件系统
通过NFS测试以后,就可以制作ramdisk文件系统了,具体如下:
1、制作一个大小为8M的虚拟磁盘
$ dd if=/dev/zero of=initrd.img bs=1k count=8192(initrd.img为8M)
2、格式化这个虚拟磁盘为ext2
$ mkfs.ext2 -F initrd.img
3、在mount下面创建initrd目录作为挂载点
$ mkdir /mnt/initrd
4、将这个虚拟磁盘挂载到/mnt/initrd下
注意这里的initrd.img不要和Ubuntu根目录下的initrd.img弄混了,同时initrd.img不能存放在rootfs目录中
$ mount -t ext2 -o loop initrd.img /mnt/initrd
5、将我们的文件系统写入initrd.img中
将测试好的文件系统里的内容全部拷贝到/mnt/initrd目录下面
$ cp /source/rootfs/* /mnt/initrd –a
6、卸载initrd
$ umount /mnt/initrd
7、压缩initrd.img为initrd.img.gz
$ gzip --best -c initrd.img > initrd.img.gz
8、配置内核支持RAMDISK
制作完initrd.img.gz后,需要配置内核支持RAMDISK作为启动文件系统
Device Drivers
SCSI device support --->
<*> SCSI disk support
Block devices --->
<*>RAM disk support
(1)Default number of RAM disks
(8192) Default RAM disk size (kbytes) (修改为8M)
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
重新编译内核
9、在U-BOOT命令行重新设置启动参数:
# setenv bootcmd tftp 33000000 zImage \; tftp 30800000 initrd.img.gz \; go 33000000
# setenv bootargs root=/dev/ram rw init=/linuxrc initrd=0x30800000,8M console=ttySAC0,115200
# savenv
重新启动开发板查看能否正常启动
四、制作cramfs文件系统
1、cramfs文件系统镜像制作
由于系统提供制作cramfs文件系统的工具,则可以利用。具体操作如下;
$ mkfs.cramfs rootfs rootfs.cramfs
2、将rootfs.cramfs拷贝到/tftpboot目录下
$ cp rootfs.cramfs /tftpboot
3、将rootfs.cramfs烧写到nand flash的第三个分区上
u-boot下执行如下命令
# tftp 30008000 rootfs.cramfs
# nand erase 500000 800000
# nand write 30008000 500000 800000
4、重新设置u-boot启动参数
# setenv bootcmd tftp 33000000 zImage\; go 33000000
# setenv bootargs root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200
# savenv
启动开发板,测试是否成功。
[root@farsight /root] # ls /
bin etc linuxrc sbin tmp var
dev lib mnt proc test usr
[root@farsight /root] # mkdir test
mkdir: Cannot create directory `test': Read-only file system
这是由cramfs文件系统决定的,cramfs格式的文件系统是只读文件系统。
五、制作jffs2文件系统
1、zlib的编译
解压zlib-1.2.3.tar.bz2并进入zlib-1.2.3配置编译安装
$ tar xvf zlib-1.2.3.tar.bz2
$ cd zlib-1.2.3
$ ./configure
$ make
$ make install
2、mtd工具编译
解压mtd-snapshot-20050519.tar.bz2并进入mtd/util编译安装
$ tar xvf mtd-snapshot-20050519.tar.bz2
$ cd mtd/util
$ make
$ make install
这样我们的系统里就有了mkfs.jffs2这个工具了
3、jffs2文件系统镜像制作
$ mkfs.jffs2 -r /source/rootfs -o rootfs.jffs2 -e 0x4000 --pad=0x800000 -n
$ cp rootfs.jffs2 /tftpboot
4、jffs2文件系统烧写
# tftp 30008000 rootfs.jffs2
# nand erase 500000 800000
# nand write 30008000 500000 800000
5、设置u-boot启动参数
# setenv bootcmd tftp 33000000 zImage\; go 33000000
# setenv bootargs root=/dev/mtdblock2 init=/linuxrc rootfstype=jffs2 rw
console=ttySAC0,115200
# savenv
重新启动开发板,一切OK!