目录
0.前言
作为一个刚刚接触Linux的小白,我手中恰好有一块Firefly RK3399开发板。之前,我成功移植uboot-2023.07、linux-5.2.8以及根文件系统,现在移植ubuntu 20.04.4根文件系统。
移植ubuntu 20.04.4根文件系统,我主要参考了 @大奥特曼打小怪兽博主所撰写的精彩帖子。对于RK3399芯片的相关原理,我也会在这些博主的文章中深入学习。他们的文章不仅内容丰富,而且具有很高的参考价值。
在此,我主要是想记录下自己的学习过程,以便日后回顾,同时也希望这些记录能对其他学习者提供一定的参考和帮助。
1. 下载源码
ubuntu base
是用于为特定需求创建自定义映像的最小rootfs
,是ubuntu
可以运行的最小环境。
下载ubuntu-base
的方式有很多,可以从官方的地址:ttp://cdimage.ubuntu.com/ubuntu-base/releases
也可以其它镜像地址下载,如清华源:Index of /ubuntu-cdimage/ubuntu-base/releases/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
进入到对应的版本目录后,根据CPU
类型,选择对应的文件下载,RK3399是
64
位的CPU
,选择arm64
的版本:
在宿主机ubuntu
下载文件并解压:
wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cdimage/ubuntu-base/releases/20.04/release/ubuntu-base-20.04.4-base-arm64.tar.gz
mkdir -p rootfs/ubuntu
sudo tar -xpvf ubuntu-base-20.04.4-base-arm64.tar.gz -C rootfs/ubuntu/
cd rootfs/ubuntu/
解压后的文件,需要保留ubuntu-base
中的文件权限及所有者,解压时需要root
权限或者sudo
操作,且使用-p
参数保留权限;
2.配置
2.1安装qemu
qemu-user-static
是一个仿真器,可以选取arm64
配置文件仿真开发板运行环境,然后挂载下载的ubuntu-base
文件,从而构建ubuntu
文件系统:
sudo apt-get install qemu-user-static
由于下载的ubuntu-base
是aarch64
架构的,因此需要拷贝qemu-aarch64-static
到ubuntu/usr/bin/
下:
sudo cp /usr/bin/qemu-aarch64-static ./usr/bin/
2.2设置软件源
Linux
家族有三个软件源系统:
yum
源,使用这种软件管理器的主要是:redhat
,centos
;apt
源,使用这种软件管理器的主要是:ubuntu
;pacman
源,使用这种软件管理器的主要是:archlinux
还有新近崛起的manjaro
;
ubuntu
是外国人开发的系统,默认使用的也是国外的源,但是从国内FQ下载国外的软件(插件)源太慢。其实国内也有很多的镜像源,比如说阿里源,网易源,清华源,中科大源(推荐,不限速),兰州大源等。
需要注意的是,这里要用ARM
源,不能复制我们本机的源。
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
2.3 配置DNS
为了可以联网更新软件,我们拷贝本机的dns
配置文件到根文件系统;
sudo cp /etc/resolv.conf ./etc/resolv.conf
然后在/etc/resolv.conf
文件中添加dns
:
sudo vim ./etc/resolv.conf
添加内容如下:
nameserver 8.8.8.8
nameserver 114.114.114.114
修改/etc/systemd/resolved.conf
:
[Resolve]
DNS=8.8.8.8 114.114.114.114
2.4挂载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
增加脚本执行权限:
sudo chmod +x mnt_ubuntu.sh
./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
目录里的根文件系统,就像进入了一个新系统,所以这也叫作是模拟运行根文件系统;
2.5安装软件以及桌面环境
挂载后可以在在命令行安装软件,更改系统配置:
默认下,ubuntu-base
基本没安装什么工具,如果要正常使用,我们可以根据需要安装,以下基本的几个建议都进行安装:
apt-get update #更新一下软件包的数据库
apt-get install net-tools
apt-get install ethtool
apt-get install ifupdown
apt-get install psmisc
apt-get install nfs-common
apt-get install htop
apt-get install vim
apt-get install rsyslog
apt-get install iputils-ping
apt-get install language-pack-en-base
apt-get install sudo
apt-get install network-manager systemd
apt install iputils-ping
apt install openssh-sftp-server
如果出现如下问题:
apt-get install net-tools
E: dpkg was interrupted, you must manually run 'sudo dpkg --configure -a' to correct the problem.
sudo dpkg --configure -a
2.6安装桌面环境
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
;
apt-get install ubuntu-desktop
2.7安装ubuntu-restricted-extras
ubuntu-restricted-extras
是一个包含各种基本软件,如Flash
插件、unrar
、gstreamer
、mp4
、ubuntu
中的chromium
浏览器的编解码器等的软件包。
由于这些软件不是开源软件,并且其中一些涉及软件专利,因此ubuntu
默认情况下不会安装它们。你必须使用multiverse
仓库,它是ubuntu
专门为用户提供非开源软件而创建的仓库。
由于ubuntu-restrcited-extras
软件包在multiverse
仓库中,因此你应验证系统上已启用multiverse
仓库:
sudo add-apt-repository multiverse
然后可以使用以下命令安装:
sudo apt install ubuntu-restricted-extras
2.8修改root
用户密码
为了方便, 这里我直接将密码设置为123
;
passwd root
修改sshd
配置文件的PermitRootLogin
属性:
vim /etc/ssh/sshd_config
在最后面加上,PermitRootLogin yes
:
PermitRootLogin yes #是否允许root登录,默认是允许的,但建议设置为no
LoginGraceTime 600m #设置指定时间内没有成功登录,将会断开连接,若无单位则默认时间为秒
2.9新增用户
新增用户,这个根据具体的情况,嵌入式的环境下,我们可以不用新增,直接使用root
的用户就行了,如果要新增,执行如下的步骤:
adduser [新用户名]
默认情况下新用户是不能使用sudo
命令的,需要修改/etc/sudoers
文件,/etc/sudoers
文件默认是只读的,因此需要先修改此文件的写权限,使用如下命令:
chmod u+w /etc/sudoers
然后使用vim
打开/etc/sudoers
,找到root ALL=(ALL:ALL) ALL
这一行,在这一行下面添加:
[新用户名] ALL=(ALL:ALL) ALL
修改完成以后保存退出,重新恢复/etc/sudoers
的只读属性,使用如下命令:
chmod u-w /etc/sudoers
2.10设置主机名称和IP
echo "rk3399" > /etc/hostname
echo "127.0.0.1 localhost" >> /etc/hosts
echo "127.0.0.1 rk3399" >> /etc/hosts
/etc/hostname
中存放的是主机名,/etc/hosts
存放的是域名与ip
的对应关系,域名与主机名没有任何关系,你可以为任何一个IP
指定任意一个名字。
2.11配置DHCP
配置一下网络DHCP
,这样系统启动以后就会自动设置好网络。RK3399
默认有1
个有线网卡、此外板载2.4G & 5G
双频WiFi
模组。
网卡eth0
:
echo auto eth0 > /etc/network/interfaces.d/eth0
echo iface eth0 inet dhcp >> /etc/network/interfaces.d/eth0
其中,eth0
是接口的名称,inet
是IPV4
协议的设置方式,dhcp
表示使用DHCP
服务器分配IP
地址,如果需要使用静态IP
地址,其值应改为static
,例如/etc/network/interfaces.d/eth0
:
auto eth0
iface eth0 inet static
address 192.168.0.105 #设置IP地址为192.168.0.105
netmask 255.255.255.0 #设置掩码为255.255.255.0
gateway 192.168.0.1 #设置默认网关为192.168.0.1
无线网卡wlan
:
echo auto wlan0 > /etc/network/interfaces.d/wlan0
echo allow-hotplug wlan0 >> /etc/network/interfaces.d/wlan0
echo iface wlan0 inet dhcp >> /etc/network/interfaces.d/wlan0
在实际测试中网口必须接入网线系统才能正常启动,就是在不联网的情况下,每次开机都要等待很久,卡在网络连接上5
分钟,这里我们可以修改下面这个文件:
vim /lib/systemd/system/networking.service
将里面的TimeoutStartSec=5min
修改为:
TimeoutStartSec=1sec
2.12修改系统重启默认等待时间
重启开发板的时候,如果有进程没有结束,系统就会等待,默认等待时间很长,导致重启速度慢。
我们可以修改默认等待时间:
vim /etc/systemd/system.conf
找到这几行:
#DefaultTimeoutStartSec=90s
#DefaultTimeoutStopSec=90s
#DefaultTRestartSec=100ms
解除注释并将DefaultTimeoutStopSec=90s
修改为:
DefaultTimeoutStopSec=1s
2.13设置开机免密登录到图形界面
(1) 我们使用以下命令修改50-ubuntu.conf
文件:
vim /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf
在文件末尾加入以下内容:
greeter-show-manual-login=true
all-guest=false
修改完成后保存退出。
(2) 输入以下命令修改gdm-autologin
文件内容:
vim /etc/pam.d/gdm-autologin
注释掉下面这一行,并保存退出。
#auth required pam_succeed_if.so user != root quiet_success
(3) 输入以下命令修改gdm-password
文件内容:
vim /etc/pam.d/gdm-password
注释掉下面这一行,并保存退出。
auth required pam_succeed_if.so user != root quiet_success
(4) 输入以下命令修改/root/.profile
文件:
vim /root/.profile
将文件最后一行改为以下内容,修改完成如所示:
tty -s && mesg n || true
(5) 输入以下命令修改custom.conf
文件:
vim /etc/gdm3/custom.conf
在文件末尾添加以下内容:
[daemon]
AutomaticLoginEnable=true
AutomaticLogin=root
TimedLoginEnable=true
TimedLogin=root
TimedLoginDelay=10
至此,我们构建的文件系统,就可以开启root
用户免密登录可视界面了!
2.14挂载ubuntu-base
文件系统
文件系统配置完成,输入exit
,然后运行脚本卸载文件系统:
./mnt_ubuntu.sh -u ubuntu/
2.15安装linux-headers
如果想在开发板上进行编译安装源代码,必须安装linux-headers。
2.15.1编译linux-headers
编译内核头文件,在内核目录下:
make -j$(nproc) bindeb-pkg
make bindeb-pkg
是一个用于构建debian
包的命令,它通常用于编译linux
内核并生成对应的debian
软件包。
当执行make bindeb-pkg
命令时,它会读取当前目录下的linux
内核源代码,并根据配置文件进行内核编译。
编译过程将包括编译内核、生成模块、创建initramfs
等步骤。最后,它将生成一组二进制文件和相关的debian
控制文件,用于创建 debian
包。
linux 5.2.8
执行完成会在内核源码debian
目录生成以下文件:
arch
changelog
control
copyright
files
linux-headers/
linux-image/
linux-image-dbg/
linux-libc-dev/
rules*
同时会在内核上一级目录下生成如下deb
包:
linux-headers-6.3.0_6.3.0-17_arm64.deb
linux-image-6.3.0_6.3.0-17_arm64.deb
linux-image-6.3.0-dbg_6.3.0-17_arm64.deb
linux-libc-dev_6.3.0-17_arm64.deb
linux-upstream_6.3.0-17_arm64.buildinfo
linux-upstream_6.3.0-17_arm64.changes
其中:
linux-image-<version>.deb
:内核镜像文件,用于安装和引导新的内核;linux-headers-<version>.deb
:内核头文件,用于开发其他软件或编译内核模块;linux-libc-dev_<version>.deb
:用于构建用户空间软件的头文件和静态库;
这些生成的debian
包可以在 debian
或基于debian
的系统上安装和使用。
2.15.2安装linux-headers
回到rootfs/ubuntu目录下,在ubuntu
宿主机将我们编译的头文件拷贝到根文件系统/opt
目录下;
sudo cp /RK3399/linux-headers-5.2.8_5.2.8-1_arm64.deb ./opt
cd ..
首先需要挂载ubuntu-base
文件系统;
./mnt_ubuntu.sh -m ubuntu/
安装linux-headers
;
cd /opt
dpkg -i /opt/linux-headers-*.deb
文件系统配置完成,输入exit
,然后执行如下命令卸载文件系统:
./mnt_ubuntu.sh -u ubuntu/
2.16安装驱动模块
2.16.1编译驱动模块
首先编译内核模块,如果已经编译过忽略即可,在内核目录下执行:
export KMODULES_OUTDIR=`pwd`/out/output_rk3399_kmodules
rm -rf ${KMODULES_OUTDIR}
mkdir -p ${KMODULES_OUTDIR}
make modules -j$(nproc)
2.16.2安装驱动模块
然后执行如下脚本install_modules.sh
:
#!/bin/bash
CROSS_COMPILE=arm-linux-
ARCH=arm64
# 用于构建并输出内核版本号
KERNEL_VER=`make CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} kernelrelease`
KMODULES_OUTDIR=`pwd`/out/output_rk3399_kmodules/${KERNEL_VER}
rm -rf ${KMODULES_OUTDIR}
make CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} INSTALL_MOD_PATH=${KMODULES_OUTDIR} modules_install
if [ $? -ne 0 ]; then
echo "failed to build kernel modules."
exit 1
fi
# 如果模块依赖文件modules.dep不存在,则生成内核模块的依赖关系
[ ! -f "${KMODULES_OUTDIR}/lib/modules/${KERNEL_VER}/modules.dep" ] && depmod -b ${KMODULES_OUTDIR} -E Module.symvers -F System.map -w ${KERNEL_VER}
# 去除驱动中的符号信息
(cd ${KMODULES_OUTDIR} && find . -name \*.ko | xargs ${CROSS_COMPILE}strip --strip-unneeded)
# 更新内核模块依赖
(cd ${KMODULES_OUTDIR}/lib/modules/${KERNEL_VER}/ && {
rm -rf ./build ./source
echo "depmod ${KMODULES_OUTDIR} ${KERNEL_VER} ..."
depmod -a -b ${KMODULES_OUTDIR} ${KERNEL_VER}
})
在ubuntu
宿主机将我们编译的驱动模块拷贝到根文件系统/lib/modules
目录下:
cp -af ${KMODULES_OUTDIR}/lib/modules/* /RK3399/rootfs/ubuntu/lib/modules
3.制作ext4根文件系统镜像
3.1初始化
rootfs目录下,建立根文件系统挂载点ubuntu_rootfs
:
mkdir ubuntu_rootfs
创建空镜像文件ubuntu_ext4_rootfs.img
,大小6144
(设置为文件系统大小x2
),具体需要的大小可以通过du build -h
查看我们根文件系统大小调整;
dd if=/dev/zero of=ubuntu_ext4_rootfs.img bs=1M count=6144
ll ubuntu_ext4_rootfs.img
mkfs.ext4 ubuntu_ext4_rootfs.img
3.2挂载
将该镜像文件挂载到ubuntu_rootfs
:
mount ubuntu_ext4_rootfs.img ubuntu_rootfs/
然后将ubuntu
的文件复制到该空文件夹中:
cp ./ubuntu/* ./ubuntu_rootfs/ -af
使用df
命令可以查看是否已经挂载:
df ubuntu_rootfs
3.3卸载
将之前挂载的卸载掉:
umount ubuntu_rootfs
此时我们已经得到了ext4
根文件系统镜像ubuntu_ext4_rootfs.img
,删除文件夹ubuntu_rootfs
:
rm -rf ubuntu_rootfs
用e2fsck
修复及检测镜像文件系统,resize2fs
减小镜像文件的大小;
e2fsck -p -f ubuntu_ext4_rootfs.img
resize2fs -M ubuntu_ext4_rootfs.img
ll ubuntu_ext4_rootfs.img
du -sh ubuntu_ext4_rootfs.img
最终得到的ext4
根文件系统镜像ubuntu_ext4_rootfs.img
大小为4.0G
。
3.4mk_rootfs.sh
脚本
我们将之前的步骤,编写成mk_rootfs.sh
脚本:
#!/bin/bash
rootfs_name=ubuntu_ext4_rootfs.img # 根文件系统名称
ubuntu_path=./ubuntu # ubuntu文件系统路径
rm -rf ubuntu_rootfs
mkdir ubuntu_rootfs
dd if=/dev/zero of=${rootfs_name} bs=1M count=6144
mkfs.ext4 ${rootfs_name}
mount ${rootfs_name} ubuntu_rootfs/
cp ${ubuntu_path}/* ./ubuntu_rootfs/ -af
umount ubuntu_rootfs
rm -rf ubuntu_rootfs
e2fsck -p -f ${rootfs_name}
resize2fs -M ${rootfs_name}
4.烧录
我们按照之前的流程得到了如下文件
idbloader.img
u-boot.itb
boot.img
ubuntu_ext4_rootfs.img
rk3399_loader_v1.27.126.bin
我手中这块开发板基于emmc启动,按照RK官方要求将
rk3399_loader_v1.27.126.bin烧录到0x0扇区
idbloader.img烧录到emmc的0x40扇区
u-boot.itb烧录到0x4000扇区
boot.img烧录到0x8000扇区
ubuntu_ext4_rootfs.img烧录到0x40000扇区
烧录方法有两种,一种是基于RK的官方烧录工具AndroidTool.exe,另外一种是在开发板上直接烧写emmc。官方AndroidTool.exe是基于recovery模式实现的,板子带有recovery按键,可以使用这种方式。我用基于AndroidTool.exe烧录:
按住recovery按键上电,板子会进入recovery模式,点击执行,开始烧录。
5.启动内核
在倒计时执行完之前,按CTRL+C
即可进入uboot
命令行。
设置ip
以及bootargs
=> setenv ipaddr 192.168.0.105
=> setenv serverip 192.168.0.200
=> saveenv
设置启动命令参数
=> setenv bootargs earlycon=uart8250,mmio32,0xff1a0000 console=tty0 console=ttyS2,115200n8 root=PARTUUID=B921B045-1D rw rootwait rootfstype=ext4 init=/sbin/init
=> saveenv
=> print bootargs
在配置了console=ttyS2,115200n8
的情况下,只有配置了console=tty0
或者console=tty1
内核启动信息才会在显示器上显示,tty0
表示当前所使用虚拟终端的一个别名,内核启动的时候,内核日志会发送到console
指定的终端设备上。
/dev/tty1~/dev/tty6
是虚拟终端在文件系统中的表示(可以通过CTRL+ALT+[F1~F6]
切换虚终端),虚拟终端的输入数据来自键盘、同时将tty
驱动的输出到显示器,他们共享同一个的键盘显示器套件。
后面测试可以正常启动内核并进入ubuntu
桌面系统的话,最好把console=ttyS2,115200n8
配置移除掉,因为这个会严重影响CPU
的性能。
设置GPT
分区表
=> gpt write mmc 0 'uuid_disk=69DAD710-2CE4-4E3C-B16C-21A1D49ABED3;name=loader1,start=32K,size=4000K,uuid=8ef917d1-5bd0-2c4f-9a33-b225b21cf919;name=loader2,start=8MB,size=4MB,uuid=77877125-2374-ad40-8b02-609e37971c59;name=trust,size=4M,uuid=b4b84b8a-f8ae-0443-b5af-3605b195c4c9;name=boot,size=112M,bootable,uuid=35219908-db08-c643-9133-2213191e57ff;name=rootfs,size=-,uuid=b921b045-1df0-41c3-af44-4c6f280d3fae'
=> part list mmc 0
启动内核
=> boot
6.ubuntu
设置以及测试
6.1查看块设备
查看eMMC
块设备文件:
ls /dev/mmc* -l
brw-rw---- 1 root disk 179, 0 Nov 22 05:37 /dev/mmcblk2
brw-rw---- 1 root disk 179, 32 Nov 22 05:10 /dev/mmcblk2boot0
brw-rw---- 1 root disk 179, 64 Nov 22 05:10 /dev/mmcblk2boot1
brw-rw---- 1 root disk 179, 1 Nov 22 05:37 /dev/mmcblk2p1
brw-rw---- 1 root disk 179, 2 Nov 22 05:37 /dev/mmcblk2p2
brw-rw---- 1 root disk 179, 3 Nov 22 05:37 /dev/mmcblk2p3
brw-rw---- 1 root disk 179, 4 Nov 22 05:37 /dev/mmcblk2p4
brw-rw---- 1 root disk 179, 5 Nov 22 05:37 /dev/mmcblk2p5
crw------- 1 root root 237, 0 Nov 22 05:10 /dev/mmcblk2rpmb
这里一共有8
个块设备节点和1
个字符设备节点;其中:
/dev/mmcblk2
表示的是eMMC
这个设备,其主设备号为179
,次设备号为0
;mmcblk2boot0
和mmcblk2boot1
对应两个Boot Area Partition
;每一个Boot Area Partition
大小都是4MB
;mmcblk2rpmb
则为RPMB Partition
;大小为4MB
;mcblk2px
为User Data Area
划分出来的SW Partitions
;实际上就是通过解析GPT
分区表创建的分区,分区编号依次为1,2,3,4,5
;
使用cat /proc/partitions
,可以查看全部分区信息:
major minor #blocks name
179 0 15267840 mmcblk2
179 1 4000 mmcblk2p1
179 2 4096 mmcblk2p2
179 3 4096 mmcblk2p3
179 4 114688 mmcblk2p4
179 5 15136751 mmcblk2p5
其中blocks
表示分区的容量,每个blocks
是1KB
。这里:
mmcblk2p1
对应loader1
分区;mmcblk2p2
对应loader2
分区;mmcblk2p3
对应trust
分区;mmcblk2p4
对应boot
分区;mmcblk2p5
对应rootfs
分区,大小为剩余所有空间;
6.2查看磁盘空间并扩容
这里我们可以通过df -hT
查看磁盘空间信息;
Filesystem Type Size Used Avail Use% Mounted on
/dev/root ext4 4.0G 4.0G 20M 30% /
devtmpfs devtmpfs 978M 0 978M 0% /dev
tmpfs tmpfs 995M 0 995M 0% /dev/shm
tmpfs tmpfs 199M 2.0M 197M 2% /run
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs tmpfs 995M 0 995M 0% /sys/fs/cgroup
tmpfs tmpfs 199M 76K 199M 1% /run/user/0
显示内容参数说明:
Filesystem
:文件系统;Type
:文件系统类型;Siz
: 分区大小;Used
: 已使用容量;Avail
: 还可以使用的容量;Use%
: 已用百分比;Mounted on
: 挂载点;
这里我们可以看到根目录挂载在/dev/root
设备节点上,文件系统格式是ext4
,/dev/root
其实就是/dev/mmcblk2p5
,也就是eMMC
设备的rootfs
分区;
这里我们可以通过resize2fs
指令进行扩容:
resize2fs /dev/mmcblk2p5
再通过df -hT
查看磁盘空间信息:
Filesystem Type Size Used Avail Use% Mounted on
/dev/root ext4 15G 4.0G 9.6G 30% /
devtmpfs devtmpfs 978M 0 978M 0% /dev
tmpfs tmpfs 995M 0 995M 0% /dev/shm
tmpfs tmpfs 199M 2.0M 197M 2% /run
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs tmpfs 995M 0 995M 0% /sys/fs/cgroup
tmpfs tmpfs 199M 76K 199M 1% /run/user/0
在我们扩容完成后,稍等一会,显示器上会进入ubuntu
桌面系统(如果不扩容的话,由于/目录没有磁盘空间了,也就进不了ubuntu
桌面环境的)。
如果无法进入ubuntu
系统,或者启动时显示器上没有输出任何启动日志,考虑配置内核时是否配置了DRM
驱动。
参考文章
Rockchip RK3399 - 移植ubuntu 20.04.4根文件系统 - 大奥特曼打小怪兽 - 博客园 (cnblogs.com)