Firefly RK3399开发板Ubuntu镜像制作入门指南:零基础开始

前言:rk-Linux-sdk 、Linux内核:5.10.160、 开发板:firefly-rk3399

 默认你有一定开发rk芯片基础。

 

开发板用了好几年,一直吃灰中,2G+16G配置。

1.下载ubuntu-base镜像

镜像地址下载,如清华源:《Index of /ubuntu-cdimage/ubuntu-base/releases/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror》。


2.在RK-Linux-SDK创建ubuntu文件夹

RK-Linux-SDK如果没有sdk已经 中心思想就是替换rootfs根文件系统,之所以我用RK-Linux-SDK,是因为我经常用这个开发。 

这里的文件夹用于编译ubuntu镜像

1.在ubuntu文件下面创建rootfs_ubuntu目录

2.把ubuntu-base压缩包解压缩到rootfs_ubuntu目录

sudo tar -xpvf ubuntu-base-20.04.4-base-arm64.tar.gz -C rootfs_ubuntu/

3.安装qemu-user-static 

 qemu-user-static是一个仿真器

在电脑上安装这个 然后放在rootfs_ubuntu/usr/bin/

sudo apt-get install qemu-user-static
sudo cp /usr/bin/qemu-aarch64-static ./rootfs_ubuntu/usr/bin/

4.设置软件源

sudo vim /etc/apt/sources.list

复制这些到/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

5.配置DNS


vi ./etc/resolv.conf  
填入这写

nameserver 8.8.8.8
nameserver 114.114.114.114

6.挂载/卸载ubuntu-base文件系统脚本

#!/bin/bash
mnt() {
    echo "MOUNTING"
    sudo mount -t proc /proc ./rootfs_ubuntu/proc
    sudo mount -t sysfs /sys ./rootfs_ubuntu/sys
    sudo mount -o bind /dev ./rootfs_ubuntu/dev
    sudo mount -o bind /dev/pts ./rootfs_ubuntu/dev/pts
    sudo chroot ./rootfs_ubuntu/
}
umnt() {
    echo "UNMOUNTING"
    sudo umount ./rootfs_ubuntu/proc
    sudo umount ./rootfs_ubuntu/sys
    sudo umount ./rootfs_ubuntu/dev/pts
    sudo umount ./rootfs_ubuntu/dev
}
 
if [ "$1" == "-m" ] ;
then
    mnt $1
elif [ "$1" == "-u" ];
then
    umnt $1
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 : ./rootfs_ubuntu/
fi

   挂载文件系统脚本使用

7. 在 ubuntu-base文件系统中安装软件

apt-get install net-tools ethtool ifupdown psmisc nfs-common htop vim rsyslog iputils-ping language-pack-en-base sudo network-manager systemd iputils-ping openssh-sftp-server -y

安装桌面环境

 apt-get install ubuntu-desktop

修改fstab文件是为了能正确挂载分区

root@eternal:/# vi /etc/fstab



# <file system>	<mount pt>	<type>	<options>	<dump>	<pass>
/dev/root	/		ext4	rw,noauto	0	1
tmpfs		/tmp		tmpfs	mode=1777	0	0
tmpfs		/run		tmpfs	mode=0755,nosuid,nodev	0	0
proc	/proc	proc	defaults	0 0
devtmpfs	/dev	devtmpfs	defaults	0 0
devpts	/dev/pts	devpts	mode=0620,ptmxmode=0666,gid=5	0 0
tmpfs	/dev/shm	tmpfs	nosuid,nodev,noexec	0 0
sysfs	/sys	sysfs	defaults	0 0
configfs	/sys/kernel/config	configfs	defaults	0 0
debugfs	/sys/kernel/debug	debugfs	defaults	0 0
pstore	/sys/fs/pstore	pstore	defaults	0 0
PARTLABEL=oem	/oem	ext4	defaults	0 2
PARTLABEL=userdata	/userdata	ext4	defaults	0 2

8.其他系统设置

1 修改root用户密码
	为了方便, 这里我直接将密码设置为123456;
	root@eternal:/# passwd root
	New password:
	Retype new password:
	passwd: password updated successfully

2.新增用户

	root@eternal:/# adduser eternal

	我了方便,这里新增的eternal用户密码也是123456;这里需要输入用户的一些信息,也可以直接回车保留默认值即可。

	默认情况下新用户是不能使用sudo命令的,我们需要修改/etc/sudoers文件。

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

	root@eternal:/# chmod u+w /etc/sudoers
	然后使用vim打开/etc/sudoers,找到root ALL=(ALL:ALL) ALL这一行,在这一行下面添加:

	eternal    ALL=(ALL:ALL) ALL

	修改完成以后保存退出,重新恢复/etc/sudoers的只读属性,使用如下命令:
	root@eternal:/# chmod u-w /etc/sudoers


3 设置主机名称和IP
	root@eternal:/# echo "rk3399" > /etc/hostname
	root@eternal:/# echo "127.0.0.1 localhost" >> /etc/hosts
	root@eternal:/# echo "127.0.0.1 rk3399" >> /etc/hosts

	/etc/hostname中存放的是主机名,/etc/hosts存放的是域名与ip的对应关系,域名与主机名没有任何关系,你可以为任何一个IP指定任意一个名字。

4 配置DHCP
	我们配置一下网络DHCP,这样系统启动以后就会自动设置好网络。RK3399默认有1个有线网卡、此外板载2.4G & 5G双频WiFi模组。
	网卡eth0:
	root@eternal:/# echo auto eth0 > /etc/network/interfaces.d/eth0
	root@eternal:/# echo iface eth0 inet dhcp >> /etc/network/interfaces.d/eth0

	其中,eth0是接口的名称,inet是IPV4协议的设置方式,dhcp表示使用DHCP服务器分配IP地址,如果需要使用静态IP地址,其值应改为static,例如/etc/network/interfaces.d/eth0:
	在实际测试中网口必须接入网线系统才能正常启动,就是在不联网的情况下,每次开机都要等待很久,卡在网络连接上5分钟,这里我们可以修改下面这个文件:
	root@eternal:/# vim /lib/systemd/system/networking.service
	将里面的TimeoutStartSec=5min修改为:
	TimeoutStartSec=1sec

6 设置开机免密登录到图形界面
	(1) 我们使用以下命令修改50-ubuntu.conf文件:

	root@eternal:/# vim /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf
	在文件末尾加入以下内容:
	greeter-show-manual-login=true
	all-guest=false

	修改完成后保存退出。
	(2) 输入以下命令修改gdm-autologin文件内容:

	root@eternal:/# vim /etc/pam.d/gdm-autologin
	注释掉下面这一行,并保存退出。
	#auth    required        pam_succeed_if.so user != root quiet_success

	(3) 输入以下命令修改gdm-password文件内容:

	root@eternal:/# vim /etc/pam.d/gdm-password

	注释掉下面这一行,并保存退出。
	auth    required        pam_succeed_if.so user != root quiet_success
	解释
	(4) 输入以下命令修改/root/.profile文件:

	root@eternal:/# vim /root/.profile

	将文件最后一行改为以下内容,修改完成如所示:

	tty -s && mesg n || true

	(5) 输入以下命令修改custom.conf文件:
	root@eternal:/# vim /etc/gdm3/custom.conf
	在文件末尾添加以下内容:
	[daemon]
	AutomaticLoginEnable=true
	AutomaticLogin=root
	TimedLoginEnable=true
	TimedLogin=root
	TimedLoginDelay=10

9.打包好制作好的根文件系统

sudo tar -czf ../rootfs.tar.gz --exclude=../rootfs.tar.gz ./

 10.制作成镜像脚本

我是直接用Debian那个脚本

#!/bin/bash -e

TARGET_ROOTFS_DIR=./rootfs_ubuntu
ROOTFSIMAGE=linaro-rootfs.img
EXTRA_SIZE_MB=300
IMAGE_SIZE_MB=$(( $(sudo du -sh -m ${TARGET_ROOTFS_DIR} | cut -f1) + ${EXTRA_SIZE_MB} ))


echo Making rootfs!

if [ -e ${ROOTFSIMAGE} ]; then
	rm ${ROOTFSIMAGE}
fi

#for script in ./post-build.sh ../device/rockchip/common/post-build.sh; do
#	[ -x $script ] || continue
#	sudo $script "$(realpath "$TARGET_ROOTFS_DIR")"
#done

sudo cp -rf project_data/sta-ap/dnsmasq.conf $TARGET_ROOTFS_DIR/etc/dnsmasq.conf

dd if=/dev/zero of=${ROOTFSIMAGE} bs=1M count=0 seek=${IMAGE_SIZE_MB}

sudo mkfs.ext4 -d ${TARGET_ROOTFS_DIR} ${ROOTFSIMAGE}

echo Rootfs Image: ${ROOTFSIMAGE}

得到linaro-rootfs.img 镜像烧录这个镜像在rootfs分区上,就会把ubuntu系统启动。

!!!注意你之前的是有烧录别的Linux固件了。!!!

其他编译脚本

我要用到adb功能进行调试,我加入adb工具

#!/bin/bash -e

# Directory contains the target rootfs
TARGET_ROOTFS_DIR="rootfs_ubuntu"

case "${ARCH:-$1}" in
	arm|arm32|armhf)
		ARCH=armhf
		;;
	*)
		ARCH=arm64
		;;
esac

echo -e "\033[36m Building for $ARCH \033[0m"

if [ ! $VERSION ]; then
	VERSION="release"
fi

echo -e "\033[36m Building for $VERSION \033[0m"

finish() {
	sudo umount $TARGET_ROOTFS_DIR/dev
	exit -1
}
trap finish ERR

sudo rm  $TARGET_ROOTFS_DIR -rf
sudo mkdir $TARGET_ROOTFS_DIR
echo -e "\033[36m Extract image \033[0m"
sudo tar -xpf ./images/rootfs-v1.2.tar.gz -C  $TARGET_ROOTFS_DIR

sudo rm  $TARGET_ROOTFS_DIR/rootfs.tar.gz -rf

sudo mount -o bind /dev $TARGET_ROOTFS_DIR/dev

ID=$(stat --format %u $TARGET_ROOTFS_DIR)


#adb 
sudo cp -rf ./overlay/usr/lib/systemd/system/usbdevice.service $TARGET_ROOTFS_DIR/usr/lib/systemd/system/usbdevice.service
sudo cp -rf ./overlay/usr/bin/usbdevice $TARGET_ROOTFS_DIR/usr/bin/usbdevice
sudo cp -rf ./overlay/usr/bin/adbd $TARGET_ROOTFS_DIR/usr/bin/adbd


sudo cp -rf ./overlay/etc/profile.d/* $TARGET_ROOTFS_DIR/etc/profile.d/


cat << EOF | sudo chroot $TARGET_ROOTFS_DIR

# Fixup owners
if [ "$ID" -ne 0 ]; then
       find / -user $ID -exec chown -h 0:0 {} \;
fi
for u in \$(ls /home/); do
	chown -h -R \$u:\$u /home/\$u
done

apt-get update

export APT_INSTALL="apt-get install -fy --allow-downgrades"

systemctl enable usbdevice.service


EOF

sudo umount $TARGET_ROOTFS_DIR/dev

 

10.注意

第一次开机必须执行这个命令: resize2fs /dev/mmcblk0p5,否侧不能进入桌面上 。这个命令是扩大root分区大小。

root@eternal:/# resize2fs /dev/mmcblk0p5
resize2fs 1.45.5 (07-Jan-2020)
The filesystem is already 3670016 (4k) blocks long.  Nothing to do!

root@eternal:/# 

11.使能mesa-panfost驱动

diff --git a/arch/arm64/boot/dts/rockchip/rk3399-firefly-linux.dts b/arch/arm64/boot/dts/rockchip/rk3399-firefly-linux.dts
index 90489ab3afbe..5ec2b78341a2 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399-firefly-linux.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3399-firefly-linux.dts
@@ -396,6 +396,10 @@ &gmac {
 
 &gpu {
        status = "okay";
+       compatible = "arm,mali-t860",
+                            "arm,malit86x",
+                            "arm,malit8xx",
+                            "arm,mali-midgard";
        mali-supply = <&vdd_gpu>;
 };
 
diff --git a/arch/arm64/configs/rk3399_linux_ubuntu.config b/arch/arm64/configs/rk3399_linux_ubuntu.config
new file mode 100644
index 000000000000..4004810c01a0
--- /dev/null
+++ b/arch/arm64/configs/rk3399_linux_ubuntu.config
@@ -0,0 +1,7 @@
+CONFIG_DRM_PANFROST=y
+CONFIG_MALI400=n
+CONFIG_DRM_IGNORE_IOTCL_PERMIT=n
+CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y
+CONFIG_DRM_GEM_SHMEM_HELPER=y
+CONFIG_DRM_SCHED=y

有点意外,在内核里面添加panfost驱动后,直接可以正常使用GPU了。

总结:

 写得不够详细,主要是记录学习使用。有gpu的使能,火狐浏览器看视频还算流畅。

参考文档是:Rockchip RK3399 – 移植ubuntu 20.04.4根文件系统 – 大奥特曼打小怪兽 – 博客园 (cnblogs.com)


作者:Eternal Love Linux

物联沃分享整理
物联沃-IOTWORD物联网 » Firefly RK3399开发板Ubuntu镜像制作入门指南:零基础开始

发表回复