ยง2023-08-28

Official Hardkernel Ubuntu is using kernel 4.9 which breaks btrfs on ARM.

Use the latest unofficial Ubuntu image (at least 5.4) by @tobetter.

https://docs.linuxfactory.or.kr/install/odroidc4/image.html

sudo su -

parted /dev/mmcblk1 | mklabel msdos | mkpart p ext4 10M 210M | mkpart p btrfs 210M 100% | toggle 1 boot | quit

apt update apt install btrfs-progs nano

mkfs.ext4 -L boot /dev/mmcblk1p1 mkfs.btrfs -L root /dev/mmcblk1p2 mkdir /mnt/root mount /dev/mmcblk1p2 /mnt/root btrfs sub create /mnt/root/@ btrfs sub create /mnt/root/@swap umount /mnt/root mount -o subvol=@,noatime,compress=lzo,autodefrag /dev/mmcblk1p2 /mnt/root mkdir /mnt/root/swap mount -o subvol=@swap,noatime /dev/mmcblk1p2 /mnt/root/swap touch /mnt/root/swap/swapfile chmod 600 /mnt/root/swap/swapfile chattr +C /mnt/root/swap/swapfile fallocate /mnt/root/swap/swapfile -l6g mkswap /mnt/root/swap/swapfile swapon /mnt/root/swap/swapfile

Find the newest stage 3 on:

http://ftp.free.fr/mirrors/ftp.gentoo.org/releases/arm64/autobuilds/current-stage3-arm64/

TIMESTAMP="20210318T005104Z" STAGE3="stage3-arm64-$TIMESTAMP" wget http://ftp.free.fr/mirrors/ftp.gentoo.org/releases/arm64/autobuilds/current-stage3-arm64/$STAGE3.tar.xz tar xJf $STAGE3.tar.xz -C /mnt/root/

nano /mnt/root/etc/portage/make.conf | COMMON_FLAGS="-O2 -pipe -mcpu=cortex-a55 -mabi=lp64 -ftree-vectorize --param l1-cache-size=32 --param l1-cache-line-size=32 --param l2-cache-size=512" | CFLAGS="${COMMON_FLAGS}" | CXXFLAGS="${COMMON_FLAGS}" | FCFLAGS="${COMMON_FLAGS}" | FFLAGS="${COMMON_FLAGS}" | CHOST="aarch64-unknown-linux-gnu" | LDFLAGS="-Wl,-O1 -Wl,--as-needed" | MAKEOPTS="-j4" | CPU_FLAGS_ARM="edsp neon thumb vfp vfpv3 vfpv4 vfp-d32 crc32 v4 v5 v6 v7 v8 thumb2" | AUTOCLEAN="yes" | EMERGE_DEFAULT_OPTS="--with-bdeps=y --quiet-build=y" | | PORTAGE_COMPRESS="bzip2" | PORTAGE_COMPRESS_FLAGS="-9" | | ACCEPT_LICENSE="* -@EULA" | LINGUAS="en" | L10N="en" | USE="logrotate symlink"

cp -L /etc/resolv.conf /mnt/root/etc/ mount -t proc proc /mnt/root/proc mount --rbind /sys /mnt/root/sys mount --make-rslave /mnt/root/sys mount --rbind /dev /mnt/root/dev mount --make-rslave /mnt/root/dev

chroot /mnt/root /bin/bash source /etc/profile mount /dev/mmcblk1p1 /boot

emerge --sync mkdir /etc/portage/package.accept_keywords

echo "app-editors/joe **" >/etc/portage/package.accept_keywords/joe # Not yet available for arm64 emerge -av app-editors/joe nano -w /etc/bash/bashrc.d/joe | export EDITOR=jpico | alias pico=jpico | alias edit=jpico source /etc/bash/bashrc

passwd groupadd ssh-users useradd -c "John Doe" -m -G users,ssh-users jdoe # Copy the SSH keys once the users are created passwd jdoe pico /etc/ssh/sshd_config | - #HostKey /etc/ssh/ssh_host_ed25519_key | + HostKey /etc/ssh/ssh_host_ed25519_key | | - #PermitRootLogin prohibit-password | + PermitRootLogin no | | - #PasswordAuthentication yes | + PasswordAuthentication no | | - #ChallengeResponseAuthentication yes | + ChallengeResponseAuthentication no | | - UsePAM yes | + UsePAM no | | - #TCPKeepAlive yes | + TCPKeepAlive yes | | - #ClientAliveInterval 0 | - #ClientAliveCountMax 3 | + ClientAliveInterval 120 | + ClientAliveCountMax 30 | | + AllowGroups ssh-users | + KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256 | + Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr | + MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com rc-update add sshd default

pico /etc/locale.gen | + en_US.UTF-8 UTF-8 | + en_US ISO-8859-15 | #ja_JP.EUC-JP EUC-JP locale-gen pico /etc/env.d/02locale | LANG="en_US.utf8" cp /usr/share/zoneinfo/Europe/Berlin /etc/localtime pico /etc/timezone | Europe/Berlin

emerge -av app-eselect/eselect-repository eselect repository add odroidc4 git https://github.com/svoop/odroidc4-overlay emerge --sync

emerge -av sys-fs/btrfs-progs blkid # Get ROOT_UUID and BOOT_UUID pico /etc/fstab # Must not have an empty line at the end | UUID={ROOT_UUID} / btrfs defaults,subvol=@,noatime,compress=lzo,autodefrag 0 1 | UUID={ROOT_UUID} /swap btrfs defaults,subvol=@swap,noatime 0 0 | /swap/swapfile none swap sw 0 0 | UUID={BOOT_UUID} /boot ext4 defaults,noatime 0 2

pico /boot/boot.ini | ODROIDC4-UBOOT-CONFIG | | setenv bootlabel "Gentoo Linux" | | setenv fk_kvers "5.11.18-odroidc4" | # setenv fk_kvers "5.11.14-odroidc4" | | setenv root_uuid "{ROOT_UUID}" | setenv root_flags "defaults,subvol=@,noatime,compress=lzo,autodefrag" | setenv bootargs " ${bootargs} root=UUID=${root_uuid} rootflags=${root_flags}" | | setenv fdtfile "meson64_odroidc4.dtb" | setenv overlays "spi0 pcf8563" | | setenv bootargs "${bootargs} console=tty1 cma=800M clk_ignore_unused" | setenv bootargs "${bootargs} console=ttyAML0,115200n8" | | setenv fdt_addr_r "0x20000000" | setenv dtbo_addr_r "0x21000000" | setenv zimage_addr_r ${ramdisk_addr_r} | | load ${devtype} ${devnum}:${partition} ${fdt_addr_r} ${prefix}dtbs/${fk_kvers}/amlogic/${fdtfile} | if test -n "${overlays}"; then | fdt addr ${fdt_addr_r} | fdt resize 16384 | setenv overlay_path ${prefix}dtbs/${fk_kvers}/amlogic/overlays/odroid${variant} | for overlay in ${overlays}; do | load ${devtype} ${devnum}:${partition} ${dtbo_addr_r} ${overlay_path}/${overlay}.dtbo
| && fdt apply ${dtbo_addr_r} | done | fi | | load ${devtype} ${devnum}:${partition} ${zimage_addr_r} ${prefix}vmlinuz-${fk_kvers}
| && unzip ${zimage_addr_r} ${kernel_addr_r}
| && load ${devtype} ${devnum}:${partition} ${fdt_addr_r} ${prefix}dtb-${fk_kvers}
| && load ${devtype} ${devnum}:${partition} ${ramdisk_addr_r} ${prefix}initramfs-${fk_kvers}.img
| && echo "Booting ${bootlabel} ${fk_kvers} from ${devtype} ${devnum}:${partition}..."
| && booti ${kernel_addr_r} ${ramdisk_addr_r}:${filesize} ${fdt_addr_r}

pico /etc/inittab | # Architecture specific features | - f0:12345:respawn:/sbin/agetty 9600 ttyAMA0 vt100 | + f0:12345:respawn:/sbin/agetty 115200 ttyAML0 xterm-256color

emerge -av sys-apps/busybox pico /etc/conf.d/hostname | - hostname="localhost" | + hostname="odroidc4" pico /etc/conf.d/net | config_eth0="dhcp" ln -s net.lo /etc/init.d/net.eth0 rc-update add net.eth0 default pico /etc/hosts | - 127.0.0.1 localhost | - ::1 localhost | + 127.0.0.1 odroidc4.example.com odroidc4 localhost | + ::1 odroidc4.exmaple.com odroidc4 localhost

pico /etc/sysctl.conf | - #kernel.panic = 3 | + kernel.panic = 3

emerge -q --sync emerge -a --update --deep --newuse @world emerge -av @world emerge -a --update --deep --newuse @world dispatch-conf

emerge -av sys-kernel/dracut sys-apps/dtc

emerge -av sys-kernel/odroidc4-sources echo "sys-kernel/odroidc4-sources" >/etc/portage/package.accept_keywords/odroidc4-sources emerge -av odroidc4-sources

Follow the instructions to get a vanilla .config and install the kernel

Use the latest pre-compiled u-boot by Hardkernel.

https://github.com/hardkernel/u-boot/releases

cd RELEASE="189" wget https://github.com/hardkernel/u-boot/releases/download/travis%2Fodroidc4-$RELEASE/u-boot-odroidc4-$RELEASE.tar.gz tar xzf u-boot-odroidc4-.tar.gz mv sd_fuse/u-boot.bin /boot chown root:root /boot/u-boot.bin rm -rf sd_fuse u-boot-odroidc4- dd if=/boot/u-boot.bin of=/dev/mmcblk1 conv=fsync,notrunc bs=512 seek=1 sync

umount /boot exit

swapoff /mnt/root/swap/swapfile umount /mnt/root/swap umount -l /mnt/root/dev{/shm,/pts,} umount -R /mnt/root{/sys,/proc} lsof | grep /mnt/root # Check if anything is still busy on /mnt/root umount /mnt/root

sync shutdown -r now

emerge -av net-misc/ntp rc-service ntp-client start rc-service ntpd start rc-update add ntpd hwclock -w --utc

emerge -av app-portage/gentoolkit sys-apps/usbutils