Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·Π° Ubuntu для ARM Β«from scratchΒ»

Когда Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ начинаСтся часто Π΅Ρ‰Π΅ нСпонятно ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΏΠΎΠΉΠ΄ΡƒΡ‚ Π² Ρ†Π΅Π»Π΅Π²ΡƒΡŽ rootfs.

Π˜Π½Ρ‹ΠΌΠΈ словами Ρ…Π²Π°Ρ‚Π°Ρ‚ΡŒΡΡ Π·Π° LFS, buildroot ΠΈΠ»ΠΈ yocto (ΠΈΠ»ΠΈ Π΅Ρ‰Π΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ) Π΅Ρ‰Π΅ Ρ€Π°Π½ΠΎ, Π° Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ ΡƒΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ. Для Π±ΠΎΠ³Π°Ρ‚Ρ‹Ρ… (Ρƒ мСня Π½Π° ΠΏΠΈΠ»ΠΎΡ‚Π½Ρ‹Ρ… ΠΎΠ±Ρ€Π°Π·Ρ†Π°Ρ… 4GB eMMC) Π΅ΡΡ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄ Ρ€Π°Π·Π΄Π°Ρ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ дистрибутив, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Ρ‡Π΅Π³ΠΎ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ всСгда ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ списки ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΈ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ список для Ρ†Π΅Π»Π΅Π²ΠΎΠΉ rootfs.

Данная ΡΡ‚Π°Ρ‚ΡŒΡ Π½Π΅ нСсСт Π² сСбС Π½ΠΎΠ²ΠΈΠ·Π½Ρ‹ ΠΈ прСдставляСт ΠΈΠ· сСбя ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ copy-paste ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ.

ЦСль ΡΡ‚Π°Ρ‚ΡŒΠΈ сборка Ubuntu rootfs для ARM Π±ΠΎΡ€Π΄Ρ‹ (Π² ΠΌΠΎΠ΅ΠΌ случаС Π½Π° Π±Π°Π·Π΅ Colibri imx7d).

Π‘Π±ΠΎΡ€ΠΊΠ° ΠΎΠ±Ρ€Π°Π·Π°

Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ rootfs для тираТирования.

РаспаковываСм Ubuntu Base

Π Π΅Π»ΠΈΠ· Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ сами исходя ΠΈΠ· нСобходимости ΠΈ собствСнных ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠΉ. Π—Π΄Π΅ΡΡŒ я ΠΏΡ€ΠΈΠ²Π΅Π» 20.

$ mkdir ubuntu20
$ cd ubuntu20
$ mkdir rootfs
$ wget http://cdimage.ubuntu.com/ubuntu-base/releases/20.04/release/ubuntu-base-20.04-base-armhf.tar.gz
$ tar xf ubuntu-base-20.04-base-armhf.tar.gz -C rootfs

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ BINFMT Π² ядрС

Если Ρƒ вас распространСнный дистрибутив, Ρ‚ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° BINFMT_MISC Π΅ΡΡ‚ΡŒ ΠΈ всС настроСно, Ссли Π½Π΅Ρ‚ β€” Ρ‚ΠΎ я ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅ ΠΊΠ°ΠΊ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ BINFMT Π² ядрС.

Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ BINFMT_MISC Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ Π² ядрС:

$ zcat /proc/config.gz | grep BINFMT
CONFIG_BINFMT_ELF=y
CONFIG_COMPAT_BINFMT_ELF=y
CONFIG_BINFMT_SCRIPT=y
CONFIG_BINFMT_MISC=y

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°Π΄ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ настройки:

$ ls /proc/sys/fs/binfmt_misc
qemu-arm  register  status
$ cat /proc/sys/fs/binfmt_misc/qemu-arm
enabled
interpreter /usr/bin/qemu-arm
flags: OC
offset 0
magic 7f454c4601010100000000000000000002002800
mask ffffffffffffff00fffffffffffffffffeffffff

Π—Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²ΠΎΡ‚ этой инструкции.

Настройка qemu static arm

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ понадобится экзСмпляр qemu собранный статичСски.

!!! Π’ΠΠ˜ΠœΠΠΠ˜Π•!!!
Если Π²Ρ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ для сборки Ρ‡Π΅Π³ΠΎ Π»ΠΈΠ±ΠΎ, ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ:
https://sourceware.org/bugzilla/show_bug.cgi?id=23960
https://bugs.launchpad.net/qemu/+bug/1805913
Π’ΠΎΠ³Π΄Π° для x86_64 host ΠΈ arm guest Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ i386 Π²Π΅Ρ€ΡΠΈΡŽ qemu:
http://ftp.ru.debian.org/debian/pool/main/q/qemu/qemu-user-static_5.0-13_i386.deb

$ wget http://ftp.debian.org/debian/pool/main/q/qemu/qemu-user-static_5.0-13_amd64.deb
$ alient -t qemu-user-static_5.0-13_amd64.deb
# ΠΏΡƒΡ‚ΡŒ Π² rootfs ΠΈ имя исполняСмого Ρ„Π°ΠΉΠ»Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ с /proc/sys/fs/binfmt_misc/qemu-arm
$ mkdir qemu
$ tar xf qemu-user-static-5.0.tgz -C qemu
$ file qemu/usr/bin/qemu-arm-static
qemu/usr/bin/qemu-arm-static: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=be45f9a321cccc5c139cc1991a4042907f9673b6, for GNU/Linux 3.2.0, stripped
$ cp qemu/usr/bin/qemu-arm-static rootfs/usr/bin/qemu-arm
$ file rootfs/usr/bin/qemu-arm
rootfs/usr/bin/qemu-arm: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=be45f9a321cccc5c139cc1991a4042907f9673b6, for GNU/Linux 3.2.0, stripped

Chroot

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ скрипт:

ch-mount.sh

#!/bin/bash

function mnt() {
    echo "MOUNTING"
    sudo mount -t proc /proc proc
    sudo mount --rbind /sys sys
    sudo mount --make-rslave sys
    sudo mount --rbind /dev dev
    sudo mount --make-rslave dev
    sudo mount -o bind /dev/pts dev/pts
    sudo chroot 
}

function umnt() {
    echo "UNMOUNTING"
    sudo umount proc
    sudo umount sys
    sudo umount dev/pts
    sudo umount dev

}

if [ "$1" == "-m" ] && [ -n "$2" ] ;
then
    mnt $1 $2
elif [ "$1" == "-u" ] && [ -n "$2" ];
then
    umnt $1 $2
else
    echo ""
    echo "Either 1'st, 2'nd or both parameters were missing"
    echo ""
    echo "1'st parameter can be one of these: -m(mount) OR -u(umount)"
    echo "2'nd parameter is the full path of rootfs directory(with trailing '/')"
    echo ""
    echo "For example: ch-mount -m /media/sdcard/"
    echo ""
    echo 1st parameter : 
    echo 2nd parameter : 
fi

Π›ΡŽΠ±ΡƒΠ΅ΠΌΡΡ Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

$ ./ch-mount.sh -m rootfs/
# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
# uname -a
Linux NShubin 5.5.9-gentoo-x86_64 #1 SMP PREEMPT Mon Mar 16 14:34:52 MSK 2020 armv7l armv7l armv7l GNU/Linux

Π Π°Π΄ΠΈ интСрСса Π·Π°ΠΌΠ΅Ρ€ΠΈΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π΄ΠΎ ΠΈ послС установки минимального (для мСня) Π½Π°Π±ΠΎΡ€Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²:

# du -d 0 -h / 2>/dev/null
63M     /

Обновим:

# apt update
# apt upgrade --yes

Установим ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΠ΅ нас ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹:

# SYSTEMD_IGNORE_CHROOT=yes apt install --yes autoconf kmod socat ifupdown ethtool iputils-ping net-tools ssh g++ iproute2 dhcpcd5 incron ser2net udev systemd gcc minicom vim cmake make mtd-utils util-linux git strace gdb libiio-dev iiod

Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ядра, ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, это ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€. Π—Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ, ядро, ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, device tree Ρ‡Π΅Ρ€Π΅Π· Ubuntu ΠΌΡ‹ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅ Π½Π΅ поставим. Они ΠΏΡ€ΠΈΠ΄ΡƒΡ‚ ΠΊ Π½Π°ΠΌ ΠΈΠ·Π²Π½Π΅ ΠΈΠ»ΠΈ сами собСрСм ΠΈΠ»ΠΈ Π½Π°ΠΌ ΠΈΡ… выдаст ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ Π±ΠΎΡ€Π΄Ρ‹, Π² любом случаС это Π·Π° Π³Ρ€Π°Π½ΡŒΡŽ Π΄Π°Π½Π½ΠΎΠΉ инструкции.

Π”ΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ стСпСни расхоТдСниС вСрсий допустимо, Π½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ Π²Π·ΡΡ‚ΡŒ ΠΈΡ… со сборки ядра.

# apt install --yes linux-headers-generic

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Π½Π΅ΠΌΠ°Π»ΠΎ:

# apt clean
# du -d 0 -h / 2>/dev/null
770M    /

НС Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ.

ΠŸΠ°ΠΊΡƒΠ΅ΠΌ ΠΎΠ±Ρ€Π°Π·

$ sudo tar -C rootfs --transform "s|^./||" --numeric-owner --owner=0 --group=0 -c ./ | tar --delete ./ | gzip > rootfs.tar.gz

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ etckeeper с настройкой autopush

Ну допустим Ρ€Π°Π·Π΄Π°Π»ΠΈ ΠΌΡ‹ Π½Π°ΡˆΡƒ сборку, Ρ€Π°Π±ΠΎΡ‚Π° пошла, ΠΊΠ°ΠΊ Π»ΡƒΡ‡ΡˆΠ΅ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΌ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ вСрсии нашСй систСмы.

На ΠΏΠΎΠΌΠΎΡ‰ΡŒ Π½Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΉΡ‚ΠΈ etckeeper.

Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ Π»ΠΈΡ‡Π½ΠΎΠ΅ Π΄Π΅Π»ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ:

  • ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ Π²Π΅Ρ‚ΠΊΠΈ
  • Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ устройства
  • Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ force push
  • ΠΈ Ρ‚.Π΄. …
# ssh-keygen
# apt install etckeeper
# etckeeper init
# cd /etc
# git remote add origin ...

Настроим autopush

МоТСм ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΆΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π²Π΅Ρ‚ΠΊΠΈ Π½Π° устройствС (допустим ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ скрипт ΠΈΠ»ΠΈ слуТбу, которая ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ запускС).

# cat /etc/etckeeper/etckeeper.conf
PUSH_REMOTE="origin"

А ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ Ρ…ΠΈΡ‚Ρ€Π΅Π΅…

Π›Π΅Π½ΠΈΠ²Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ

ΠŸΡƒΡΡ‚ΡŒ Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, допустим сСрийный Π½ΠΎΠΌΠ΅Ρ€ процСссора (Π½Ρƒ ΠΈΠ»ΠΈ MAC β€” ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΏΠΎΠΊΡƒΠΏΠ°ΡŽΡ‚ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½):

cat /proc/cpuinfo

# cat /proc/cpuinfo
processor       : 0
model name      : ARMv7 Processor rev 5 (v7l)
BogoMIPS        : 60.36
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm 
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xc07
CPU revision    : 5

processor       : 1
model name      : ARMv7 Processor rev 5 (v7l)
BogoMIPS        : 60.36
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm 
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xc07
CPU revision    : 5

Hardware        : Freescale i.MX7 Dual (Device Tree)
Revision        : 0000
Serial          : 06372509

Π’ΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для ΠΈΠΌΠ΅Π½ΠΈ Π²Π΅Ρ‚ΠΊΠΈ Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡƒΡˆΠΈΡ‚ΡŒ:

# cat /proc/cpuinfo | grep Serial | cut -d':' -f 2 | tr -d [:blank:]
06372509

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ простой скрипт:

# cat /etc/etckeeper/commit.d/40myown-push
#!/bin/sh
set -e

if [ "$VCS" = git ] && [ -d .git ]; then
  branch=$(cat /proc/cpuinfo | grep Serial | cut -d':' -f 2 | tr -d [:blank:])
  cd /etc/
  git push origin master:${branch}
fi

И всё β€” Ρ‡Π΅Ρ€Π΅Π· Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ измСнСния ΠΈ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ список ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² для Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ.

Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹

BINFMT_MISC
Kernel Support for miscellaneous Binary Formats (binfmt_misc)
Compiling with qemu user chroot
Building Ubuntu rootfs for ARM
How to create a custom Ubuntu live from scratch
Crossdev qemu-static-user-chroot
etckeeper

ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° getdents64

readdir() returns NULL (errno=EOVERFLOW) for 32-bit user-static qemu on 64-bit host
Ext4 64 bit hash breaks 32 bit glibc 2.28+
compiler_id_detection fails for armhf when using QEMU user-mode emulation
CMake doesn’t work properly under qemu-arm

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com