定制根文件系统的方法不少,最经常使用的是使用BusyBox来构建定制根文件系统。它集成压缩了Linux的许多工具和命令,能够使用户迅速方便地创建一套相对完整、功能丰富的文件系统,其中包括大量经常使用的应用程序。下面详细介绍有关Busybox定制根文件系统。html
在/home/xxx/xxx目录下创建rootfs目录,linux
$ mkdir rootfsgit
$ cd rootfsgithub
$ mkdir root bin sbin etc dev usr lib tmp mnt sys proc var //创建经常使用目录shell
$ mkdir usr/lib usr/bin usr/sbinbash
$ tar -jxvf busybox-1.26.2.tar.bz2ide
$ make distclean函数
$ make defconfig工具
$ make menuconfig ARCH=armui
3.1选择Busybox Settings --->
Installation Options --->
BusyBox installation prefix(在里面输入BusyBox的安装目录,我是保存在/home/xxx/xxx/rootfs下)
3.2选择Busybox Settings --->
选中[*] Don't use /usr
3.3 Busybox Settings---->
Build Options---->
选中 [*]Build BusyBox as a static binary(静态连接)
Cross Compiler prefix配置为arm-linux-gnueabi-(指定交叉编译器)
配置好后,保存相关配置信息。
$ make
$ make install
dev目录下必须有console和null这两个设备文件,使用mknod来建立这两个设备文件。
$ cd dev/
$ sudo mknod -m 666 console c 5 1
$ sudo mknod -m 666 null c 1 3
$ cd /home/xxx/xxx/rootfs/etc
$ cp /home/ xxx/xxx/Downloads/busybox-1.26.2/examples/bootfloppy/etc/* ./ -raf
7.一、修改fstab配置文件为:
1 proc /proc proc defaults 0 0 2 tmpfs /tmp tmpfs defaults 0 0 3 sysfs /sys sysfs defaults 0 0 4 tmpfs /dev tmpfs defaults 0 0 5 var /dev tmpfs defaults 0 0 6 ramfs /dev ramfs defaults 0 0 7
7.2修改profile文件为:
# /etc/profile: system-wide .profile file for the Bourne shells USER="id -un" LOGNAME=$USER HOSTNAME='/bin/hostname' export PS1='[\u@\h:\w]\#' PATH=/bin:/sbin:/usr/bin:/usr/sbin LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH export PATH LD_LIBRARY_PATH
7.3修改inittab文件为:
# /etc/inittab ::sysinit:/etc/init.d/rcS ::askfirst:-/bin/sh ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r ::restart:/sbin/init
在启动过程当中bootloader会传递参数init=/linuxrc给内核的main( )函数,因此在文件系统被挂载后,运行的第一个程序是linuxrc,而linuxrc是一个指向/bin/busybox的连接文件,也就是说文件系统被挂在后运行的第一个程序是busybox。Busybox首先会解析文件/etc/inittab,这个文件中存放的是系统的配置信息,这些配置信息指明了接下来将要启动那些程序。
/etc/inittab 文件中每一个条目用来定义一个子进程,并肯定它的启动方法,格式以下
<id>:<runlevels>:<action>:<process>
<id>:表示这个进程要使用的控制台(即标准输入、标准输出、标准错误设备)。若是省 略,则使用与init进程同样的控制台。
<runlevels>:对于Busybox init程序,这个字段滑意义,能够省略。
<action>:表示init程序如何控制这个子进程,
<process>: 要执行的程序,它能够是可执行程序,也能够是脚本
文件etc/inittab配置条目说明以下:
::sysinit:/etc/init.d/rcS 启动系统初始化文件/etc/init.d/rcS。字段sysinit代表文件/etc/init.d/rcS在系统启动后最早执行,而且只执行一次,init进程等待它结束才继续执行其它动做。(脚本文件名通常为rc,后缀S表明单用户运行级别脚本)
::askfirst:-/bin/sh 启动askfirst动做的shell。askfirst代表init进程先输出“Please press Enter to actvie this console”,等用户输入回车键以后才启动-/bin/sh。
::ctrlaltdel:/sbin/reboot 当按下Ctrl+Alt+Delete组合键时,init重启执行程序。字段ctrlaltdel代表当按下Ctrl+Alt+Delete组合键时,执行相应的进程。
::shutdown:/bin/umount -a -r 告诉init在关机时运行umount命令卸载全部的文件系统,若是卸载失败,试图以只读方式从新挂载。字段shutdown代表在重启关闭系统命令时执行相应进程。
7.4 配置系统的hostname。在etc目录下执行以下命令:
$ mkdir sysconfig
$ cd sysconfig
$ touch HOSTNAME
$ echo tiny4412 > HOSTNAME
7.5 配置init.d/rcS文件为:
#! /bin/sh PATH=/sbin:/bin:/usr/bin:/usr/sbin runlevel=S prevlevel=N umask 022 export PATH runlevel prevlevel mount -a mkdir -p /dev/pts mount -t devpts devpts /dev/pts #mount -n -t usbfs none /proc/bus/usb echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s mkdir -p /var/lock ifconfig lo 127.0.0.1 /bin/hostname -F /etc/sysconfig/HOSTNAME
修改init.d/rcS文件权限为:
$ chmod 777 init.d/rcS
详解:
#!/bin/sh #用busybox的shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin #shell命令的搜索路径
runlevel=S #运行在单用户模式
prevlevel=N #前一个级别,为N则表示没有前一个级别
umask 022 #权限位掩码
export PATH runlevel prevlevel #将环境的变量导出到环境中
mount -a #将文件 /etc/fstab 中指明的文件挂载到对应的挂载点上
echo /sbin/mdev>/proc/sys/kernel/hotplug #当有热插拔事件产生时, 内核就会调用位于/sbin目录的 mdev。 这时 mdev经过环境变量中的 ACTION 和 DEVPATH,(这两个变量是系统自带的)来肯定这次热插拔事件的动做以及影响了/sys 中的那个目录。接着会看看这个目录中是否有“dev”的属性文件,若是有就利用这些信息为 这个设备在/dev 下建立设备节点文件。
mdev -s #创建dev目录。以‘-s’为参数调用位于/sbin 目录写的 mdev(实际上是个连接,做用是传递参数给/bin目录下的busybox 程序并调用它) ,mdev扫描 /sys/class和/sys/block中全部的类设备目录,若是在目录中含有名为“dev”的文件,且文件中包含的是设备号,则 mdev 就利用这些信息为这个设备在/dev下建立设备节点文件。通常只在启动时才执行一次 “mdev -s” 。
7.6设置ROOT用户(在etc下)
添加passwd
文件:
root:x:0:0:root:/root:/bin/bash
添加group
文件
root:x:0:
添加shadow
文件
root:$6$whiml8Gm$IuKrjGatftq.i6i3OYiu9EP3Rou.RtC2gKC0neyDgM/D5gGBzZwfCUiVoLAj.rWjEmSIwkIe2sKI0DpUusTDn1:17260:0:99999:7:::
#!/bin/bash rm -rf ramdisk* sudo dd if=/dev/zero of=ramdisk bs=1k count=8192 sudo mkfs.ext4 -F ramdisk sudo mkdir -p ./initrd sudo mount -t ext4 ramdisk ./initrd
sudo cp rootfs/* ./initrd -raf sudo mknod initrd/dev/console c 5 1 sudo mknod initrd/dev/null c 1 3 sudo umount ./initrd sudo gzip --best -c ramdisk > ramdisk.gz sudo mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img rm ramdisk ramdisk.gz initrd -rf
把该脚本拷贝到rootfs同一目录下,执行该脚本制做Ramdisk文件系统。生成的ramdisk.img就是咱们须要的Ramdisk文件系统。