Fausia se ata Ubuntu mo le ARM "mai le sasa"

A faatoa amata le atinaʻe, e masani ona le manino poʻo fea afifi o le a alu i le rootfs sini.

I se isi faaupuga, ua vave tele e puʻe le LFS, buildroot poʻo le yocto (poʻo se isi mea), ae ua uma ona e manaʻomia e amata. Mo le au mauoa (O loʻo ia te aʻu le 4GB eMMC i luga o faʻataʻitaʻiga pailate) o loʻo i ai se auala e tufatufa atu ai i le au atinaʻe se tufatufaga o le a mafai ai ona latou vave tuʻuina atu se mea o loʻo misi nei, ona mafai lea ona matou aoina mai lisi o afifi ma fai se lisi mo o a'a sini.

O lenei tusiga e le fou ma o se faʻatonuga faigofie kopi-faʻapipiʻi.

O le faʻamoemoega o le tusiga o le fausia lea o Ubuntu rootfs mo laupapa ARM (i loʻu tulaga, faʻavae ile Colibri imx7d).

Fausia le ata

Matou te fa'apipi'iina a'a fa'atatau mo le toe faia.

Tatalaina le Ubuntu Base

Matou te filifilia le faʻamalolo e faʻatatau i manaʻoga ma o matou lava manaʻoga. O lea ua ou tuuina atu le 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

Siaki le lagolago BINFMT i le fatu

Afai ei ai sau tufatufa masani, ona i ai lea o le lagolago mo BINFMT_MISC ma ua faʻatulagaina mea uma, pe a leai, ona ou mautinoa lea e te iloa le auala e mafai ai e le BINFMT le lagolago ile fatu.

Ia mautinoa ua mafai BINFMT_MISC i le fatu:

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

O lea la e tatau ona e siaki tulaga:

$ 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

E mafai ona e lesitala ma le lima e faʻaaoga ai, mo se faʻataʻitaʻiga, o faatonuga nei.

Fa'atūina le lima static qemu

Ole taimi nei tatou te manaʻomia se faʻataʻitaʻiga qemu faʻapipiʻiina.

!!! FAAMATALAGA!!!
Afai e te fuafua e faʻaaoga se atigipusa e fau ai se mea, siaki:
https://sourceware.org/bugzilla/show_bug.cgi?id=23960
https://bugs.launchpad.net/qemu/+bug/1805913
Ona mo le x86_64 talimalo ma lima malo e te manaʻomia le faʻaogaina o le i386 version o le 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

Fa'amatalaga faigofie:

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

Matou te faamemelo i le taunuuga:

$ ./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

Naʻo le malie, seʻi o tatou fuaina le tele aʻo leʻi faʻapipiʻi ma pe a uma ona faʻapipiʻi le laʻititi (mo aʻu) seti o afifi:

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

Tatou fa'afou:

# apt update
# apt upgrade --yes

Tatou fa'apipi'i afifi tatou te fiafia i ai:

# 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

Kernel ulutala faila ma modules o se mataupu ese. Ioe, matou te le faʻapipiʻi le bootloader, kernel, modules, masini masini e ala i le Ubuntu. O le a latou o mai ia i matou mai fafo pe matou te faʻapotopotoina i latou lava pe o le a tuʻuina mai ia i matou e le kamupani gaosi oloa, i soʻo se tulaga e sili atu i le lautele o lenei faatonuga.

I se isi itu, e talia le eseesega o lomiga, ae sili atu le ave mai le fatu fatu.

# apt install --yes linux-headers-generic

Seʻi o tatou vaʻai i le mea na tupu ma na iʻu ai i le tele o mea:

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

Aua nei galo e seti se upu faataga.

Fa'apipi'i le ata

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

E le gata i lea, e mafai ona matou faʻapipiʻi etckeeper ma le faʻaogaina o le autopush

Ia, seʻi tatou fai atu na matou tufatufaina atu la matou faʻapotopotoga, na amata le galuega i le auala sili e faʻapipiʻi mulimuli ai lomiga eseese o la matou polokalama.

e mafai ona sau le isi tagata e fesoasoani mai.

O le saogalemu o se mataupu patino:

  • e mafai ona e puipuia nisi lala
  • faia se ki tulaga ese mo masini taitasi
  • fa'amalo fa'amalosi le tulei
  • ma isi. ...
# ssh-keygen
# apt install etckeeper
# etckeeper init
# cd /etc
# git remote add origin ...

Tatou setiina le autopush

E mafai, ioe, faia ni lala i luga o le masini i le taimi muamua (seʻi tatou fai atu tatou te faia se tusitusiga poʻo se auaunaga o le a faʻatautaia i le taimi muamua e faʻalauiloa ai).

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

Pe mafai ona tatou faia se mea e sili atu le atamai...

Auala paie

Sei o tatou maua se ituaiga o faʻamatalaga tulaga ese, fai mai le numera o le gaioiga (poʻo le MAC - faʻatau e kamupani ogaoga le laina):

pusi / faʻatau / 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

Ona mafai lea ona tatou faʻaaogaina mo le igoa ole lala o le a tatou tuleia i ai:

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

Sei o tatou faia se tala faigofie:

# 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

Ma e pau lava - a maeʻa sina taimi e mafai ona tatou vaʻavaʻai i suiga ma faia se lisi o afifi mo le firmware faʻamoemoe.

Mea e fautuaina

BINFMT_MISC
Lagolago Kernel mo Fa'asologa Fa'alua eseese (binfmt_misc)
Tu'ufa'atasi ma le qemu user chroot
Fausia Ubuntu rootfs mo ARM
Faʻafefea ona fatuina se masani Ubuntu ola mai le sasa
Crossdev qemu-static-user-chroot
ma isi tausi

getdents64 faafitauli

readdir() toe faafoi NULL (errno=EOVERFLOW) mo le 32-bit user-static qemu ile 64-bit host
Ext4 64 bit hash male 32 bit glibc 2.28+
compiler_id_detection le manuia mo armhf pe a faʻaaogaina QEMU faʻaoga-faiga faʻaoga
E le aoga le CMake i lalo o le qemu-arm

puna: www.habr.com