ARM根文件系统制作(For 2440)
1. 准备工作
Busybox源码:http://www.busybox.net/downloads/
# cd /home/liao
# tar –jxvf busybox-1.13.3.tar.bz2
# cd busybox-1.13.3
2. busybox编译
2.1修改Makefile
CROSS_COMPILE ?=arm-linux-
ARCH ?=arm
2.2 配置busybox
# make menuconfig
Busybox Settings--->
Build Options--->
[*] Build BusyBox as a static binary(no shared libs)
[*] Build with Large File Support(for accessing files>2GB)
Installation Options->
[]Don’t use /usr
Applets links (as soft-links) --->
(./_install) BusyBox installation prefix 修改(./_install)为/utu2440/rootfs
Busybox Library Tuning --->
[*] vi-style line editing commands
[*]Fancy shell prompts
Linux Module Utilities--->
(/lib/modules)Default directory containing modules
(modules.dep)Default name of modules.dep
[ ] simplified modutils
[*] insmod
[*] rmmod
[*] lsmod
[*] modprobe
-----options common to multiple modutils
[ ] support version 2.2/2.4 Linux kernels
[*]Support tainted module checking with new kernels
[*]Support for module .aliases file
[*] support for modules.symbols file
Linux System Utilities --->
[*]Support /etc/mdev.conf
[*]Support command execution at device addition/removal
# make
# make install
编译出错:
networking/interface.c:818: error: `ARPHRD_INFINIBAND' undeclared here (not in a function)
networking/interface.c:818: error: initializer element is not constant
networking/interface.c:818: error: (near initialization for `ib_hwtype.type')
make[1]: *** [networking/interface.o] 错误 1
make: *** [networking] 错误 2
解决:在networking/interface.c文件中添加:
#define ARPHRD_INFINIBAND 32 /* InfiniBand */
编译后,在rootfs目录下会生成目录bin、sbin、usr和文件linuxrc的内容
3. 建立根文件目录
前面已经生成了bin、sbin等目录,这里建立一些必要的文件目录
# mkdir dev etc lib proc sys mnt tmp var home boot root
# mkdir usr/lib usr/modules
# mkdir etc/init.d etc/sysconfig
# mkdir mnt/etc mnt/jffs2 mnt/data mnt/temp
# mkdir var/lib var/lock var/run var/tmp
# chmod 1777 tmp
# chmod 1777 var/tmp
# sudo mknod -m 600 dev/console c 5 1
# sudo mknod -m 600 dev/null c 1 3
这两个设备节点需要root用户建立,具体原因有待研究
4. 建立etc目录配置文件
4.1 etc/mdev.conf文件,内容可有可无。
4.2 passwd、group、shadow文件,手动、自动创建
手动创建是根据规范手动编写这三个文件内容
# cat passwd
root:x:0:0:root:/root:/bin/sh
passwd一共由7个字段组成,6个冒号将其隔开。它们的含义分别为:
1 用户名
2 是否有加密口令,x表示有,不填表示无,采用MD5、DES加密。
3 用户ID
4 组ID
5 注释字段
6 登录目录
7 所使用的shell程序
#cat group
root:x:0:
group一共由4个字段组成,3个冒号将其隔开,它们的含义分别为:
1 组名
2 是否有加密口令,同passwd
3 组ID
4 指向各用户名指针的数组
#cat shadow
root:$1$3jZ93Mwq$oaeef6lWIuThavs8wD0Wh1:0:0:99999:7:::
shadow一共由9个字段组成,8个冒号将其隔开,它们的含义分别为:
1 用户名
2 加密后的口令,若为空,表示该用户不需要口令即可登陆,若为*号,表示该账号被禁用。 上面的表示的是123456加密后的口令。
3 从1970年1月1日至口令最近一次被修改的天数
4 口令在多少天内不能被用户修改
5 口令在多少天后必须被修改(0为没有修改过)
6 口令过期多少天后用户账号被禁止
7 口令在到期多少天内给用户发出警告
8 口令自1970年1月1日被禁止的天数
9 保留域
自动创建是使用busybox提供的adduser和passwd
在文件系统正常运行起来后,使用adduser命令,使用方法为:
#adduser root
然后就会在etc目录下自动生成passwd 、group、shadow文件。但是运行该命令后会打印出如下消息:
passwd:unknown uid 0
这表示不能为该用户设置密码,此时你会发现要passwd命令也无法使用。解决的办法是,打开passwd文件,其内容为:
root:x:1000:1000:Linux User…:/home/root:/bin/sh
将用户ID和组ID均更改为0
打开group文件,其内容为:
root:x:1000:
同样将组ID改为0
然后,passwd命令就可以正常使用了。这时为root用户设置口令:
#passwd root
根据提示输入密码。其中,root用户登陆后的目录可以手动进行更改。
4.3 etc/inittab文件:
::sysinit:/etc/init.d/rcS
s3c2410_serial0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a –r
4.4 etc/init.d/rcS文件:
#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
echo "---------------mount all--------------"
mount -a
echo "---------------Start mdev-------------"
echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev -s
echo "**************************************"
echo "Kernel version:linux-2.6.24"
echo "YC2440 rootfs"
echo "Designer:zechin.liao"
echo "Date:2010.12.22"
echo "**************************************"
/bin/hostname -F /etc/sysconfig/HOSTNAME
# chmod +x etc/init.d/rcS
4.5 etc/fstab文件:
#device mount-point type option dump fack order
proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
mdev /dev ramfs defaults 0 0
4.6 etc/profile文件:
#Ash profile
#vim:syntax=sh
#No core file by defaults
#ulimit -S -c 0>/dev/null>&1
export LD_LIBRARY_PATH=/lib:/usr/lib
PATH=$PATH
USER="id -un"
LOGNAME=$USER
PS1='[/u@/h /W]#'
HOSTNAME='/bin/hostname'
export USER LOGNAME PS1 PATH
暂时使用nfs挂载根文件,后面将介绍制作yaffs、jffs文件。