附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)

目录

  • Buildroot 根文件系统构建
    • 何为buildroot?
      • buildroot 简介
      • buildroot 下载
    • buildroot 构建根文件系统
      • 配置buildroot
      • 编译buildroot
      • buildroot 根文件系统测试
    • buildroot 第三方软件和库的配置
    • buildroot 下的busybox 配置
      • busybox 配置
      • busybox 中文字符的支持
      • 编译busybox
    • 根文件系统测试
  • Yocto 根文件系统构建
  • Ubuntu-base 根文件系统构建
    • ubuntu-base 获取
    • ubuntu 根文件系统构建
      • 解压缩ubuntu base 根文件系统
      • 安装qemu
      • 设置软件源
      • 在主机挂载并配置根文件系统
    • ubuntu 根文件系统测试
      • nfs 挂载测试
      • ubuntu 根文件系统烧写
    • ubuntu 系统使用
      • 添加新用户
      • 网络DHCP 配置
      • 安装软件
      • FTP 服务器搭建
      • gcc 和make 工具安装

前面我们学习了如何使用busybox 来构建根文件系统,但是busybox 构建的根文件系统不齐全,很多东西需要我们自行添加,比如lib 库文件。在我们后面的驱动开发中很多第三方软件也需要我们自己去移植,这些第三方软件有很多又依赖其他的库文件,导致移植过程非常的繁琐。本章我们来学习一下另外一种实用的根文件系统构建方法,那就是使用buildroot 来构建根文件系统。

Buildroot 根文件系统构建

何为buildroot?

buildroot 简介

在《第三篇系统移植篇》我们最后讲解了如何使用busybox 构建文件系统,busybox 仅仅只是帮我们构建好了一些常用的命令和文件,像lib 库、/etc 目录下的一些文件都需要我们自己手动创建,而且busybox 构建的根文件系统默认没有用户名和密码设置。在后续的实验中,我们还要自己去移植一些第三方软件和库,比如alsa、iperf、mplayer 等等。那么有没有一种傻瓜
式的方法或软件,它不仅包含了busybox 的功能,而且里面还集成了各种软件,需要什么软件就选择什么软件,不需要我们去移植。答案肯定是有的,buildroot 就是这样一种工具,buildroot比busybox 更上一层楼,buildroot 不仅集成了busybox,而且还集成了各种常见的第三方库和软件,需要什么就选择什么,就跟我们去吃自助餐一样,想吃什么就拿什么。buildroot 极大的方便了我们嵌入式Linux 开发人员构建实用的根文件系统。

从busybox 开始一步一步的构建根文件系统适合学习、了解根文件系统的组成,但是不适合做产品(主要是自己构建的话会有很多不完善、没有注意到的细节)。buildroot 会帮我们处理好各种细节,根文件系统也会更加的合理、有效。因此在做产品的时候推荐大家使用buildroot 来构建自己的根文件系统,当然了,类似buildroot 的软件还有很多,比如后面要讲的yocto。

buildroot 和uboot、Linux Kernel 很类似,我们需要到其官网上下载源码,然后对其进行配置,比如设置交叉编译器、设置目标CPU 参数等,最主要的就是选择所需要的第三方库或软件。一切配置好以后就可以进行编译,编译完成了以后就会在一个文件夹里面存放好编译结果,也就是根文件系统。

buildroot 下载

buildroot 源码肯定是要从buildroot 官网下载,官网地址为https://buildroot.org/,打开以后的官网界面如图A1.1.2.1 所示:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第1张图片
点击图A1.1.2.1 中的“DOWNLOAD”按钮即可打开buildroot 的下载界面,如图A1.1.2.2所示:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第2张图片
可以看出,在写本教程的时候最新的LTS(长期支持版)版buildroot 为2019.02.6,分为.gz和.bz2 两种压缩格式,这里我就使用右侧的.bz2 压缩格式的源码,选中以后下载即可。我们已经将其放到了开发板光盘中,路径为:1、例程源码-》8、buildroot 源码-》buildroot-2019.02.6.tar.bz2,
一切准备好以后就可以使用buildroot 构建根文件系统了。

buildroot 构建根文件系统

配置buildroot

将buildroot 源码buildroot-2019.02.6.tar.bz2 拷贝到ubuntu 中,也就是我们前面创建的tool目录下。拷贝完成以后对其进行解压,命令如下:

tar -vxjf buildroot-2019.02.6.tar.bz2

解压完成以后就会得到一个名为“buildroot-2019.02.6”的目录,此目录就是我们解压得到的buildroot 源码,进入到此目录中,此目录下的文件如图A1.2.1.1 所示:
在这里插入图片描述
buildroot 和uboot、Linux kernel 一样也支持图形化配置,输入如下命令即可打开图形化配置界:

make menuconfig

打开以后的图形化配置界面如图A1.2.1.2 所示:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第3张图片
接下来我们就依次配置buildroot,配置完成以后就可以进行编译了。
1、配置Target options
首先配置Target options 选项,需要配置的项目和其对应的内容如下(“=”号后面是配置项要选择的内容!):

Target options
	-> Target Architecture 			= ARM (little endian)
	-> Target Binary Format 		= ELF
	-> Target Architecture Variant 	= cortex-A7
	-> Target ABI 					= EABIhf
	-> Floating point strategy 		= NEON/VFPv4
	-> ARM instruction set 			= ARM

配置完成以后如图A1.2.1.3 所示:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第4张图片

2、配置Toolchain
此配置项用于配置交叉编译工具链,也就是交叉编译器,这里设置为我们自己所使用的交叉编译器即可。buildroot 其实是可以自动下载交叉编译器的,但是都是从国外服务器下载的,鉴于国内的网络环境,强烈推荐大家设置成自己所使用的交叉编译器。需要配置的项目和其对应的内容如下:

Toolchain
	-> Toolchain type = External toolchain
	-> Toolchain = Custom toolchain //用户自己的交叉编译器
	-> Toolchain origin = Pre-installed toolchain //预装的编译器
	-> Toolchain path =/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf
	-> Toolchain prefix = $(ARCH)-linux-gnueabihf //前缀
	-> External toolchain gcc version = 4.9.x
	-> External toolchain kernel headers series = 4.1.x
	-> External toolchain C library = glibc/eglibc
	-> [*] Toolchain has SSP support? (NEW) //选中
	-> [*] Toolchain has RPC support? (NEW) //选中
	-> [*] Toolchain has C++ support? //选中
	-> [*] Enable MMU support (NEW) //选中

Toolchain 下几个比较重要的选项需要说明一下,如下所示:
Toolchain:设置为Custom toolchain,表示使用用户自己的交叉编译器。
Toolchain origin:设置为Pre-installed toolchain,表示使用预装的交叉编译器。
Toolchain path:设置自己安装的交叉编译器绝对路径!buildroot 要用到。
Toolchain prefix:设置交叉编译器前缀,要根据自己实际所使用的交叉编译器来设置,比如我们使用的是arm-linux-gnueabihf-gcc,因此前缀就是$(ARCH)-linux-gnueabihf,其中ARCH我们前面已经设置为了arm。

3、配置System configuration
此选项用于设置一些系统配置,比如开发板名字、欢迎语、用户名、密码等。需要配置的项目和其对应的内容如下:

System configuration
	-> System hostname 	= alpha_imx6ull //平台名字,自行设置
	-> System banner 	= Welcome to alpha i.mx6ull //欢迎语
	-> Init system 		= BusyBox //使用busybox
	-> /dev management 	= Dynamic using devtmpfs + mdev //使用mdev
	-> [*] Enable root login with password (NEW) //使能登录密码
	-> Root password 	= 123456 //登录密码为123456

在System configuration 选项中可以配置平台名字,登录密码等信息。

4、配置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

对于I.MX6U 来说此选项不用配置,因为我们是通过Mfgtool 工具将根文件系统烧写到开发板上的EMMC/SD 卡中,烧写的时候需要自己对根文件系统进行打包。

5、禁止编译Linux 内核和uboot
buildroot 不仅仅能构建根文件系统,也可以编译linux 内核和uboot。当配置buildroot,使能linux 内核和uboot 以后buildroot 就会自动下载最新的linux 内核和uboot 源码并编译。但是我们一般都不会使用buildroot 下载的linux 内核和uboot,因为buildroot 下载的linux 和uboot官方源码,里面会缺少很多驱动文件,而且最新的linux 内核和uboot 会对编译器版本号有要求,可能导致编译失败。因此我们需要配置buildroot,关闭linux 内核和uboot 的编译,只使用buildroot 来构建根文件系统,首先是禁止Linux 内核的编译,配置如下:

-> Kernel
	-> [ ] Linux Kernel //不要选择编译Linux Kernel 选项!

如图A1.2.1.4 所示:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第5张图片
接着禁止编译Uboot,配置如下:

-> Bootloaders
	-> [ ] U-Boot //不要选择编译U-Boot 选项!

如图A1.2.1.5 所示:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第6张图片
6、配置Target packages

此选项用于配置要选择的第三方库或软件、比如alsa-utils、ffmpeg、iperf 等工具,但是现在我们先不选择第三方库,防止编译不下去!先编译一下最基本的根文件系统,如果没有问题的话再重新配置选择第三方库和软件。否则一口吃太多会容易撑着的,编译出问题的时候都不知道怎么找问题。

编译buildroot

配置完成以后就可以编译buildroot 了,编译完成以后buildroot 就会生成编译出来的根文件系统压缩包,我们可以直接使用。输入如下命令开始编译:

sudo make //注意,一定要加sudo,而且不能通过-jx 来指定多核编译!!!

buildroot 编译的时候会先从网上下载所需的软件源码,有些软件源码可能下载不下来,这个时候就需要我们自行处理,这个后面会详细的讲解。
buildroot 编译过程会很耗时,可能需要几个小时,请耐心等待!
buildroot 因为要从网上下载源码,因此可能存在有些源码无法下载或下载很慢的情况,比如如图A1.2.2.1 所示:
在这里插入图片描述
可以看出图A1.2.2.1 中正在下载cmake-3.8.2.tar.gz 这个压缩包,大小是7.2MB,当前下载网速是1.6KB/S ,需要用时71 分钟,显然这是无法忍受的!我们可以自行到https://cmake.org/files/v3.8/cmake-3.8.2.tar.gz 这个网站上去将cmake-3.8.2.tar.gz 这个源码下载下来,然后拷贝到Ubuntu 中buildroot 源码目录下的dl 文件夹中,dl 文件夹专用用于存放下载下
来的源码。

等待编译完成,编译完成以后就会在buildroot-2019.02.6/output/images 下生成根文件系统,如图A1.2.2.2 所示:
在这里插入图片描述

从图A1.2.2.2 可以看出,编译出来了多种格式的rootfs,比如ext2、ext4、ubi 等。其中rootfs.tar 就是打包好的根文件系统,我们就使用rootfs.tar 进行测试。在nfs 目录下新建一个名为buildrootfs 的文件夹,然后将图A1.2.2.2 中的rootfs.tar 拷贝到buildrootfs 目录下并解压,命令如下:

cd /home/zuozhongkai/linux/nfs //进入到nfs 目录下
mkdir buildrootfs //创建buildrootfs 目录
cd buildrootfs //进入到buildrootfs 目录
cp ../../IMX6ULL/tool/buildroot-2019.02.6/output/images/rootfs.tar ./ //拷贝到rootfs.tar
tar
tar -vxf rootfs.tar //解压缩rootfs.tar
rm rootfs.tar //删除rootfs.tar

解压缩完成以后的buildrootfs 目录如图A1.2.2.3 所示:
在这里插入图片描述
图A1.2.2.3 就是使用buildroot 编译出来的根文件系统,我们可以通过nfs 挂载到开发板上,然后对其进行测试。

buildroot 根文件系统测试

buildroot 制作出来的根文件系统已经准备好了,接下来就是对其进行测试。测试方法也是通过nfs 挂载的方式,启动uboot,修改bootargs 环境变量,设置nfsroot 目录为Ubuntu 中的buildrootfs 目录,命令如下:

setenv bootargs 'console=tty1 console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.253:
/home/zuozhongkai/linux/nfs/buildrootfs rw ip=192.168.1.251:192.168.1.253:192.168.1.1:255.255.
255.0::eth0:off'

设置好以后启动系统,进入根文件系统以后如图A2.2.3.1 所示:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第7张图片
在图A2.2.3.1 中,首先要进入到/lib/modules 目录,但是默认没有,因此需要我们自行创建此目录。buildroot 构建的根文件系统启动以后会输出我们前面设置的欢迎语“Welcome to alpha i.mx6ull”。然后需要输入用户名和密码,用户名是“root”,密码就是我们前面配置buildroot 的时候设置的“123456”。输入用户名和密码以后就可以进入系统中,如图A2.2.3.2 所示:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第8张图片
可以看出的buildroot 构建的根文件系统运行基本没有问题,但是这个根文件系统是最简单的,我们并没有在buildroot 里面配置任何第三方的库和软件,接下来我们就配置buildroot,使能一些常见的第三方软件。

buildroot 第三方软件和库的配置

我在前面学习的时候需要自行移植一些第三方的库和软件,比如alsa-lib、alsa-utils 等等,现在我们不需要自行移植这些第三方软件和库了,可以直接在buildroot 里面配置使能。比如我们现在配置使能alsa-lib、alsa-utils 这两个软件和库。

1、使能alsa-lib
输入make menuconfig,打开buildroot 配置界面,配置路径如下:

Target packages
	-> Libraries
		-> Audio/Sound
			-> -*- alsa-lib ---> 此配置项下的文件全部选中

如图A1.3.1 所示:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第9张图片
2、使能alsa-utils
接下来使能alsa-utils,路径如下:

Target packages
	-> Audio and video applications
		-> alsa-utils 此目录下的软件全部选中

配置好以后如图A1.3.2 所示:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第10张图片
等待编译完成就可以使用新的根文件系统进行测试了,将buildroot/images/rootfs.tar 拷贝到nfs 目录下的buildroot 目录中,然后重新解压。注意,以前自己添加的文件并不会被删除掉的,解压命令如下:

tar -vxf rootfs.tar

解压完成以后就可以使用alsa-utils 相关的软件了,比如alsamixer,想想我们曾经在第六十五章中自行移植alsa-utils 的时候,那个过程叫一个复杂。通过buildroot 的话直接一个配置就可以搞定全部,方便快捷,大家可以自行尝试去配置使能一些其他的第三方库和软件。

buildroot 下的busybox 配置

busybox 配置

buildroot 在构建根文件系统的时候也是要用到busybox 的,既然用到了busybox 那么就涉及到busybox 的配置。buildroot 会自动下载busybox 压缩包,buildroot 下载的源码压缩包都存放在/dl 目录下,在dl 目录下就有一个叫做“busybox”的文件夹,此目录下保存着busybox 压缩包,如图A1.4.1.1 所示:
在这里插入图片描述
可以看出,buildroot 下载的busybox 版本为1.29.3。要想编译busybox,必须对图A1.4.1.1中的压缩包进行解压缩,buildroot 将所有解压缩后的软件保存在/output/build 软件中,我们可以在找到/output/build/busybox-1.29.3 这个文件夹,此文件夹就是解压后的busybox 源码,文件内容如图A1.4.1.2 所示:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第11张图片
如果大家想要修改busybox 源码的话就直接在图A1.4.1.2 中找到相应的文件,然后修改即可。我们现在是要配置buildroot 下的busybox,因此肯定要打开busybox 的配置界面,在buildroot下打开busybox 的配置界面输入如下命令:

sudo make busybox-menuconfig

输入以后就会打开buildroot 下的busybox 配置界面,如图A1.4.1.3 所示:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第12张图片
图A1.4.1.3 就是我们最熟悉的busybox 配置界面了,大家想要配置什么就直接操作就行了,或者参考第三十八章即可。

busybox 中文字符的支持

在第三十八章我们数过了,busybox 对中文字符显示做了限制,因此必须要修改相关的文件,具体修改过程参考38.2.2 小节即可,这里就不再赘述了。

编译busybox

配置好以后就可以重新编译buildroot 下的busybox,进入到buildroot 源码目录下,输入如下命令查看当前buildroot 所有配置了的目标软件包,也就是packages:

sudo make show-targets

结果如图A1.4.3.1 所示:
在这里插入图片描述
图A1.4.3.1 中列出了当前buildroot 中所有使能了的packages 包,其中就包括busybox,如
果我们想单独编译并安装busybox 的话执行下面命令即可:

sudo make busybox

上述命令就会重新编译busybox。编译完成以后重新编译buildroot,主要是对其进行打包,输入如下命令:

sudo make

重新编译完成以后查看一下output/images 目录下rootfs.tar 的创建时间是否为刚刚编译的,如果不是的话就删除掉rootfs.tar,然后重新执行“sudo make”重新编译一下即可。最后我们使用新的rootfs.tar 启动Linux 系统。

根文件系统测试

buildroot 的根文件系统制作好以后就是测试工作了,测试内容和第三十八章中一样,这里就不赘述了。这里我们重点说一下另外一个问题,我们使用构建的根文件系统启动以后会发现,输入命令的时候命令行前面一直都是“#”,如果我们进入到某个目录的话前面并不会显示当前目录路径,如图A1.5.1 所示:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第13张图片
从图A1.5.1 可以看出,我们当前所处的目录是/etc,但是前面的提示符一直是“#”,这样不利于我们查看自己当前所处的路径。最好能像Ubuntu 一样,可以指出当前登录的用户名,主机名以及所处的目录,如图A1.5.2 所示:
在这里插入图片描述

我们现在就来设置,实现图A1.5.2 中所示的效果。我们要先了解一下“PS1”这个环境变量,PS1 用于设置命令提示符格式,格式如下:

PS1 = ‘命令列表’

命令列表中可选的参数如下:

\! 显示该命令的历史记录编号。
\# 显示当前命令的命令编号。
\$ 显示$符作为提示符,如果用户是root 的话,则显示#号。
\\ 显示反斜杠。
\d 显示当前日期。
\h 显示主机名。
\n 打印新行。
\nnn 显示nnn 的八进制值。
\s 显示当前运行的shell 的名字。
\t 显示当前时间。
\u 显示当前用户的用户名。
\W 显示当前工作目录的名字。
\w 显示当前工作目录的路径

我们打开/etc/profile 文件,找到如下所示内容,然后将其屏蔽掉:

			示例代码A1.5.1 /etc/profile 文件要屏蔽的内容
3 if [ "$PS1" ]; then
4 	if [ "`id -u`" -eq 0 ]; then
5 		export PS1='# '
6 	else
7 		export PS1='$ '
8 	fi
9 fi

上述代码就是原始的设置PS1 环境变量的配置代码,就是它将命令提示符设置为了固定的“#”,我们将其屏蔽掉,然后输入如下所示内容:

						/etc/profile 添加的内容
PS1='[\u@\h]:\w$:'
export PS1

第2 行就是设置PS1 环境变量,格式就是:

[user@hostname]:currentpath$:

设置好以后的/etc/profile 文件内容如图A1.5.3 所示:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第14张图片
/etc/profile 文件修改完成以后重启开发板,这个时候我们就如到某个目录的时候命令行就会有提示,如图A1.5.4 所示:
在这里插入图片描述
从图A1.5.4 可以看出,命令提示符显示正常了,完整的显示除了用户名、主机名和当前路径。至此,buildroot 构建根文件系统就已经全部完成了,当然了,很多第三方软件本章并没有使能,大家可以自行根据实际需求选择对应的第三方软件和库。

Yocto 根文件系统构建

本章有独立的教程,请参考《【正点原子】I.MX6U Yocto 构建根文件系统V1.0.pdf》!

Ubuntu-base 根文件系统构建

大家肯定会有疑问,能不能在ALPHA 开发板上运行Ubuntu 呢?答案肯定是可以的,Ubuntu
是Linux 系统的一种,可以简单的将Ubuntu 理解为一个根文件系统,和我们用busybox、buildroot
制作的根文件系统一样。因此移植Ubuntu 也就是将Ubuntu 根文件系统移植到我们的开发板上,
但是因为I.MX6ULL 孱弱的性能,本章我们就只移植Ubuntu 的最小根文件系统,没有图形化
界面。

ubuntu-base 获取

本章参考网上相关帖子与内容。
Ubuntu 的移植非常简单,不需要我们编译任何东西,因为Ubuntu 官方已经将根文件系统
制作好了!我们只需要简单配置一下Ubuntu 官方提供的base 根文件系统,使其在我们的开发
板上跑起来即可。因此我们首先需要下载Ubuntu-base,为了和我们的教程一致,本章我们移植
Ubuntu 16.04 版本根文件系统,有兴趣的可以移植其他版本的Ubuntu 内核,比如18.04。首先
肯定是到Ubuntu 官方去下载16.04 的根文件系统,根文件系统下载地址为
http://cdimage.ubuntu.com/,下载界面如图A3.1.1 所示:
图A3.1.1 ubuntu 镜像下载网站
点击图A3.1.1 中的ubuntu-base,进入到ubuntu-base 下载界面,如图A3.1.2 所示:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第15张图片
图A3.1.1 ubuntu 镜像下载网站
点击图A3.1.1 中的ubuntu-base,进入到ubuntu-base 下载界面,如图A3.1.2 所示:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第16张图片
图A3.1.2 ubuntu-base 下载界面
点击图A3.1.2 中的“releases”,下载releases 版本的根文件系统,进去以后如图A3.1.3 所
示:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第17张图片

图A3.1.3 各个版本的ubuntu base 下载
从图A3.1.3 可以看出,Ubuntu 提供了从12.04 开始,一直到最新的19.10 版本的ubuntu base 供大家下载。我们选择16.04.5,点击以后进入如图A3.1.4 所示界面:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第18张图片

图A3.1.4 16.04.5 下载界面
点击图A3.1.4 中的“release”,进入16.04.5 的下载界面,如图A3.1.5 所示:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第19张图片
图A3.1.5 ubuntu base 下载界面
从图A3.1.5 可以看出,Ubuntu 针对不同的CPU 架构提供相应的ubuntu base 根文件系统,
有amd64(64 位X86)、armhf、i386(32 位X86)、powerpc、ppc64el 等系统的。I.MX6ULL 是Cortex-A 内核的CPU,并且有硬件浮点运算单元,因此选择armhf 版本。在图A3.1.5 中找到“ubuntu-base-16.04.5-base-armhf.tar.gz”,也就是16.04.5 版本的ubuntu base 根文件系统,将其下载下来。
这个我们已经放到了开发板光盘中,路径为:开发板光盘->8、系统镜像->2、教程系统镜像->3、
文件系统->1、Ubuntu base 根文件系统->ubuntu-base-16.04.5-base-armhf.tar.gz。

ubuntu 根文件系统构建

解压缩ubuntu base 根文件系统

为了存放ubuntu base 根文件系统,先在PC 的Ubuntu 系统中的nfs 目录下创建一个名为
ubuntu_rootfs 的目录,命令如下:

cd /home/zuozhongkai/linux/nfs //进入到nfs 目录下
mkdir ubuntu_rootfs //创建名为“ubuntu_rootfs”目录

将上一小节下载得到的“ubuntu-base-16.04.5-base-armhf.tar.gz ”拷贝到上面创建的
“ubuntu_rootfs”目录中,然后使用如下命令对其解压缩:

sudo tar -vzxf ubuntu-base-16.04.5-base-armhf.tar.gz

解压完成以后如图A3.2.1.1 所示:
在这里插入图片描述

图A3.2.1.1 解压缩以后的ubuntu base 根文件系统
从图A3.2.1.1 可以看出,ubuntu base 解压以后就是大家最常见的linux 根文件系统,但是
目前还不能直接使用,还需要对其做一些其他的配置。

安装qemu

需要在PC 的Ubuntu 上安装qemu 工具,命令如下:

sudo apt-get install qemu-user-static

将刚刚安装的qemu-user-static 拷贝到刚刚解压出来的ubuntu base 目录中,也就是
ubuntu_rootfs/usr/bin 目录下,命令如下:

cd /home/zuozhongkai/linux/nfs/ubuntu_rootfs //进入到ubuntu_rootfs 目录下
sudo cp /usr/bin/qemu-arm-static ./usr/bin/ //拷贝qemu-arm-static

设置软件源

我们在ubuntu 下使用apt-get 安装软件的时候,是从网上下载软件并安装的,因此需要指
定软件源。在设置软件源之前先将Ubuntu 主机下的DNS 配置文件/etc/resolv.conf 拷贝到根文件
系统中,命令如下:

cd /home/zuozhongkai/linux/nfs/ubuntu_rootfs //进入到ubuntu_rootfs 目录下
sudo cp /etc/resolv.conf ./etc/resolv.conf //拷贝resolv.conf

设置软件源,打开根文件系统中的ubuntu_rootfs/etc/apt/sources.list 文件,在此文件最后面
添加软件源,比如国内常用的清华源、中科大源等等,这些软件源可以直接在网上查找。注意
这里要用ubuntu16.04 的ARM 源,不能找成了X86 的源。根据网上的推荐,我们使用如下所示
的中科大软件源(这里非常感谢一位网名为“兔子”的网友提醒并测试):

示例代码A3.2.3.1 中科大Ubuntu arm 软件源
#中科大源
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-backports main multiverse restricted universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-proposed main multiverse restricted universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-security main multiverse restricted universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-updates main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-backports main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-proposed main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-security main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-updates main multiverse restricted universe

大家将示例代码A3.2.3.1 中的源添加到sources.list 文件中即可。

在主机挂载并配置根文件系统

1、在主机挂载根文件系统
接下来将上面制作的根文件系统挂载到主机上,需要挂载proc、sys、dev、dev/pts 等文件
系统,最后使用chroot 将主机的根文件系统切换到我们前面制作的根文件系统中。这里我们通
过两个脚本文件来完成挂载和卸载操作,首先是挂载脚本mount.sh,在ubuntu_rootfs 目录下创
建一个名为mount.sh 的shell 脚本,然后在里面输入如下所示内容:

示例代码A3.2.4.1 mount.sh 脚本文件内容
1 #!/bin/bash
2 echo "MOUNTING"
3 sudo mount -t proc /proc /home/zuozhongkai/linux/nfs/ubuntu_rootfs/proc
4 sudo mount -t sysfs /sys /home/zuozhongkai/linux/nfs/ubuntu_rootfs/sys
5 sudo mount -o bind /dev /home/zuozhongkai/linux/nfs/ubuntu_rootfs/dev
6 sudo mount -o bind /dev/pts /home/zuozhongkai/linux/nfs/ubuntu_rootfs/dev/pts
7 sudo chroot /home/zuozhongkai/linux/nfs/ubuntu_rootfs

再编写一个卸载的脚本文件,新建名为unmount.sh 的shell 脚本,在里面输入如下所示内
容:

示例代码A3.2.4.2 unmount.sh 脚本文件内容
1 #!/bin/bash
2 echo "UNMOUNTING"
3 sudo umount /home/zuozhongkai/linux/nfs/ubuntu_rootfs/proc
4 sudo umount /home/zuozhongkai/linux/nfs/ubuntu_rootfs/sys
5 sudo umount /home/zuozhongkai/linux/nfs/ubuntu_rootfs/dev/pts
6 sudo umount /home/zuozhongkai/linux/nfs/ubuntu_rootfs/dev

最后给予mount.sh 和unmount.sh 这两个shell 脚本可执行权限,命令如下:

sudo chmod 777 mount.sh unmount.sh

一切准备就绪以后执行mount.sh 脚本,将制作的根文件系统挂载到主机下,输入如下命
令:

./mount.sh

挂载成功以后如图A3.2.4.1 所示:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第20张图片

图A3.2.4.1 切换根文件系统
从图A3.2.4.1 可以看出,当前终端已经将根文件系统切换到了我们上面制作的ubuntu_rootfs
根文件系统中。
2、安装常用的命令和软件
由于ubuntu base 是一个最小根文件系统,很多命令和软件都没有,因此我们需要先安装一
下常用的命令和软件,输入如下命令(注意!是在电脑的Ubuntu 下输入这些命令,因为现在电
脑的Ubuntu 正挂载着我们移植的Ubuntu-base 根文件系统):

apt update
apt install sudo
apt install vim
apt install kmod
apt install net-tools
apt install ethtool
apt install ifupdown
apt install language-pack-en-base
apt install rsyslog
apt install htop
apt install iputils-ping

我们就先安装这些命令和软件,保证ubuntu base 根文件系统能够在开发板上正常启动即
可,等启动以后再根据实际情况继续安装其他的命令和软件。
3、设置root 用户密码
设置一下root 用户的密码,这里我设置简单一点,root 用户密码也设置为“root”,相当于
用户名和密码一样,命令如下:

passwd root //设置root 用户密码

输入“passwd root”以后会让你输入root 用户密码,输入两次,如图A3.2.4.2 所示:
在这里插入图片描述

图A3.2.4.2 设置root 用户密码
有兴趣的话也可以新建其他的用户并设置密码。
4、设置本机名称和IP 地址
输入如下命令设置本机名称和IP 地址:

echo "alientek_imx6ul" > /etc/hostname
echo "127.0.0.1 localhost" >> /etc/hosts
echo "127.0.0.1 alientek_imx6ul" >> /etc/hosts

5、设置串口终端
ubuntu 根文件系统在开发板上启动以后我们通常也希望串口终端正常工作,这里根据网友
的介绍需要创建一个链接。首先确定自己所使用的串口设备文件,比如正点原子的ALPHA 开
发板使用的UART1 对应的串口设备文件为ttymxc0 ,我们需要添加一个名为
[email protected] 的链接,链接到[email protected] 服务上,输入如下命令:

ln -s /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@ttymxc0.
service

设置好以后就可以退出根文件系统了,输入如下命令退出:

exit

退出以后再执行一下unmount.sh 脚本取消挂载,命令如下:

./unmount.sh

至此,ubuntu base 根文件系统就已经制作好了,接下来就是挂载到开发板上去测试。

ubuntu 根文件系统测试

nfs 挂载测试

根文件系统已经制作完成了,接下来就是测试,先用nfs 挂载根文件系统,在uboot 里面设
置bootargs 环境变量的值如下:

setenv bootargs ‘console=tty1 console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.253:/
home/zuozhongkai/linux/nfs/ubuntu_rootfs rw ip=192.168.1.251:192.168.1.253:192.168.1.1:255.255.
255.0::eth0:off’
saveenv //保存环境变量

注意红色字体,设置根文件系统为我们前面制作的ubuntu_rootfs。设置完成以后重启开发
板,这个时候就会进入到ubuntu 根文件系统中,如图A3.3.1.1 所示:
在这里插入图片描述

图A3.3.1.1 进入ubuntu 根文件系统
从图A3.3.1.1 可以看出,16.04.5 版本的ubuntu 根文件系统启动成功,并且要求我们输入
用户名和密码,用户名和密码都是root。用户名和密码输入成功以后就会进入到系统,如图
A3.3.1.2 所示:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第21张图片

图A3.3.1.2 进入ubuntu 根文件系统
从图A3.3.1.2 可以看出,ubuntu 根文件系统工作正常,这个时候就可以在ALPHA 开发板
上玩Ubuntu 系统了。

ubuntu 根文件系统烧写

通过nfs 挂载根文件系统测试成功,接下来就可以使用MfgTool 将ubuntu 根文件系统烧写
到开发板上的EMMC 或者NAND 中,烧写方法我们已经在《第三十九章系统烧写》章节做了
详细的讲解。
1、打包ubuntu 根文件系统
首先打包ubuntu 根文件系统,命令如下:

cd ubuntu_rootfs //进入到ubuntu 根文件系统
tar -vcjf ubuntu_rootfs.tar.bz2 * //打包根文件系统

打包完成以后就可以使用MfgTool 工具将ubuntu 根文件系统烧写到开发板的EMMC 或
NAND 中。
2、烧写ubuntu 根文件系统
在《第三十九章系统烧写》章节我们已经详细的讲解了MfgTool 工具的原理,并且教了大
家如何改造自己的MfgTool 工具。最简单的方法就是将刚刚打包好的名为“ubuntu_rootfs.tar.bz2”
重命名为“rootfs-alientek-emmc.tar.bz2”或“rootfs-alientek-nand.tar.bz2”,然后通过“mfgtool2-alientek-alpha-emmc.vbs”或“mfgtool2-alientek-alpha-nand.vbs”来完成向EMMC 或NAND 中烧
写系统。
也可以添加ubuntu 系统烧写脚本,完成MfgTool 工具的定制化。系统烧写完成以后就可以
从EMMC 或NAND 启动系统进行测试。

ubuntu 系统使用

添加新用户

1、添加新用户
我们制作的ubuntu 根文件系统默认只有一个root 用户,默认都是用root 用户登录的,和我
们在PC 上使用Ubuntu 系统一样,默认使用root 用户的话可能会因为操作失误导致系统被破
坏。因此最好创建一个普通用户,默认使用普通用户,当需要root 权限的时候就使用“sudo”
命令即可。使用adduser 命令添加普通用户:

adduser zuozhongkai //添加普通用户

添加新用户的时候需要设置新用户密码,根据自己的实际情况设置即可,用户添加过程如
图A3.3.2.1 所示:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第22张图片

图A3.3.2.1 新用户添加
新用户添加完成以后就可以重启开发板,然后使用新用户登录。
2、设置新用户可以使用sudo 命令
默认情况下新用户是不能使用sudo 命令的,即使你输入了密码也不能使用sudo,会提示“
zuozhongkai is not in the sudoers file. This incident will be reported.”错误,如图A3.3.2.2 所示:
在这里插入图片描述

图A3.3.2.2 错误提示
我们需要修改/etc/sudoers 文件,首先使用如下命令切换回root 用户:

su //切换回root 用户

/etc/sudoers 文件默认是只读的,因此需要先修改此文件的写权限,使用如下命令:

chmod u+w /etc/sudoers

然后使用vi 打开/etc/sudoers,找到“root ALL=(ALL:ALL) ALL”这一行,在这一行下面添
加:

zuozhongkai ALL=(ALL:ALL) ALL

表示“zuozhongkai”这个用户可以执行sudo 命令,但是要输入密码,设置完成以后如图
A3.3.2.3 所示:
在这里插入图片描述
图A3.3.2.3 /etc/sudoers 文件
修改完成以后保存退出,重新恢复/etc/sudoers 的只读属性,使用如下命令:

chmod u-w /etc/sudoers

设置完成以后重启切换到“zuozhongkai”用户,这个时候sudo 命令就运行正常了,可以使
用fdsik 命令测试一下,fdisk 需要root 权限。输入如下命令:

sudo fdisk -l

如果sudo 运行正常的话就会打印出当前开发板的所有存储信息。

网络DHCP 配置

我们默认没有配置DHCP,因为ubuntu 启动以后不能直接联网,需要手动启动网卡并设置
IP 地址。这里我们配置一下网络DHCP,这样系统启动以后就会自动设置好网络。正点原子的
ALPHA 开发板有两个网卡,在linux 系统下的网卡名字为eth0 和eth1,我们以eth0 为例,讲
解一下如何配置其DHCP,输入如下命令:

su //切换到root 用户
echo auto eth0 > /etc/network/interfaces.d/eth0
echo iface eth0 inet dhcp >> /etc/network/interfaces.d/eth0
/etc/init.d/networking restart

设置好以后重启开发板,eth0 网卡就会默认打开,可以直接上网。eth1 网卡同理,支持将
上述命令中的eth0 换为eth1 即可。

安装软件

至此,ubuntu 根文件系统已经完全在开发板上运行起来了,如果要安装什么软件的话直接
使用apt 工具即可,和我们在PC 下使用ubuntu 一样。比如我们安装mplayer,那么就可以直接
输入:

sudo apt-get install mplayer //安装mplayer

等待安装完成,完成以后就可以使用mplayer 了,非常的方便。

FTP 服务器搭建

我们可以在开发板上搭建一个FTP 服务器,这样就可以通过FileZilla 这样的FTP 客户端软
件和开发板之间进行文件传输。搭建方法和PC 下的Ubuntu 一模一样,参考4.1 小节即可,主
要是在开发板上安装vsftpd,然后进行简单的设置即可。
开发板上的vsftpd 部署好以后就可以使用FileZilla 来访问了,站点设置如图A3.4.4.1 所示:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第23张图片
图A3.4.4.1 站点设置
站点设置好以后就可以进行连接了,默认进入到“zuozhongkai”用户目录下,如图A3.4.4.2
所示:附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第24张图片

图A3.4.4.2 FTP 访问开发板
大家可以尝试向开发板里面上传一个文件,或者从开发板里面读取一个文件到windows 下。
笔者测试从windows 向开发板发送一个文件,平均速度在11~12MB/S 左右,如图A3.4.4.3 所
示:
在这里插入图片描述
图A3.4.4.3 FTP 传输速度

gcc 和make 工具安装

我们可以直接用I.MX6ULL 来编译代码,只需要安装gcc 和make 工具,这两个工具的安
装很简单,输入如下命令即可:

sudo apt-get install gcc //安装gcc 编译器
sudo apt-get install make //安装make 工具

安装完成以后输入“gcc -v”查看gcc 是否安装成功,如果安装成功的话就会打印出gcc 版
本号,如图A3.4.5.1 所示:
附录A 其他根文件系统构建(Buildroot\Yocto\Ubuntu-base 方式)_第25张图片

图A3.4.5.1 gcc 版本号
从图A3.4.5.1 可以看出,当前安装的gcc 版本号为5.4.0。再输入“make -v”查看make 工
具的版本号,如果make 工具安装成功的话就会输出make 工具版本号,如图A3.4.5.2 所示:
在这里插入图片描述

图A3.4.5.2 make 版本号
当gcc 和make 工具都安装成功以后就可以编写一个小程序编译测试一下,比如新建一个
main.c 文件,然后在main.c 里面输入如下内容:

示例代码A3.2.5.1 main.c 文件内容
1 #include <stdio.h>
2
3 int main(void)
4 {
5 printf("hello world!\r\n");
6 return 0;
7 }

完成以后直接使用I.MX6ULL 编译,输入如下命令:

gcc main.c -o main

编译完成以后就会生成一个名为“main”的可执行文件,使用“file”命令查看此文件信
息,结果如图A3.4.5.3 所示:
在这里插入图片描述

图A3.4.5.3 main 文件属性
从图A3.4.5.3 可以看出,main 可执行文件是一个32 位的ARM 可执行文件,因为我们安装
的gcc 工具就是armhf 的。执行main 文件,输出“hello world!”字符串,如图A3.4.5.4 所示:
在这里插入图片描述

图A3.4.5.4 main 软件运行结果
注意:
由于I.MX6ULL 性能比较差,只能编译一些简单的而是代码,稍微复杂一点的代码编译就
会很慢!因此不建议在I.MX6ULL 上编译程序!
至此,关于如何在正点原子的ALPHA 开发板上搭建ubuntu 系统就讲解到这里了,由于
I.MX6ULL 性能所限,并没有跑图形化界面,大家可以根据实际需求,完成自己的定制化ubuntu
系统。

你可能感兴趣的:(正点IMX6ULL系统移植,linux,驱动开发,运维)