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

概述

所谓制作根文件系统,就是创建各种目录,并在里面创建各种文件。如在/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
  1. 创建映像文件
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

自动创建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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值