Skip to content

Create DevTerm R01 OS image from scratch

GNU edited this page May 6, 2022 · 23 revisions

Before start

Our system image is modified based on fedora wiki
The main thing is to replace the root fs and kernel files
Some linux experience is required to handle every possible situation
there are some discrepancies with the final system image
So this document is more suitable for the guidance of the d1 system image

Prepare

a ubuntu linux system, like ubuntu 21.04

install riscv64 gcc

sudo apt install gcc-11-riscv64-linux-gnu binutils-riscv64-linux-gnu

install qemu static for chroot

sudo apt install qemu-user-static

Bootloader

reference doc:

https://fedoraproject.org/wiki/Architectures/RISC-V/Allwinner

git clone https://github.com/smaeul/sun20i_d1_spl
pushd sun20i_d1_spl
git checkout origin/mainline
make CROSS_COMPILE=riscv64-linux-gnu- p=sun20iw1p1 mmc
popd
pushd sun20i_d1_spl
sudo dd if=nboot/boot0_sdcard_sun20iw1p1.bin of=/dev/sdX bs=512 seek=16

git clone https://github.com/tekkamanninja/opensbi -b allwinner_d1 pushd opensbi CROSS_COMPILE=riscv64-linux-gnu- PLATFORM=generic FW_PIC=y BUILD_INFO=y make popd

git clone https://github.com/tekkamanninja/u-boot -b allwinner_d1
pushd u-boot
make CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv nezha_defconfig
make CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv menuconfig
make CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv u-boot.bin u-boot.dtb
popd

in menuconfig, there is an import option must be selected:

Image 2022-04-11 112248

otherwises, the boot will hang

u-boot.toc1

[opensbi] file = fw_dynamic.bin addr = 0x40000000 [dtb] file = u-boot.dtb addr = 0x44000000 [u-boot] file = u-boot.bin addr = 0x4a000000

pushd u-boot
cp ${PATH_TO_TOC1_CFG}/toc1.cfg ${PATH_TO_OPENSBI}/fw_dynamic.bin .
tools/mkimage -T sunxi_toc1 -d toc1.cfg  u-boot.toc1
popd

pushd u-boot sudo dd if=u-boot.toc1 of=/dev/sdX bs=512 seek=32800

Image 2022-04-10 192110

Disk partition prepare

old fedora image fdisk partition

Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xda568ce2

Device                                                                            Boot   Start      End  Sectors  Size Id Type
fedora-riscv64-d1-developer-xfce-rawhide-Rawhide-20211124-132603.n.0-sda.raw.img2        69632   319487   249856  122M  c W95 FAT32 (LBA)
fedora-riscv64-d1-developer-xfce-rawhide-Rawhide-20211124-132603.n.0-sda.raw.img3 *     319488  1320959  1001472  489M 83 Linux
fedora-riscv64-d1-developer-xfce-rawhide-Rawhide-20211124-132603.n.0-sda.raw.img4      1320960 25319423 23998464 11.5G 83 Linux

create disk image file

create image file with dd

MEGA=16777216

dd if=/dev/zero bs=$MEGA count=1024 of=disk.img
echo -e "o\nn\np\n2\n69632\n319487\nn\np\n3\n319488\n1320959\nn\np\n4\n1320960\n\n\nt\n2\nc\na\n3\n\nw" | fdisk disk.img
fdisk -l disk.img

sudo losetup --show -f -P disk.img #/dev/loop1 sudo mkfs.vfat /dev/loop1p2 sudo mkfs.ext4 /dev/loop1p3 sudo mkfs.ext4 /dev/loop1p4

Download ubuntu riscv image for rootfs

https://wiki.ubuntu.com/RISC-V

https://cdimage.ubuntu.com/releases/21.04/release/

https://cdimage.ubuntu.com/releases/21.04/release/ubuntu-21.04-preinstalled-server-riscv64+unmatched.img.xz

take rootfs of ubuntu out

sudo losetup --show -f -P ubuntu-21.04-preinstalled-server-riscv64+unmatched.img # eg: /dev/loop1,depends on your linux system

sudo mount /dev/loop1p1 /mnt/p1
sudo tar cpjfv ubuntu-21.04-preinstalled-server-riscv64+unmatched_rootfs.tar.bz2 -C /mnt/p1/ .
sudo umount /mnt/p1
sudo losetup -D /dev/loop1 #dettach,release /dev/loop1

download link: https://mega.nz/file/IQFlWZKL#_ERlz3GXoUgxsIoaLHK8oQ2A6SNFcHhZpS2tF3N6RaQ
https://mega.nz/file/IIlAHKST#PP8feOr6tHxdbD-Zoyj64G4TfG7HG_1s3VHasisP6h0

prebuilt files

boot partition

ubuntu_2104_devterm_d1_boot.tar.bz2

https://mega.nz/file/NEsV1SRQ#FexV7wJhiUQKLcfBol4bB5m8UsX1O5qWet8geONclY4
https://mega.nz/file/YJUjiKKb#nrxH6BDvyGjpNSyZEzbRqbHk9ed9RE7jcuOPbTdximM

included files

├── board.dtb  
├── **boot**  
│ └── uEnv.txt  
├── config-5.4.61  
├── **efi**  
├── **extlinux**  
│ ├── extlinux.conf  
│ └── extlinux.conf.cpi.bak  
├── **grub2**  
│ └── **themes**  
│ └── **system**  
│ └── **background.png**  
├── grub.cfg  
├── System.map-5.4.61  
├── **uEnv.txt** -\> boot/uEnv.txt  
└── vmlinuz-5.4.61  

ubuntu_2104_devterm_d1_EFI.tar.bz2

https://mega.nz/file/kNUBRBIB#NsPzKTDWbfBSTth7-eVz9gPjeaEdYnP7PfuYGz28cOk

extlinux.conf is the file actually do the boot configuration

How to compile kernel

get kernel source

https://github.com/cuu/last_linux-5.4.git

it is a mirror kernel code from tina_d1_h of all winner with all patched for devterm d1

get toolchain

https://github.com/cuu/toolchain-thead-glibc download toolchain

simple step for compiling kernel

extract and put toolchain in any folder you like

then edit m.sh in last_linux-5.4

set correct path of toolchain for PATH

export PATH=/data/tina_d1_h/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/bin/:$PATH

to be

export PATH=/wherever_you_put_toolchain/riscv64-glibc-gcc-thead_20200702/bin/:$PATH

then simply run ./m.sh to compile kernel

we just simple use the prebuit toolchain from all-winner to compile the patched kernel code based on all-winner tina for devterm_d1

and we have to ,because allwinner prebuilt toolchain has the neccessary custom opcode for the kernel of d1

kernel patch url: https://github.com/clockworkpi/DevTerm/tree/main/Code/patch/d1

to get original tina code from allwinner ,visit https://open.allwinnertech.com/

Make alpha os image

required file list:

  • ubuntu_2104_devterm_d1_EFI.tar.bz2
  • ubuntu_2104_devterm_d1_boot.tar.bz2
  • ubuntu-21.04-preinstalled-server-riscv64+unmatched_rootfs.tar.bz2
  • boot0_sdcard_sun20iw1p1.bin
  • u-boot.toc1
  • disk.img with all partitions formatted
sudo losetup --show -f -P disk.img  ## assume we will have /dev/loop1
sudo dd if=boot0_sdcard_sun20iw1p1.bin of=/dev/loop1 bs=512 seek=16
sudo dd if=u-boot.toc1 of=/dev/loop1 bs=512 seek=32800

sudo mount /dev/loop1p2 /mnt/p2
sudo mount /dev/loop1p3 /mnt/p3
sudo mount /dev/loop1p4 /mnt/p4
sudo tar xpjfv  ubuntu_2104_devterm_d1_EFI.tar.bz2 -C /mnt/p2
sudo tar xpjfv  ubuntu_2104_devterm_d1_boot.tar.bz2  -C /mnt/p3
sudo tar xpjfv ubuntu-21.04-preinstalled-server-riscv64+unmatched_rootfs.tar.bz2  -C /mnt/p4

chroot part

sudo mount /dev/loop1p3 /mnt/p4/boot cd /mnt/p4

sudo mount --bind /dev dev/ sudo mount --bind /sys sys/ sudo mount --bind /proc proc/ sudo mount --bind /dev/pts dev/pts sudo chroot .

upgrade to devel

now we are in chroot

touch /etc/cloud/cloud-init.disabled
apt-get update && apt-get purge needrestart

then edit /etc/apt/source.list, replace all hirsute to devel then

apt update
apt-get dist-upgrade

wait a long time until upgrade done(or retry if failed,it is neccessary for having a newer xorg/mesa in riscv to display)

after upgrade

apt update 
apt install  mesa-utils libgl1-mesa-glx libglx-mesa0 libgles2-mesa libegl-mesa0 
apt install -y  xterm cmus alsamixergui qutebrowser elinks vim emacs tilde bc gnuplot dosbox chocolate-doom gimp xfig xpdf xaos x11-apps gkrellm  imagemagick inkscape
apt remove multipath-tools

add cpi user

useradd -m  cpi

#add into groups
usermod -a -G adm,dialout,cdrom,floppy,sudo,audio,dip,video,plugdev,netdev,lxd,pulse,pulse-access cpi

twm stuff

d1 use twm as default window manager for low resource usage

wget https://github.com/clockworkpi/DevTerm/blob/main/Code/R01/d1_twm.tar.bz2?raw=true

tar xpjfv d1_twm.tar.bz2 -C /home/cpi

chown -R cpi:cpi /home/cpi

xorg fbdev fix

rotate Xorg

ubuntu@ubuntu:~$ cat /etc/X11/xorg.conf.d/10-d1.conf  
Section "Device" 
        Identifier "FBDEV" 
        Driver "fbdev" 
        Option "fbdev" "/dev/fb0" 
        Option "Rotate" "cw" 
        Option          "SwapbuffersWait" "true" 
EndSection 
 
Section "Screen" 
        Identifier "Screen0" 
        Device "FBDEV" 
        DefaultDepth 24 
 
        Subsection "Display" 
                Depth 16 
                Modes "1280x480" "480x1280" 
        EndSubsection 
 
        Subsection "Display" 
                Depth 24 
                Modes "1280x480" "480x1280" 
        EndSubsection 
 
EndSection

reduce time of boot

sudo systemctl mask apt-daily.service apt-daily-upgrade.service
sudo systemctl disable apt-daily.service apt-daily-upgrade.service
sudo systemctl disable apt-daily.timer apt-daily-upgrade.timer

sudo systemctl disable NetworkManager-wait-online.service 
sudo systemctl disable systemd-random-seed.service

sudo systemctl disable  e2scrub_reap.service
sudo systemctl disable systemd-networkd-wait-online.service

sudo systemctl disable lvm2-monitor.service

sudo systemctl disable snapd.seeded.service 
sudo systemctl disable pppd-dns.service

sudo systemctl disable avahi-daemon.service
sudo systemctl disable ModemManager.service

sudo systemctl disable apport.service
sudo systemctl mask apport.service
sudo systemctl disable accounts-daemon.service
sudo systemctl mask accounts-daemon.service
sudo systemctl disable udisks2.service   

faster login

All scripts in /etc/update-motd.d/ transferred to other place or just deleted them all

Install devterm related package

wget -O - https://raw.githubusercontent.com/clockworkpi/apt/main/debian/KEY.gpg | sudo apt-key add -  

echo "deb https://raw.githubusercontent.com/clockworkpi/apt/main/debian/ stable main" | sudo tee  /etc/apt/sources.list.d/clockworkpi.list  

apt update

apt install devterm-audio-patch devterm-backlight-cpi devterm-fan-temp-daemon-rpi devterm-keyboard-firmware devterm-thermal-printer devterm-thermal-printer-cups devterm-wiringpi-cpi

get out chroot

exit
cd 

sudo umount /mnt/p4/dev/pts
sudo umount /mnt/p4/dev/
sudo umount /mnt/p4/proc
sudo umount /mnt/p4/sys
sudo umount /mnt/p4/boot

sudo umount /mnt/p3
sudo umount /mnt/p2
sudo umount /mnt/p4

sudo losetup -D /dev/loop1

Final part

now we have a chroot edited os image file disk.img in 16GB with ubuntu devel branch root fs

you can still use

sudo losetup --show -f -P disk.img  
sudo gparted /dev/loop1

to shrink the disk size to be like 8G or less to fit your sd card

then dd it into sd card

Clone this wiki locally