天天看点

03-busybox构建根文件系统之最小根文件系统

查看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

继续阅读