嵌入式Linux内核以及根文件系统制作
Posted _WILLPOWER_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式Linux内核以及根文件系统制作相关的知识,希望对你有一定的参考价值。
内核制作
注意:
我测试的使用nandflsh中bootloader启动,sd卡bootloader启动有问题
制作嵌入式平台使用的Linux内核,方法和制作PC平台的Linux内核基本一致。
-
清除原有配置与中间文件
x86: make distclean
arm:make distclean -
配置内核
x86: make menuconfig
arm:make menuconfig ARCH=arm
(一般来说有一个参考的配置文件) -
编译内核
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
cd rootfs
ln -s ./bin/busybox init
- 配置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内核以及根文件系统制作的主要内容,如果未能解决你的问题,请参考以下文章