分类:
2011-10-08 19:16:11
构建基本的嵌入式Linux根文件系统
其实在去年8月份我做系统移植时就构建好了一个可以用的根文件系统,但是那时是跟着别人的《Linux全线移植文档》做的。有些东西我也不清楚,只是跟着做,做出来能用就了事了,没有深究其中的规范,以及文件系统中哪些要,哪些不要。
趁着今年过年的几天假期,我移植重新移植了U-Boot1.3.1和Linux2.6.24到S3C2410及S3C2440后,我想好好的看看有 关文件系统构建方法和规范,整理整理构建根文件系统的文档。之后,我用了近一周的时间,慢慢研究《构建嵌入式Linux系统》这本书有关根文件系统的部 分,以及一些网上的参考资料,不断地实验。构建好了一个精简的根文件系统,下面我只介绍构建的过程和方法,至于原理我给出以下参考资料,自己看吧。
1、 《Linux系统移植》:一个经典的Linux移植文档,共有95页的PDF文档,内容十分详细,里面有根文件系统的创建,还多地方都有下载(有的网站称之为《Linux系统全线移植文档》等等),很值得参考。在这里感谢文档的作者们。
2、 《构建嵌入式Linux系统》必看!里面对文件系统的构建讲的挺细。
3、 《Filesystem Hierarchy Standard》Linux文件系统的标准规范。我只看到英文的。
其他再遇到不懂的就google,基本上都是Linux的相关知识,都是找得到的。
(1)创建根文件系统的基本目录结构。
#! /bin/sh
echo "making dir : mnt tmp var"
echo "making dir : home root boot" echo "done"
|
在你想要建立根文件系统的地方,运行:
[tekkamanninja@Tekkaman-Ninja nfs]$ ./mkroot |
(2)配置、编译和安装Busybox-1.9.1
[tekkamanninja@Tekkaman-Ninja source]$ tar -xjvf busybox-1.9.1.tar.bz2 |
修改Makefile文件:
[tekkamanninja@Tekkaman-Ninja busybox-1.9.1]$ pwd |
在原有的基础上修改如下:
Busybox Settings --->
Installation Options --->
[*] Don't use /usr
(/home/tekkamanninja/working/nfs/rootfs) BusyBox installation prefix
Busybox Library Tuning --->
[*] Support for /etc/networks
[*] Additional editing keys
[*] vi-style line editing commands
(15) History size
[*] History saving
[*] Tab completion
[*] Username completion
[*] Fancy shell prompts
Login/Password Management Utilities --->选项全部N掉,后面单独使用TinyLogin。(因为集成的好像不是很好用,我自己的经验是这样)
Linux Module Utilities --->
[N] Support version 2.2.x to 2.4.x Linux kernels
Shells --->
--- Ash Shell Options 下的选项全选
[tekkamanninja@Tekkaman-Ninja busybox-1.9.1]$ make |
我是动态编译所以查看一下需要的动态库
[tekkamanninja@Tekkaman-Ninja busybox-1.9.1]$ /home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-readelf -d busybox |
(3)修改和创建必要的文件。
[tekkamanninja@Tekkaman-Ninja busybox-1.9.1]$ cp -a examples/bootfloppy/etc/* [tekkamanninja@Tekkaman-Ninja busybox-1.9.1]$ cd ../../nfs/rootfs/etc/ |
1、增加为SHELL导入全局变量的文件/etc/profile
[tekkamanninja@Tekkaman-Ninja etc]$ kwrite profile
# /etc/profile: system-wide .profile file for the Bourne shells echo "Processing /etc/profile... "
echo "Set PS1 in /etc/profile" export PS1="\\e[05;32m[$USER@\\w\\a]\\$\\e[00;34m"
echo "Done" echo |
2、增加初始化文件
[tekkamanninja@Tekkaman-Ninja etc]$ kwrite inittab
::sysinit:/etc/init.d/rcS |
[tekkamanninja@Tekkaman-Ninja etc]$ kwrite fstab
proc /proc proc defaults 0 0 |
3、增加初始化脚本
[tekkamanninja@Tekkaman-Ninja etc]$ kwrite init.d/rcS
#! /bin/sh
|
4、删除备份文件
[tekkamanninja@Tekkaman-Ninja etc]$ rm *~ init.d/*~
5、为mdev创建配置文件
[tekkamanninja@Tekkaman-Ninja etc]$ vi mdev.conf
创建一个mdev.conf文件,内容可有可无。
(4)为使用用户登录功能移植TinyLogin
1、下载
从 下载tinylogin-snapshot.tar.bz2,并解压.
[tekkamanninja@Tekkaman-Ninja source]$ tar -xjvf tinylogin-snapshot.tar.bz2
2、修改tinyLogin的Makefile
[tekkamanninja@Tekkaman-Ninja source]$ cd tinylogin
[tekkamanninja@Tekkaman-Ninja tinylogin]$ kwrite Makefile
指明tinyLogin使用自己的算法来处理用户密码
USE_SYSTEM_PWD_GRP = false |
3、 编译并安装
[tekkamanninja@Tekkaman-Ninja tinylogin]$ make PREFIX=/home/tekkamanninja/working/nfs/rootfs install make tinylogin be setuid root, which will cause it to fail. make: *** [install] 错误 1 [tekkamanninja@Tekkaman-Ninja tinylogin]$su 口令: [root@Tekkaman-Ninja tinylogin]# make PREFIX=/home/tekkamanninja/working/nfs/rootfs install [root@Tekkaman-Ninja tinylogin]# exit exit |
我是动态编译所以查看一下需要的动态库
[tekkamanninja@Tekkaman-Ninja tinylogin]$ /home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-readelf -d tinylogin 0x00000004 (HASH) 0x8128 0x00000012 (RELSZ) 80 (bytes) 0x00000013 (RELENT) 8 (bytes) |
创建创建帐号及密码文件:
[tekkamanninja@Tekkaman-Ninja tinylogin]$ cd ../../nfs/rootfs/etc/ root:x:0:root |
这 3个文件是从Host中拷贝过来的,只留下root帐号。
那么现在 root的登陆密码和Host的登陆口令一致了,可以登录后再修改以及创建新用户。( 若使用以上文件,则root密码为tekkaman)
拷贝必需的动态库文件
[tekkamanninja@Tekkaman-Ninja lib]$ cp -d /home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/ld* . |
以上是最基本的文件。
一个最基本根文件系统构建完成!未压缩的文件系统总大小不到3M。
以下是启动信息:
U-Boot 1.3.1 (Feb 18 2008 - 16:04:40)
Processing /etc/profile... Set search library path in /etc/profile Set user path in /etc/profile Set PS1 in /etc/profile Done
[root@/root]#
|
以上我使用nfs挂载的,后面我会介绍如何挂载jffs2、cramfs以及yaffs文件系统,有了这个基本的文件系统以后,其他就好办了!以下是这个文件系统,编译器是gcc4.1.2(制作编译器所用内核为2.6.24)。
|