Ich sehe etwas wirklich Seltsames in einer chrooted Debian- armel
Umgebung.
Aber zuerst ein bisschen Hintergrundgeschichte ... Das ist lang, aber die Frage ist komplex und jede mögliche Hilfe hängt davon ab, die ganze Geschichte zu kennen.
Ich habe einen eingebetteten ARM-SoC, der Linux ausführt - genauer gesagt einen Debian armel
Lenny auf einem 2.6.17-Kernel. Die Debian-Distribution selbst ist leicht auf spätere Versionen ( sudo apt-get dist-upgrade
) aktualisierbar und kann so auf den neuesten Stand gebracht werden, auf die armel
Versionen von
squeeze
oder sogar wheezy
.
Das Problem ist, dass der Kernel benutzerdefiniert ist ... Der fragliche ARM-SoC ist nicht Teil des Hauptkernels, daher wird er in 2.6.17 so gut wie aufgegeben.
Wenn Sie wissen, wie Linux und GLIBC funktionieren, können Sie das Problem bereits erkennen - GLIBC-Versionen werden mit einer unterstützten Kernel-Mindestversion kompiliert ... Die Version ist weit über 2.6.17 hinausgegangen. Wenn wir also versuchen, zB zu einem Debian-Squeeze zu chrooten ...
$ # From inside the little ARM machine running Debian Lenny
$ sudo debootstrap --arch armel squeeze /squeeze \
http://ftp.whateverCountry.debian.org/debian
$ sudo -i
# mount -t proc none /squeeze/proc
# mount -t sysfs none /squeeze/sys
# mount -t devpts none /squeeze/dev/pts
# chroot /squeeze
Fatal: Kernel too old
... sehen wir eine Nachricht vom GLIBC von squeeze
, die uns mitteilt, dass es nicht kompiliert wurde, um mit diesem alten Kernel (2.6.17) zu arbeiten.
Das gleiche Problem tritt auch bei Wheezy auf - da es neuer als squeeze ist - und wird in der Tat von nun an bei jeder Debian-Version auftreten, da deren GLIBC auf meinem 2.6.17-Kernel nicht mehr funktionieren wird.
Zuerst dachte ich, dies sei ein Deal Breaker - aber dann wurde mir klar, dass ich GLIBC theoretisch neu kompilieren kann, um mit dem älteren Kernel zu arbeiten, den mein SoC verwendet Paket in zB Debian squeeze.
Ich vermute, dass die Kompilierung von GLIBC und die Erstellung der libc6_2.11.3-4.deb-Datei über eine von den Göttern von Debian erfundene automatisierte Cross-Compiler-Maschinerie erfolgt.
Ich bin kein Gott ... noch konnte ich in Google etwas darüber finden, wie man einer wird - dh wie man meinen Core i5 als Host verwendet, um GLIBC mit genau den gleichen Einstellungen wie die Paketversion (in Debian squeeze
) zu kompilieren mit.
Also habe ich es ausgetrickst - ich habe herausgefunden, wie man die ARM-Version von Debian Squeeze auf meinem Core i5 einrichtet (eine Technik, die eine statische Version der qemu-arm
Binärdatei verwendet).
Sobald ich in meiner x86-gehosteten Version von chrootete Debian-armel-squeeze
, konnte ich einfach ...
$ cd /var/tmp
$ apt-get source libc6
...
$ # edit this in - compile for my kernel...
$ vi eglibc-2.11.3/debian/sysdeps/linux.mk
...
MIN_KERNEL_SUPPORTED := 2.6.17
...
$ export DEB_BUILD_OPTS="nocheck parallel=1"
$ cd eglibc-2.11.3
$ dpkg-buildpackage -b -d -us -uc
... und nach 3 Stunden (die von Core i5 gehostete chrooted-Version von
Debian-armel-squeeze
ist viel langsamer als eine native Maschine ...) habe ich mein libc6 .deb-Paket erhalten. Es würde wahrscheinlich 3 Monate dauern, um diesen Build in meinem SoC zu erstellen, also beschwere ich mich nicht.
Zurück in meinem echten ARM-SoC habe ich alle libc-Dateien (.so) des neuen Pakets über die Standard-Squeeze-Dateien kopiert und versucht, chroot zu starten.
# chroot squeeze/
root@ttsiodras:/#
Ja! Es funktionierte! (oder so schien es)
Meine benutzerdefinierte libc hat aus der chroot berichtet:
# /lib/libc.so.6
GNU C Library (Debian EGLIBC 2.11.3-4) stable release version 2.11.3, by Roland McGrath et al.
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.4.5.
Compiled on a Linux 2.6.26 system on 2014-10-23.
Available extensions:
crypt add-on version 2.1 by Michael Glad and others
GNU Libidn by Simon Josefsson
Native POSIX Threads Library by Ulrich Drepper et al
Support for some architectures added on, not maintained in glibc core.
BIND-8.2.3-T5B
For bug reporting instructions, please see:
<http://www.debian.org/Bugs/>.
Die Dinge schienen zu funktionieren - ich habe eine Datei kopiert, aufgerufen ls
...
Aber als ich versuchte, apt-get
einige Apps von zu installieren squeeze
, bekam ich ... einige unerwartete Fehler:
# apt-get install indent
Reading package lists... Done
Building dependency tree... Done
The following NEW packages will be installed:
indent
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 110 kB of archives.
After this operation, 516 kB of additional disk space will be used.
Get:1 http://ftp.gr.debian.org/debian/ squeeze/main indent armel 2.2.11-1 [110 kB]
Fetched 110 kB in 0s (236 kB/s)
tar: ./control: Cannot utime: Function not implemented
tar: ./md5sums: Cannot utime: Function not implemented
tar: .: Cannot utime: Function not implemented
tar: Exiting with failure status due to previous errors
dpkg-deb: subprocess tar returned error exit status 2
dpkg: error processing /var/cache/apt/archives/indent_2.2.11-1_armel.deb (--unpack):
subprocess dpkg-deb --control returned error exit status 2
configured to not write apport reports
rm: cannot remove `/var/lib/dpkg/tmp.ci': Function not implemented
dpkg: error while cleaning up:
subprocess rm cleanup returned error exit status 1
Errors were encountered while processing:
/var/cache/apt/archives/indent_2.2.11-1_armel.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
Oh-oh ... ein Haufen Function not implemented
. Das klingt so, als würde GLIBC berichten, dass grundlegende Dinge nicht funktionieren ...
Ich Strace verwaltet (nicht fragen , wie) und herausgefunden, dass alle -at
Funktionen versagen: openat
, mkdirat
, renameat
, usw. - sie sind alle Berichte ENOSYS.
Es scheint, dass ich nur teilweise erfolgreich war - einige Systemaufrufe schlagen in meinem neuen GLIBC fehl.
Ist es unmöglich, a zu kompilieren squeeze
oder wheeze
GLIBC unter 2.6.17 auszuführen?
Alle Ideen / Hinweise, was ich falsch gemacht habe und / oder wie ich vorgehen soll, wären sehr dankbar ...