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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值