----------------------------------------------------------------------------------------------------------------------------
开发板 :NanoPC-T4开发板eMMC :16GBLPDDR3 :4GB显示屏 :15.6英寸HDMI接口显示屏u-boot :uboot 2023.04linux :6.3----------------------------------------------------------------------------------------------------------------------------
在上一篇文章中,我们介绍了通过busybox构建根文件系统,但是我们在使用的过程中有个致命的问题,就是缺少各种命令以及各种开发环境,比如python,jdk、mysql啊。比如我们需要使用python开发环境,那么我们就得自己去下载python源码编译,然后移植到开发板中。那我们就开始想,我们是不是像centos、ubuntu这些文件系统一样,直接通过apt、yum命令搞定这些安装呢?
幸运的是,我们搜索网上资料发现,ubuntu针对不同的CPU架构提供相应的ubuntu base根文件系统,目前提供的架构有amd64、arm64、armhf、i386、s390x、ppc64。因此我们可以直接构建基于ubuntu base的根文件系统。
一、ubuntu base
ubuntu base是用于为特定需求创建自定义映像的最小rootfs,是ubuntu可以运行的最小环境。
1.1 下载源码
下载ubuntu-base的方式有很多,我们可以从官方的地址:ttp://cdimage.ubuntu.com/ubuntu-base/releases。
也可以其它镜像地址下载,如清华源:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cdimage/ubuntu-base/releases/。
根据需要,下载自己对应的发行版本,这里我们就已20.04为例;
进入到对应的版本目录后,根据我们的CPU类型,选择对应的文件下载,这里,我们使用的是RK3399,64位的CPU,我们选择arm64的版本;
在宿主机ubuntu命令行运行如下命令,开始下载文件:
root@zhengyang:/work/sambashare/rk3399# wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cdimage/ubuntu-base/releases/20.04/release/ubuntu-base-20.04.4-base-arm64.tar.gz
root@zhengyang:/work/sambashare/rk3399# ll ubuntu-base-20.04.4-base-arm64.tar.gz
-rw-r--r-- 1 root root 26228459 Feb 22 2022 ubuntu-base-20.04.4-base-arm64.tar.gz
下载完成后,在宿主机上选择建立一个rootfs/ubuntu目录,将下载的文件ubuntu-base-20.04.4-base-arm64.tar.gz解压到该目录下;
root@zhengyang:/work/sambashare/rk3399# mkdir -p rootfs/ubuntu
root@zhengyang:/work/sambashare/rk3399# sudo tar -xpvf ubuntu-base-20.04.4-base-arm64.tar.gz -C rootfs/ubuntu/
root@zhengyang:/work/sambashare/rk3399# cd rootfs/ubuntu/
root@zhengyang:/work/sambashare/rk3399/rootfs/ubuntu# ls
bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
需要注意的是:解压后的文件,需要保留ubuntu-base中的文件权限及所有者,解压时需要root权限或者sudo操作,且使用-p参数保留权限;
1.2 配置
1.2.1 安装qemu
qemu-user-static是一个仿真器,可以选取arm64配置文件仿真开发板运行环境,然后挂载下载的ubuntu-base文件,从而构建ubuntu文件系统。
root@zhengyang:/work/sambashare/rk3399/rootfs/ubuntu# sudo apt-get install qemu-user-static
由于下载的ubuntu-base是aarch64架构的,因此需要拷贝qemu-aarch64-static到ubuntu/usr/bin/下;
root@zhengyang:/work/sambashare/rk3399/rootfs/ubuntu# sudo cp /usr/bin/qemu-aarch64-static ./usr/bin/
1.2.2 设置软件源
什么是源?其实吧它就像苹果和案桌的软件应用商店一样,为Linux用户提供软件下载及更新服务的。Linux家族有三个软件源系统:
- yum源,使用这种软件管理器的主要是:redhat,centos;
- apt源,使用这种软件管理器的主要是:ubuntu;
- pacman源,使用这种软件管理器的主要是:archlinux还有新近崛起的manjaro;
uzbuntu是外国人开发的系统,默认使用的也是国外的源,但是从国内FQ下载国外的软件(插件)源太慢。其实国内也有很多的镜像源,比如说阿里源,网易源,清华源,中科大源(推荐,不限速),兰州大源等。
需要注意的是,这里要用ARM源,不能复制我们本机的源。
root@zhengyang:/work/sambashare/rk3399/rootfs/ubuntu# sudo vim ./etc/apt/sources.list
这里我们选择华为国内下载源,这里需要把原内容删除,全部替换为:
deb http://mirrors.huaweicloud.com/ubuntu-ports/ focal main multiverse restricted universe
deb http://mirrors.huaweicloud.com/ubuntu-ports/ focal-backports main multiverse restricted universe
deb http://mirrors.huaweicloud.com/ubuntu-ports/ focal-proposed main multiverse restricted universe
deb http://mirrors.huaweicloud.com/ubuntu-ports/ focal-security main multiverse restricted universe
deb http://mirrors.huaweicloud.com/ubuntu-ports/ focal-updates main multiverse restricted universe
deb-src http://mirrors.huaweicloud.com/ubuntu-ports/ focal main multiverse restricted universe
deb-src http://mirrors.huaweicloud.com/ubuntu-ports/ focal-backports main multiverse restricted universe
deb-src http://mirrors.huaweicloud.com/ubuntu-ports/ focal-proposed main multiverse restricted universe
deb-src http://mirrors.huaweicloud.com/ubuntu-ports/ focal-security main multiverse restricted universe
deb-src http://mirrors.huaweicloud.com/ubuntu-ports/ focal-updates main multiverse restricted universe
如要用于其他版本,把focal换成其他版本代号即可: 22.04:jammy;20.04:focal;18.04:bionic;16.04:xenial;14.04:trusty。
需要下载失败,尝试更换下载源。
其他源,比如清华源:
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-proposed main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-proposed main restricted universe multiverse
163源:
deb http://mirrors.163.com/ubuntu-ports/ focal main restricted universe multiverse
deb http://mirrors.163.com/ubuntu-ports/ focal-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu-ports/ focal-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu-ports/ focal-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu-ports/ focal-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu-ports/ focal main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu-ports/ focal-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu-ports/ focal-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu-ports/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu-ports/ focal-backports main restricted universe multiverse
1.2.3 配置DNS
为了可以联网更新软件,我们拷贝本机的dns配置文件到根文件系统;
root@zhengyang:/work/sambashare/rk3399/rootfs/ubuntu# sudo cp /etc/resolv.conf ./etc/resolv.conf
然后在/etc/resolv.conf文件中添加dns:
root@zhengyang:/work/sambashare/rk3399/rootfs/ubuntu# sudo vim ./etc/resolv.conf
添加内容如下:
nameserver 8.8.8.8
nameserver 114.114.114.114
1.3 挂载/卸载ubuntu-base文件系统
在rootfs目录下创建挂载脚本mnt_ubuntu.sh:
#!/bin/bash
mnt() {
echo "MOUNTING"
sudo mount -t proc /proc ${
2}proc
sudo mount -t sysfs /sys ${
2}sys
sudo mount -o bind /dev ${
2}dev
sudo mount -o bind /dev/pts ${
2}dev/pts
sudo chroot ${
2}
}
umnt() {
echo "UNMOUNTING"
sudo umount ${
2}proc
sudo umount ${
2}sys
sudo umount ${
2}dev/pts
sudo umount ${
2}dev
}
if [ "$1" == "-m" ] && [ -n "$2" ] ;
then
mnt $1 $2
elif [ "$1" == "-u" ] && [ -n "$2" ];
then
umnt $1 $2
else
echo ""
echo "Either 1'st, 2'nd or both parameters were missing"
echo ""
echo "1'st parameter can be one of these: -m(mount) OR -u(umount)"
echo "2'nd parameter is the full path of rootfs directory(with trailing '/')"
echo ""
echo "For example: ch-mount -m /media/sdcard/"
echo ""
echo 1st parameter : ${
1}
echo 2nd parameter : ${
2}
fi
增加脚本执行权限:
root@zhengyang:/work/sambashare/rk3399/rootfs# sudo chmod +x mnt_ubuntu.sh
1.3.1 挂载文件系统
执行如下命令将会挂载ubunru-base文件系统;
root@zhengyang:/work/sambashare/rk3399/rootfs# ./mnt_ubuntu.sh -m ubuntu/
执行该命令实际上就是执行:
sudo mount -t proc /proc ubuntu/proc
sudo mount -t sysfs /sys ubuntu/sys
sudo mount -o bind /dev ubuntu/dev
sudo mount -o bind /dev/pts ubuntu/dev/pts
sudo chroot ubuntu/
(1) proc文件系统是指一类虚拟文件系统,它不是从磁盘上的分区中读取数据,而是通过内核在内存中动态生成的。proc文件系统通常用于提供有关系统内核和进程信息的接口,例如系统内存使用情况、硬件设备信息等。在Linux系统中挂载proc文件系统的命令格式如下:
mount -t proc [选项] /proc [挂载点]
其中,-t proc 参数表示将要挂载的文件系统类型是proc 文件系统;/proc 表示要挂载的proc文件系统的挂载点;ubuntu/proc 表示挂载点在当前目录下的一个名为 ubuntu 的子目录中的proc子目录。通过这个命令,可以将proc文件系统挂载到指定的挂载点,以便访问其中包含的有关系统内核和进程信息的接口。
(2) mount -y sysfs命令和mount -t proc同理;
(3) mount -o bind命令将前一个目录挂载到后一个目录上,所有对后一个目录的访问其实都是对前一个目录的访问;
(4) chroot ubuntu/命令把根目录换成指定的目的目录,此时根目录就变成了ubunru-base所在目录的;用ll可以看到文件系统也有变化,此终端里的根文件系统已经切换到ubuntu目录里的根文件系统,就像进入了一个新系统,所以这也叫作是模拟运行根文件系统;
我们可以在在命令行安装软件,更改系统配置;
root@zhengyang:/# ll
total 56
drwxr-xr-x 17 root root 4096 May 29 15:18 ./
drwxr-xr-x 17 root root 4096 May 29 15:18 ../
lrwxrwxrwx 1 root root 7 Feb 21 2022 bin -> usr/bin/
drwxr-xr-x 2 root root 4096 Apr 15 2020 boot/
drwxr-xr-x 18 root root 4300 May 30 10:54 dev/
drwxr-xr-x 30 root root 4096 May 29 15:30 etc/
drwxr-xr-x 2 root root 4096 Apr 15 2020 home/
lrwxrwxrwx 1 root root 7 Feb 21 2022 lib -> usr/lib/
drwxr-xr-x 2 root root 4096 Feb 21 2022 media/
drwxr-xr-x 2 root root 4096 Feb 21 2022 mnt/
drwxr-xr-x 2 root root 4096 Feb 21 2022 opt/
dr-xr-xr-x 366 root root 0 May 30 11:19 proc/
drwx------ 2 root root 4096 May 29 15:38 root/
drwxr-xr-x 4 root root 4096 Feb 21 2022 run/
lrwxrwxrwx 1 root root 8 Feb 21 2022 sbin -> usr/sbin/
drwxr-xr-x 2 root root 4096 Feb 21 2022 srv/
dr-xr-xr-x 13 root root 0 May 30 10:54 sys/
drwxrwxrwt 2 root root 4096 Feb 21 2022 tmp/
drwxr-xr-x 10 root root 4096 Feb 21 2022 usr/
drwxr-xr-x 11 root root 4096 Feb 21 2022 var/
文件系统配置完成,输入 exit ,然后运行脚本卸载文件系统;
1.3.2 卸载文件系统
执行如下命令卸载文件系统:
root@zhengyang:/work/sambashare/rk3399/rootfs# ./mnt_ubuntu.sh -u ubuntu/
实际上就是把之前挂载的全部卸载掉。
1.4 安装软件以及桌面环境等
1.4.1 安装必要软件
默认下,ubuntu-base基本没安装什么工具,如果要正常使用,我们可以根据需要安装,以下基本的几个建议都进行安装;
root@zhengyang:/# apt-get update #更新一下软件包的数据库
root@zhengyang:/# apt-get install net-tools
root@zhengyang:/# apt-get install ethtool
root@zhengyang:/# apt-get install ifupdown
root@zhengyang:/# apt-get install psmisc
root@zhengyang:/# apt-get install nfs-common
root@zhengyang:/# apt-get install htop
root@zhengyang:/# apt-get install vim
root@zhengyang:/# apt-get install rsyslog
root@zhengyang:/# apt-get install iputils-ping
root@zhengyang:/# apt-get install language-pack-en-base
root@zhengyang:/# apt-get install sudo
root@zhengyang:/# apt-get install network-manager systemd
root@zhengyang:/# apt install iputils-ping
root@zhengyang:/# apt install openssh-sftp-server
如果出现如下问题:
root@zhengyang:/# apt-get install net-tools
E: dpkg was interrupted, you must manually run 'sudo dpkg --configure -a' to correct the problem.
root@zhengyang:/# sudo dpkg --configure -a
1.4.2 安装桌面环境
ubuntu官方考虑到使用者的不同需求,提供各种不同的发行板。虽然发布了几种版本的ubuntu系统,但是他们的核心系统是一模一样的,可以这么说不同发行版的ubuntu的区别在于:桌面环境的不同和预设安装的软件的不同;
(1) ubuntu:ubuntu是主要的发行版,它使用GNOME这个桌面环境,相依的虚拟套件是ubuntu-desktop;
(2) kubuntu:采用以功能强大闻名的KDE当成桌面环境,功能众多以及华丽桌面配置为其卖点,相依的虚拟套件是kubuntu-desktop;
(3) xubuntu:采用了比较轻量级的桌面环境Xfce,所以这个版本的诉求是针对比较老旧的电脑。Xfce的设计理念是减少使用的系统资源,并且成为一套完整可用的桌面环境。功能来说,虽没有像ubuntu与kubuntu功能众多,但也具备基本文书、上网与影音等功能。相依的虚拟套件是xubuntu-desktop;
(4) lubuntu:采用了比Xfce更轻量的桌面环境Lxde,是自从10.04之后才新增的版本。这个版本的诉求是针对小笔电、效能较差的电脑或追求快速的使用者。虽然精简,但仍然符合大多数使用者对于桌面的要求。同样具备文书处理、上网和影音,更特别的是,它已经内建了几乎所有播放需要使用到的解码器,可直接播放mp3及rmvb等格式的档案,相依的虛擬套件是lubuntu-desktop;
(5) edubuntu:是ubuntu的教育分支版。它主要的诉求是教育使用,所以里面有很多精心挑选的教育相关套件,和一些小游戏等。而为了可以让教师们快速安装到电脑教室或安装到老旧的电脑里,它还使用了LTSP技术,可以让老师们在短短的一个小时内建立整个电脑教师环境。使用GNOME桌面环境相依的虚拟套件是edubuntu-desktop;使用KDE桌面环境相依的虚拟套件是edubuntu-desktop-kde;
LTSP (Linux Terminal Server Project)的发展目的是提供多个工作站只负责显示,实际软体和计算在伺服器上面,也叫做thin-clients机制。它的好处是工作站可以使用很老旧的电脑,因为工作站只用来当XTerminal,所以一切资源都放在伺服器上。这个方式可以让维修成本和管理成本减少很多,所以特别适合公司和学校使用;
这我们选择一个虚拟套件安装,这里我最初的虚拟套件是ubuntu-desktop;
root@zhengyang:/# apt-get install ubuntu-desktop
需要注意:安装之后桌面环境在开发板运行起来后,CPU占用率相对较高,这下图是我当时使用火狐浏览器打开视频的CPU占用情况,在RK3399上性能不咋样,因此如果不是必要尽量不要安装桌面环境环境,可以考虑采用安装x11vnc远程桌面的解决方案。
后面我又尝试安装了xubuntu,安装过程中有几点需要注意:
- 语言布局我选的Chinese - Hanyu Pinyin (altgr);
- 显示管理器(它们提供图形登录并处理用户身份验证)我选择的是lightdm;可以通过cat /etc/X11/default-display-manager命令查看安装的哪一个;
后面介绍的流程都是针对ubuntu的,当然对xubuntu、lubuntu等基本都是适用的(如果有差异,请自行更正)。
1.4.3 安装ubuntu-restricted-extras
ubuntu-restricted-extras是一个包含各种基本软件,如Flash插件、unrar、gstreamer、mp4、ubuntu中的chromium浏览器的编解码器等的软件包。
由于这些软件不是开源软件,并且其中一些涉及软件专利,因此ubuntu默认情况下不会安装它们。你必须使用multiverse仓库,它是ubuntu 专门为用户提供非开源软件而创建的仓库。
由于ubuntu-restrcited-extras软件包在multiverse仓库中,因此你应验证系统上已启用 multiverse仓库:
root@zhengyang:/# sudo add-apt-repository multiverse
然后你可以使用以下命令安装:
root@zhengyang:/# sudo apt install ubuntu-restricted-extras
安装完成后,由于新安装的媒体编解码器,你应该可以播放MP3和其他媒体格式了。
在kubuntu、lubuntu 和 xubuntu 都有此软件包,并有各自不同的名称。它们本应使用相同的名字,但不幸的是并不是。
在 kubuntu 上,使用以下命令:
sudo apt install kubuntu-restricted-extras
在 lubuntu 上,使用:
sudo apt install lubuntu-restricted-extras
在 xubuntu 上,你应该使用:
sudo apt install xubuntu-restricted-extras
在kubuntu、lubuntu 下安装我没有测试,但是在xubuntu下安装发现找不到安装包,可以考虑安装ubuntu-restricted-extras试试。
注意:如果有看视频的诉求,这个一定要安装,不然是无法观看视频的,浏览器也是无法打开视频。
1.5 系统设置
1.5.1 修改root用户密码
为了方便, 这里我直接将密码设置为123456;
root@zhengyang:/# passwd root
New password:
Retype new password:
passwd: password updated successfully
1.5.2 新增用户
新增用户,这个根据具体的情况,嵌入式的环境下,我们可以不用新增,直接使用root的用户就行了,如果要新增,执行如下的步骤:
root@zhengyang:/# adduser zhengyang
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_TIME = "en_DK.UTF-8",
LANG = "zh_CN.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
Adding user `zhengyang' ...
Adding new group `zhengyang' (1000) ...
Adding new user `zhengyang' (1000) with group `zhengyang' ...
Creating home directory `/home/zhengyang' ...