目录
一、文件系统框架
是文件系统的整体架构:
bin: 操作系统所使用的二进制文件。如 ls cd mkdir cp find grep 等
etc: 各种系统的配置文件
lib:系统所使用的库
mnt:挂载路径
dev:设备节点 ,就是和硬件相关的设备节点
正如一句话Linux 下一切皆文件 ,你操作任何东西其实都是在操作文件,硬件同时他也被抽象为了一个文件,他是一个特殊的文件,设备节点文件。
usr:一般是用户的程序
local:一般你默认安装一个库他默认都会按照到此目录下
opt:一般也是留给咱们自己安装第三方软件 。如 QT或者是你自己去安装的交叉编译工具也是安装到此目录的
home:普通用户的家目录
root:管理用户的目录
二、buildroot介绍
如果想要构建完整的根文件系统,大家一般都是使用buildroot,它不仅包含了 busybox 的功能,而且里面还集成了各种软件,需要什么软件就选择什么软件,不需要我们去移植。
嵌入式系统三大部分:bootloader(uboot)、Linux 内核、根文件系统。
制作根文件系统有三大神器:busybox、buildroot、yocto。
使用 busybox 构建文件系统,仅仅只是帮我们构建好了一些常用的命令和文件,像 lib 库、/etc 目录下的一些文件都需要自己手动创建,我们还要自己去移植一些第三方软件和库,比如 alsa、iperf、mplayer 等等。而且 busybox 构建的根文件系统默认没有用户名和密码设置。
如果想要构建完整的根文件系统,大家一般都是使用 buildroot,它不仅包含了 busybox 的功能,而且里面还集成了各种软件,需要什么软件就选择什么软件,不需要我们去移植。buildroot 极大的方便了
我们嵌入式 Linux 开发人员构建实用的根文件系统。
buildroot 的目录架构:写具体用处的请务必记住
.
├── arch: 存放CPU架构相关的配置脚本,如arm/mips/x86,这些CPU相关的配置,在制作工具链时,编译uboot和kernel时很关键.
├── board
├── boot
├── CHANGES
├── Config.in
├── Config.in.legacy
├── configs: 放置开发板的一些配置参数.
├── COPYING
├── DEVELOPERS
├── dl: 存放下载的源代码及应用软件的压缩包.
├── docs: 存放相关的参考文档.
├── fs: 放各种文件系统的源代码.
├── linux: 存放着Linux kernel的自动构建脚本.
├── Makefile
├── Makefile.legacy
├── output: 是编译出来的输出文件夹.
│ ├── build: 存放解压后的各种软件包编译完成后的现场.
│ ├── host: 存放着制作好的编译工具链,如gcc、arm-linux-gcc等工具.
│ ├── images: 存放着编译好的uboot.bin, zImage, rootfs等镜像文件,可烧写到板子里, 让linux系统跑起来.
│ ├── staging
│ └── target: 用来制作rootfs文件系统,里面放着Linux系统基本的目录结构,以及编译好的应用库和bin可执行文件. (buildroot根据用户配置把.ko .so .bin文件安装到对应的目录下去,根据用户的配置安装指定位置)
├── package:下面放着应用软件的配置文件,每个应用软件的配置文件有Config.in和soft_name.mk。
├── README
├── support
├── system
└── toolchain
三、buildroot下载
buildroot 源码肯定是要从 buildroot 官网下载:
官网地址
下载后解压如图:
buildroot 和 uboot、Linux kernel 一样也支持图形化配置,输入如下命令即可打开图形化配置界:make menuconfig
下载安装一些必要的库
1.编译文件系统之前下载一些必要库
sudo apt-get install gitk git-gui u-boot-tools device-tree-compiler gcc-aarch64-linux-gnu mtools parted libudev-dev libusb-1.0-0-dev autoconf autotools-dev libsigsegv2 m4 intltool libdrm-dev curl sed make binutils build-essential gcc g++ bash patch gzip gawk bzip2 perl tar cpio python unzip rsync file bc wget libncurses5 libglib2.0-dev libgtk2.0-dev libglade2-dev cvs git mercurial rsync openssh-client subversion asciidoc w3m dblatex graphviz libc6:i386 libssl-dev expect fakeroot cmake flex bison liblz4-tool libtool keychain expect-dev
三、buildroot的配置
1、进入配置的方法
怎么进入配置界面:
make menuconfig ARCH=arm
这个配置界面 生成的对应的配置文件 .config
推出保存后就会自动生成这个文件
2、配置过程
1、配置 Target options
Target options
Target Architecture (AArch64 (little endian)):
ARM 64 位架构
Target Architecture Variant (cortex-A76/A55 big.LITTLE) —>
A76 + A55 的小核组成
Floating point strategy (Auto) —>
自动匹配硬浮点运算版本
MMU Page Size (4KB) —>
内存保护单元一页的大小
Target Binary Format (ELF) —>
链接二进制的格式 ELF
2、配置 Toolchain
Toolchain
Toolchain type (Buildroot toolchain)
一般我们如果使用外扩的工具链你就直接使用厂商配置好的文件
给低端的芯片做适配用 自带的 buildroot 自己下载的工具链
(xyd) custom toolchain vendor name
标识名字,下载最新的交叉编译器,起一个链接文件名,名字就是 “xyd“
这个无所谓的
C library (glibc) :
默认选择是 C 语言支持 全库
还可以选 uclibc –> 大部分常用库 glibc 包含 uclibc
Kernel Headers (Linux 5.10.x kernel headers)
他会往文件系统里面导入一些内核支持头文件
一般选怎跟你的内核版本差不多近的版本就行了
[] Install glibc utilities
一般会安装这个工具
GCC compiler Version (gcc 10.x)
你要选择用哪个交叉编译器版本
[] Enable C++ support一般至少需要支持 C++语言
3、Build options
(0) Number of jobs to run simultaneously (0 for auto)
他是编译 buildroot 的线程数如果你填 0->自动-> 尽量不要,容易出错
我一般会修改为 12 16 20 24……
[*] Enable compiler cache
一般我会开启编译缓冲区 快一些
gcc optimization level (optimization level 2)
这个编译等级一般我们最建议的等级为 2 等级
libraries (both static and shared)
我一般都要 既要动态库 我还要静态库
4、配置 System configuration
(xyd) System hostname:
主机名
(Welcome to xyd) System banner
进入系统的欢迎语
/dev management (Dynamic using devtmpfs + mdev)
后期驱动的驱动模块管理工具
如果不添加此模块,后驱动加载会有问题
[] Use symlinks to /usr for /bin, /sbin and /lib
产生环境变量的链接
[] Enable root login with password
(1) Root password
开机密码 密码为 1
5、配置 Filesystem images
-> Filesystem images
-> [] ext2/3/4 root filesystem //如果是 EMMC 或 SD 卡的话就用 ext3/ext4
-> ext2/3/4 variant = ext4 //选择 ext4 格式
-> [] ubi image containing an ubifs root filesystem //如果使用 NAND 的话就用 ubifs
6、配置Kernel
buildroot 不仅仅能构建根文件系统,也可以编译 linux 内核和 uboot。当配置 buildroot,使能 linux 内核和 uboot 以后 buildroot 就会自动下载最新的 linux 内核和 uboot 源码并编译。但是我们一般都不会使用 buildroot 下载的 linux 内核和 uboot,因为 buildroot 下载的 linux 和 uboot官方源码,里面会缺少很多驱动文件,而且最新的 linux 内核和 uboot 会对编译器版本号有要求,可能导致编译失败。因此我们需要配置 buildroot,关闭 linux 内核和 uboot 的编译,只使用buildroot 来构建根文件系统,首先是禁止 Linux 内核的编译,配置如下:
-> [ ] Linux Kernel //不要选择编译 Linux Kernel 选项!
7、 接着禁止编译 Uboot,配置Bootloaders
-> [ ] U-Boot //不要选择编译 U-Boot 选项!
8、配置 Target packages
此选项用于配置要选择的第三方库或软件、比如 alsa-utils、ffmpeg、iperf、ftp、ssh等工具,可以按需选择。
配置完成以后就可以编译 buildroot 了,编译完成以后 buildroot 就会生成编译出来的根文件系统压缩包,我们可以直接使用。输入如下命令开始编译:
make //注意,不能通过-jx 来指定多核编译!!!
buildroot 编译过程会很耗时,大概半小时左右。请耐心等待!编译完成以后就会在/output/images 下生成根文件系统,即可使用。