Nyiptakeun gambar Ubuntu pikeun ARM "ti mimiti"

Nalika pangwangunan nembé dimimitian, sering henteu écés bungkusan mana anu bakal angkat ka rootfs target.

Kalayan kecap séjén, éta teuing mimiti grab LFS, buildroot atanapi yocto (atawa hal sejenna), tapi anjeun geus kudu ngamimitian. Pikeun euyeub (Kuring boga 4GB eMMC on sampel pilot) aya jalan kaluar pikeun ngadistribusikaeun ka pamekar distribusi anu bakal ngidinan pikeun gancang nganteurkeun hiji hal anu ayeuna leungit, lajeng urang salawasna bisa ngumpulkeun daptar bungkusan na nyieun daptar pikeun target rootfs.

Tulisan ieu sanés énggal sareng mangrupikeun instruksi salin-témpél anu saderhana.

Tujuan tina tulisan nyaéta ngawangun rootfs Ubuntu pikeun papan ARM (dina hal kuring, dumasar kana Colibri imx7d).

Ngawangun gambar

Urang ngumpul rootfs target pikeun réplikasi.

Unpacking Ubuntu Base

Urang milih pelepasan sorangan dumasar kana kabutuhan sareng karesep urang sorangan. Di dieu kuring masihan 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

Mariksa rojongan BINFMT dina kernel

Upami anjeun gaduh distribusi umum, teras aya dukungan pikeun BINFMT_MISC sareng sadayana dikonpigurasi, upami henteu, maka kuring yakin anjeun terang kumaha ngaktifkeun dukungan BINFMT dina kernel.

Pastikeun BINFMT_MISC diaktipkeun dina kernel:

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

Ayeuna anjeun kedah pariksa setélan:

$ 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

Anjeun tiasa ngadaptar sacara manual nganggo, contona, didieu aya parentah ieu.

Nyetél qemu panangan statik

Ayeuna urang peryogi conto qemu anu dirakit sacara statis.

!!! PERHATOSAN!!!
Upami anjeun badé nganggo wadah pikeun ngawangun hiji hal, pariksa:
https://sourceware.org/bugzilla/show_bug.cgi?id=23960
https://bugs.launchpad.net/qemu/+bug/1805913
Teras pikeun host x86_64 sareng tamu panangan anjeun kedah nganggo versi 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

chroot

Aksara basajan:

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

Urang muji hasilna:

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

Ngan pikeun senang, hayu urang ngukur ukuran saméméh jeung sanggeus masang minimum (pikeun kuring) set bungkusan:

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

Hayu urang ngamutahirkeun:

# apt update
# apt upgrade --yes

Hayu urang pasang bungkusan anu dipikaresep ku urang:

# 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

File sareng modul header kernel mangrupikeun masalah anu misah. Tangtu, urang moal install bootloader, kernel, modul, tangkal alat via Ubuntu. Aranjeunna bakal sumping ka urang ti luar atanapi urang bakal ngumpul aranjeunna sorangan atanapi aranjeunna bakal dipasihkeun ka kami ku produsén dewan, dina hal naon waé ieu saluareun ruang lingkup instruksi ieu.

Pikeun extent sababaraha, versi divergence bisa ditarima, tapi leuwih hade nyandak eta tina ngawangun kernel.

# apt install --yes linux-headers-generic

Hayu urang tingali naon anu kajantenan sareng tétéla seueur pisan:

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

Tong hilap nyetél kecap akses.

Bungkusan gambar

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

Salaku tambahan, urang tiasa masang etckeeper kalayan setélan autopush

Nya, hayu urang ngadistribusikaeun assembly urang, karya dimimitian dina cara pangalusna keur ngumpul engké versi béda tina sistem urang.

jsbkeeper bisa datang ka bantuan urang.

Kasalametan mangrupikeun masalah pribadi:

  • Anjeun tiasa ngajaga cabang tangtu
  • ngahasilkeun konci unik pikeun tiap alat
  • mareuman gaya push
  • jsb. ...
# ssh-keygen
# apt install etckeeper
# etckeeper init
# cd /etc
# git remote add origin ...

Hayu urang nyetél autopush

Urang tiasa, tangtosna, nyiptakeun cabang dina alat sateuacanna (nyaéta urang ngadamel naskah atanapi jasa anu bakal dijalankeun pertama kalina diluncurkeun).

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

Atanapi urang tiasa ngalakukeun anu langkung pinter ...

Puguh jalan

Hayu urang gaduh sababaraha jinis identifier unik, sebutkeun nomer séri prosesor (atanapi MAC - perusahaan serius mésér kisaran):

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

Teras urang tiasa nganggo éta pikeun nami cabang anu kami bakal nyorong:

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

Hayu urang nyieun skrip basajan:

# 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

Sareng éta sadayana - saatos sababaraha waktos urang tiasa ningali parobihan sareng nyiptakeun daptar bungkusan pikeun firmware target.

bahan dianjurkeun

BINFMT_MISC
Rojongan Kernel pikeun Rupa-rupa Format Binér (binfmt_misc)
Compiling kalawan qemu pamaké chroot
Ngawangun rootfs Ubuntu pikeun ARM
Kumaha cara nyiptakeun live Ubuntu khusus ti mimiti
Crossdev qemu-statik-pamaké-chroot
jsb

masalah getdents64

readdir () mulih NULL (errno = EOVERFLOW) pikeun 32-bit pamaké-statik qemu on 64-bit host
Ext4 64 bit Hash ngarecah 32 bit glibc 2.28+
compiler_id_detection gagal pikeun armhf nalika maké QEMU pamaké-mode emulation
CMake teu dianggo leres handapeun qemu-panangan

sumber: www.habr.com