天天看點

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

繼續閱讀