所谓制作根文件系统,就是创建各种目录,并在里面创建各种文件。如在/bin,/sbin目录下存放各种可执行程序,在/etc目录下存放配置文件,在/lib目录下存放库文件。
通常,使用Busybox来创建上述目录下的可执行文件。
内容包括
1./dev/console,/dev/null
2.init程序,由busybox创建
3./etc/inittab(配置文件)
4.配置文件指定的应用程序
5.C库
busybox将众多的UNIX命令集合到一个很小的可执行程序中,它为提供的选项少,但能够满足一般应用,为各种小型的或者嵌入式系统提供了一个比较完整的工具集。
使用busybox创建最小根文件系统时,只需要在/dev目录下创建必要的设备节点,在/etc目录下创建一些配置文件即可。
1.解压
book@book-desktop:/work/system$ tar xjf busybox-1.7.0.tar.bz2
2.编译
参考\busybox-1.7.0\INSTALL
make menuconfig # This creates a file called ".config"
make # This creates the "busybox" executable
make install # or make CONFIG_PREFIX=/path/from/root install
第一步:
make menuconfig
编译完成后,生成.config文件,并读取.config配置信息
BusyBox 1.7.0 Configuration
---------------------------------------------------------------------------------------------------------
+-------------------------------------- Busybox Configuration ---------------------------------------+
| Arrow keys navigate the menu. selects submenus --->. Highlighted letters are hotkeys. |
| Pressing includes, excludes, modularizes features. Press to exit, > for |
| Help, > for Search. Legend: [*] built-in [ ] excluded module < > module capable |
| |
| +------------------------------------------------------------------------------------------------+ |
| | Busybox Settings ---> | |
| | --- Applets | |
| | Archival Utilities ---> | |
| | Coreutils ---> | |
| | Console Utilities ---> | |
| | Debian Utilities ---> | |
| | Editors ---> | |
| | Finding Utilities ---> | |
| | Init Utilities ---> | |
| | Login/Password Management Utilities ---> | |
| | Linux Ext2 FS Progs ---> | |
| | Linux Module Utilities ---> | |
| | Linux System Utilities ---> | |
| | Miscellaneous Utilities ---> | |
| +-------------v(+)-------------------------------------------------------------------------------+ |
+----------------------------------------------------------------------------------------------------+
| <Select> < Exit > < Help > |
+----------------------------------------------------------------------------------------------------+
BusyBox 1.7.0 Configuration
修改Makefile,设置交叉编译
设置tab completion
第二步:执行make
book@book-desktop:/work/system/busybox-1.7.0$ make
注意:第一次编译时出错,错误信息如下,原因是没有修改Makefile中的交叉编译
In file included from /usr/include/linux/netfilter_ipv4.h:8,
from ipsvd/tcpudp.c:33:
/usr/include/linux/netfilter.h:55: error: field ‘in’ has incomplete type
/usr/include/linux/netfilter.h:56: error: field ‘in6’ has incomplete type
ipsvd/tcpudp.c: In function ‘tcpudpsvd_main’:
ipsvd/tcpudp.c:314: warning: ignoring return value of ‘write’, declared with attribute warn_unused_result
make[1]: *** [ipsvd/tcpudp.o] Error 1
make: *** [ipsvd] Error 2
第三步:安装
注意:千万不要直接make install,该命令会安装到PC机中,将破坏系统
①创建一个目录
book@book-desktop:/work/system/busybox-1.7.0$ mkdir -p /work/nfs_root/first_fs
②把busybox安装到该文件夹下
book@book-desktop:/work/system/busybox-1.7.0$ make CONFIG_PREFIX=/work/nfs_root/first_fs install
③进入文件夹查看
book@book-desktop:/work/nfs_root/first_fs$ ls
bin linuxrc sbin usr
busybox安装后,已经有了基本的目录。继续创建其他目录。
1.创建设备文件:/dev/console,/dev/null
仿照PC,使用mknod创建
book@book-desktop:/work/nfs_root/first_fs$ ls /dev/console /dev/null -l
crw------- 1 root root 5, 1 2016-08-03 08:04 /dev/console
crw-rw-rw- 1 root root 1, 3 2016-08-02 11:07 /dev/null
book@book-desktop:/work/nfs_root/first_fs$
book@book-desktop:/work/nfs_root/first_fs$ mkdir dev
book@book-desktop:/work/nfs_root/first_fs$ cd dev
book@book-desktop:/work/nfs_root/first_fs/dev$ sudo mknod console c 5 1
[sudo] password for book:
book@book-desktop:/work/nfs_root/first_fs/dev$ ls
console
book@book-desktop:/work/nfs_root/first_fs/dev$ sudo mknod null c 1 3
book@book-desktop:/work/nfs_root/first_fs/dev$ ls -l
total 0
crw-r--r-- 1 root root 5, 1 2016-08-03 20:42 console
crw-r--r-- 1 root root 1, 3 2016-08-03 20:43 null
2.构造/etc/inittab(配置文件)
book@book-desktop:/work/nfs_root/first_fs$ mkdir etc
book@book-desktop:/work/nfs_root/first_fs$ vi etc/inittab
在inittab中添加下面内容
console::askfirst:-/bin/sh
3.安装C库
将目录/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib下的库文件拷贝到lib目录下
book@book-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ mkdir /work/nfs_root/first_fs/lib
book@book-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp *.so* /work/nfs_root/first_fs/lib/ -d
此时,这就是我们的最小根文件系统。
book@book-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cd /work/nfs_root/first_fs
book@book-desktop:/work/nfs_root/first_fs$ ls
bin dev etc lib linuxrc sbin usr
将制作好的最小文件系统,制作为映像文件,就可以烧写到开发板上运行了。
1.解压yaffs2工具
book@book-desktop:/work/system$ tar xjf yaffs_source_util_larger_small_page_nand.tar.bz2
book@book-desktop:/work/system$ cd Development_util_ok/
book@book-desktop:/work/system/Development_util_ok$ ls
yaffs yaffs2
2.编译
进入/work/system/Development_util_ok/yaffs2/utils目录下,执行make
编译出的工具如下
book@book-desktop:/work/system/Development_util_ok/yaffs2/utils$ ls -l
total 132
-rw------- 1 book book 1770 2008-07-08 00:35 Makefile
-rwxr-xr-x 1 book book 18266 2016-08-03 21:05 mkyaffs2image
-rw------- 1 book book 19669 2008-07-08 00:36 mkyaffs2image.c
-rw-r--r-- 1 book book 9412 2016-08-03 21:05 mkyaffs2image.o
-rwxr-xr-x 1 book book 18126 2016-08-03 21:05 mkyaffsimage
-rw------- 1 book book 16206 2008-02-29 10:26 mkyaffsimage.c
-rw-r--r-- 1 book book 8168 2016-08-03 21:05 mkyaffsimage.o
-rw------- 1 book book 6731 2008-02-29 10:26 nand_ecc.c
-rw-r--r-- 1 book book 1776 2016-08-03 21:05 nand_ecc.o
lrwxrwxrwx 1 book book 14 2016-08-03 21:05 yaffs_ecc.c -> ../yaffs_ecc.c
-rw-r--r-- 1 book book 2496 2016-08-03 21:05 yaffs_ecc.o
-rw------- 1 book book 1416 2008-02-29 10:26 yaffs_packedtags1.c
-rw-r--r-- 1 book book 1216 2016-08-03 21:05 yaffs_packedtags1.o
lrwxrwxrwx 1 book book 22 2016-08-03 21:05 yaffs_packedtags2.c -> ../yaffs_packedtags2.c
-rw-r--r-- 1 book book 2160 2016-08-03 21:05 yaffs_packedtags2.o
lrwxrwxrwx 1 book book 23 2016-08-03 21:05 yaffs_tagsvalidity.c -> ../yaffs_tagsvalidity.c
-rw-r--r-- 1 book book 822 2016-08-03 21:05 yaffs_tagsvalidity.o
book@book-desktop:/work/system/Development_util_ok/yaffs2/utils$
3.将mkyaffs2image工具拷贝到系统目录/usr/local/bin/下
book@book-desktop:/work/system/Development_util_ok/yaffs2/utils$ sudo cp mkyaffs2image /usr/local/bin/
4.加上可执行属性
book@book-desktop:/work/system/Development_util_ok/yaffs2/utils$ sudo chmod +x /usr/local/bin/mkyaffs2image
book@book-desktop:/work/nfs_root$ ls
first_fs fs_mini.jffs2 fs_mini_mdev.tar.bz2 fs_mini.yaffs2 fs_qtopia_ts.yaffs2 temp
first_fs.jffs2 fs_mini_mdev fs_mini_mdev.yaffs2 fs_qtopia.jffs2 fs_qtopia.yaffs2
first_fs.yaffs2 fs_mini_mdev.jffs2 fs_mini.tar.bz2 fs_qtopia.tar.bz2 fs_xwindow.tar.bz2
book@book-desktop:/work/nfs_root$ mkyaffs2image
mkyaffs2image: image building tool for YAFFS2 built Aug 3 2016
usage: mkyaffs2image dir image_file [convert]
dir the directory tree to be converted
image_file the output file to hold the image
'convert' produce a big-endian image from a little-endian machine
book@book-desktop:/work/nfs_root$ mkyaffs2image first_fs first_fs.yaffs2
6.下载验证
book@book-desktop:/work/nfs_root$ ls
first_fs fs_mini.jffs2 fs_mini_mdev.tar.bz2 fs_mini.yaffs2 fs_qtopia_ts.yaffs2 temp
first_fs.jffs2 fs_mini_mdev fs_mini_mdev.yaffs2 fs_qtopia.jffs2 fs_qtopia.yaffs2
first_fs.yaffs2 fs_mini_mdev.jffs2 fs_mini.tar.bz2 fs_qtopia.tar.bz2 fs_xwindow.tar.bz2
将first_fs.yaffs2下载到开发板上验证动作。u-boot和DNW下载。
##### 100ask Bootloader for OpenJTAG #####
[n] Download u-boot to Nand Flash
[k] Download Linux kernel uImage
[j] Download root_jffs2 image
[y] Download root_yaffs image
[d] Download to SDRAM & Run
[z] Download zImage into RAM
[g] Boot linux from RAM
[f] Format the Nand Flash
[s] Set the boot parameters
[b] Boot the system
[r] Reboot u-boot
[q] Quit from menu
Enter your selection: y
USB host is connected. Waiting a download.
Now, Downloading [ADDRESS:30000000h,TOTAL:10591690]
RECEIVED FILE SIZE:10591690 (738KB/S, 14S)
NAND erase: device 0 offset 0x260000, size 0xfda0000
Skipping bad block at 0x00960000
Skipping bad block at 0x031e0000
Skipping bad block at 0x03fc0000
Skipping bad block at 0x04a60000
Skipping bad block at 0x06e00000
Skipping bad block at 0x091c0000
Skipping bad block at 0x09a60000
Skipping bad block at 0x0d640000
Skipping bad block at 0x0e480000
Erasing at 0xffe0000 -- 100% complete.
OK
NAND write: device 0 offset 0x260000, size 0xa19dc0
Bad block at 0x960000 in erase block from 0x960000 will be skipped
Writing data at 0xc6b000 -- 100% complete.
10591680 bytes written: OK
按b启动
VFS: Mounted root (yaffs filesystem).
Freeing init memory: 140K
init started: BusyBox v1.7.0 (2016-08-03 20:18:39 CST)
Please press Enter to activate this console.
starting pid 763, tty '/dev/console': '/bin/sh'
# ls
bin etc linuxrc sbin
dev lib lost+found usr
#
创建proc目录,挂载虚拟文件系统
book@book-desktop:/work/nfs_root/first_fs$ mkdir proc
配置文件中设置挂载
book@book-desktop:/work/nfs_root/first_fs$ vi etc/inittab
添加配置脚本文件::sysinit:/etc/init.d/rcS
创建配置脚本,写入挂载内容
book@book-desktop:/work/nfs_root/first_fs$ mkdir etc/init.d
book@book-desktop:/work/nfs_root/first_fs$ vi etc/init.d/rcS
mount -t proc none /proc
加上可执行属性
book@book-desktop:/work/nfs_root/first_fs$ chmod +x etc/init.d/rcS
也可以在rcS中使用mount -a命令,该命令依赖于etc/fstab
book@book-desktop:/work/nfs_root/first_fs$ vim etc/fstab
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
此时
book@book-desktop:/work/nfs_root/first_fs$ cat etc/fstab
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
book@book-desktop:/work/nfs_root/first_fs$ cat etc/init.d/rcS
#mount -t proc none /proc
mount -a
生成映像文件,验证
book@book-desktop://$ cd /work/nfs_root/
book@book-desktop:/work/nfs_root$ mkyaffs2image first_fs first_fs.yaffs2
参考\busybox-1.7.0\docs\mdev.txt
Here's a typical code snippet from the init script:
[1] mount -t sysfs sysfs /sys
[2] echo /bin/mdev > /proc/sys/kernel/hotplug
[3] mdev -s
Of course, a more "full" setup would entail executing this before the previous
code snippet:
[4] mount -t tmpfs mdev /dev
[5] mkdir /dev/pts
[6] mount -t devpts devpts /dev/pts
创建目录
book@book-desktop:/work/nfs_root/first_fs$ mkdir sys
添加挂载点
book@book-desktop:/work/nfs_root/first_fs$ vi etc/fstab
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
在rcS中添加配置内容
book@book-desktop:/work/nfs_root/first_fs$ vi etc/init.d/rcS
#mount -t proc none /proc
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
制作映像文件,下载验证
book@book-desktop:/work/nfs_root$ mkyaffs2image first_fs first_fs.yaffs2
VFS: Mounted root (yaffs filesystem).
Freeing init memory: 140K
init started: BusyBox v1.7.0 (2016-08-03 20:18:39 CST)
starting pid 764, tty '': '/etc/init.d/rcS'
Please press Enter to activate this console.
starting pid 769, tty '/dev/console': '/bin/sh'
# ls
bin etc linuxrc proc sys usr
dev lib lost+found sbin
#
# ls dev
console ptyrf tty17 ttyq7
dsp ptys0 tty18 ttyq8
event0 ptys1 tty19 ttyq9
fb0 ptys2 tty2 ttyqa
full ptys3 tty20 ttyqb
第一次,总是报错无法挂载tmpfs,原因是,在添加挂载点时,拼写错误
错误:
tmpfs /dev tempfs defaults 0 0
正确:
tmpfs /dev tmpfs defaults 0 0