Firefly RK3399 - 移植ubuntu 20.04.4根文件系统

目录

0.前言

1. 下载源码

2.配置

2.1安装qemu

2.2设置软件源

2.3 配置DNS

2.4挂载ubuntu-base文件系统

2.5安装软件以及桌面环境

2.6安装桌面环境

2.7安装ubuntu-restricted-extras

2.8修改root用户密码

2.9新增用户

2.10设置主机名称和IP

2.11配置DHCP

2.12修改系统重启默认等待时间

2.13设置开机免密登录到图形界面

2.14挂载ubuntu-base文件系统

2.15安装linux-headers

2.15.1编译linux-headers

2.15.2安装linux-headers

2.16安装驱动模块

2.16.1编译驱动模块

2.16.2安装驱动模块

3.制作ext4根文件系统镜像

3.1初始化

3.2挂载

3.3卸载

3.4mk_rootfs.sh脚本

4.烧录

5.启动内核

6.ubuntu设置以及测试

6.1查看块设备

6.2查看磁盘空间并扩容

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-baseaarch64架构的,因此需要拷贝qemu-aarch64-staticubuntu/usr/bin/下:

sudo cp /usr/bin/qemu-aarch64-static ./usr/bin/

2.2设置软件源

Linux家族有三个软件源系统:

  • yum源,使用这种软件管理器的主要是:redhatcentos
  • 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

执行如下命令将会挂载ubuntu-base文件系统;

./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) ubuntuubuntu是主要的发行版,它使用GNOME这个桌面环境,相依的虚拟套件是ubuntu-desktop

(2) kubuntu:采用以功能强大闻名的KDE当成桌面环境,功能众多以及华丽桌面配置为其卖点,相依的虚拟套件是kubuntu-desktop

(3) xubuntu:采用了比较轻量级的桌面环境Xfce,所以这个版本的诉求是针对比较老旧的电脑。Xfce的设计理念是减少使用的系统资源,并且成为一套完整可用的桌面环境。功能来说,虽没有像ubuntukubuntu功能众多,但也具备基本文书、上网与影音等功能。相依的虚拟套件是xubuntu-desktop

(4) lubuntu:采用了比Xfce更轻量的桌面环境Lxde,是自从10.04之后才新增的版本。这个版本的诉求是针对小笔电、效能较差的电脑或追求快速的使用者。虽然精简,但仍然符合大多数使用者对于桌面的要求。同样具备文书处理、上网和影音,更特别的是,它已经内建了几乎所有播放需要使用到的解码器,可直接播放mp3rmvb等格式的档案,相依的虛擬套件是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插件、unrargstreamermp4ubuntu中的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是接口的名称,inetIPV4协议的设置方式,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
  • mmcblk2boot0mmcblk2boot1对应两个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表示分区的容量,每个blocks1KB。这里:

  • 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)

  • 57
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值