您的位置:首页 > 其它

【记录】制作最小根文件系统

2016-08-08 15:21 399 查看

概述

所谓制作根文件系统,就是创建各种目录,并在里面创建各种文件。如在/bin,/sbin目录下存放各种可执行程序,在/etc目录下存放配置文件,在/lib目录下存放库文件。

通常,使用Busybox来创建上述目录下的可执行文件。

最小根文件系统

内容包括

1./dev/console,/dev/null

2.init程序,由busybox创建

3./etc/inittab(配置文件)

4.配置文件指定的应用程序

5.C库

配置,编译busybox

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.  <Enter> selects submenus --->.  Highlighted letters are hotkeys.   |
|  Pressing <Y> includes, <N> excludes, <M> modularizes features.  Press <Esc><Esc> to exit, <?> for |
|  Help, </> for Search.  Legend: [*] built-in  [ ] excluded  <M> 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


制作映像文件

将制作好的最小文件系统,制作为映像文件,就可以烧写到开发板上运行了。

制作yaffs2镜像

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 #####

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


自动创建dev目录下的节点(udev,buybox中的简化版本mdev)

参考\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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: