د ARM لپاره د اوبنټو عکس رامینځته کول "له پیل څخه"

کله چې پراختیا یوازې پیل شي، دا اکثرا روښانه نده چې کوم کڅوړې به د هدف روټف ته لاړ شي.

په بل عبارت، دا د LFS، بلډروټ یا یوکوټو (یا بل څه) د نیولو لپاره ډیر وخت دی، مګر تاسو لا دمخه پیل کولو ته اړتیا لرئ. د بډایه لپاره (زه په ازمایښتي نمونو کې 4GB eMMC لرم) د پراختیا کونکو ته د توزیع کولو لپاره یوه لاره شتون لري چې دوی ته به اجازه ورکړي چې ژر تر ژره هغه څه وړاندې کړي چې اوس مهال ورک دي ، او بیا موږ کولی شو تل د کڅوړو لیست راټول کړو او د دې لپاره لیست جوړ کړو. د هدف ریښی.

دا مقاله نوې نه ده او د کاپي پیسټ لارښوونې دي.

د مقالې هدف د ARM بورډونو لپاره د اوبنټو روټفونه رامینځته کول دي (زما په قضیه کې ، د کولیبري 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 زموږ مرستې ته راځي.

خوندیتوب یوه شخصي موضوع ده:

  • تاسو کولی شئ ځینې څانګې خوندي کړئ
  • د هرې وسیلې لپاره یو ځانګړی کیلي رامینځته کړئ
  • د ځواک فشار غیر فعال کړئ
  • etc ...
# 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 کارن کروټ سره تالیف کول
د ARM لپاره د اوبنټو روټفونه جوړول
د سکریچ څخه د دودیز اوبنټو ژوند کولو څرنګوالی
Crossdev qemu-static-user-chroot
وغیره

getdents64 ستونزه

readdir() په 32-bit کوربه کې د 64-bit کارن-static qemu لپاره NULL (errno=EOVERFLOW) راګرځوي
Ext4 64 bit هش 32 bit glibc 2.28+ ماتوي
compiler_id_detection د armhf لپاره ناکامه کیږي کله چې د QEMU کارن موډ ایمولیشن کاروي
CMake د qemu-arm لاندې په سمه توګه کار نه کوي

سرچینه: www.habr.com