查看busybox的INSTALL文件,里面都有详细的安装说明
tar xjf busybox-1.7.0.tar.bz2
cd busybox-1.7.0
make menuconfig
修改配置项
make
mkdir /work/nfs_root/first_fs
make CONFIG_PREFIX=/work/nfs_root/first_fs install
root# ls
bin linuxrc sbin usr
root# ls -l bin/ls
lrwxrwxrwx 1 book book 7 10月 18 09:03 bin/ls -> busybox
创建设备
mkdir dev
cd dev
mknode console c 5 1
mknode null c 1 3
配置文件
mkdir etc
vi etc/inittab
console::askfirst:-/bin/sh
C库:直接拷贝GCC的动态库
mkdir lib
cp /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/*.so* lib -d
制作镜像
mkyaffs2image first_fs/ first_fs.yaffs2
这样就创建好了最小根文件系统,烧写即可
烧录:
nfs 30000000 192.168.1.174:/work/nfs_root/first_fs.yaffs2
nand erase root
nand write.yaffs 30000000 260000 $(filesize)
继续完善根文件系统:
现在在板子上想ps查看进程信息是看不到的
需要创建proc目录, 挂载虚拟proc文件系统,
在内核里面当前有哪些应用程序在跑是通过虚拟的proc文件系统来收集的
mkdir /proc
mount -t proc none /proc
挂载上虚拟文件系统之后执行ps命令就可以看到进程信息
# ps
PID Uid VSZ Stat Command
1 0 3092 S init
2 0 SW< [kthreadd]
3 0 SWN [ksoftirqd/0]
4 0 SW< [watchdog/0]
5 0 SW< [events/0]
6 0 SW< [khelper]
55 0 SW< [kblockd/0]
56 0 SW< [ksuspend_usbd]
59 0 SW< [khubd]
61 0 SW< [kseriod]
73 0 SW [pdflush]
74 0 SW [pdflush]
75 0 SW< [kswapd0]
76 0 SW< [aio/0]
710 0 SW< [mtdblockd]
745 0 SW< [kmmcd]
762 0 SW< [rpciod/0]
764 0 3096 S -sh
778 0 3096 R ps
# cd /proc
# ls
1 745 devices loadavg swaps
2 75 diskstats locks sys
3 76 driver meminfo sysrq-trigger
4 762 execdomains misc sysvipc
5 764 fb modules timer_list
55 779 filesystems mounts tty
56 asound fs mtd uptime
59 buddyinfo interrupts net version
6 bus iomem partitions vmstat
61 cmdline ioports scsi yaffs
710 cpu irq self zoneinfo
73 cpuinfo kallsyms slabinfo
74 crypto kmsg stat
上面1目录表示进程pid号为1的进程也就是init进程的信息, 进去1目录看看:
# cd 1
# ls
auxv environ maps oom_adj stat wchan
clear_refs exe mem oom_score statm
cmdline fd mounts root status
cwd fdinfo mountstats smaps task
# ls -l fd
lrwx------ 1 0 0 64 Jan 1 00:03 0 -> /dev/console
lrwx------ 1 0 0 64 Jan 1 00:03 1 -> /dev/console
lrwx------ 1 0 0 64 Jan 1 00:03 2 -> /dev/console
fd指向/dev/console, 标准输入0, 标准输出1, 标准错误2都指向/dev/console
上面手动挂载了proc虚拟文件系统, 继续构建根文件系统使proc自动挂载:
在/etc/inittab中加入脚本项
::sysinit:/etc/init.d/rcS
在脚本中挂载proc文件系统
创建/etc/init.d目录和/etc/init.d/rcS文件
在/etc/init.d/rcS文件加入以下内容:
mount -t proc none /proc
保存,并加上可执行权限chmod +x /etc/init.d/rcS
制作镜像:
mkyaffs2image first_fs/ first_fs.yaffs2
烧录:
nfs 30000000 192.168.1.174:/work/nfs_root/first_fs.yaffs2
nand erase root
nand write.yaffs 30000000 260000 $(filesize)
也可以用mount -a 命令挂载
mount -a命令会去读/etc/fstab, 根据这个文件的内容来挂载
下面分析/etc/fstab文件的格式:
proc /proc proc defaults 0 0
#device mount-point type options dump fsck order
挂载哪个设备 挂载点 文件系统类型
创建/etc/fstab
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
修改/etc/init.d/rcS内容
mount -a #会去读/etc/fstab
制作镜像, 烧写:
查看已经挂载的文件系统:
# cat /proc/mounts
rootfs / rootfs rw 0 0
/dev/root / nfs rw,vers=2,rsize=4096,wsize=4096,hard,nolock,proto=udp,timeo=11,retrans=2,sec=sys,addr=192.168.1.174 0 0
proc /proc proc rw 0 0
继续完善根文件系统:
/dev目录下只有ocnsole和null这两个手工创建的设备, 如果每个设备都要手工创建就很麻烦
Linux有udev机制, 会自动创建/dev目录下的设备节点,
在busybox里面有一个类似的mdev机制, busybox-1.7.0\docs\mdev.txt有详细的说明
mdev的用途主要有两个:初始化/dev目录下的设备节点, 动态更新. 动态更新不仅更新/dev目录,
还支持热拔插, 即插入/卸载设备时执行的某些动作
要使用mdev, 需要内核支持sysfs文件系统,为了减少对flash的读写,还需要支持tmpfs文件系统
下面根据busybox-1.7.0\docs\mdev.txt来修改:
1. 修改/etc/fstab, 把sysfs文件系统和tmpfs文件系统挂载上去
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
2. 修改/etc/init.d/rcS文件加入要自动运行的命令
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /bin/mdev > /proc/sys/kernel/hotplug #当插入U盘或自动加载某个驱动, 内核就会调用hotplug, 创建设备节点
mdev -s #创建内核原有的设备节点
3. 创建sys目录
mkdir /sys /tmp /mnt /root /proc
制作镜像, 烧写!
在根文件系统中挂载nfs:
1. 服务器允许目录被挂接, 开nfs服务, 配置/etc/exports文件
sudo vi /etc/exports
/work/nfs_root/first_fs *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
sudo /etc/init.d/nfs-kernel-server restart // 重启NFS服务
showmount -e 192.168.1.174 // 查看nfs目录是否有更新
2. 开发板去挂接
mount -t nfs -o nolock 192.168.1.174:/work/nfs_root/first_fs /mnt
命令行启动NFS文件系统挂载:
命令行格式查看linux-2.6.22.6/Documentation/nfsroot.txt
root=/dev/nfs
nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
setenv bootargs root=/dev/nfs nfsroot=192.168.1.174:/work/nfs_root/first_fs ip=192.168.1.11:192.168.1.174:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0