移植busybox构建最小根文件系统的步骤详解

Busybox:瑞士军刀,里面装有很多小命令。

STEP 1:构建目录结构

创建根文件系统目录,主要包括以下目录

/dev /etc /lib /usr /var /proc /tmp /home /root /mnt /bin /sbin /sys
#mkdir  /home/rootfs
#cd  /home/rootfs
#mkdir dev etc lib usr var proc tmp home root mnt sys

STEP 2: 使用busybox构建/bin /sbin linuxrc

进入busybox-1.16.1目录,执行

#make defconfig
#make menuconfig
Busybox Setting ----->
 Build Options ----->
  //1选择将busybox进行静态编译
  [*]Build BusyBox as a static binary (no shared libs)
  //2.指定交叉编译器为
  (/usr/local/arm/4.3.2/bin/arm-linux-)Cross Compiler prefix
Installation Options -----> (选择生成的文件存放目录,也可以直接放在rootfs下就不用拷贝了)

  //3.选择上 Don't use /usr
Busybox Library Tuning--->
 [*]Username completion
 [*]Fancy shell prompts
 [*]Query cursor position from terminal
  //4.编译出的busybox的shell命令解释器支持显示当前路径及主机信息

保存退出

#make #make install

在busybox目录下会看见 _install目录,里面有/bin /sbin linuxrc三个文件将这三个目录或文件拷到第一步所建的rootfs文件夹下。

#cp bin/ sbin/ linuxrc /home/rootfs -ra

切记一定要带上-a的参数,因为bin目录里大部分都是链接,如果不带-a的参数,拷过去之后会做相应的复制,不再是链接的形式

STEP 3 构建etc目录:(主要有etc/inittab文件 、etc/init.d/rcs、etc/fstab)

1)进入根文件系统rootfs的etc目录,执行如下操作:

拷贝Busybox-1.16.1/examples/bootfloopy/etc/* 到当前目录下

 #cp –r busybox-1.16.1/examples/bootfloopy/etc/* rootfs/etc

修改inittab,(根据它创建其他子进程)

原始文件为:       

1 ::sysinit:/etc/init.d/rcS         2 ::respawn:-/bin/sh     
3 tty2::askfirst:-/bin/sh         4 ::ctrlaltdel:/bin/umount -a -r

      修改后为:

---(1):开机免登陆,直接打开shell(前面数字为行号)               

1 ::sysinit:/etc/init.d/rcS         
2 #::respawn:-/bin/sh        
 3 #::respawn:-/bin/login         
4 console::askfirst:-/bin/sh        
 5 #tty2::askfirst:-/bin/sh         6 ::ctrlaltdel:/bin/umount -a -r

---(2):开机需要登陆(前面数字为行号)             

 1 ::sysinit:/etc/init.d/rcS         
2 #::respawn:-/bin/sh       
3 ::respawn:-/bin/login         
4 #console::askfirst:-/bin/sh        
5 #tty2::askfirst:-/bin/sh        
6 ::ctrlaltdel:/bin/umount -a -r

2)拷贝虚拟机上的/etc/passwd, /etc/group, /etc/shadow到rootfs/etc下

  # cp /etc/passwd rootfs/etc
  # cp /etc/group rootfs/etc
  # cp /etc/shadow roofs/etc

  对以下三个文件修改,只保存与root相关的项,根据具体情况内容会有所不同。

  修改passwd为root:x:0:0:root:/root:/bin/sh,即只保存与root相关项,而且最后改成/bin/ash。

  修改group为root:x:0:root

  修改shadow为root:$1$x9yv1WlB$abJ2v9jOlOc9xW/y0QwPs.:14034:0:99999:7:::

  登陆开发板时需输入用户名密码,同虚拟机相同

3)修改profile

PATH=/bin:/sbin:/usr/bin:/usr/sbin   //可执行程序 环境变量
  export LD_LIBRARY_PATH=/lib:/usr/lib  //动态链接库 环境变量
  /bin/hostname osee
  USER="`id -un`"
  LOGNAME=$USER
  HOSTNAME='/bin/hostname'
  PS1='[\u@\h \W]# '       //显示主机名、当前路径等信息:

4)修改 etc/init.d/rc.S文件(添加自动执行命令)#!/bin/sh

/bin/mount -n -t ramfs ramfs /var  
  /bin/mount -n -t ramfs ramfs /tmp
  /bin/mount -n -t sysfs none /sys
  /bin/mount -n -t ramfs none /dev
  /bin/mkdir /var/tmp
  /bin/mkdir /var/modules
  /bin/mkdir /var/run
  /bin/mkdir /var/log
  /bin/mkdir -p /dev/pts     //telnet服务需要
  /bin/mkdir -p /dev/shm     //telnet服务需要
  #echo /sbin/mdev > /proc/sys/kernel/hotplug//USB自动挂载需要
  /sbin/mdev -s   //启动mdev在/dev下自动创建设备文件节点
  /bin/mount -a
   #######配置网络################################
   /sbin/ifconfig lo 127.0.0.1 netmask 255.0.0.0
  /sbin/ifconfig eth0 192.168.1.70
  /sbin/ifconfig eth0 netmask 255.255.255.0
  /sbin/route add default gw 192.168.1.1 eth0
  /sbin/ifconfig eth1 192.168.1.71 netmask 255.255.255.0
  /sbin/route add default gw 192.168.1.1 eth1

5)修改etc/fstab文件,增加以下文件 挂载proc tmpfs文件系统

#device  mount-point type options    dump fsck order
  none /dev/pts devpts mode=0622  0 0
  tmpfs /dev/shm tmpfs defaults  0 0
  proc /proc  proc  defaults 0 0

STEP 4 构建lib目录:

(~/at91/x-tools/arm-zch-linux-gnueabi/arm-zch-linux-gnueabi/sysroot/lib我的只是把这个目录下的SO文件复制就可以了)

1)#cd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib

将以下动态库拷贝到rootfs/lib下

#cp *so* roofs/lib -a

2)#cd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib

将以下动态库拷贝到rootfs/lib下

#cp ./libstdc++.so.* rootfs/lib -a

STEP 5 构建lmdev目录:

方法1:静态创建设备文件cat /proc/devices

mknod console c 5 1
mknod null c 1 3
mknod ttySAC0 c 204 64
mknod mtdblock0 b 31 0

方法2:使用mdev创建设备文件

确保内核设置CONFIG_SYSFS CONFIG_TMPFS

在内核启动时,自动运行mdev

修改etc/fstab来自动挂载根文件系统 修改etc/init.d/rcS加入自动运行的命令。

总结

以上所述是小编给大家介绍的移植busybox构建最小根文件系统的步骤详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • android设备不识别awk命令 缺少busybox怎么办

    android设备不识别awk命令,缺少busybox 一.什么是BusyBox ? BusyBox 是标准 Linux 工具的一个单个可执行实现.BusyBox 包含了一些简单的工具,例如 cat 和 echo,还包含了一些更大.更复杂的工具,例如 grep.find.mount 以及 telnet.有些人将 BusyBox 称为 Linux 工具里的瑞士军刀.简单的说BusyBox就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令.(摘自百度百科) 二.下载BusyBox 下载B

  • Linux系统下移植busybox中mkfs.vfat命令

    为了延长磁盘寿命来存储音视频文件,打发在格式化磁盘过程中将簇的大小设置大点.因为存储的音视频文件现对较大,那么将簇大小设置得尽可能大,这样可以增强磁盘读取数据的性能,同时也不会浪费太多空间. 但发现我们设备的mkfs.vfat不支持-s参数设置簇的大小. 于是打算重新移植mkfs.vfat. 思路1 重新移植busybox 1.官网上下载最新的busybox源码 2.修改Makefile ARCH =arm CROSS_COMPILE = /opt/hisi-linux-nptl/arm-his

  • Alpine镜像中telnet转移至busybox-extras

    Alpine镜像中的telnet在3.7版本后被转移至busybox-extras包中,需要使用apk单独安装. 现象 Alpine版本为3.8, 不再有指向busybox的telent ~ # cat /etc/alpine-release 3.8.0 ~ # ~ # ls /usr/bin/ |grep -w busybox |grep telnet ~ # 原因 确认了相关的issue发现,在Alpine3.7时就已经有了这个变化:https://github.com/gliderlabs

  • Docker利用busybox创建基础镜像(base image)

    Docker镜像的首行从FROM alpine之类的镜像开始,但是最初的基础镜像是如何创建的,本文使用一个busybox创建一个基础镜像,相信在此过程中会对docker一些相关的概念有进一步的理解. 什么是基础镜像(base image) 简单来说,基础镜像就是没有From或者FROM scratch开头的Dockerfile所构建出来的镜像.比如alpine,这个很小的linux镜像目前只有4M左右 [root@kong ~]# docker images |grep alpine docke

  • 移植busybox构建最小根文件系统的步骤详解

    Busybox:瑞士军刀,里面装有很多小命令. STEP 1:构建目录结构 创建根文件系统目录,主要包括以下目录 /dev /etc /lib /usr /var /proc /tmp /home /root /mnt /bin /sbin /sys #mkdir /home/rootfs #cd /home/rootfs #mkdir dev etc lib usr var proc tmp home root mnt sys STEP 2: 使用busybox构建/bin /sbin lin

  • Python api构建tensorrt加速模型的步骤详解

    目录 一.创建TensorRT有以下几个步骤: 二.Python api和C++ api在实现网络加速有什么区别? 三.构建TensorRT加速模型 3.1 加载tensorRT 3.2 创建网络 3.3 ONNX构建engine 一.创建TensorRT有以下几个步骤: 1.用TensorRT中network模块定义网络模型 2.调用TensorRT构建器从网络创建优化的运行时引擎 3.采用序列化和反序列化操作以便在运行时快速重建 4.将数据喂入engine中进行推理 二.Python api

  • 30分钟用Node.js构建一个API服务器的步骤详解

    Node.js 对初学者来说可能是令人望而却步的,其灵活的结构和缺乏严格的规范使它看起来很复杂. 本教程是 Node.js,Express 框架和 MongoDB 的快速指南,重点介绍基本的 REST 路由和基本的数据库交互.你将构建一个简单的 API 框架模版,然后可以将其用作任何应用. 本教程适用于:你应该对 REST API 和 CRUD 操作有基本的了解,还有基本的 JavaScript 知识.我用的是 ES6(主要是箭头函数),但并不是很复杂. 在本教程中,我们将为创建一个网络笔记应用

  • 使用Vite+Vue3+Vant全家桶快速构建项目步骤详解

    目录 引言 一.vue3全家桶模板介绍 1.版本依赖 2.全家桶内置集成 二.安装 tive-cli 命令行工具 三.生成项目 四.项目体验 引言 随着Vue3 和 Vite 版本的不断更新完善,开发体验有了质的飞跃.因此,越来越多的大厂也逐步拥抱 Vue3. 利用Vite 脚手架工具可以很轻松生成以 Vue3 为模板的项目,但是作为Vue全家桶的 vue-router.vuex.axios等成员,需要自己一个一个去配置.于是便自行开发了本文讲到的 tive-cli 脚手架模板工具,只需短短几个

  • oracle net manager 数据传输安全步骤详解

    简介 Net Manger可以管理服务命名和监听程序. 所谓监听程序就是一个Oracle服务器上进程,负责监听/响应客户端对Oracle服务的请求.之前我们在安装数据库实例时,同时已经安装了一个监听程序,这点我们知道就行. 本篇重点给大家介绍oracle net manager 数据传输安全,具体操作步骤如下所示: oracle net manager来加密客户端与数据库之间或中间件与 数据库之间的网络传输数据 第一步:开始-->所有程序 -->oracle --> 配置和移植工具 --

  • node创建Vue项目步骤详解

    vue的安装 Vue.js不支持IE8及以下版本.因为Vue.js使用了ECMAScript5特性,IE8显然不能模拟. Vue.js支持所有兼容ECMAScript5的浏览器. 在用Vue.js构建大型应用时,推荐使用npm安装,npm能很好的和webpack等打包工具配合使用. 首先Vue的安装依赖于node.js,要保证你的计算机上已经安装过node.js. 如何查看node是否安装或者node版本呢? 进入cmd,输入命令 node -v,回车查看.node最好使用新一些的版本,否则后续

  • Electron整合React使用搭建开发环境的步骤详解

    简介 用于构建用户界面的 JavaScript 库 步骤 首先创建React npx create-react-app doc 进入到doc项目 cd doc 安装electron npm install electron --save-dev 安装依赖 判断是否为生产环境 cnpm install electron-is-dev --save-dev 在项目根目录创建main.js const { app ,BrowserWindow } = require('electron') const

  • vue实现的多页面项目如何优化打包的步骤详解

    遇到的问题 在多页面框架打包的过程中会,随着业务的增加页面越来越多,使用的三方包也会越来越多,但并不是所有页面都会使用到三方插件,使用webpack打包会让所有的三方包打包到一起,会导致vendor.js(三方包打包后的文件)越来越大,即使没使用过三方插件的页面也会引入,页面加载会越来越慢. 如何优化 使用cdn引入,这种就每次新建一个页面的时候手动通过cdn的方式引入,但是并不是特别好的方式,还需要手动加入. 就是使用splitChunks分割三方包,将三方包单独打包出来,根据页面的依赖情况自

  • Spring Cloud中使用jib进行docker部署的步骤详解

    Jib介绍 Jib 是 Google 开发的可以直接构建 Java 应用的 Docker 和 OCI 镜像的类库,以 Maven 和 Gradle 插件形式提供. 通过 Jib,Java 开发者可以使用他们熟悉的 Java 工具来构建容器.Jib 是一个快速而简单的容器镜像构建工具,它负责处理将应用程序打包到容器镜像中所需的所有步骤.它不需要你编写 Dockerfile 或安装 Docker,而且可以直接集成到 Maven 和 Gradle中 -- 只需要将插件添加到构建中,就可以立即将 Jav

  • SpringBoot整合Swagger2的步骤详解

    简介 swagger是一个流行的API开发框架,这个框架以"开放API声明"(OpenAPI Specification,OAS)为基础, 对整个API的开发周期都提供了相应的解决方案,是一个非常庞大的项目(包括设计.编码和测试,几乎支持所有语言). springfox大致原理: springfox的大致原理就是,在项目启动的过种中,spring上下文在初始化的过程, 框架自动跟据配置加载一些swagger相关的bean到当前的上下文中,并自动扫描系统中可能需要生成api文档那些类,

随机推荐