Kreye yon imaj Ubuntu pou ARM "nan grate"

Lè devlopman jis kòmanse, li souvan pa klè ki pakè pral ale nan rootf yo sib.

Nan lòt mo, li twò bonè pou pwan LFS, buildroot oswa yocto (oswa yon lòt bagay), men ou deja bezwen kòmanse. Pou moun rich yo (mwen gen 4GB eMMC sou echantiyon pilòt yo) gen yon fason pou yo distribye bay devlopè yo yon distribisyon ki pral pèmèt yo byen vit delivre yon bagay ki manke kounye a, epi lè sa a nou ka toujou kolekte lis pakè epi kreye yon lis pou rasin sib yo.

Atik sa a se pa nouvo epi li se yon senp enstriksyon kopye-kole.

Objektif atik la se pou konstwi Ubuntu rootfs pou tablo ARM (nan ka mwen an, ki baze sou Colibri imx7d).

Bati yon imaj

Nou rasanble rootfs sib yo pou replikasyon.

Debalaj Ubuntu baz

Nou chwazi lage a tèt nou baze sou bezwen ak preferans pwòp nou yo. Isit la mwen bay 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

Tcheke sipò BINFMT nan nwayo a

Si ou gen yon distribisyon komen, Lè sa a, gen sipò pou BINFMT_MISC ak tout bagay se configuré, si se pa, Lè sa a, mwen sèten ke ou konnen ki jan yo pèmèt sipò BINFMT nan nwayo a.

Asire w ke BINFMT_MISC aktive nan nwayo a:

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

Koulye a, ou bezwen tcheke paramèt yo:

$ 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

Ou ka enskri manyèlman lè l sèvi avèk, pou egzanp, isit la se enstriksyon sa yo.

Mete kanpe bra estatik qemu

Koulye a, nou bezwen yon egzanp qemu ki reyini statikman.

!!! ATANSYON!!!
Si w gen plan pou itilize yon veso pou konstwi yon bagay, tcheke:
https://sourceware.org/bugzilla/show_bug.cgi?id=23960
https://bugs.launchpad.net/qemu/+bug/1805913
Lè sa a, pou x86_64 host ak bra envite ou bezwen sèvi ak vèsyon i386 nan 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

Script senp:

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

Nou admire rezilta a:

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

Jis pou plezi, ann mezire gwosè a anvan ak apre enstale seri minimòm (pou mwen) pakè:

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

Ann mete ajou:

# apt update
# apt upgrade --yes

Ann enstale pakè nou enterese yo:

# 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

Fichye header Kernel ak modil yo se yon pwoblèm separe. Natirèlman, nou pa pral enstale bootloader, nwayo, modil, pye bwa aparèy atravè Ubuntu. Yo pral vin jwenn nou soti deyò oswa nou pral rasanble yo tèt nou oswa yo pral ba nou pa manifakti tablo a, nan nenpòt ka sa a se pi lwen pase sijè ki abòde lan enstriksyon sa a.

Nan yon sèten mezi, divèjans vèsyon an akseptab, men li pi bon pou w pran yo soti nan konstriksyon nwayo a.

# apt install --yes linux-headers-generic

Ann wè sa ki te pase epi li te tounen anpil:

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

Pa bliye mete yon modpas.

Anbalaj imaj la

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

Anplis de sa, nou ka enstale etckeeper ak anviwònman an autopush

Oke, an n di nou distribye asanble nou an, travay la te kòmanse sou ki jan pi bon yo rasanble pita diferan vèsyon nan sistèm nou an.

etckeeper ka vin ede nou.

Sekirite se yon kesyon pèsonèl:

  • ou ka pwoteje sèten branch
  • jenere yon kle inik pou chak aparèy
  • enfim fòs pouse
  • elatriye. ...
# ssh-keygen
# apt install etckeeper
# etckeeper init
# cd /etc
# git remote add origin ...

Ann mete kanpe autopush

Nou ka, nan kou, kreye branch sou aparèy la davans (an nou di nou fè yon script oswa yon sèvis ki pral kouri premye fwa li te lanse).

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

Oswa nou ka fè yon bagay ki pi entelijan...

Fason parese

Se pou nou gen kèk kalite idantifyan inik, di nimewo seri a nan processeur a (oswa MAC - konpayi serye achte seri a):

chat / 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

Lè sa a, nou ka sèvi ak li pou non branch nan ki nou pral pouse:

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

Ann kreye yon script senp:

# 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

Epi sa a tout - apre yon ti tan nou ka gade nan chanjman yo epi kreye yon lis pakè pou firmwèr la sib.

Materyèl rekòmande

BINFMT_MISC
Sipò Kernel pou divès fòma binè (binfmt_misc)
Konpile ak chroot itilizatè qemu
Bati Ubuntu rootfs pou ARM
Ki jan yo kreye yon Ubuntu koutim viv nan grafouyen
Crossdev qemu-static-user-chroot
gadyen elatriye

pwoblèm getdents64

readdir() retounen NULL (errno=EOVERFLOW) pou qemu itilizatè-estatik 32-bit sou lame 64-bit.
Ext4 64 bit hash kraze 32 bit glibc 2.28+
compiler_id_detection echwe pou armhf lè w ap itilize QEMU itilizatè-mòd emulasyon
CMake pa travay byen anba qemu-arm

Sous: www.habr.com