linux系统移植篇(四)—— 根文件系统使用介绍

linux系列目录:
linux基础篇(一)——GCC和Makefile编译过程
linux基础篇(二)——静态和动态链接
ARM裸机篇(一)——i.MX6ULL介绍
ARM裸机篇(二)——i.MX6ULL启动过程
ARM裸机篇(三)——i.MX6ULL第一个裸机程序
ARM裸机篇(四)——重定位和地址无关码
ARM裸机篇(五)——异常和中断
linux系统移植篇(一)—— linux系统组成
linux系统移植篇(二)—— Uboot使用介绍
linux系统移植篇(三)—— Linux 内核使用介绍
linux系统移植篇(四)—— 根文件系统使用介绍
linux驱动开发篇(一)—— Linux 内核模块介绍
linux驱动开发篇(二)—— 字符设备驱动框架
linux驱动开发篇(三)—— 总线设备驱动模型
linux驱动开发篇(四)—— platform平台设备驱动

文章目录

  • 一、根文件系统的介绍
  • 二、常见的根文件系统
  • 三、BusyBox 构建根文件系统
    • 1、BusyBox 简介
    • 2、获取BusyBox
    • 3、编译 BusyBox 构建根文件系统
    • 4、安装busybox


一、根文件系统的介绍

根文件系统首先是内核启动时所 mount(挂载)的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。

在构建根文件系统之前,我们先来看一下根文件系统里面大概都有些什么内容,以 Ubuntu为例,根文件系统的目录名字为‘/’,所以输入如下命令就可以进入根目录中:
在这里插入图片描述

  • /bin 目录
    此目录下存放着系统需要的可执行文件,一般都是一些命令,比如 ls、 mv 等命令。
  • /dev 目录
    dev 是 device 的缩写,所以此目录下的文件都是和设备有关的,此目录下的文件都是设备文件。
  • /etc 目录
    此目录下存放着各种配置文件。
  • /lib 目录
    lib 是 library 的简称,也就是库的意思,因此此目录下存放着 Linux 所必须的库文件。这些库文件是共享库,命令和用户编写的应用程序要使用这些库文件。
  • /mnt 目录
    临时挂载目录,一般是空目录,可以在此目录下创建空的子目录,比如/mnt/sd、 /mnt/usb,这样就可以将 SD 卡或者 U 盘挂载到/mnt/sd 或者/mnt/usb 目录中。
  • /proc 目录
    此目录一般是空的,当 Linux 系统启动以后会将此目录作为 proc 文件系统的挂载点, proc是个虚拟文件系统,没有实际的存储设备。 proc 里面的文件都是临时存在的,一般用来存储系统运行信息文件。
  • /usr 目录
    usr 不是 user 的缩写,而是 Unix Software Resource 的缩写,也就是 Unix 操作系统
    软件资源目录。
  • /var 目录
    此目录存放一些可以改变的数据
  • /sbin 目录
    此目录页用户存放一些可执行文件,但是此目录下的文件或者说命令只有管理员才能使用,主要用户系统管理。
  • /sys 目录
    系统启动以后此目录作为 sysfs 文件系统的挂载点, sysfs 是一个类似于 proc 文件系统的特殊文件系统, sysfs 也是基于 ram 的文件系统,也就是说它也没有实际的存储设备。
  • /opt
    可选的文件、软件存放区,由用户选择将哪些文件或软件放到此目录中。

二、常见的根文件系统

根文件系统本质都是一些文件和配置信息组成,之间的界限没有很明确的界定,以下大致列出一些根文件系统的特点:
linux系统移植篇(四)—— 根文件系统使用介绍_第1张图片

三、BusyBox 构建根文件系统

1、BusyBox 简介

BusyBox 是一个集成了三百多个最常用 Linux 命令和工具的软件。 BusyBox 包含了一些简单的工具,例如 ls、 cat 和 echo 等等,还包含了一些更大、更复杂的工具,例 grep、 find、 mount 以及 telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说 BusyBox 就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Linux 系统的自带的 shell。

2、获取BusyBox

BusyBox 可以在其官网下载到,官网地址为: https://busybox.net
linux系统移植篇(四)—— 根文件系统使用介绍_第2张图片
下载当前最新版本 busybox-1.35.0.tar.bz2 也可以使用我们提供的文件。

3、编译 BusyBox 构建根文件系统

将 busybox-1.29.0.tar.bz2 发送到 Ubuntu 中,存放位置大家随便选择。然后使用如下命令将其解压:

tar -vxjf busybox-1.35.0.tar.bz2

解压后目录如下:
linux系统移植篇(四)—— 根文件系统使用介绍_第3张图片
配置 busybox:

make menuconfig
  1. 选择使用arm-linux-gnueabihf-编译工程
  2. 选中静态编译,便于调用的文件不会因为库文件的更改和报错
    linux系统移植篇(四)—— 根文件系统使用介绍_第4张图片

编译 busybox:

make

4、安装busybox

一般在 Linux 驱动开发的时候通过 nfs 挂载根文件系统会更加方便,首先在nfs 服务器目录中新建一个安装目录 rootfs 用于安装busybox,然后使用 CONFIG_PREFIX 环境变量指定该目录进行安装:

make install CONFIG_PREFIX=/home/kk/imx6ull/nfs/rootfs

安装完成以后,busybox的所有工具和文件就会被安装到目录rootfs中:
在这里插入图片描述
rootfs 目录下有 bin、 sbin 和 usr 这三个目录,以及 linuxrc 这个文件。Linux内核init进程最后会查找用户空间的init程序,找到以后就会运行这个用户空间的init程序,从而切换到用户态,而linuxrc就是可以作为用户空间的init程序。如果 bootargs 设置 init=/linuxrc,那么 linuxrc 就是可以作为用户空间的 init 程序,所以用户态空间的 init 程序是 busybox 来生成的。
busybox 的工作就完成了,但是此时的根文件系统还不能使用,还需要一些其他的文件。

在rootfs目录下新建以下目录:

mkdir dev etc lib var proc tmp home root mnt sys

新建以下文件

cd ./dev
sudo mknod console c 5 1
sudo mknod null c 1 3

在inittab中添加以下内容

cd ../etc
vim inittab
console::askfirst:-/bin/sh

保存后,在uboot中根据自己开发板的IP,设置网络:

setenv ipaddr 192.168.1.5
setenv ethaddr 32:34:46:78:9A:DC
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
setenv serverip 192.168.1.7
saveenv

设置bootargs ,从nfs启动根文件系统:

setenv args_mmc_old 'setenv  bootargs console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.7:/home/kk/imx6ull/nfs/rootfs,v3 rw ip=192.168.1.5:192.168.1.7:192.168.1.1:255.255.255.0::eth0:off'
saveenv

重启开发板等开发板启动成功后我们进入了我们编译好的 busybox 根文件系统我们看看根文件系统整体大小为 du -sh
linux系统移植篇(四)—— 根文件系统使用介绍_第5张图片

可以看到使用Busybox编译的文件系统仅占 1.5M,虽然占用空间是小了,但是功能也非常少,若要编译其他程序的话需要手工下载、编译,如果它需要某些依赖库,你还需要手工下载、编译这些依赖库。如果想做一个极简的文件系统,可以使用Busybox手工制作。

至此,Linux“三巨头”Uboot、kernel、以及根文件系统已经全部介绍完了, U-Boot、 Linux kernel 和 rootfs 这三者一起构成了一个完整的 Linux 系统。看完前边的文章,应该大体了解linux系统的组成部分,以及每个部分所扮演的角色。本系列文章重在快速入门linux系统组成结构,更加详细的内容,将以专题的形式展现。

前边内容以快速了解为主,没有太多的代码讲解,后边将学习linux系统的驱动开发,会开始以大量的代码形式讲解。

你可能感兴趣的:(linux,linux,arm开发,运维,根文件系统)