【1】概念
根文件系统:系统运行所必须依赖的一些文件
(比如脚本、库、配置文件...),本质就是目录和文件。根文件系统镜像:将根文件系统按照某种格式进行打包压缩后生成的单个文件 rootfs-----> ramdisk.img
文件系统:一种管理和访问磁盘的软件机制,
不同文件系统管理和访问磁盘的机制不同
【2】 移植根文件系统的工具 busybox
1. 短小精悍
2. 版本更新较快,版本之间差异不大
【3】 如何获取busybox
https://busybox.net/downloads/
【4】根文件系统中目录的介绍
注释:个文件功能解析
bin: 命令文件(通过busybox工具制作)
dev: 设备文件(被操作系统识别的设备才有对应的文件,即设备运行时)
etc: 配置文件(配置内核相关的一些信息)
lib: 库文件、比如C的标准库(从交叉编译工具链中复制的)
linuxrc:根文件系统被挂载后运行的第一个程序(通过busybox工具制作)
mnt: 共享目录(非必要)比如挂载SD卡等时将SD卡挂载在该目录
proc: 与进程相关的文件(当有进程运行时才会有文件)
root: 用户权限(板子本身就是以root用户运行)
sbin: 超级用户命令、一般用户不可用(板子本身是超级用户 通过busybox工具制作)
sys: 系统文件(系统运行时,系统加载后才会有文件)
tmp: 临时文件(比如插入新的设备时会产生临时文件)
usr: 用户文件(通过busybox工具制作)
var: 存放下载的文件和软件 (可有可无)
mkdir lib mnt proc root sys tmp var
【5】使用busyBox工具制作根文件系统需要使用gcc-4.9.4版本的交叉编译工具链,需要重新配置交叉编译工具链
步骤:
1. 在ubuntu的家目录(~)下,创建toolchain
mkdir toolchain
2. 拷贝gcc-4.9.4.tar.xz到toolchain目录下
cp 共享目录/gcc-4.9.4.tar.xz ~/toolchain
3. 解压缩交叉编译工具链
tar -vxf gcc-4.9.4.tar.xz
4. 配置环境变量
打开 sudo vi /etc/bash.bashrc
在最后一行添加以下内容:
export PATH=$PATH:/home/hqyj/toolchain/gcc-4.9.4/bin/
修改为自己的路径
注意:需要将gcc-4.9.1的注释掉
5. 使环境变量立即生效
source /etc/bash.bashrc
6. 测试交叉编译工具链是否安装成功
切换完交叉编译工具链,ubuntu的终端需要重新开
arm-none-linux-gnueabi-gcc -v
打印以下内容,表示成功
gcc version 4.9.4 (Sourcery G++ Lite 2010.09-50)
【6】使用busybox工具制作rootfs根文件系统
1. 拷贝busybox-1.31.1.tar.bz2到ubuntu的家目录下
cp /mnt/hgfs/share/busybox-1.31.1.tar.bz2 ~/
2. 对根文件系统进行解压缩,并切换到busybox-1.31.1目录下
tar -vxf busybox-1.31.1.tar.bz2
cd busybox-1.31.1
3. 分析README
没有获取太多重要的信息
4. 通过make help 获取编译的帮助信息
清除中间文件
make clean - delete temporary files created by build
make distclean - delete all non-source files (including .config)
编译
make all - Executable and documentation
通过图形化界面的配置
make menuconfig - interactive curses-based configurator
安装和卸载
make install - install busybox into CONFIG_PREFIX
make uninstall
5. 修改Makefile,配置为交叉编译工具链
打开Makefile
将一下内容:
164 CROSS_COMPILE ?=
190 ARCH ?= $(SUBARCH)
修改为
164 CROSS_COMPILE ?= arm-none-linux-gnueabi-
190 ARCH ?= arm
6. 执行make menuconfig 命令,对busybox进行配置
1》 使用静态库,不使用共享库,共享库的话当移植到板子上面的时候,就不能使用了
Settings --->
[*] Build static binary (no shared libs) (NEW)
2》 配置为vi风格的行编辑命令
Settings --->
[*] vi-style line editing commands (NEW)
3》 配置根文件系统的安装路径
Settings --->
(./_install) Destination path for 'make install'
修改./_install 为 /home/hq/rootfs
进来以后先按一下tab键,然后再去修改就可以
4》配置支持驱动模块化的命令
Linux Module Utilities --->
此前前边默认是*,将*修改为空
[ ] Simplified modutils
[*] depmod (27 kb) (NEW)
[*] insmod (22 kb) (NEW)
[*] lsmod (1.9 kb) (NEW)
[*] Pretty output (NEW)
[*] modinfo (24 kb) (NEW)
[*] modprobe (28 kb) (NEW)
[*] Blacklist support (NEW)
[*] rmmod (3.3 kb) (NEW)
7. 对源码进行编译
make / make all
8. 安装根文件系统到/home/hqyj/rootfs
make install
9. 测试根文件系统,对根文件系统进行部署
1》首先将nfs目录的的rootfs跟换一个其他的名字
cd ~/nfs
mv rootfs rootfs-ok
2》将自己制作的rootfs文件拷贝到~/nfs
cp ~/rootfs ~/nfs -raf
10. 重启开发板,测试rootfs是否可以正常使用
前提,使用tftp下载uImage
使用nfs挂载根文件系统
1》挂载成功,但是打印一下错误信息:
can't run '/etc/init.d/rcS': No such file or directory
can't open /dev/tty2: No such file or directory
can't open /dev/tty3: No such file or directory
can't open /dev/tty4: No such file or directory
解决办法:
Cd ~/nfs/rootfs
创建dev文件夹,创建etc/init.d文件夹,
在etc/init.d目录下创建rcS文件
mkdir -p etc/init.d
mkdir dev
cd etc/init.d
touch rcS
2》继续重启开发板,进行测试
出现以下问题:
can't run '/etc/init.d/rcS': Permission denied
此问题解决办法:修改rcS的权限最大
chmod 777 rcS
在rcS文件中必须添加以下内容:
#!/bin/sh
/bin/mount -a
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
解释:
mount -a:系统会自动解析fstab配置文件,系统根据
此配置文件进行一系列的挂接动作
echo /sbin/mdev > /proc/sys/kernel/hotplug:
向文件/proc/sys/kernel/hotplug写入字符串"/sbin/mdev" 其实就是告诉内核驱动将来创建设备文件的程序是/sbin/mdev
mdev -s:系统启动,将内核驱动对应的设备文件进行自动创建
can't open /dev/tty2: No such file or directory
can't open /dev/tty3: No such file or directory
can't open /dev/tty4: No such file or directory
此问题,后边会解决
再次重启开发板:
3》在根文件系统的etc目录下创建文件fstab inittab
cd etc
touch fstab
touch inittab
打开inittab文件添加以下内容:
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
解释:系统启动的流程
打开fstab文件添加以下内容
#device mount-point type options dump fsck orde
proc /proc proc defaults 0 0
tpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
解析:
第一列:设备类型
第二列:挂载点
第三列:类型
第4,5,6列:访问权限
再次重启开发板,基本上成功,
4》创建其他文件:
mkdir lib mnt proc root sys tmp var
再次重启开发板,根文件系统制作成功。
5》添加用户名
在根文件系统的etc目录下创建profile文件,
打开profile文件,添加以下内容:
export HOSTNAME=hq
export USER=root
export HOME=ot
#export PS1="\[\u@\h \W\]\$ "
#cd root
export PS1="[$USER@$HOSTNAME \W\]\# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH
重启开发板
6》移植共享库到根文件系统中,
在ubuntu中创建test.c 编写以下代码
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("hello world!\n");
return 0;
}
使用交叉编译工具链编译test.c生成test可执行程序
arm-none-linux-gnueabi-gcc test.c -o test 拷贝test可执行程序到新制作的文件系统中
cp test ~/nfs/rootfs
重启开发板,在超级终端终端上,运行应用程序test
./test
出现以下错误提示:
-/bin/sh: ./test: not found
问题原因:缺少应用程序运行必要的动态库。
解决办法:将交叉编译工具链中的库,拷贝到根文件系统的lib目录
cp /home/hq/toolchain/gcc-4.9.4/arm-none-linux-gnueabi/sysroot/lib/* ~/nfs/rootfs/lib
cp /home/hq/toolchain/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot/lib/* ~/nfs/rootfs/lib
到此课程结束:
具体的ramdisk.img根文件系统的制作,可以根据实验手册按照步骤要求去做即可
交叉编译工具链,132M,太大,不往板子里面装交叉编译工具链