"เชถเชฐเซ‚เช†เชคเชฅเซ€" เชเช†เชฐเชเชฎ เชฎเชพเชŸเซ‡ เช‰เชฌเซเชจเซเชŸเซ เช›เชฌเซ€ เชฌเชจเชพเชตเชตเซ€

เชœเซเชฏเชพเชฐเซ‡ เชตเชฟเช•เชพเชธ เชฎเชพเชคเซเชฐ เชถเชฐเซ‚ เชฅเชพเชฏ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชคเซ‡ เช˜เชฃเซ€ เชตเช–เชค เชธเซเชชเชทเซเชŸ เชนเซ‹เชคเซเช‚ เชจเชฅเซ€ เช•เซ‡ เช•เชฏเชพ เชชเซ‡เช•เซ‡เชœเซ‹ เชฒเช•เซเชทเซเชฏ เชฐเซ‚เชŸเชเชซ เชชเชฐ เชœเชถเซ‡.

เชฌเซ€เชœเชพ เชถเชฌเซเชฆเซ‹เชฎเชพเช‚ เช•เชนเซ€เช เชคเซ‹, LFS, เชฌเชฟเชฒเซเชกเชฐเซ‚เชŸ เช…เชฅเชตเชพ เชฏเซ‹เช•เซเชŸเซ‹ (เช…เชฅเชตเชพ เชฌเซ€เชœเซเช‚ เช•เช‚เชˆเช•) เชฎเซ‡เชณเชตเชตเชพเชจเซเช‚ เช–เซ‚เชฌ เชœ เชตเชนเซ‡เชฒเซเช‚ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเชฎเชพเชฐเซ‡ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เชถเชฐเซ‚ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชถเซเชฐเซ€เชฎเช‚เชค เชฒเซ‹เช•เซ‹ เชฎเชพเชŸเซ‡ (เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชชเชพเชฏเชฒเซ‹เชŸ เชจเชฎเซ‚เชจเชพเช“ เชชเชฐ 4GB eMMC เช›เซ‡) เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“เชจเซ‡ เชตเชฟเชคเชฐเชฃ เช•เชฐเชตเชพเชจเซ‹ เชเช• เชฎเชพเชฐเซเช— เช›เซ‡ เชœเซ‡ เชคเซ‡เชฎเชจเซ‡ เชนเชพเชฒเชฎเชพเช‚ เช–เซ‚เชŸเซ‡ เช›เซ‡ เชคเซ‡ เช•เช‚เชˆเช• เชเชกเชชเชฅเซ€ เชชเชนเซ‹เช‚เชšเชพเชกเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเชถเซ‡, เช…เชจเซ‡ เชชเช›เซ€ เช…เชฎเซ‡ เชนเช‚เชฎเซ‡เชถเชพ เชชเซ‡เช•เซ‡เชœเซ‹เชจเซ€ เชธเซ‚เชšเชฟ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช เช…เชจเซ‡ เชคเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เชธเซ‚เชšเชฟ เชฌเชจเชพเชตเซ€ เชถเช•เซ€เช เช›เซ€เช. เชฒเช•เซเชทเซเชฏ เชฐเซ‚เชŸเชซเซเชธ.

เช† เชฒเซ‡เช– เชจเชตเซ‹ เชจเชฅเซ€ เช…เชจเซ‡ เชเช• เชธเชฐเชณ เช•เซ‹เชชเซ€-เชชเซ‡เชธเซเชŸ เชธเซ‚เชšเชจเชพ เช›เซ‡.

เชฒเซ‡เช–เชจเซ‹ เชนเซ‡เชคเซ เชเช†เชฐเชเชฎ เชฌเซ‹เชฐเซเชกเซเชธ เชฎเชพเชŸเซ‡ เช‰เชฌเซเชจเซเชŸเซ เชฐเซ‚เชŸเชซเซเชธ เชฌเชจเชพเชตเชตเชพเชจเซ‹ เช›เซ‡ (เชฎเชพเชฐเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เช•เซ‹เชฒเชฟเชฌเซเชฐเซ€ 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 เชนเซ‹เชธเซเชŸ เช…เชจเซ‡ เช†เชฐเซเชฎ เช—เซ‡เชธเซเชŸ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ‡ qemu เชจเชพ i386 เชตเชฐเซเชเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡:
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 เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช

เชธเชพเชฐเซเช‚, เชšเชพเชฒเซ‹ เช•เชนเซ€เช เช•เซ‡ เช…เชฎเซ‡ เช…เชฎเชพเชฐเซ€ เชเชธเซ‡เชฎเซเชฌเชฒเซ€เชจเซเช‚ เชตเชฟเชคเชฐเชฃ เช•เชฐเซเชฏเซเช‚ เช›เซ‡, เช…เชฎเชพเชฐเซ€ เชธเชฟเชธเซเชŸเชฎเชจเชพ เชชเช›เซ€เชจเชพ เชตเชฟเชตเชฟเชง เชธเช‚เชธเซเช•เชฐเชฃเซ‹เชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชถเซเชฐเซ‡เชทเซเช  เชฐเซ€เชคเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเชตเซเช‚ เชคเซ‡เชจเชพ เชชเชฐ เช•เชพเชฎ เชถเชฐเซ‚ เชฅเชฏเซเช‚.

etckeeper เช…เชฎเชพเชฐเซ€ เชฎเชฆเชฆ เชฎเชพเชŸเซ‡ เช†เชตเซ€ เชถเช•เซ‡ เช›เซ‡.

เชธเชฒเชพเชฎเชคเซ€ เช เชตเซเชฏเช•เซเชคเชฟเช—เชค เชฌเชพเชฌเชค เช›เซ‡:

  • เชคเชฎเซ‡ เช…เชฎเซเช• เชถเชพเช–เชพเช“เชจเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹
  • เชฆเชฐเซ‡เช• เช‰เชชเช•เชฐเชฃ เชฎเชพเชŸเซ‡ เช…เชจเชจเซเชฏ เช•เซ€ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‹
  • เชฌเชณ เชฆเชฌเชพเชฃ เช…เช•เซเชทเชฎ เช•เชฐเซ‹
  • เชตเช—เซ‡เชฐเซ‡ ...
# ssh-keygen
# apt install etckeeper
# etckeeper init
# cd /etc
# git remote add origin ...

เชšเชพเชฒเซ‹ เช“เชŸเซ‹เชชเชถ เชธเซ‡เชŸ เช•เชฐเซ€เช

เช…เชฎเซ‡, เช…เชฒเชฌเชคเซเชค, เช‰เชชเช•เชฐเชฃ เชชเชฐ เช…เช—เชพเช‰เชฅเซ€ เชถเชพเช–เชพเช“ เชฌเชจเชพเชตเซ€ เชถเช•เซ€เช เช›เซ€เช (เชšเชพเชฒเซ‹ เช•เชนเซ€เช เช•เซ‡ เช…เชฎเซ‡ เชเช• เชธเซเช•เซเชฐเชฟเชชเซเชŸ เช…เชฅเชตเชพ เชธเซ‡เชตเชพ เชฌเชจเชพเชตเซ€เช เช›เซ€เช เชœเซ‡ เชคเซ‡ เชชเซเชฐเชฅเชฎ เชตเช–เชค เชถเชฐเซ‚ เชฅเชพเชฏ เชคเซเชฏเชพเชฐเซ‡ เชšเชพเชฒเชถเซ‡).

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

เช…เชฅเชตเชพ เช†เชชเชฃเซ‡ เช•เช‚เชˆเช• เชธเซเชฎเชพเชฐเซเชŸ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช...

เช†เชณเชธเซ เชฎเชพเชฐเซเช—

เชชเซเชฐเซ‹เชธเซ‡เชธเชฐเชจเซ‹ เชธเซ€เชฐเซ€เชฏเชฒ เชจเช‚เชฌเชฐ เช•เชนเซ‹ (เช…เชฅเชตเชพ MAC - เช—เช‚เชญเซ€เชฐ เช•เช‚เชชเชจเซ€เช“ เชถเซเชฐเซ‡เชฃเซ€ เช–เชฐเซ€เชฆเซ‡ เช›เซ‡): เช…เชฎเชจเซ‡ เช…เชฎเซเช• เชชเซเชฐเช•เชพเชฐเชจเซเช‚ เช…เชจเชจเซเชฏ เช“เชณเช–เช•เชฐเซเชคเชพ เช›เซ‡.

เชฌเชฟเชฒเชพเชกเซ€ / เชชเซเชฐเซ‹เช• / 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) เชฎเชพเชŸเซ‡ เช•เชฐเซเชจเชฒ เชธเชชเซ‹เชฐเซเชŸ
qemu เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ chroot เชธเชพเชฅเซ‡ เชธเช‚เช•เชฒเชจ
ARM เชฎเชพเชŸเซ‡ เช‰เชฌเซเชจเซเชŸเซ เชฐเซ‚เชŸเชซเซเชธ เชฌเชจเชพเชตเชตเซเช‚
เชถเชฐเซ‚เช†เชคเชฅเซ€ เช•เชธเซเชŸเชฎ เช‰เชฌเซเชจเซเชŸเซ เชฒเชพเช‡เชต เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฌเชจเชพเชตเชตเซเช‚
Crossdev qemu-static-user-chroot
เชตเช—เซ‡เชฐเซ‡ เชธเช‚เชญเชพเชณเชจเชพเชฐ

getdents64 เชธเชฎเชธเซเชฏเชพ

readdir() 32-bit เชนเซ‹เชธเซเชŸ เชชเชฐ 64-bit เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ-เชธเซเชฅเชฟเชฐ qemu เชฎเชพเชŸเซ‡ NULL (errno=EOVERFLOW) เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡
Ext4 64 เชฌเซ€เชŸ เชนเซ‡เชถ เชฌเซเชฐเซ‡เช•เซเชธ 32 เชฌเซ€เชŸ glibc 2.28+
QEMU เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ-เชฎเซ‹เชก เช‡เชฎเซเชฏเซเชฒเซ‡เชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ armhf เชฎเชพเชŸเซ‡ compiler_id_detection เชจเชฟเชทเซเชซเชณ เชœเชพเชฏ เช›เซ‡
CMake qemu-arm เชนเซ‡เช เชณ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเชคเซเช‚ เชจเชฅเซ€

เชธเซ‹เชฐเซเชธ: www.habr.com