一, 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 个段组成, 格式如下:
- <id>
- :
- <runlevels>
- :
- <action>
- :
- <process>
- <id>
- : 每个指令的标识符, 不能重复. 但是对于 busybox 的 init 来说,
- <id>
- 有着特殊意义.
对于 busybox 而言 < id > 用来指定启动进程的控制 tty, 一般我们将串口或者 LCD 屏幕设置为控
制 tty.
- <runlevels>
- : 对 busybox 来说此项完全没用, 所以空着.
- <action>
- : 动作, 用于指定
- < process>
- 可能用到的动作.
<process>: 具体的动作, 比如程序, 脚本或命令等.
创建一个 / etc/inittab 文件, 内容如下:
- #etc/inittab
- ::sysinit:/etc/init.d/rcS
- console::askfirst:-/bin/sh
- ::restart:/sbin/init
- ::ctrlaltdel:/sbin/reboot
- ::shutdown:/bin/umount -a -r
- ::shutdown:/sbin/swapoff -a
支持 DNS 服务, 在 rootfs 中新建文件 / etc/resolv.conf, 然后在里面输入如下内容:
- nameserver 114.114.114.114
- nameserver 192.168.1.1
来源: http://www.bubuko.com/infodetail-3338775.html