定制根文件系统的方法很多,最常用的是使用BusyBox来构建定制根文件系统。它集成压缩了Linux的许多工具和命令,可以使用户迅速方便地建立一套相对完整、功能丰富的文件系统,其中包括大量常用的应用程序。下面详细介绍有关Busybox定制根文件系统。

一、系统环境:

1、操作系统:Ubuntu140.4

2、交叉编译工具:gcc version 6.1.1 20160711 (Linaro GCC 6.1-2016.08)

3、busybox源码包:busybox-1.26.2

二、构建rootfs

1、建立rootfs目录

在/home/xxx/xxx目录下建立rootfs目录,

$  mkdir rootfs

$  cd  rootfs

$  mkdir  root  bin  sbin  etc  dev  usr  lib  tmp  mnt  sys  proc  var  //建立常用目录

$  mkdir  usr/lib  usr/bin  usr/sbin

2、解压源码包:

$ tar -jxvf busybox-1.26.2.tar.bz2

3、配置BusyBox

$ make distclean

$ make defconfig

$ make menuconfig ARCH=arm

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-(指定交叉编译器)

配置好后,保存相关配置信息。

4、编译安装Busybox

$ make

$ make install

5、添加/home/xxx/xxx/rootfs/dev目录下的设备文件。

    dev目录下必须有console和null这两个设备文件,使用mknod来创建这两个设备文件。

      $ cd dev/

    $ sudo mknod -m 666 console c 5 1

   $ sudo mknod -m 666 null c 1 3

6、把busybox源码目录下的examples/bootfloppy/etc的内容拷贝到rootfs目录下的etc下

$ cd /home/xxx/xxx/rootfs/etc

$ cp  /home/ xxx/xxx/Downloads/busybox-1.26.2/examples/bootfloppy/etc/* ./ -raf

   7、修改配置文件

  .1、修改fstab配置文件为:

   proc        /proc   proc    defaults
tmpfs /tmp tmpfs defaults
sysfs /sys sysfs defaults
tmpfs /dev tmpfs defaults
var /dev tmpfs defaults
ramfs /dev ramfs defaults

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

PS1含义

  1. \d :代表日期,格式为weekday month date,例如:"Mon Aug 1"
  2. \H :完整的主机名称。例如:我的机器名称为:fc4.linux,则这个名称就是fc4.linux
  3. \h :仅取主机的第一个名字,如上例,则为fc4,.linux则被省略
  4. \t :显示时间为24小时格式,如:HH:MM:SS
  5. \T :显示时间为12小时格式
  6. \A :显示时间为24小时格式:HH:MM
  7. \u :当前用户的账号名称
  8. \v :BASH的版本信息
  9. \w :完整的工作目录名称。家目录会以 ~代替
  10. \W :利用basename取得工作目录名称,所以只会列出最后一个目录
  11. \# :下达的第几个命令
  12. \$ :提示字符,如果是root时,提示符为:# ,普通用户则为:$

   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
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:::root:/root:/bin/bash

添加group文件

root:x::

添加shadow文件

root:$$whiml8Gm$IuKrjGatftq.i6i3OYiu9EP3Rou.RtC2gKC0neyDgM/D5gGBzZwfCUiVoLAj.rWjEmSIwkIe2sKI0DpUusTDn1:::::::

三、制作Ramdisk文件系统

#!/bin/bash

rm -rf ramdisk*

sudo dd if=/dev/zero of=ramdisk bs=1k count=

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文件系统。

github:https://github.com/xiaozhao777/busybox-1.26.2

参考:

https://www.cnblogs.com/AP0904225/p/7020418.html

https://blog.csdn.net/sinat_20006769/article/details/79059317

Busybox构建根文件系统和制作Ramdisk的更多相关文章

  1. 使用busybox构建根文件系统

    当我们在Qemu上运行起来自己编译的内核之后,需要使用busybox构建一个文件系统,将此文件系统挂载上去就可以使用busybox提供的各种命令了. 1.编译安装busybox 源码下载地址:http ...

  2. 韦东山笔记之用busybox构建根文件系统

    1 百度搜索busybox进入busybox官网(https://busybox.net/)作者:恒久力行 QQ:624668529  点击左侧DownloadSource下载最新稳定版的busybo ...

  3. Linux根文件系统的制作

    转载:http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076655.html 1. 根文件系统 文件系统是包括在一个磁盘(包括光盘.软盘.闪盘及 ...

  4. linux2.6.30.4内核移植(5)——构建根文件系统(yaffs文件系统格式的镜像)

    一.首先编译并安装BusyBox 这里使用的交叉编译器还是3.4.5. 注意:编译内核.编译BusyBox以及编译文件系统中的所有应用程序的交叉编译器要使用同一个版本. 1.获取BusyBox源码 下 ...

  5. linux 内核移植和根文件系统的制作【转载】

    原文地址:http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076214.html 1.1 Linux内核基础知识 在动手进行Linux内核移植之 ...

  6. linux 内核移植和根文件系统的制作

    1.1 Linux内核基础知识 在动手进行Linux内核移植之前,非常有必要对Linux内核进行一定的了解,下面从Linux内核的版本和分类说起. 1.1.1  Linux版本 Linux内核的版本号 ...

  7. Linux 根文件系统的制作

    一.建立根文件系统目录与文件 1. 创建目录 #mkdir rootfs #cd rootfs #mkdir bin dev etc lib proc sbin sys usr mnt tmp var ...

  8. 构建根文件系统之init进程分析

    busybox是ls.cp等命令的集合. 执行ls时,实际上是执行了busybox ls 执行cp时,实际上是执行了busybox cp 分析init程序之前,再让我们回想一下我们的目标:u-boot ...

  9. 构建根文件系统之busybox

    配置busybox 首先将busybox的压缩包放入服务器进行解压缩: busybox集合了几百个命令,在一般的系统中并不需要全部使用.可以通过配置busybox来选择这些命令.定制某些命令的功能(选 ...

随机推荐

  1. 排错技能:任务管理器中追踪某w3wp.exe是哪个IIS站点的application pool

    如果Windows的任务管理器中发现某个w3wp.exe占用了100%CPU,那我们就要揪出这是那个网站的application pool在作怪, 首先,每个站点一定要单独使用各自的applicati ...

  2. sql 实现学生成绩并列排名算法

    SELECT uname, score , 排名=(SELECT COUNT(score) FROM FenShu WHERE Score > a.Score) + 1FROM FenShu a ...

  3. Java 高级框架——Mybatis(一)

    一, SQl复习 a,数据库SQL命令 创建数据库并指定编码 Create database 数据库名 default character set utf8 create database ssm d ...

  4. 关于对CSS中超链接那部分的设置

    a:link{                                  //正常下的超链接 color:red;                          //超链接的颜色 text ...

  5. Redis的过期策略和内存淘汰策略

    Redis的过期策略:通常有三种,Redis中同时使用惰性过期和定期过期两种过期策略组合. 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除.该策略可以立即清除过期的数据 ...

  6. QMap迭代器

    QMap<int, QString> intToStr; intToStr[] = "test" for (auto iter = intToStr.begin(); ...

  7. .net core 自动生成文档

    如下图自动生成显示接口文档注释

  8. Hive随机取某几行数据

    order by rand() limit 100 1. 可用于普通随机筛选 2. 也可用于row_number() 等函数的排序里作为随机排序.

  9. python读取excel,返回dic列表

    def get_xls_sheets_as_dic(pro_name, xls_name): dic_list = [] xls_path = os.path.join(BASE_PATH, &quo ...

  10. activiti官网实例项目activiti-explorer之扩展流程节点属性2

    情景需求:需要查找activiti-explorer项目中获取流程id的方法,然后根据流程id获取相应字段在节点属性中添加内容. 大致流程:拿取整个流程id获取对应表单属性,在页面节点属性中展示对应表 ...