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