Skip to content

Create OS image from scratch (Ubuntu)

emutyworks edited this page Jul 17, 2022 · 10 revisions

*This procedure boots but does not work properly. Please read it for reference only.

*This procedure was done with WSL2 (LxRunOffline/Ubuntu 21.10).

- Prepare
$ sudo apt update
$ sudo apt install -y gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu qemu-user-static
$ sudo apt install -y build-essential bison flex swig python3-dev libssl-dev bzip2 libncurses5-dev libncursesw5-dev

- SPL(Boot0)
$ 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

- OpenSBI
$ 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

- U-boot
$ 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
----------
Deveice Drivers --->
  MMC Host controller Support  --->
    [*] Poll for broken card detection case
----------
$ make CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv u-boot.bin u-boot.dtb

- Build u-boot.toc1
$ vi toc1.cfg
----------
[opensbi]
file = fw_dynamic.bin
addr = 0x40000000
[dtb]
file = u-boot.dtb
addr = 0x44000000
[u-boot]
file = u-boot.bin
addr = 0x4a000000
----------
$ cp ../opensbi/build/platform/generic/firmware/fw_dynamic.bin .
$ tools/mkimage -T sunxi_toc1 -d toc1.cfg u-boot.toc1
$ popd

- Download this file
ubuntu-21.04-preinstalled-server-riscv64+unmatched_rootfs.tar.bz2
https://mega.nz/file/IQFlWZKL#_ERlz3GXoUgxsIoaLHK8oQ2A6SNFcHhZpS2tF3N6RaQ
ubuntu_2104_devterm_d1_boot.tar.bz2
https://mega.nz/file/NEsV1SRQ#FexV7wJhiUQKLcfBol4bB5m8UsX1O5qWet8geONclY4
ubuntu_2104_devterm_d1_EFI.tar.bz2
https://mega.nz/file/kNUBRBIB#NsPzKTDWbfBSTth7-eVz9gPjeaEdYnP7PfuYGz28cOk

- Create disk image file
$ MEGA=16777216
$ sudo dd if=/dev/zero bs=$MEGA count=1024 of=disk.img
$ sudo 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" | sudo fdisk disk.img
$ sudo fdisk -l disk.img
----------
Device     Boot   Start      End  Sectors  Size Id Type
disk.img2         69632   319487   249856  122M  c W95 FAT32 (LBA)
disk.img3  *     319488  1320959  1001472  489M 83 Linux
disk.img4       1320960 33554431 32233472 15.4G 83 Linux
----------

$ sudo losetup --show -f -P disk.img
----------
/dev/loop0
----------
$ sudo mkfs.vfat /dev/loop0p2
$ sudo mkfs.ext4 /dev/loop0p3
$ sudo mkfs.ext4 /dev/loop0p4

- Make alpha os image
$ sudo dd if=sun20i_d1_spl/nboot/boot0_sdcard_sun20iw1p1.bin of=/dev/loop0 bs=512 seek=16
$ sudo dd if=u-boot/u-boot.toc1 of=/dev/loop0 bs=512 seek=32800

$ sudo mkdir -p /mnt/p2 /mnt/p3 /mnt/p4
$ sudo mount /dev/loop0p2 /mnt/p2
$ sudo mount /dev/loop0p3 /mnt/p3
$ sudo mount /dev/loop0p4 /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/loop0p3 /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 .

$ touch /etc/cloud/cloud-init.disabled
$ apt remove update-notifier-common
$ apt-get update && apt-get purge needrestart

$ vi /etc/apt/sources.list
----------
*replace all "hirsute" to "devel"
----------
$ apt update
$ apt-get dist-upgrade

$ apt update
$ apt install mesa-utils libgl1-mesa-glx libglx-mesa0 libgles2-mesa libegl-mesa0
$ apt install 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

$ useradd -m cpi
$ usermod -a -G adm,dialout,cdrom,floppy,sudo,audio,dip,video,plugdev,netdev,lxd,pulse,pulse-access cpi

$ 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

$ vi /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 24
    Modes "1280x480" "480x1280"
  EndSubsection
EndSection
----------

$ 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

$ curl https://raw.githubusercontent.com/clockworkpi/apt/main/debian/KEY.gpg | sudo tee /etc/apt/trusted.gpg.d/clockworkpi.asc
$ 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-keyboard-firmware devterm-thermal-printer devterm-thermal-printer-cups devterm-wiringpi-cpi

$ exit
$ cd
$ sudo umount /mnt/p4/dev/pts
$ sudo umount -l /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/loop0

- Copy "extlinux.conf.cpi.bak" to "extlinux.conf"
$ sudo losetup --show -f -P disk.img
----------
/dev/loop1
----------
$ sudo mount /dev/loop1p3 /mnt/p3
$ cd /mnt/p3/extlinux
$ sudo cp extlinux.conf extlinux.conf.org
$ sudo cp extlinux.conf.cpi.bak extlinux.conf
$ cd ~
$ sudo umount /mnt/p3
$ sudo losetup -D /dev/loop1

*Please flash "disk.img" to Micro SD Card with balenaEtcher.