Ƙirƙirar hoton Ubuntu don ARM "daga karce"

Lokacin da ci gaba kawai ya fara, sau da yawa ba a bayyana waɗanne fakitin za su je tushen tushen tushen.

A wasu kalmomi, ya yi da wuri don kama LFS, buildroot ko yocto (ko wani abu dabam), amma kuna buƙatar farawa. Ga masu arziki (Ina da 4GB eMMC akan samfuran matukin jirgi) akwai hanyar da za a rarraba wa masu haɓakawa rarrabawa wanda zai ba su damar isar da wani abu da sauri wanda ya ɓace a halin yanzu, sannan koyaushe zamu iya tattara jerin fakiti kuma mu ƙirƙira jeri don tushen tushen.

Wannan labarin ba sabon abu bane kuma umarni ne mai sauƙi na kwafi.

Manufar labarin shine gina tushen tushen Ubuntu don allon ARM (a cikin akwati na, dangane da Colibri imx7d).

Gina hoto

Muna tattara tushen tushen manufa don maimaitawa.

Zazzage Ubuntu Base

Mukan zabar sakin bisa ga bukatu da abubuwan da muka zaba. Anan na bada 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

Duba tallafin BINFMT a cikin kwaya

Idan kuna da rarraba gama gari, to akwai tallafi don BINFMT_MISC kuma komai yana daidaita, idan ba haka ba, to na tabbata kun san yadda ake kunna tallafin BINFMT a cikin kwaya.

Tabbatar da an kunna BINFMT_MISC a cikin kwaya:

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

Yanzu kuna buƙatar duba saitunan:

$ 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

Kuna iya yin rajista da hannu ta amfani da, misali, ga waɗannan umarnin.

Saitin hannun qemu a tsaye

Yanzu muna buƙatar misalin qemu da aka haɗe.

!!! HANKALI!!!
Idan kuna shirin yin amfani da akwati don gina wani abu, duba:
https://sourceware.org/bugzilla/show_bug.cgi?id=23960
https://bugs.launchpad.net/qemu/+bug/1805913
Sannan ga x86_64 mai masaukin baki da baƙon hannu kuna buƙatar amfani da sigar i386 na 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

tsiro

Rubutun mai sauƙi:

ch- dutsen.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

Mun yaba da sakamakon:

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

Kawai don jin daɗi, bari mu auna girman kafin da bayan shigar da mafi ƙarancin (a gare ni) saitin fakiti:

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

Bari mu sabunta:

# apt update
# apt upgrade --yes

Bari mu shigar da fakitin da muke sha'awar:

# 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

Fayilolin taken Kernel da kayayyaki daban ne. Tabbas, ba za mu shigar da bootloader, kernel, modules, bishiyar na'urar ta Ubuntu ba. Za su zo mana daga waje ko kuma mu hada su da kanmu ko kuma a ba mu su daga masana'antun hukumar, a kowane hali wannan ya wuce iyakar wannan umarni.

Har zuwa wani lokaci, bambance-bambancen sigar abin karɓa ne, amma yana da kyau a ɗauke su daga ginin kernel.

# apt install --yes linux-headers-generic

Bari mu ga abin da ya faru kuma ya zama mai yawa:

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

Kar a manta saita kalmar sirri.

Shirya hoton

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

Bugu da kari, za mu iya shigar da dai sauransukeeper tare da autopush saitin

To, bari mu ce mun rarraba taronmu, aikin ya fara kan yadda za a iya haɗa nau'ikan tsarinmu daban-daban daga baya.

Mai kula da sauransu zai iya zuwa don taimakonmu.

Tsaro al'amari ne na sirri:

  • za ku iya kare wasu rassan
  • samar da maɓalli na musamman ga kowace na'ura
  • kashe karfin turawa
  • da dai sauransu. ...
# ssh-keygen
# apt install etckeeper
# etckeeper init
# cd /etc
# git remote add origin ...

Bari mu saita autopush

Za mu iya, ba shakka, ƙirƙirar rassa a kan na'urar a gaba (bari mu ce muna yin rubutun ko sabis wanda zai fara aiki a farkon lokacin da aka kaddamar).

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

Ko za mu iya yin wani abu mafi wayo ...

Hanyar kasala

Bari mu sami wani nau'i na musamman mai ganowa, ka ce lambar serial na processor (ko MAC - kamfanoni masu mahimmanci sun sayi kewayon):

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

Sannan za mu iya amfani da shi don sunan reshen da za mu tura zuwa gare shi:

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

Bari mu ƙirƙiri rubutu mai sauƙi:

# 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

Kuma shi ke nan - bayan ɗan lokaci za mu iya duba canje-canje kuma ƙirƙirar jerin fakiti don firmware mai niyya.

Abubuwan da aka ba da shawarar

BINFMT_MISC
Taimakon Kernel don Tsarukan Binariyoyi daban-daban (binfmt_misc)
Haɗa tare da qemu mai amfani chroot
Gina tushen tushen Ubuntu don ARM
Yadda ake ƙirƙirar Ubuntu na al'ada kai tsaye daga karce
Crossdev qemu-static-user-chroot
da dai sauransu

matsala 64

readdir() ya dawo NULL (errno=EOVERFLOW) don 32-bit user-static qemu akan mai masaukin 64-bit
Ext4 64 bit zanta karya 32 bit glibc 2.28+
compiler_id_detection ya gaza ga armhf lokacin amfani da kwaikwayar yanayin mai amfani na QEMU
CMake baya aiki da kyau a ƙarƙashin qemu-hannu

source: www.habr.com