busybox 版本 :busybox-1.29
操作系统版本 :ubuntu 16.0.4.7
arm_gcc版本 :gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gcc
制作busybox 文件系统
-
解压busybox
tar -xvf busybox-1.29.tar.gz
-
创建busybox 编译脚本
cd busybox-1.29 vim build_busybox.sh
build_busybox.sh
#!/bin/sh export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabihf- export PATH=$PATH:/home/li/linux/gcc-v/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin #make clean make defconfig make menuconfig make -j6 make install CONFIG_PREFIX=/home/li/linux/nfs/rootfs
-
创建 文件系统安装路径
mkdir /home/li/linux/nfs/rootfs
-
修改 busybox源码 支持中文
//修改printable_string.c
修改const char* FAST_FUNC printable_string(uni_stat_t *stats, const char *str)vim libbb/printable_string.c //注释掉 31行 /*if (c >= 0x7f) break;*/ //注释45行修改为 /*if (c < ' ' || c >= 0x7f)*/ if (c < ' ' )
//修改unicode.c
修改static char* FAST_FUNC unicode_conv_to_printable2(uni_stat_t *stats, const char *src, unsigned width, int flags)vim libbb/unicode.c //注释掉 1022行 //*d++ = (c >= ' ' && c < 0x7f) ? c : '?'; *d++ = (c >= ' ') ? c : '?'; //注释掉 1031行 //if (c < ' ' || c >= 0x7f) if (c < ' ')
-
编译busybox
./build_busybox.shbusybox menuconfig 设置
Location: -> Settings -> Build static binary (no shared libs) // 使用共享库 不选 -> vi-style line editing commands //vi风格的行编辑命令 可选 -> Support Unicode //选中 -> Check $LC_ALL, $LC_CTYPE and $LANG environment variables 选中 -> Linux Module Utilities -> Simplified modutils //简化模块 不选 -> Linux System Utilities -> mdev (16 kb) 全部选中,默认都是选中的
-
完善根文件系统
//创建库文件夹 mkdir /home/li/linux/nfs/rootfs/lib mkdir /home/li/linux/nfs/rootfs/usr/lib
//拷贝 arm_linux_gcc libc/lib/*----->/rootfs/lib/
cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linuxgnueabihf/libc/lib/ cp *so* *.a /home/li/linux/nfs/rootfs/lib/ -d rm ld-linux-armhf.so.3 cp ld-linux-armhf.so.3 /home/li/linux/nfs/rootfs/lib
//拷贝 arm_linux_gcc lib/*----->/rootfs/lib/
cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib/ cp *so* *.a /home/li/linux/nfs/rootfs/lib/ -d
//拷贝 arm_linux_gcc /usr/lib/*----->/rootfs//usr/lib
cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib/ cp *so* *.a /home/li/linux/nfs/rootfs/usr/lib/ -d
-
创建文件夹
cd /home/li/linux/nfs/rootfs/ mkdir dev proc mnt sys tmp root
-
设置uboot参数
///nfs 加载 启动参数 //设置网络信息 setenv serverip 192.168.1.102 setenv ipaddr 192.168.1.29 setenv ethaddr 00:04:9f:04:d2:35 setenv gatewayip 192.168.1.1 setenv netmask 255.255.255.0 //设置nfs目录 setenv nfsroots /home/li/linux/nfs/ //nfs加载内核 加载所设备树 setenv bootcmd 'nfs ${loadaddr} ${serverip}:${nfsroot}${image};nfs ${fdt_addr} ${serverip}:${nfsroot}${fdt_file};bootz ${loadaddr} - ${fdt_addr};' //nfs启动 不能存在变量否则无法正常启动 setenv bootargs 'console=tty1 video=mxcfb0:dev=hdmi,1920x1080@60,bpp=32 console=ttymxc3,115200 root=/dev/nfs rw nfsroot=192.168.1.101:/home/li/linux/nfs/rootfs ip=192.168.1.102:192.168.1.101:192.168.1.1:255.255.255.0::eth0:off' saveenv
完善文件系统
-
创建启动脚本 rcS
cd /home/li/linux/nfs/rootfs sudo mkdir ./etc ./etc/init.d sudo touch ./etc/init.d/rcS sudo vim ./etc/init.d/rcS
rcS
a. PATH 环境变量保存着可执行文件可能存在的目录
b. LD_LIBRARY_PATH 环境变量保存着库文件所在的目录
c. export 来导出上面这些环境变量mount -a 挂载所有文件系统
#!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib export PATH LD_LIBRARY_PATH mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s /// PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH //PATH 环境变量保存着可执行文件可能存在的目录 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib //LD_LIBRARY_PATH 环境变量保存着库文件所在的目录 export PATH LD_LIBRARY_PATH //导入环境变量 mount -a //挂载所有文件系统 mkdir /dev/pts //创建挂载点 mount -t devpts devpts /dev/pts //挂载devpts 挂载到/dev/pts 目录 ----->文件系统由文件/etc/fstab 来指定 //mdev 来管理热插拔设备 下面两句使能linux内核再/dev目录中自动创建节点 //即是把/sbin/mdev写到/proc/sys/kernel/hotplug文件里 echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s
-
rcS添加权限
chmod 777 rcS
-
创建 文件系统信息/etc/inittab文件(初始化文件系统)
id runlevelstype action process 令的标识符 保留 动作 具体的动作 id:每个指令的标识符,不能重复。但是对于 busybox 的 init 来说, 有着特殊意义。
对于 busybox 而言用来指定启动进程的控制 tty,一般我们将串口或者 LCD 屏幕设置为控
制 tty。
runlevels: 对 busybox 来说此项完全没用,所以空着。
action:动作,用于指定process可能用到的动作。动作 描述 sysinit 在系统初始化的时候 process 才会执行一次。 respawn 当 process 终止以后马上启动一个新的。 askfirst 和 respawn 类似,在运行 process 之前在控制台上显示“Please press Enter to activate this console.”。只要用户按下“Enter”键以后才会执行 process。 wait 告诉 init,要等待相应的进程执行完以后才能继续执行。 once 仅执行一次,而且不会等待 process 执行完成 restart 当 init 重启的时候才会执行 procee。 ctrlaltdel 当按下 ctrl+alt+del 组合键才会执行 process。 shutdown 关机的时候执行 process。 sysinit sysinit sudo touch ./etc/inittab sudo vim ./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 /// ::sysinit:/etc/init.d/rcS //在系统初始化的时候 执行/etc/init.d/rcS。 console::askfirst:-/bin/sh //console 作为控制台终端,也就是 ttymxc0 ::restart:/sbin/init //重启运行运行/sbin/init ::ctrlaltdel:/sbin/reboot // ctrl+alt+del 组合键的话就运行/sbin/reboot ::shutdown:/bin/umount -a -r //关机卸载 各个文件系统 ::shutdown:/sbin/swapoff -a // 关机执行/sbin/swapoff
- 创建 文件系统信息/etc/fstab 文件
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。sudo touch ./etc/fstab sudo vim ./etc/fstab #<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
脚本启动流程
在busybox中 init作为其他进程的控制这和发起者,当init进程开始创建子进程时,会解析 /etc/inittab 文件,创建进程,执行开机启动脚本 /etc/init.d/rcS,在rcS中会导入环境变量,指定控制台(如果没有指定控制台,则使用制定的否则使用默认的/dev/console),挂载文件系统,会调用/etc/fstab获取的文件系统加载信息,最后加载文件系统。
init
-->./etc/inittab
-->/etc/fstab
-->/etc/reS