嵌入式Linux内核以及根文件系统制作

Posted _WILLPOWER_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式Linux内核以及根文件系统制作相关的知识,希望对你有一定的参考价值。

内核制作

注意:
我测试的使用nandflsh中bootloader启动,sd卡bootloader启动有问题

制作嵌入式平台使用的Linux内核,方法和制作PC平台的Linux内核基本一致。

  1. 清除原有配置与中间文件
    x86: make distclean
    arm:make distclean

  2. 配置内核
    x86: make menuconfig
    arm:make menuconfig ARCH=arm
    (一般来说有一个参考的配置文件)

  3. 编译内核
    x86: make bzImage
    arm:make uImage ARCH=arm CROSS_COMPILE=arm-linux-
    (注意使用ARCH以及CROSS_COMPILE参数)


通过tftp传到内存中

(注意将uImage.bin移动到tftp服务器指定问文件夹内)
tftp 0xc0008000 uImage.bin



然后启动bootm c0008000


可以看到没有文件系统,内核无法进行挂载

根文件系统制作

  • 建立根文件系统目录与文件
    • 创建目录
    • 创建设备文件
    • 加入配置文件
    • 添加内核模块
    • 编译busybox
  • 挂载文件系统到内核
    • 挂载方式简介
    • initramfs挂载
    • NFS挂载

创建目录

mkdir bin dev etc lib proc sbin sys usr mnt tmp var
mkdir usr/bin usr/lib usr/sbin lib/modules

创建设备文件

cd rootfs/dev
mknod -m 666 console c 5 1
mknod -m 666 null c 1 3
(-m 属性、c表示字符设备、 5 主设备号、 1次设备号)

加入配置文件

tar xvf etc.tar.gz
mv etc/* ./root/etc/ -rf

添加内核模块

cd ../linux(linux是上面我们制作内核的文件)
make modules ARCH=arm CROSS_COMPILE=arm-linux-

make modules_install ARCH=arm INSTALL_MOD_PATH=../rootfs

编译/安装busybox

Busybox:嵌入式开发中的瑞士军刀

配置busybox
make menuconfig

Busybox Settings **>**build Options- >
选中“Build busybox as a static binary”,静态链接Cross Compiler 'prefix (arm-linux-)
Installation Options- >
选中“Don’t use /usr",选中该项可以避免busybox被安装到宿主系统的
/usr目录下,破坏宿主系统
Busybox Installation Prefix (/xxx/rootfs)
该选项表明编译后的busybox的安装位置

之后使用make开始编译

编译完成

安装make install



挂载根文件系统到内核

挂载方式

根据存储设备的硬件特性、系统需求,不同的文件系统类型有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为RAM和FLASH,常用的基于存储设备的文件系统类型包括: jffs2 , yaffs2 , ubifs,ramdisk等

  • 基于NandFlash的文件系统
    • Yaffs2(可读可写)
    • UbiFS(可读可写)
  • 基于NorFlash的文件系统
    • Jffs2(可读可写)
  • 基于内存的文件系统(启动速度快)
    • Ramdisk(固定)
    • Initramfs(动态分配)
  • 基于网络的文件系统
    • NFS(一般开发阶段使用)

使用Initramfs

  1. cd rootfs
    ln -s ./bin/busybox init
  2. 配置Linux内核,支持initramfs


然后到内核文件所在目录输入make menuconfig ARCH=arm


然后选择其下面一项指定位置

最后保存退出,重新编译

make uImage ARCH=arm CROSS_COMPILE=arm-linux-
这个时候编译的内核是有文件系统在其中的


复制到tftp目录中去

然后再U-Boot中设置环境变量
set bootargs noinitrd console=ttySAC0,115200
然后再U-Boot中通过tftp下载
tftp c0008000 uImage.bin


然后启动
bootm c0008000


可以看到系统被成功启动

使用NFS(network file system)

首先取消initramfs,在内核文件目录
make menuconfig ARCH=arm

然后勾选network file system


保存后再次编译


然后将rootfs这个文件夹通过nfs共享出去

然后在bootloader中下载uImage.bin
开发板中
tftp c0008000 uImage.bin

然后要设置启动参数

set env bootargs noinitrd console=ttySAC0,115200 init=/init root=/dev/nfs rw nfsroot=192.168.3.246:/home/wp/Desktop/arm-kernel/rootfs ip=192.168.3.122:192.168.3.246:192.168.3.1:255.255.255.0:willpower:eth0:off

其中:
nfsroot表示共享的rootfs文件夹的位置
ip字段后面依次为开发板IP、nfs服务器IP、网关IP、子网掩码、主机名字、网卡、以及DHCP是否开启

这个时候可能会出现

Linux通过nfs挂载根文件系统失败:VFS: Unable to mount root fs via NFS, trying floppy.

参考此篇文章(有效)

sudo vim /etc/default/nfs-kernel-server
添加
RPCNFSDOPTS="–nfs-version 2,3,4 --debug --syslog"
然后重启服务器
sudo /etc/init.d/nfs-kernel-server restart即可

然后再开发板中启动内核
bootm c0008000
就可以成功看到界面了

这个时候在一边做操作即可同步到另一边非常方便


编译问题

编译内核提示mkimage command not found – U-Boot images will not be built

sudo apt install u-boot-tools

“Makefile:xxx:***混合的隐含和普通规则。停止”

原文链接

以上是关于嵌入式Linux内核以及根文件系统制作的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式Linux开发-busybox根文件系统制作

嵌入式linux与物联网进阶之路三:根文件系统制作

嵌入式Linux开发-根文件系统NFS网络挂载

Linux中文件系统分类,以及基础使用方法

嵌入式Linux开发-根文件系统本地挂载

嵌入式 Linux根文件系统移植——根文件系统简介