Start Linux Leave Linux a while Back to Linux
分类: LINUX
2008-02-23 00:24:05
platform: s
首先在开发平台的上创建 rootfs 及 根目录下的一些必要的文件.
1. 创建必须的文件夹及设备文件
# mkdir rootfs
# cd rootfs
# mkdir bin dev etc lib mnt proc sbin sys root
# mkdir /etc/var
# mkdir /etc/tmp
# ln -s /etc/var /var
# ln -s /etc/tmp /tmp
2. 创建设备文件系统
从 Linux-
版本的udev是一个基于用户空间的设备管理系统。在内核启动时并不能
自动创建设备节点,固需手动创建console和null两个启动过程必须的设
备节点。我们将采用busybox中内置的mdev,一个简化的udev版本.
# mknod -m 660 dev/console c 5 1
# mknod -m 660 dev/null c 1 3
3. 建立动态运行库
# cp -rfd /usr/local/arm/
拷贝经过交叉编译的库文件,参数-d,保持库文件的链接关系。
# rm -rf rootfs/lib/*.a
删除所有的静态库文件。
注:/usr/local/arm/
# arm-linux-strip rootfs/lib/*
移除所有的符号信息, 压缩库空间。
注:用arm-linux-gc
4. 交叉编译busybox
解压缩tar -zxf busybox
解压后修改Makefile,指明交叉编译器:
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/
在解压后的busybox
值得注意的是 shell 的选择,在 Choose your default shell (none) 这一项回车后选择ash, 否则,编译后会提示找不到shell,使系统无法启动。
还需选中以下两个选项:
Shell --->
[*] Standalone shell
[*] Command line editing
...
[*] Tab completion
[*] Username completion
其中Tab comletion选项是用于输入命令后按 Tab 键自动补齐的.
Busybox settings --->
Build option --->
[*] Build BusyBox as a static binary (no shared libs)
Init Utilities --->
[*] init
[ ] debugging aid
[*] Support reading an inittab file
[ ] Support running commands with a controlling-tty
[*] Be _extra_ quiet on boot
[ ] Support dumping core for child processes (debugging only)
[*] Support running init from within an initrd (not initramfs)
[*] poweroff, halt, and reboot
[*] mesg
Linux System Utilities --->
[*] mdev
[*] Support /etc/mdev.conf
[ ] Support command execution at device addition/removal
必须选择 mdev 选项, 否则不能启用udev。
执行 make install进行编译,编译完后,会出现_install目录,包含bin、sbin、usr三个目录和一个linuxrc文件。
linuxrc是linux启动后第一执行的文件(由u-boot传给linux的启动参数决定,在kernel的boot option 的目录),其作用是执行相应的初始化工作。但u-boot编译生成的仅是一个指向/bin/busybox的链接文件。由于我们需要作一些初始化工作,如启动web服务器,加载特定驱动程序等,我们将自行编写linuxrc这个文件。bin、sbin、usr这三个目录里除了bin/busybox一个文件外,其余都是指向busybox的链接文件。我们将bin、sbin、usr这三个目录和linuxrc这个链接文件拷贝到rootfs的目录下,基本的文件系统制作完成。
如果找不到linuxrc文件,可以自建一个:
# ln -s /arm/busybox linuxrc
5. etc目录制作
a) 添加 fstab 文件,添加 必须的挂靠目录
none /proc proc defaults 0 0
none /dev/pts devpts mode=0622 0 0
tmpfs /dev/shm tmpfs defaults 0 0
/dev/sda1 /mnt/flash vfat defaults 0 0
b) 添加 init.d/rcS 文件 添加自动执行部分
#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/lib:
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
#Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
trap ":" INT QUIT TSTP
/bin/mount -t proc none /proc
/bin/mount -t tmpfs none /root
/bin/mount -t tmpfs none /tmp
/bin/mount -t tmpfs none /var
/bin/mount -t tmpfs none /dev
/bin/mount -t sysfs none /sys
/bin/mkdir -p /var/lib
/bin/mkdir -p /var/run
/bin/mkdir -p /var/log
/bin/mknod -m 660 /dev/console c 5 1
/bin/mknod -m 660 /dev/null c 1 3
/bin/mknod -m 666 /dev/ptmx c 5 2
/bin/mkdir /dev/shm
/bin/mkdir /dev/pts
echo "Starting mdev ..."
/sbin/mdev -s
echo /sbin/mdev > /proc/sys/kernel/hotplug
/etc/rc.d/init.d/netd start
/sbin/ifconfig lo 127.0.0.1
/sbin/ifconfig eth0 192.168.0.9
/sbin/route add default eth0
/bin/hostname -F /etc/sysconfig/HOSTNAM
c) 创建 rc.d\init.d\netd 文件
#!/bin/sh
base=inetd
# See how we were called.
case "$1" in
start)
/usr/sbin/$base
;;
stop)
pid='/bin/pidof $base'
if [ -n "$pid" ]; then
kill -9 $pid
fi
;;
esac
exit
d) 其他文件具体参考rootfs目录
2. 生成镜像文件
a): 镜像文件tool文件: mkfs.yaffs2
b): 创建新的镜像文件:
./mkfs.yaffs2 1 rootfs yaffs2.img
mkfs.yaffs2参数说明可以参考./mkfs.yaffs2 -help
新镜像文件yaffs2.img可以通过usb下载到nandflash里,Rootfs文件系统制作完成。