根文件系统构建
一、BusyBox构建根文件系统
1、编译BusyBox根文件系统
在Ubuntu上NFS服务器目录/home/liupf/linux/nfs/创建rootfs子目录
mkdir rootfs
在PC上解压busybox-1.29.0.tar.bz2。
tar -vxjf busybox-1.29.0.tar.bz2
1.修改Makefile,添加编译器
164 CROSS_COMPILE ?= /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- ...... 190 ARCH ?= arm
2.busybox中文字符支持
修改busybox-1.29.0/libbb/printable_string.c中printable_string函数。主要增加了对大于0x7F字符和UNICODE的支持。
修改busybox-1.29.0/libbb/unicode.c中unicode_conv_to_printable2函数。修改内容与前述类似。
3.配置busybox
busybox三种配置选项。
defconfig:缺省配置,即默认配置
allyesconfig:全选配置,选中全部配置
allnoconfig:最小配置
开始配置busybox:
make defconfig
make menuconfig
Location:#选择动态编译,取消下述选项
-> Settings
-> Build static binary (no shared libs)
Location:
-> Settings
-> vi-style line editing commands
Location:#取消勾选
-> Linux Module Utilities
-> Simplified modutils
Location:
-> Linux System Utilities
-> mdev (16 kb) //确保下面的全部选中,默认都是选中的
Location:#使能unicode编码以支持中文
-> Settings
-> Support Unicode //选中
-> Check $LC_ALL, $LC_CTYPE and $LANG environment variables //选中
4、编译busybox
使用以下指令:
make install CONFIG_PREFIX=/home/liupf/linux/nfs/rootfs
如果 bootargs 设置 init=/linuxrc,那么 linuxrc 就是可以作为用户空间的 init 程序,所以用户态空间的 init 程序是 busybox 来生成的。
2、向根文件系统添加lib库
1、向rootfs的“/lib”添加库文件
在rootfs下创建lib文件夹
mkdir rootfs
进入目录/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linuxgnueabihf/libc/lib
cp *so* *.a /home/liupf/linux/nfs/rootfs/lib/ -defconfig
其中ld-linux-armhf.so.3是一个软连接文件。需要拷贝实际指向的文件。删除该文件。
rm ld-linux-armhf.so.3
重新进入库目录,执行:
cp ld-linux-armhf.so.3 /home/liupf/linux/nfs/rootfs/lib/
在目录/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib中同样也有需要的库文件,将其拷贝到网络文件系统的lib目录下。
2.向rootfs的usr/lib目录添加库文件
现在nfs/rootfs/目录下创建usr/lib目录
将/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib目录中的库文件拷贝到rootfs/usr/lib中。
cp *so* *.a /home/liupf/linux/nfs/rootfs/usr/lib/ -d
拷贝完成后,使用一下命令查看两个目录的大小
cd rootfs //进入根文件系统目录 du ./lib ./usr/lib/ -sh //查看 lib 和 usr/lib 这两个目录的大小
两个目录大小分别是57M和67M。
3、创建其他文件夹
在根文件系统中创建其他文件夹,如 dev、 proc、 mnt、 sys、 tmp 和 root 等。
二、测试文件系统
root变量的设置格式如下:
root=/dev/nfs nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gwip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>
我们使用的命令示例如下:
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.1.250:/home/liupf/linux/nfs/rootfs ip=192.168.1.251:192.168.1.250:192.168.1.1:255.255.255.0::eth0:off' //设置 bootargs saveenv //保存环境变量
三、完善文件系统
1、创建/etc/init.d/rcS文件
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib export PATH LD_LIBRARY_PATH runlevel mount -a #挂载所有的文件系统,这些文件系统由文件/etc/fstab来指定 mkdir /dev/pts mount -t devpts devpts /dev/pts #创建目录/dev/pts,然后将 devpts 挂载到/dev/pts 目录中。
echo /sbin/mdev > /proc/sys/kernel/hotplug #使用mdev来管理热插拔设备,通过这两行内核可以在/dev目录下自动创建设备节点 mdev -s
#此处可添加需要自动启动的应用程序
创建完成后,给与/etc/init.d/rcS可执行权限。
2、创建/etc/fstab文件
在 rootfs 中创建/etc/fstab 文件,fstab 在 Linux 开机以后自动配置哪些需要自动挂载的分区,格式如下:
<file system> <mount point> <type> <options> <dump> <pass>
<file system>:要挂载的特殊的设备,也可以是块设备,比如/dev/sda 等等。
<mount point>:挂载点。
<type>:文件系统类型,比如 ext2、 ext3、 proc、 romfs、 tmpfs 等等。
<options>:挂载选项,在 Ubuntu 中输入“man mount”命令可以查看具体的选项。一般使 用 defaults,也就是默认选项, defaults 包含了 rw、 suid、 dev、 exec、 auto、 nouser 和 async。
<dump>:为 1 的话表示允许备份,为 0 不备份,一般不备份,因此设置为 0。
<pass>:磁盘检查设置,为 0 表示不检查。根目录‘/’设置为 1,其他的都不能设置为 1,其他的分区从 2 开始。一般不在 fstab 中挂载根目录,因此这里一般设置为 0。
#<file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0
3、创建/etc/inittab文件
init 程序会读取/etc/inittab这个文件, inittab 由若干条指令组成。每条指令的结构都是一样的,由以“:”分隔的 4 个段组