其实在去年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)创建根文件系统的基本目录结构。NXZLinux联盟我把这个过程做成了shell脚本,很方便!
#! /bin/shNXZLinux联盟 echo "creatint rootfs dir......"NXZLinux联盟 mkdir rootfsNXZLinux联盟 cd rootfsNXZLinux联盟 NXZLinux联盟 echo "making dir : bin dev etc lib proc sbin sys usr"NXZLinux联盟 mkdir bin dev etc lib proc sbin sys usr #必备的8个目录NXZLinux联盟 mkdir usr/bin usr/lib usr/sbin lib/modules
NXZLinux联盟 # Don't use mknod ,unless you run this Script as root !NXZLinux联盟 # mknod -m 600 dev/console c 5 1NXZLinux联盟 # mknod -m 666 dev/null c 1 3 echo "making dir : mnt tmp var"NXZLinux联盟 mkdir mnt tmp varNXZLinux联盟 chmod 1777 tmpNXZLinux联盟 mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/tempNXZLinux联盟 mkdir var/lib var/lock var/log var/run var/tmp NXZLinux联盟 chmod 1777 var/tmp
echo "making dir : home root boot"NXZLinux联盟 mkdir home root boot
echo "done"
|
在你想要建立根文件系统的地方,运行:
[tekkamanninja@Tekkaman-Ninja nfs]$ ./mkrootNXZLinux联盟 creatint rootfs dir......NXZLinux联盟 making dir : bin dev etc lib proc sbin sys usrNXZLinux联盟 making dir : mnt tmp varNXZLinux联盟 making dir : home root bootNXZLinux联盟 doneNXZLinux联盟 [tekkamanninja@Tekkaman-Ninja nfs]$ cd rootfs/dev/NXZLinux联盟 [tekkamanninja@Tekkaman-Ninja dev]$ suNXZLinux联盟 口令:NXZLinux联盟 [root@Tekkaman-Ninja dev]# mknod -m 600 console c 5 1;mknod -m 666 null c 1 3;exitNXZLinux联盟 exitNXZLinux联盟 [tekkamanninja@Tekkaman-Ninja dev]$
|
(2)配置、编译和安装Busybox-1.9.1
[tekkamanninja@Tekkaman-Ninja source]$ tar -xjvf busybox-1.9.1.tar.bz2 NXZLinux联盟
|
修改Makefile文件: [tekkamanninja@Tekkaman-Ninja busybox-1.9.1]$ pwdNXZLinux联盟 /home/tekkamanninja/working/source/busybox-1.9.1NXZLinux联盟 [tekkamanninja@Tekkaman-Ninja busybox-1.9.1]$ kwrite MakefileNXZLinux联盟 NXZLinux联盟 NXZLinux联盟 ......(第151-154行)NXZLinux联盟 #SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \NXZLinux联盟 # -e s/arm.*/arm/ -e s/sa110/arm/ \NXZLinux联盟 # -e s/s390x/s390/ -e s/parisc64/parisc/ \NXZLinux联盟 # -e s/ppc.*/powerpc/ -e s/mips.*/mips/ )NXZLinux联盟 ......(第174行附近)NXZLinux联盟 #ARCH ?= $(SUBARCH)NXZLinux联盟 #CROSS_COMPILE ?=NXZLinux联盟 ARCH = armNXZLinux联盟 CROSS_COMPILE = /home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-NXZLinux联盟 [tekkamanninja@Tekkaman-Ninja busybox-1.9.1]$ make menuconfig
|
在原有的基础上修改如下:
Busybox Settings --->NXZLinux联盟
Installation Options --->NXZLinux联盟
[*] 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]$ makeNXZLinux联盟 ......NXZLinux联盟 LINK busybox_unstrippedNXZLinux联盟 Trying libraries: crypt mNXZLinux联盟 Library crypt is neededNXZLinux联盟 Library m is neededNXZLinux联盟 Final link with: crypt mNXZLinux联盟 [tekkamanninja@Tekkaman-Ninja busybox-1.9.1]$ make install
|
我是动态编译所以查看一下需要的动态库
[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 busyboxNXZLinux联盟 NXZLinux联盟 Dynamic section at offset 0xac014 contains 22 entries:NXZLinux联盟 Tag Type Name/ValueNXZLinux联盟 0x00000001 (NEEDED) Shared library: [libcrypt.so.1]NXZLinux联盟 0x00000001 (NEEDED) Shared library: [libm.so.6]NXZLinux联盟 0x00000001 (NEEDED) Shared library: [libc.so.6]NXZLinux联盟 0x0000000c (INIT) 0xc0f0NXZLinux联盟 0x0000000d (FINI) 0x97608NXZLinux联盟 0x00000004 (HASH) 0x80e8NXZLinux联盟 0x00000005 (STRTAB) 0xa3c0NXZLinux联盟 0x00000006 (SYMTAB) 0x8b30NXZLinux联盟 0x0000000a (STRSZ) 3371 (bytes)NXZLinux联盟 0x0000000b (SYMENT) 16 (bytes)NXZLinux联盟 0x00000015 (DEBUG) 0x0NXZLinux联盟 0x00000003 (PLTGOT) 0xbc0ecNXZLinux联盟 0x00000002 (PLTRELSZ) 2976 (bytes)NXZLinux联盟 0x00000014 (PLTREL) RELNXZLinux联盟 0x00000017 (JMPREL) 0xb550NXZLinux联盟 0x00000011 (REL) 0xb4e0NXZLinux联盟 0x00000012 (RELSZ) 112 (bytes)NXZLinux联盟 0x00000013 (RELENT) 8 (bytes)NXZLinux联盟 0x6ffffffe (VERNEED) 0xb400NXZLinux联盟 0x6fffffff (VERNEEDNUM) 3NXZLinux联盟 0x6ffffff0 (VERSYM) 0xb0ecNXZLinux联盟 0x00000000 (NULL) 0x0NXZLinux联盟
|
(3)修改和创建必要的文件。
1、增加为SHELL导入全局变量的文件/etc/profile
[tekkamanninja@Tekkaman-Ninja etc]$ kwrite profile
# /etc/profile: system-wide .profile file for the Bourne shellsNXZLinux联盟 echo
echo "Processing /etc/profile... "NXZLinux联盟 # no-op
NXZLinux联盟 # Set search library pathNXZLinux联盟 echo "Set search library path in /etc/profile"NXZLinux联盟 export LD_LIBRARY_PATH=/lib:/usr/lib NXZLinux联盟 NXZLinux联盟 # Set user pathNXZLinux联盟 echo "Set user path in /etc/profile"NXZLinux联盟 PATH=/bin:/sbin:/usr/bin:/usr/sbinNXZLinux联盟 export PATH NXZLinux联盟 NXZLinux联盟 # Set PS1 NXZLinux联盟 #注意:ash 除了SHELL变量外,支持\u、\h、\W、\$、\!、\n、\w 、\nnn(ASCII字符对应的八进制数)NXZLinux联盟 #以及\e[xx;xxm (彩色特效)等等!NXZLinux联盟 #而且前面还要多加一个 '\'!
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/rcSNXZLinux联盟 ::respawn:-/bin/loginNXZLinux联盟 ::restart:/sbin/init NXZLinux联盟 NXZLinux联盟 ::ctrlaltdel:/sbin/rebootNXZLinux联盟 ::shutdown:/bin/umount -a -rNXZLinux联盟 ::shutdown:/sbin/swapoff -a
|
[tekkamanninja@Tekkaman-Ninja etc]$ kwrite fstab proc /proc proc defaults 0 0NXZLinux联盟 none /tmp ramfs defaults 0 0NXZLinux联盟 mdev /dev ramfs defaults 0 0NXZLinux联盟 sysfs /sys sysfs defaults 0 0NXZLinux联盟
|
3、增加初始化脚本
[tekkamanninja@Tekkaman-Ninja etc]$ kwrite init.d/rcS
#! /bin/shNXZLinux联盟 echo "----------mount all"NXZLinux联盟 /bin/mount -a
NXZLinux联盟 echo "----------Starting mdev......"NXZLinux联盟 /bin/echo /sbin/mdev > /proc/sys/kernel/hotplugNXZLinux联盟 mdev -s
NXZLinux联盟 echo "*********************************************************"NXZLinux联盟 echo " Tekkaman Ninja 2440 Rootfs(nfs) 2008.2 "NXZLinux联盟 echo " Love Linux ! ! @@ Love Ke Ke ! ! "NXZLinux联盟 echo "********************************************************"
|
4、删除备份文件 [tekkamanninja@Tekkaman-Ninja etc]$ rm *~ init.d/*~
5、为mdev创建配置文件
[tekkamanninja@Tekkaman-Ninja etc]$ vi mdev.conf
创建一个mdev.conf文件,内容可有可无。
(4)为使用用户登录功能移植TinyLogin
1、下载
从http://tinylogin.busybox.net/ 下载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 = falseNXZLinux联盟 ...... NXZLinux联盟 CROSS =/home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-NXZLinux联盟 CC = $(CROSS)gccNXZLinux联盟 AR = $(CROSS)arNXZLinux联盟 STRIPTOOL = $(CROSS)strip
|
3、 编译并安装 [tekkamanninja@Tekkaman-Ninja tinylogin]$ make PREFIX=/home/tekkamanninja/working/nfs/rootfs installNXZLinux联盟 Aborting install -- You must be root, otherwise I can't.
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 NXZLinux联盟 NXZLinux联盟 Dynamic section at offset 0x9670 contains 21 entries:NXZLinux联盟 Tag Type Name/ValueNXZLinux联盟 0x00000001 (NEEDED) Shared library: [libcrypt.so.1]NXZLinux联盟 0x00000001 (NEEDED) Shared library: [libc.so.6]NXZLinux联盟 0x0000000c (INIT) 0x9c40NXZLinux联盟 0x0000000d (FINI) 0x10160
0x00000004 (HASH) 0x8128NXZLinux联盟 0x00000005 (STRTAB) 0x9070NXZLinux联盟 0x00000006 (SYMTAB) 0x85e0NXZLinux联盟 0x0000000a (STRSZ) 1430 (bytes)NXZLinux联盟 0x0000000b (SYMENT) 16 (bytes)NXZLinux联盟 0x00000015 (DEBUG) 0x0NXZLinux联盟 0x00000003 (PLTGOT) 0x19740NXZLinux联盟 0x00000002 (PLTRELSZ) 1064 (bytes)NXZLinux联盟 0x00000014 (PLTREL) RELNXZLinux联盟 0x00000017 (JMPREL) 0x9818NXZLinux联盟 0x00000011 (REL) 0x97c8
0x00000012 (RELSZ) 80 (bytes)
0x00000013 (RELENT) 8 (bytes)NXZLinux联盟 0x6ffffffe (VERNEED) 0x9758NXZLinux联盟 0x6fffffff (VERNEEDNUM) 2NXZLinux联盟 0x6ffffff0 (VERSYM) 0x9606NXZLinux联盟 0x00000000 (NULL) 0x0
|
创建创建帐号及密码文件: [tekkamanninja@Tekkaman-Ninja tinylogin]$ cd ../../nfs/rootfs/etc/NXZLinux联盟 [tekkamanninja@Tekkaman-Ninja etc]$ suNXZLinux联盟 口令:NXZLinux联盟 [root@Tekkaman-Ninja etc]# cp /etc/passwd . ;cp /etc/shadow . ;cp /etc/group .NXZLinux联盟 [root@Tekkaman-Ninja etc]# kwrite passwdNXZLinux联盟 root:x:0:0:root:/root:/bin/shNXZLinux联盟 [root@Tekkaman-Ninja etc]# kwrite group
root:x:0:rootNXZLinux联盟 [root@Tekkaman-Ninja etc]# kwrite shadowNXZLinux联盟 root:$1$N8K8eEQe$.XkJo3xcsjOE6vo1jW9Nk/:13923:0:99999:7:::NXZLinux联盟 NXZLinux联盟 [root@Tekkaman-Ninja etc]# rm *~NXZLinux联盟 rm:是否删除 普通文件 “group~”? yNXZLinux联盟 rm:是否删除 普通文件 “passwd~”? yNXZLinux联盟 rm:是否删除 普通文件 “shadow~”? yNXZLinux联盟 [root@Tekkaman-Ninja etc]# exitNXZLinux联盟 exitNXZLinux联盟 [tekkamanninja@Tekkaman-Ninja etc]$
|
这 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* .NXZLinux联盟 cp: 略过目录 “/home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/ldscripts”NXZLinux联盟 [tekkamanninja@Tekkaman-Ninja lib]$ cp /home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/libc-2.3.2.so .;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/libc.so.6 .NXZLinux联盟 [tekkamanninja@Tekkaman-Ninja lib]$ cp /home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/libm-* . ;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/libm.s* .NXZLinux联盟 [tekkamanninja@Tekkaman-Ninja lib]$ cp /home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/libcrypt-* . ;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/libcrypt.s* .NXZLinux联盟
|
以上是最基本的文件。
一个最基本根文件系统构建完成!未压缩的文件系统总大小不到3M。
以下是启动信息: U-Boot 1.3.1 (Feb 18 2008 - 16:04:40)NXZLinux联盟 NXZLinux联盟 DRAM: 64 MBNXZLinux联盟 Flash: 1 MBNXZLinux联盟 NAND: NAND flash probing at 0x4E000000NXZLinux联盟 64 MBNXZLinux联盟 In: serialNXZLinux联盟 Out: serialNXZLinux联盟 Err: serialNXZLinux联盟 Hit any key to stop autoboot: 0NXZLinux联盟 dm9000 i/o: 0x20000300, id: 0x90000a46NXZLinux联盟 MAC: 08:08:08:08:12:27NXZLinux联盟 operating at 100M full duplex modeNXZLinux联盟 File transfer via NFS from server 192.168.1.22; our IP address is 192.168.1.2NXZLinux联盟 Filename '/home/tekkamanninja/working/nfs/zImage.img'.NXZLinux联盟 Load address: 0x30008000NXZLinux联盟 Loading: ###########################################NXZLinux联盟 #######################################NXZLinux联盟 ####################################NXZLinux联盟 ##########################################NXZLinux联盟 ############
|