Að búa til Ubuntu mynd fyrir ARM „frá grunni“

Þegar þróunin er rétt að hefjast er oft ekki ljóst hvaða pakkar munu fara í miða rootfs.

Með öðrum orðum, það er of snemmt að grípa LFS, buildroot eða yocto (eða eitthvað annað), en þú þarft nú þegar að byrja. Fyrir þá ríku (ég er með 4GB eMMC á tilraunasýnum) er leið út til að dreifa til þróunaraðila dreifingu sem gerir þeim kleift að afhenda fljótt eitthvað sem vantar núna, og þá getum við alltaf safnað lista yfir pakka og búið til lista fyrir markmiðsrótin.

Þessi grein er ekki ný og er einföld copy-paste kennsla.

Tilgangur greinarinnar er að byggja Ubuntu rootfs fyrir ARM borð (í mínu tilfelli, byggt á Colibri imx7d).

Að byggja upp ímynd

Við setjum saman markmiðsrótina til afritunar.

Upptaka Ubuntu Base

Við veljum útgáfuna sjálf út frá þörfum og eigin óskum. Hér hef ég gefið 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

Athugar BINFMT stuðning í kjarnanum

Ef þú ert með sameiginlega dreifingu, þá er stuðningur fyrir BINFMT_MISC og allt er stillt, ef ekki, þá er ég viss um að þú veist hvernig á að virkja BINFMT stuðning í kjarnanum.

Gakktu úr skugga um að BINFMT_MISC sé virkt í kjarnanum:

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

Nú þarftu að athuga stillingarnar:

$ 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

Þú getur skráð þig handvirkt með því að nota td. hér eru þessar leiðbeiningar.

Setja upp kyrrstöðuarm qemu

Nú þurfum við statískt samsett qemu dæmi.

!!! ATHUGIÐ!!!
Ef þú ætlar að nota gám til að smíða eitthvað skaltu skoða:
https://sourceware.org/bugzilla/show_bug.cgi?id=23960
https://bugs.launchpad.net/qemu/+bug/1805913
Síðan fyrir x86_64 gestgjafa og armgesti þarftu að nota i386 útgáfuna af 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

Einfalt handrit:

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

Við dáumst að niðurstöðunni:

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

Til gamans skulum við mæla stærðina fyrir og eftir að setja upp lágmarks (fyrir mig) pakkasett:

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

Við skulum uppfæra:

# apt update
# apt upgrade --yes

Við skulum setja upp pakkana sem við höfum áhuga á:

# 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

Kjarnahausskrár og einingar eru sérstakt mál. Auðvitað munum við ekki setja upp ræsiforritið, kjarnann, einingar, tækjatréð í gegnum Ubuntu. Þeir munu koma til okkar utan frá eða við setjum þá saman sjálfir eða þeir verða gefnir okkur af plötuframleiðandanum, í öllum tilvikum er þetta utan gildissviðs þessarar leiðbeiningar.

Að einhverju leyti er mismunur á útgáfum ásættanlegt, en það er betra að taka þær úr kjarnabyggingunni.

# apt install --yes linux-headers-generic

Við skulum sjá hvað gerðist og það kom mikið út:

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

Ekki gleyma að setja lykilorð.

Að pakka myndinni

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

Að auki getum við sett upp etckeeper með autopush stillingunni

Jæja, segjum að við höfum dreift samsetningunni okkar, vinnan hófst um hvernig best væri að setja saman síðari mismunandi útgáfur af kerfinu okkar.

etckeeper getur komið okkur til hjálpar.

Öryggi er persónulegt mál:

  • þú getur verndað ákveðnar greinar
  • búa til einstakan lykil fyrir hvert tæki
  • slökkva á þvingunarýtingu
  • o.s.frv. ...
# ssh-keygen
# apt install etckeeper
# etckeeper init
# cd /etc
# git remote add origin ...

Við skulum setja upp autopush

Við getum að sjálfsögðu búið til útibú á tækinu fyrirfram (segjum að við gerum handrit eða þjónustu sem keyrir í fyrsta skipti sem það er opnað).

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

Eða við getum gert eitthvað skynsamlegra...

Latur leið

Við skulum hafa einhvers konar einstakt auðkenni, segjum raðnúmer örgjörvans (eða MAC - alvarleg fyrirtæki kaupa svið):

köttur / 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

Þá getum við notað það fyrir nafn útibúsins sem við munum ýta á:

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

Við skulum búa til einfalt handrit:

# 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

Og það er allt - eftir smá stund getum við skoðað breytingarnar og búið til lista yfir pakka fyrir fastbúnaðinn.

Efni sem mælt er með

BINFMT_MISC
Kernel Stuðningur fyrir ýmis tvöfaldur snið (binfmt_misc)
Samsetning með qemu notanda chroot
Að byggja Ubuntu rootfs fyrir ARM
Hvernig á að búa til sérsniðna Ubuntu live frá grunni
Crossdev qemu-static-user-chroot
o.fl

getdents64 vandamál

readdir() skilar NULL (errno=EOVERFLOW) fyrir 32-bita notendastöðug qemu á 64-bita hýsil
Ext4 64 bita kjötkássa brot 32 bita glibc 2.28+
compiler_id_detection mistekst fyrir armhf þegar QEMU notendahamur er notaður
CMake virkar ekki almennilega undir qemu-arm

Heimild: www.habr.com