ื™ืฆื™ืจืช ืชืžื•ื ืช ืื•ื‘ื•ื ื˜ื• ืขื‘ื•ืจ ARM "ืžืืคืก"

ื›ืืฉืจ ื”ืคื™ืชื•ื— ืจืง ืžืชื—ื™ืœ, ืœืจื•ื‘ ืœื ื‘ืจื•ืจ ืื™ืœื• ื—ื‘ื™ืœื•ืช ื™ืขื‘ืจื• ืœ-rootfs ื”ื™ืขื“.

ื‘ืžื™ืœื™ื ืื—ืจื•ืช, ื–ื” ืžื•ืงื“ื ืžื“ื™ ืœืชืคื•ืก LFS, buildroot ืื• yocto (ืื• ืžืฉื”ื• ืื—ืจ), ืื‘ืœ ืืชื” ื›ื‘ืจ ืฆืจื™ืš ืœื”ืชื—ื™ืœ. ืœืขืฉื™ืจื™ื (ื™ืฉ ืœื™ 4GB eMMC ื‘ื“ื•ื’ืžื™ื•ืช ืคื™ื™ืœื•ื˜) ื™ืฉ ืžื•ืฆื ืœื”ืคื™ืฅ ืœืžืคืชื—ื™ื ื”ืคืฆื” ืฉืชืืคืฉืจ ืœื”ื ืœื”ืขื‘ื™ืจ ื‘ืžื”ื™ืจื•ืช ืžืฉื”ื• ืฉื—ืกืจ ื›ืจื’ืข, ื•ืื– ืชืžื™ื“ ื ื•ื›ืœ ืœืืกื•ืฃ ืจืฉื™ืžื•ืช ืฉืœ ื—ื‘ื™ืœื•ืช ื•ืœื™ืฆื•ืจ ืจืฉื™ืžื” ืขื‘ื•ืจ ืฉื•ืจืฉื™ ื”ื™ืขื“.

ืžืืžืจ ื–ื” ืื™ื ื• ื—ื“ืฉ ื•ื”ื•ื ื”ื•ืจืื” ืคืฉื•ื˜ื” ืœื”ืขืชื™ืง-ื”ื“ื‘ืง.

ืžื˜ืจืช ื”ืžืืžืจ ื”ื™ื ืœื‘ื ื•ืช ืื•ื‘ื•ื ื˜ื• rootfs ืขื‘ื•ืจ ืœื•ื—ื•ืช ARM (ื‘ืžืงืจื” ืฉืœื™, ืžื‘ื•ืกืก ืขืœ Colibri imx7d).

ื‘ื ื™ื™ืช ืชืžื•ื ื”

ืื ื• ืžืจื›ื™ื‘ื™ื ืืช ืฉื•ืจืฉื™ ื”ื™ืขื“ ืœืฉื›ืคื•ืœ.

ืคืจื™ืงืช ื‘ืกื™ืก ืื•ื‘ื•ื ื˜ื•

ืื ื• ื‘ื•ื—ืจื™ื ืืช ื”ืฉื—ืจื•ืจ ื‘ืขืฆืžื ื• ืขืœ ืกืžืš ื”ืฆื•ืจืš ื•ื”ื”ืขื“ืคื•ืช ืฉืœื ื•. ื”ื ื” ื ืชืชื™ 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

ืขื›ืฉื™ื• ืื ื—ื ื• ืฆืจื™ื›ื™ื ืžื•ืคืข qemu ืžื•ืจื›ื‘ ืกื˜ื˜ื™ืช.

!!! ืชืฉื•ืžืช ื”ืœื‘!!!
ืื ืืชื” ืžืชื›ื ืŸ ืœื”ืฉืชืžืฉ ื‘ืžื™ื›ืœ ื›ื“ื™ ืœื‘ื ื•ืช ืžืฉื”ื•, ื‘ื“ื•ืง:
https://sourceware.org/bugzilla/show_bug.cgi?id=23960
https://bugs.launchpad.net/qemu/+bug/1805913
ืื– ืขื‘ื•ืจ x86_64 ืžืืจื— ื•ืื•ืจื— ื–ืจื•ืข ืืชื” ืฆืจื™ืš ืœื”ืฉืชืžืฉ ื‘ื’ืจืกืช 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

ื ืชื—

ืชืกืจื™ื˜ ืคืฉื•ื˜:

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

ืงื‘ืฆื™ ื›ื•ืชืจื•ืช ืœื™ื‘ื” ื•ืžื•ื“ื•ืœื™ื ื”ื ืขื ื™ื™ืŸ ื ืคืจื“. ื›ืžื•ื‘ืŸ, ืœื ื ืชืงื™ืŸ ืืช ื˜ื•ืขืŸ ื”ืืชื—ื•ืœ, ื”ืงืจื ืœ, ื”ืžื•ื“ื•ืœื™ื, ืขืฅ ื”ืžื›ืฉื™ืจื™ื ื“ืจืš ืื•ื‘ื•ื ื˜ื•. ื”ื ื™ื’ื™ืขื• ืืœื™ื ื• ืžื‘ื—ื•ืฅ ืื• ืฉื ืจื›ื™ื‘ ืื•ืชื ื‘ืขืฆืžื ื• ืื• ืฉื”ื ื™ื™ืžืกืจื• ืœื ื• ืขืœ ื™ื“ื™ ื™ืฆืจืŸ ื”ืœื•ื—, ื‘ื›ืœ ืžืงืจื” ื–ื” ืžืขื‘ืจ ืœืชื—ื•ื ื”ื•ืจืื” ื–ื•.

ื‘ืžื™ื“ื” ืžืกื•ื™ืžืช, ืกื˜ื™ื™ืช ื’ืจืกืื•ืช ืžืงื•ื‘ืœืช, ืื‘ืœ ืขื“ื™ืฃ ืœืงื—ืช ืื•ืชืŸ ืžื‘ื ื™ื™ืช ื”ืงืจื ืœ.

# 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 ืขื ื”ื’ื“ืจืช ื”ื“ื—ื™ืคื” ื”ืื•ื˜ื•ืžื˜ื™ืช

ื•ื‘ื›ืŸ, ื ื ื™ื— ืฉื”ืคืฆื ื• ืืช ื”ืžื›ืœื•ืœ ืฉืœื ื•, ื”ืขื‘ื•ื“ื” ื”ื—ืœื” ืขืœ ื”ื“ืจืš ื”ื˜ื•ื‘ื” ื‘ื™ื•ืชืจ ืœื”ืจื›ื™ื‘ ื’ืจืกืื•ืช ืฉื•ื ื•ืช ืžืื•ื—ืจื•ืช ื™ื•ืชืจ ืฉืœ ื”ืžืขืจื›ืช ืฉืœื ื•.

ืฉื•ืžืจ ื•ื›ื•' ื™ื›ื•ืœ ืœื‘ื•ื ืœืขื–ืจืชื ื•.

ื‘ื˜ื™ื—ื•ืช ื”ื™ื ืขื ื™ื™ืŸ ืื™ืฉื™:

  • ืืชื” ื™ื›ื•ืœ ืœื”ื’ืŸ ืขืœ ืขื ืคื™ื ืžืกื•ื™ืžื™ื
  • ืœื™ืฆื•ืจ ืžืคืชื— ื™ื™ื—ื•ื“ื™ ืขื‘ื•ืจ ื›ืœ ืžื›ืฉื™ืจ
  • ืœื‘ื˜ืœ ื“ื—ื™ืคื” ื‘ื›ื•ื—
  • ื•ื›ื• ' ...
# ssh-keygen
# apt install etckeeper
# etckeeper init
# cd /etc
# git remote add origin ...

ื‘ื•ืื• ื ื’ื“ื™ืจ ื“ื—ื™ืคื” ืื•ื˜ื•ืžื˜ื™ืช

ืื ื—ื ื• ื™ื›ื•ืœื™ื ื›ืžื•ื‘ืŸ ืœื™ืฆื•ืจ ืกื ื™ืคื™ื ื‘ืžื›ืฉื™ืจ ืžืจืืฉ (ื ื ื™ื— ืฉื ื™ืฆื•ืจ ืกืงืจื™ืคื˜ ืื• ืฉื™ืจื•ืช ืฉื™ืคืขืœ ื‘ืคืขื ื”ืจืืฉื•ื ื” ืฉื”ื•ื ื™ื•ืฉืง).

# 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
ืชืžื™ื›ืช ืœื™ื‘ื” ืขื‘ื•ืจ ืคื•ืจืžื˜ื™ื ื‘ื™ื ืืจื™ื ืฉื•ื ื™ื (binfmt_misc)
ืงื•ืžืคื™ืœืฆื™ื” ืขื chroot ืžืฉืชืžืฉ qemu
ื‘ื ื™ื™ืช rootfs ืฉืœ ืื•ื‘ื•ื ื˜ื• ืขื‘ื•ืจ ARM
ื›ื™ืฆื“ ืœื™ืฆื•ืจ ืื•ื‘ื•ื ื˜ื• ืžื•ืชืื ืื™ืฉื™ืช ื‘ืฉื™ื“ื•ืจ ื—ื™ ืžืืคืก
Crossdev qemu-static-user-chroot
ื•ื›ื•' ืฉื•ืžืจ

ื‘ืขื™ื” ืฉืœ getdents64

readdir() ืžื—ื–ื™ืจื” NULL (errno=EOVERFLOW) ืขื‘ื•ืจ qemu 32-bit ืžืฉืชืžืฉ ืกื˜ื˜ื™ ื‘ืžืืจื— 64-bit
Ext4 64 ืกื™ื‘ื™ื•ืช hash ืฉื•ื‘ืจ 32 ืกื™ื‘ื™ื•ืช glibc 2.28+
compiler_id_detection ื ื›ืฉืœ ืขื‘ื•ืจ armhf ื‘ืขืช ืฉื™ืžื•ืฉ ื‘ืืžื•ืœืฆื™ื™ืช ืžืฆื‘ ืžืฉืชืžืฉ QEMU
CMake ืœื ืขื•ื‘ื“ ื›ืžื• ืฉืฆืจื™ืš ืชื—ืช qemu-arm

ืžืงื•ืจ: www.habr.com