【实验目的】 熟悉Linux文件系统目录结构,创建自己的文件系统,通过NFS方式测试;用文件系统工具生成ramdisk文件系统映象文件。 【实验环境】 主机:ubuntu 12.04发行版 目标机:FS210平台 交叉编译工具:arm-none-linux-gnueabi-gcc 【实验步骤】 一、根文件系统制作 1、 源码下载 我们选择的版本是busybox-1.17.3.tar.bz2下载路径为: http://busybox.net/downloads/ 2、 解压源码 $ tar xvf busybox-1.17.3.tar.bz2 3、 进入源码目录,修改Makefile $ cd busybox-1.17.3 vim Makefile ARCH = arm CROSS_COMPILE = arm-none-linux-gnueabi- 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) ()Cross Compiler prefix () Additional CFLAGS Installation Options ---> [*] Don't use /usr Applets links (as soft-links) ---> (./_install) BusyBox installation prefix (NEW) 5、 编译 $ make 6、 安装 $ make install busybox默认安装路径为源码目录下的_install 7、 进入安装目录下 $ cd _install $ ls bin linuxrc sbin 8、 创建其他需要的目录 $ mkdir dev etc mnt proc var tmp sys root lib home usr 9、 添加动态库 ? 将工具链中的库拷贝到_install目录下的lib目录 $cp -raf /usr/local/toolchain-4.5.1-farsight/arm-none-linux-gnueabi/lib/* lib/ ? 删除库文件中的符号表,也叫瘦身 $ rm -rf lib/*.a $ arm-none-linux-gnueabi-strip lib/* 10、 添加系统启动文件 在_install/etc下添加文件inittab,文件内容如下: ::sysinit:/etc/init.d/rcS ::askfirst:-/bin/ash ::ctrlaltdel:/sbin/reboot ::shutdown:/sbin/swapoff -a ::shutdown:/bin/umount -a -r ::restart:/sbin/init 格式说明: <id>:<runlevels>:<action>:<process> : 在什么时间启动什么进程 id: 进程所使用的终端名 runlevels:不用填写 <action>: Valid actions include: sysinit, respawn, askfirst, wait, once, restart, ctrlaltdel, and shutdown.\ sysinit: 系统初始化的时候,放在最前面 respawn,askfirst是一样的,如果process意外终止啦,系统会讲其重启 askfirst 会有提示Please press Enter to activate this console wait: 该进程一定要执行完,才能执行下一个 once, 进程如果意外终止,那么不会重启 11,在_install/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 ---> [*] /proc file system support (NEW) [*] sysfs file system support (NEW) [*] Virtual memory file system support (former shm fs) [*] Tmpfs POSIX Access Control Lists 重新编译内核 12, 在_install/etc下创建init.d目录,并在init.d下创建rcS文件,rcS文件内容为: cd _install/etc mkdir init.d vim init.d/rcS #!/bin/sh echo ">>>>>>>> in /etc/init.d/rcS<<<<<<<<<<<<<<<<<" /bin/mount -a echo /sbin/mdev > /proc/sys/kernel/hotplug /sbin/mdev -s =============================================== mdev是用于自动创建设备节点 为rcS添加可执行权限: $ chmod +x init.d/rcS 13,在_install/etc下添加profile文件,文件内容为: #!/bin/sh export HOSTNAME=farsight export USER=root export HOME=root 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 14、 设备文件创建 根文件系统中有一个设备节点是必须的,在dev下创建console节点 $ mknod dev/console c 5 1 以上的步骤就完成了linux根目录所需要的所有文件,可以直接使用 NFS测试 1、将做好的根目录复制成/opt/rootfs(如果你已经有这个目录,就要注意啦) $ sudo cp -raf _install /opt/rootfs 2, 在ubuntu中将/opt/rootfs设置成nfs文件系统 修改ubuntu的/etc/exports: 将/opt/rootfs设置成nfs文件系统格式 /opt/rootfs *(subtree_check,rw,no_root_squash,async) sudo service nfs-kernel-server restart 测试: sudo mount -t nfs 192.168.7.22:/opt/filesystem/ /mnt/nfs/ 2、设置uboot环境变量 # setenv bootcmd tftp 20800000 zImage \; go 20800000 # setenv bootargs root=nfs nfsroot=192.168.7.100:/opt/rootfs init=/linuxrc console=ttySAC0,115200 ip=192.168.7.200 # saveenv ======================================================================================= 如果开机就运行一个自己可执行程序,可以做如下处理 12, 编译出一个可执行程序: /bin/hello_arm 13, /etc/init.d/rcS中启动可执行程序 方法一: 直接在/etc/init.d/rcS添加一条: /bin/hello_arm 方法二:另外再写一个脚本,然后在/etc/init.d/rcS中启动这个脚本 写一个脚本: /etc/local/mysrv.sh #!/bin/ash echo "my first app" /bin/hello_arm 然后在/etc/init.d/rcS添加一条 /etc/local/mysrv.sh 重新启动开发板,查看是否能够正常挂载,功能是否正常 三、 制作cramfs文件系统,首先必须先了解nand中的分区表: Creating 5 MTD partitions on "s5pv210-nand": 0x000000000000-0x000000100000 : "myuboot" 0x000000100000-0x000000500000 : "kernel" 0x000000500000-0x000001500000 : "rootfs" 0x000001500000-0x000002500000 : "userdata" 0x000002500000-0x000040000000 : "usr spec" 1、cramfs文件系统镜像制作 由于系统提供制作cramfs文件系统的工具,可以直接使用。具体操作如下; $ cd /opt $ mkfs.cramfs rootfs rootfs.cramfs 2、将rootfs.cramfs拷贝到/tftpboot目录下 $ sudo cp rootfs.cramfs /tftpboot 3、将rootfs.cramfs烧写到nand flash的第三个分区上 u-boot下执行如下命令 #tftp 20008000 myrootfs.cramfs #nand erase 0x500000 0x1000000 #nand write 0x20008000 0x500000 0x1000000 4、重新设置u-boot启动参数 # setenv bootcmd tftp 20800000 zImage \; go 20800000 # setenv bootargs root=/dev/mtdblock2 rootfstype=cramfs init=/linuxrc console=ttySAC0,115200 # saveenv 启动开发板,测试是否成功。 [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格式的文件系统是只读的。 四、制作jffs2文件系统 1、配置内核支持jffs2文件系统 File systems ---> [*] Miscellaneous filesystems ---> <*> Journalling Flash File System v2 (JFFS2) support 重新编译内核并拷贝到/tftpboot下 2、mtd工具安装 $ sudo apt-get install mtd-utils 或将liblzo2-2_2.06-1_i386.deb和mtd-utils_1%3a1.4.4-1_i386.deb拷贝到Linux下执行如下命令 $ sudo dpkg -i *.deb 这样我们的系统里就有了mkfs.jffs2这个工具了 4、jffs2文件系统镜像制作 $ cd /opt $ mkfs.jffs2 -r rootfs -o rootfs.jffs2 -e 0x20000 --pad=0x400000 -n 解释: -e: nand的块大小: 128K --pad= : myrootfs.jffs2指定为多大: 和分区大小一致 (该选项不是一定要的) -n : 不要打印不必要的调试信息 $ sudo cp rootfs.jffs2 /tftpboot 5、jffs2文件系统烧写 # tftp 20008000 rootfs.jffs2 # nand erase 0x500000 0x1000000 # nand write.jffs2 0x20008000 0x500000 0x1000000 6、设置u-boot启动参数 # setenv bootcmd tftp 20008000 zImage\; go 20008000 # set bootargs console=ttySAC0,115200 init=/linuxrc root=1f02 rootfstype=jffs2 # saveenv 重新启动开发板,查看是否能够创建或者是删除文件