Created Create DevTerm R01 OS image from scratch (markdown)

GNU 2022-05-06 15:50:54 +08:00
parent 25c00c6947
commit 54bf6fee7d

@ -0,0 +1,400 @@
# 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](Assets/Image%202022-04-11%20112248.png)
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](Assets/Image%202022-04-10%20192110.png)
# 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