Ke hana nei i kahi kiʻi ʻo Ubuntu no ARM "mai ka ʻōpala"

I ka hoʻomaka ʻana o ka hoʻomohala ʻana, ʻaʻole maopopo pinepine i nā pūʻolo e hele i nā rootfs.

I nā huaʻōlelo ʻē aʻe, ua hiki wawe ka hopu ʻana iā LFS, buildroot a yocto (a i ʻole kekahi mea ʻē aʻe), akā pono ʻoe e hoʻomaka. No ka poʻe waiwai (loaʻa iaʻu he 4GB eMMC ma nā hoʻohālike pilote) aia kahi ala e hāʻawi aku ai i nā mea hoʻomohala i kahi mahele e hiki ai iā lākou ke hāʻawi koke i kahi mea i nalowale i kēia manawa, a laila hiki iā mākou ke hōʻiliʻili mau i nā papa inoa o nā pūʻolo a hana i kahi papa inoa no nā kumu kumu.

ʻAʻole mea hou kēia ʻatikala a he ʻōlelo aʻoaʻo kope maʻalahi.

ʻO ke kumu o ka ʻatikala ke kūkulu ʻana i nā rootfs ʻo Ubuntu no nā papa ARM (i koʻu hihia, e pili ana iā Colibri imx7d).

Ke kūkulu ʻana i kiʻi

Hoʻohui mākou i nā rootfs i hoʻopaʻa ʻia no ka hana hou ʻana.

Wehe i ka waihona ʻo Ubuntu

Koho mākou i ka hoʻokuʻu ʻana ma muli o ka pono a me kā mākou makemake ponoʻī. Eia au i haawi aku ai i 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

Ke nānā nei i ke kākoʻo BINFMT ma ka kernel

Inā loaʻa iā ʻoe kahi mahele maʻamau, a laila aia ke kākoʻo no BINFMT_MISC a ua hoʻonohonoho ʻia nā mea āpau, inā ʻaʻole, a laila maopopo wau ua ʻike ʻoe pehea e hiki ai i ke kākoʻo BINFMT i ka kernel.

E hōʻoia i ka hiki ʻana o BINFMT_MISC i ka kernel:

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

I kēia manawa pono ʻoe e nānā i nā hoʻonohonoho:

$ 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

Hiki iā ʻoe ke hoʻopaʻa inoa me ka lima me ka hoʻohana ʻana, no ka laʻana, eia keia mau kuhikuhi.

Hoʻonohonoho ʻana i ka lima static qemu

I kēia manawa pono mākou i kahi laʻana qemu i hui pū ʻia.

!!! HOOLAHA!!!
Inā hoʻolālā ʻoe e hoʻohana i kahi pahu e kūkulu i kekahi mea, e nānā:
https://sourceware.org/bugzilla/show_bug.cgi?id=23960
https://bugs.launchpad.net/qemu/+bug/1805913
A laila no ka x86_64 host a me ka malihini lima pono ʻoe e hoʻohana i ka mana i386 o 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

ʻO Chroot

Palapala maʻalahi:

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

Mahalo mākou i ka hopena:

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

No ka leʻaleʻa wale, e ana kāua i ka nui ma mua a ma hope o ka hoʻokomo ʻana i ka liʻiliʻi (noʻu) nā pūʻolo:

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

E hōʻano hou kākou:

# apt update
# apt upgrade --yes

E hoʻokomo i nā pūʻolo a mākou e makemake 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

He mea ʻokoʻa nā faila poʻomanaʻo Kernel a me nā modula. ʻOiaʻiʻo, ʻaʻole mākou e hoʻokomo i ka bootloader, kernel, modules, device tree ma o Ubuntu. E hele mai lākou iā mākou mai waho mai a i ʻole e hōʻuluʻulu mākou iā lākou iho a i ʻole e hāʻawi ʻia iā mākou e ka mea hana papa, inā ʻaʻole kēia ma waho o ke ʻano o kēia ʻōlelo aʻo.

I kekahi ʻano, ʻae ʻia ka divergence version, akā ʻoi aku ka maikaʻi o ka lawe ʻana iā lākou mai ka hana kernel.

# apt install --yes linux-headers-generic

E ʻike kākou i ka mea i hana ʻia a ua nui ka hopena:

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

Mai poina e hoʻonoho i ka ʻōlelo huna.

Hoʻopili i ke kiʻi

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

Eia hou, hiki iā mākou ke hoʻokomo i ka etckeeper me ka hoʻonohonoho autopush

ʻAe, e ʻōlelo mākou ua puʻunaue mākou i kā mākou hui, hoʻomaka ka hana i ka maikaʻi o ka hōʻuluʻulu ʻana i nā ʻano like ʻole o kā mākou ʻōnaehana.

hiki i ka mea mālama ke kōkua iā mākou.

He mea pilikino ka palekana:

  • hiki iā ʻoe ke pale i kekahi mau lālā
  • hana i kahi kī kū hoʻokahi no kēlā me kēia mea hana
  • hoʻopaʻa ikaika
  • etc. ...
# ssh-keygen
# apt install etckeeper
# etckeeper init
# cd /etc
# git remote add origin ...

E hoʻonohonoho kāua i ka autopush

Hiki iā mākou, ʻoiaʻiʻo, hana i nā lālā ma ka hāmeʻa ma mua (e ʻōlelo mākou e hana mākou i kahi palapala a i ʻole kahi lawelawe e holo i ka manawa mua i hoʻomaka ʻia).

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

A i ʻole hiki iā mākou ke hana i kahi mea naʻauao ...

Ala palaualelo

E loaʻa iā mākou kekahi ʻano mea ʻike kūʻokoʻa, e ʻōlelo i ka helu serial o ka mea hana (a i ʻole MAC - kūʻai nā ʻoihana koʻikoʻi i ka laulā):

pōpoki / 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

A laila hiki iā mākou ke hoʻohana iā ia no ka inoa o ka lālā a mākou e pana ai:

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

E hana kākou i palapala maʻalahi:

# 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

A ʻo ia wale nō - ma hope o kekahi manawa hiki iā mākou ke nānā i nā loli a hana i kahi papa inoa o nā pūʻolo no ka firmware target.

Mea paipai ʻia

BINFMT_MISC
Kākoʻo Kernel no nā ʻano helu binary like ʻole (binfmt_misc)
Hoʻopili pū me ka mea hoʻohana qemu chroot
Ke kūkulu ʻana i nā rootfs ʻo Ubuntu no ARM
Pehea e hana ai i kahi ola Ubuntu maʻamau mai ka wā kahiko
Crossdev qemu-static-user-chroot
kahu mālama

getdents64 pilikia

readdir () hoʻihoʻi i ka NULL (errno=EOVERFLOW) no 32-bit mea hoʻohana-static qemu ma 64-bit host
ʻO Ext4 64 bit hash i haki i ka 32 bit glibc 2.28+
Compiler_id_detection nele no armhf ke hoʻohana i ka QEMU mea hoʻohana-mode emulation
ʻAʻole hana pono ʻo CMake ma lalo o ka lima qemu

Source: www.habr.com