When I first introduced cloud phones (Unveiling Cloud Phone Technology! Achieving Low-Cost Transformation of One Computer into Hundreds of “Virtual Phones” in Practice), I mentioned that the mobile box from Magic Cloud was a bit expensive. However, running it on a server lacked graphical acceleration, which slightly affected the experience, so I tried running it on a laptop (The High-Performance Gaming Cloud Phone Revolution! GPU Acceleration Makes Redroid Performance Comparable to Xiaomi 15), and the results were quite good.
Nevertheless, I always wanted to find an ARM device to test. I tried the Kunpeng cloud server, but it was very disappointing. As a last resort, I bought two RK3588 development boards at a seafood market, intending to install an Ubuntu system on them.
Actually, there was a catch. Before buying the first board, I specifically searched and found that there was only one model of RK3588. However, after receiving the board, I couldn’t install the Ubuntu system no matter what. It was only then that AI informed me that what I bought was not the RK3588, but the RK3588S. In addition, there is also an RK3588S2. The differences among these models lie in the device tree; the RK3588 supports the most PCIe (4), followed by the RK3588S (2), and the RK3588S2 only supports a meager interface (1), and it also has a cut-down GPU specification (1 core).
The specific model of the RK3588S motherboard is Yisheng YS-F3588 Smart Commercial Display Board, as shown below:

As you can see, it only has one HDMI port and one Ethernet port. The official firmware only supports Android 12, with no Ubuntu available. I spent nearly a month trying to customize it without success. This is also one of the reasons for the decline in article quality over the past month.
Later, I bought another RK3588 motherboard, specifically the Dingchang DC-A588-V03 board, as shown below:

This board has three HDMI ports and two Ethernet ports, and the official firmware includes both Android 12 and Ubuntu 20.04, which is better than nothing.
Of course, the board comes with Android 12, and using Rockchip’s development tools, we can flash it to Ubuntu 20.04.

This system comes with a default GNU desktop, but one of the two USB ports can only be used as OTG, leaving only one port for connecting a keyboard and mouse, which is not very convenient. Therefore, we log into the device directly through the serial port, as shown below.

Checking the motherboard’s configuration information shows that the CPU is Cortex-A55, with the actual model being RK3588, an octa-core 64-bit processor with 4 Cortex-A76 big cores and 4 Cortex-A55 small cores, claiming a maximum frequency of 2.4 GHz, which is displayed here as 2304 MHz.

The memory size is 8 GB, and the storage is 64 GB of onboard EMMC storage.
With this Ubuntu 20.04 system, we can manually upgrade to Ubuntu 24.04 (Say Goodbye to Reinstallation! Upgrade from Ubuntu 22.04 to 24.04 Tutorial, the Ultimate Solution with Zero Data Loss). However, if any issues arise, such as the time I accidentally bricked this board, it took a lot of effort to recover it. At that point, I could only flash back to the original Ubuntu 20.04 firmware, and upgrading to Ubuntu 24.04 would take several hours, which is quite inconvenient.
Instead of repeatedly tinkering with the official firmware, why not build a custom system from scratch? So, can we create our own custom image? Theoretically, it is definitely possible, and we will first use Ubuntu 20.04 to operate.
First, we can further streamline the Ubuntu 20.04 system. Let’s take a look at which files occupy more space in the system.
du -sh /* | sort -hr | head -n 10

There aren’t too many files yet. We can see that in the default official firmware, there are two files my_video-1.mkv and my_video-2.mkv under the /root path. We will delete these two files for comparison.

However, if we execute an update, many software will be installed via Snap, ultimately occupying 3.9 GB of space. Therefore, we need to take action first and create an APT configuration file to prevent the installation of Snapd.
echo 'Package: snapd' | tee /etc/apt/preferences.d/no-snapd.pref
echo 'Pin: release a=*' | tee -a /etc/apt/preferences.d/no-snapd.pref
echo 'Pin-Priority: -10' | tee -a /etc/apt/preferences.d/no-snapd.pref

Additionally, clean the APT cache and logs, keeping only the last 7 days. Confirm that there are no important files in /root/rootfs_backup before deleting it, or they will be permanently lost!
apt-get clean
journalctl --vacuum-time=7
drm -rf /root/rootfs_backup

In this way, the /var directory has been reduced by 114 MB, which is a good comparison.
Next, we create a temporary working directory /root/rootfs_backup and use the rsync command to synchronize the files and directories from the root directory to this temporary working directory, using -aAXv to preserve permissions, symbolic links, extended attributes, etc., and using –exclude to exclude virtual file systems and temporary directories.
mkdir -p /root/rootfs_backup
rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/var/log/*","/var/cache/*","/var/tmp/*","/root/rootfs_backup/*"} / /root/rootfs_backup/

Wait for all files to synchronize, and we check the /root/rootfs_backup directory to see if it contains all necessary files.
du -sh /root/rootfs_backup
du -sh /root/rootfs_backup/* | sort -hr | head -n 10

We can see that the synchronized paths are basically consistent with the expected values, and the total size of the folders is 3.5 GB.
Next, we allocate a 3700 MB image rootfs.img based on the actual used space of 3.5 GB, slightly larger than 3.5 GB, and format the image to ext4 format.
dd if=/dev/zero of=/root/rootfs.img bs=1M count=3700 status=progress
mkfs.ext4 -F /root/rootfs.img

Then, we mount the rootfs.img to /mnt/rootfs_img and copy all files from /root/rootfs_backup/ into it.
mkdir /mnt/rootfs_img
mount -o loop /root/rootfs.img /mnt/rootfs_img
cp -a /root/rootfs_backup/* /mnt/rootfs_img/

After the file copying is complete, we unmount it and use e2fsck to check and repair the file system.
umount /mnt/rootfs_img
e2fsck -f /root/rootfs.img

Of course, we can also use resize2fs to adjust the actual occupied space of the file system, though it may not always be effective.
resize2fs -M /root/rootfs.img
ls -lh /root/rootfs.img

Next, we can copy the rootfs.img file to the computer. If there are any abnormal situations with the system later, we can directly use this image to overwrite the rootfs partition, as shown below:

How about that? Simple, right?
**Recommended Reading***
16-Core CPU Running at 100%! Testing Six Vulnerability Scanning Modes on 21 Nodes, This Mode Makes the Server Go Wild
Running Docker on Windows, 8GB of Memory Can’t Even Satisfy the Vulnerability Scanning Tool?
Tencent App Treasure Conquers Windows! Major Changes in Installing Android Apps on Windows by 2025, 5 Minutes to Get Xiaohongshu/King of Glory
Two Commands to Solve It! Kali Natively Integrates GVM Vulnerability Scanner, Saving 5GB of Space Compared to Docker
Windows Disappearing, Router Mutations? Greenbone Community Edition Multi-Mode Scanning Practice, Don’t Step on These Pits Again
Six-Year-Old Image Failure! Step-by-Step Guide to Deploying the Latest Enterprise-Level Vulnerability Scanning Tool OpenVAS with Docker
Windows Can Also Play Docker! Step-by-Step Guide to Deploying Redroid Cloud Phone
The High-Performance Gaming Cloud Phone Revolution! GPU Acceleration Makes Redroid Performance Comparable to Xiaomi 15
Automatically Install the System by Plugging in a USB Drive? Master the Automatic Installation Image Creation for Ubuntu Server Edition in One Article
Connect to WiFi and Change IP! Unveiling the Black Technology of Multi-VPN Exit for Enterprise Routers!
Global Implementation of Cloud Phones: Using Policy Routing to Achieve Free Switching of Docker Container Networks
VMware Edge 620 Magic Operation: Flashing iStoreOS to Become a Versatile Enterprise Gateway, Easily Handling Multiple SSIDs
From CentOS to Ubuntu: Zero-Cost Migration of L2TP VPN, Practical Experience of Enterprise-Level Intranet Penetration!
WireGuard Too Complicated? Teach You to Use Netmaker to Achieve Global Networking in Ten Minutes
Unveiling Cloud Phone Technology! Achieving Low-Cost Transformation of One Computer into Hundreds of “Virtual Phones” in Practice
iWAN Tunnel Test: A Single Handshake Running at Full 2.3Gbps, Can Free SD-WAN Really Beat Dedicated Lines?