HOWTO: Beim Cross-Kompilieren eine 32-Bit (i386) Linux-Kernel auf 64-Bit-Maschine (amd64)
Zweck: In diesen Tagen 64-Bit-Hardware und Betriebssystem werden immer mehr und mehr üblich und bezahlbar. Nun, wenn Sie eine benutzerdefinierte Linux-Kernel auf einer regulären Intel-Architektur 32-Bit-Maschine (i386) für eine 32-Bit-Rechner selbst kompilieren, dann gibt es keine Probleme. Aber jetzt, wenn Sie versuchen, einen benutzerdefinierten Linux-Kernel für 32-Bit-auf 64-Bit-Rechner kompilieren anfangen, Dinge anders. Man kann nicht direkt kompilieren eine 32-Bit-Kernel auf einem 64-Bit-Rechner in einer Art und Weise einfach . Ich habe in mehreren fragte Foren aber nicht bekommen eine richtige Antworten, so habe ich beschlossen, die Forschung über meine eigenen. In diesem Blog-Post werden wir lernen, wie man eine 32-Bit-Kernel auf einem 64-Bit-Rechner kompilieren.
Wenn Sie, wie man eine 32-Bit-Grafik (X Windows)-Anwendung auf einem 64-Bit-Betriebssystem ausgeführt wird, klicken Sie hier .
Terminologie: In der Regel in der Linux-Welt:
- i386 - Bezieht sich auf 32-Bit-
- amd64 - Bezieht sich auf 64-Bit-
Hinweis: "amd64" bedeutet nicht nur 64-Bit-AMD-Maschinen. Intel, AMD und VIA - Der Begriff amd64 wird allgemein für alle 64-Bit-Maschine verwendet. Um Kredit zu geben, für das erste AMD kommen mit 64-Bit-Architekturen wird das Wort amd64 verwendet.
Szenario: Hier ist meine aktuelle Szenario, das ich in dieser ganzen Blog-Post verwenden werden
Host-Computer: AMD Athlon X2 Dual Core 64-Bit-Rechner mit 64-Bit-OS Debian installieren
Zielcomputer: Intel Celeron 32-Bit-Rechner
Nun, würde Ich mag, um eine Linux-Kernel für mein Ziel auf meiner Maschine Host-Computer zu kompilieren. Typischerweise Menschen tun dies, weil in der Regel schneller als Host-Computer als Zielrechner oder wie in meinem Fall habe ich mich entschlossen, alle meine Linux-Kernel auf Host-Maschine kompiliert sind. Allerdings, wenn Sie eine 32-Bit-OS (Operating System) auf einem 64-Bit-Computer installiert haben, dann können Sie einfach Ihren Kernel kompilieren, wie Sie es nutzen, um vor zu tun. Sie brauchen nicht, diesen Beitrag zu folgen.
Schritt 1: Erstellen Sie eine 32-Bit-System debootstrap
Die Faust Schritt ist, um eine 32-Bit-Debian-Bootstrap-System auf Ihrem Host-Computer zu erstellen. Sie können folgen Sie diesem Link für die Schritt-für-Schritt-Anleitung, wie Sie das tun.
Das Endergebnis dieser Schritt wird sein, dass Sie eine brandneue 32-Bit-System in das folgende Verzeichnis haben:
/home/kushalk/chroots/debian32
auf Ihrem 64-Bit-Rechner
Schritt 2: Richten Sie Ihre Kernel-Quellen
Jetzt nur noch "chroot" in der Bootstrap System gy geben Sie den folgenden Befehl:
amd64# chroot /home/kushalk/chroots/debian32
debian32# cd /usr/src/
debian32# apt-get install linux-source-2.6.26
debian32# tar -xjvf linux-source-2.6.26.tar.bz2
und Sie sind bereit zu starten Kompilieren des Kernels
Hinweis: Anstelle des Herunterladens Quellen noch einmal aus dem Internet, kann man auch Quelltext Ordner von Ihrem / usr / src / Verzeichnis auf Ihrem Host-Maschine. Linux Kernel-Quellen werden nicht 32-bit/64-bit abhängig was bedeutet, dass die gleiche Quelle Tarballdatei verwendet werden, um 32-Bit und 64-Bit-Kernel zu kompilieren.
Schritt 3: Konfigurieren Sie Ihren Linux-Kernel
Jetzt können Sie entweder nur eine Standard-Kernel-Konfigurationsdatei durch.:
debian32# cd /usr/src/linux-source-2.6.26
debian32# make defconfig
sonst können Sie kopieren eine bestehende Konfigurationsdatei durch.:
debian32# cp </path-to-config-file/.config> .config
sonst können Sie Ihren Kernel konfigurieren, um eine Konfigurationsdatei zu erzeugen durch.:
debian32# make menuconfig
Nun, wenn Sie grafische Kernel-Konfiguration wie "make xconfig" oder "machen gconfig" verwenden wollen, werden Sie nicht in der Lage, mit der obigen Einstellung so weit zu tun. Wenn Sie zu tun versuchen Sie werden am Ende immer folgende Fehlermeldung:
debian32# make xconfig
scripts/kconfig/qconf arch/x86/Kconfig
No protocol specified
qconf: cannot connect to X server :0.0
make[1]: *** [xconfig] Error 1
make: *** [xconfig] Error 2
debian32#
Wir müssen einige zusätzliche Schritte durchführen, um das grafische Konfigurations-Bildschirm, die ich in meiner Erklärung erhalten nächsten Post (siehe Schritt 5).
Schritt 4: Stellen Sie Ihre Linux-Kernel
Nun gibt es zwei Möglichkeiten, um einen Linux-Kernel kompilieren - die "Standard" so oder so "Debian" Weise, die mit "make-kpkg" Dienstprogramm beinhaltet. Ich in der Regel mit Debian zu kompilieren.
debian32# make-kpkg --initrd --append-to-version=-32bit kernel_image kernel_headers
Nun gehen und einen Kaffee holen und Sie sollten Ihren Kernel bereit in wenigen Minuten.
Jetzt können Sie kommen aus Ihrem "chroot"-Umgebung und kopieren Sie das Kernel-Image zurück auf dem Host-System.
debian32# exit
amd64# cp /home/kushalk/chroots/debian32/usr/src/*.deb /root/
In dem oben genannten Befehl, bin ich kopieren Sie alle *. Deb-Dateien (die kompilierten Kernel und Header-Dateien) von meinem 32-Bit-System auf die Bootstrap-Benutzer "root"-Verzeichnis auf meinem Host-System (amd64). Obwohl wir den Begriff des "32-Bit-System" verwendet, es bedeutet nur, ein Verzeichnis, das auf dem Host-System befindet. Ihr 32-Bit-Bootstrap-System in auf Ihrem 64-Bit-Maschine.
Das war's. Glückliche 32-bit'ing!













5. Juni 2009 um 7:12 Uhr
[...] Wir haben bereits gesehen, wie man ein System schaffen debootstrap und wir haben auch gelernt, wie man eine 32-Bit-Anwendung zu kompilieren (wie Linux-Kernel) innerhalb des Systems in debootstrap Debian Linux. [...]
23. Oktober 2009 um 12:05 Uhr
$ (Echo '# / bin / sh'; echo 'exec gcc-m32 "$ @"')> ~ / bin/i486-linux-gnu-gcc
$ Chmod + x ~ / bin/i486-linux-gnu-gcc
$ For i in ar ld nm objcopy Streifen; tun
$ Ln-s `which $ i` ~ / bin/i486-linux-gnu- $ i
$ Getan
$ Fakeroot make-kpkg-arch i386 kernel-image
Works for me ...
Auf diesen Kommentar antworten
Admin Antworten:
26. Oktober 2009 um 10:14 Uhr
Ich bin jetzt gespannt, dass zu versuchen. Ich werde wirklich schätzen, wenn Sie uns kurz erklären kann, was Sie in den Befehlen vor dem "fakeroot" Befehl tun.
Vielen Dank.
Auf diesen Kommentar antworten
27. Oktober 2009 um 10:31 Uhr
Stellt sicher, dass die erforderlichen Binärdateien vorhanden für das Ziel sind. Sie sind notwendig, weil Make-kpkg tut dies:
machen CROSS_COMPILE = i486-linux-gnu-ARCH = i386 vorzubereiten
Symbolischen Link ist meistens in Ordnung, da die gleichen Binärdateien normalerweise für x86-und amd64 sowieso verwendet werden. Die odd one out ist der Compiler, die "-m32" muss (obwohl ich nicht ohne diese getestet habe, scheint es sinnvoll, es trotzdem zu geben für Richtigkeit, und der Compiler wird gezielt amd64 Standard).
Auf diesen Kommentar antworten
Admin Antworten:
3. November 2009 um 12:37 Uhr
Hallo Ds,
Nun weiß ich sehen, was Sie versuchen, in Ihrem kleinen Skript vor fakeroot tun. Doch bevor ich das versuchen, würde Ich mag wissen, wie man un-do die Schritte (in einer sauberen Art und Weise), um sie in den ursprünglichen Zustand wiederherzustellen (für den Aufbau amd64 Kernel).
Auf diesen Kommentar antworten
1. November 2009 um 9:00 Uhr
Nizza Post, aber ich frage mich (ein bisschen lazzy mich versuchen), wenn
$ Linux32 machen defconfig
$ Linux32 machen
würde den Job nicht machen? Haben Sie diese Möglichkeit zu untersuchen?
Auf diesen Kommentar antworten
ds Antworten:
1. November 2009 um 3:37 Uhr
Das scheint in Ordnung.
"Fakeroot linux32 machen deb-pkg" auch funktioniert, aber bietet nicht die manchmal nützlich-"Sie ersetzen den laufenden Kernel - sind Sie sicher, dass" Fragen.
Doch "fakeroot linux32 make-kpkg kernel-image" baut 64-bit (dies ist von dem, was passiert, wenn es "machen oldconfig" läuft klar).
Auf diesen Kommentar antworten
pat Antworten:
2. November 2009 um 10:18 Uhr
Ich stimme meine Antwort würde nicht funktionieren, ein Debian-Paket zu erstellen.
Ich wollte jedoch versuchen, den Kernel von der Quellen-Tarball zu bauen, und es funktionierte. Ich war sogar in der Lage, auf einen anderen 32-Bit-System habe ich booten. Das einzige Problem ist, dass die Konfiguration nicht einfach ist, nur Konsolen-Modus Config gearbeitet ...
Und die Installation der Module ist nicht so einfach. Also lasst meine Antwort für die Archive halten ...;-p
Auf diesen Kommentar antworten
pat Antworten:
2. November 2009 um 10:22 Uhr
Allein der Gedanke, es ein bisschen spät, aber die Installation der Module wird es viel einfacher durch ein einfaches chroot.
Auf diesen Kommentar antworten
17. April 2010 um 08.31 Uhr
"Hinweis:" amd64 "bedeutet nicht, dass nur 64-Bit-AMD-Maschinen. Intel, AMD und VIA - Der Begriff amd64 wird allgemein für alle 64-Bit-Maschine verwendet. Um Kredit zu geben, für das erste AMD kommen mit 64-Bit-Architekturen wird das Wort amd64 verwendet. "
Das ist völlig falsch. Es gibt 64-Bit-Architekturen seit langer, langer Zeit, zB DEC Alpha. AMD nicht "zuerst mit 64-Bit-Architekturen kommen." In der Tat war auch Intel zuvor mit dem Itanium. AMD jedoch aktualisiert die alte Intel 32-Bit-x86 * architectur * bis 64-bit, und bekommt den Kredit dafür.
Auf diesen Kommentar antworten
Uszui Antwort:
28. Juni 2012 um 3:06 Uhr
Eine andere Sache, nur geben die Kredite an den falschen Anbieter ist eine Sache, die andere Sache ist, dass die Notiz darauf hin, dass alle 64-Bit-Maschinen amd64, die auch falsch waren.
Nicht so lange her Intel startete seine eigene 64-Bit-CPUs. Das waren völlig unvereinbar mit den 32-Bit-Wieder-und Linux-Welt nannte sie ia64. AMD kam mit seinem Konkurrenten, auch 64-Bit-Prozessor, sondern mit 32-Bit-Kompatibilität, genannt amd64 oder x86_64. Es stellte sich heraus, dass ein größerer Erfolg amd64 als ia64 war, so Intel begonnen, die AMD64-Architektur in seinen neueren Modelle verwenden, ließ die ia64. Auf diese Weise gibt es eine Chance, dass eine Reihe von Linux-Anwender tatsächlich eine ia64-Computer, für sie ist amd64 die falsche Wahl.
Auf diesen Kommentar antworten
6. Oktober 2010 um 1:55 Uhr
[...] Jahr schrieb ich einen Blog-Artikel auf Bootstrapping Ihr System mit debootstrap. Später schrieb ich einen Artikel, die debootstrap wieder verwendet zum Erstellen einer Cross-Kompilierung für Linux [...]
14. November 2011 um 1:48 Uhr
Ich baute i686 32-Bit-Kernel in 64-Bit-AMD-System. ^ ^ Ich habe es nicht chroot Methode. Es sieht zu viel Aufwand ehrlich. Ich wusste, gcc-Compiler ist Cross-Architektur.
Build-System: 2.6.39 AMD 64-Bit
2.6.39amd64hp # 1 SMP PREEMPT Fr 11. November 21.33.44 KST 2011 x86_64 GNU / Linux
Zielsystem: 2.6.39 32-Bit-Intel Pentium M
Linux-Laptop 2.6.39 Nr. 1 PREEMPT Mo 14. November 03.36.14 KST 2011 i686 GNU / Linux
Es ist Auszug von dmesg von 32-Bit-System - ein Laptop.
[0.000000] Initializing cgroup subsys cpuset
[0.000000] Initializing cgroup subsys cpu
[0.000000] Linux version 2.6.39 (2.6.39) (Pinguin @ theblue) (gcc version 4.4.5 (Debian 4.4.5-8
)) # 1 PREEMPT Mo 14. November 2011 03.36.14 KST
Unten hat die Cross-Architektur aufzubauen.
"$ Export KBUILD_VERBOSE = 1" ist irrelvant. Es zeigt Meldungen, die während der Kernel zu bauen.
$ Export CFLAGS = "-march = pentium-m-O2-pipe-fomit-frame-pointer"
gcc Compiler-Optimierung Option für Intel Pentium M 1.8 GHz ist pentium-m.
"-O2-pipe-fomit-frame-pointer" sind Code-Optimierung. "-Pipe" ist für die Geschwindigkeit der Zusammenstellung nicht binär bauen.
$ Export CXXFLAGS = "$ {CFLAGS}"
Ich denke CXXFLAGS ist irrelevant zu. Es ist für g+ + Compiler.
"$ DEB_HOST_ARCH = i386 i386 setarch Make-kpkg-Revision" 1 "-cross-compile - arch = i386-us-uc-initrd-rootcmd fakeroot kernel-image kernel-headers"
Es injiziert Cross-Compile-Einstellungen auf Linux-Kernel Build Makefile und verwalten den Bauprozess. Wie Sie unten sehen, führt er zwei Befehle.
exec machen kpkg_version = 12.036 + nmu1-f / usr / share / kernel-package / Regelsatz / minimal.mk debian Debian-Revision = 1 KPKG_ARCH = i386 CROSS_COMPILE = - = YES INITRD ROOT_CMD = fakeroot
Ich denke, dieser Befehl startet Linux-Kernel zu bauen.
"Exec debian / rules Debian-Revision = 1 KPKG_ARCH = i386 CROSS_COMPILE = - = YES INITRD ROOT_CMD = fakeroot UNSIGN_CHANGELOG = YES UNSIGN_SOURCE = YES kernel-image kernel-headers"
Ich wusste nicht symbolische Links für i386. Make-kpkg beklagt fehlende 32-Bit-Compiler gcc, ausgelöst "Menü oldconfig"
$ Export KBUILD_VERBOSE = 1
$ Export CFLAGS = "-march = pentium-m-O2-pipe-fomit-frame-pointer"
$ Export CXXFLAGS = "$ {CFLAGS}"
$ DEB_HOST_ARCH = i386 i386 setarch Make-kpkg-Revision "1"-cross-compile - arch = i386-us-uc-initrd-rootcmd fakeroot kernel-image kernel-headers
Es erstellt zwei Dateien Paket:
6.9M 14. November 03.59 linux-headers-2.6.39_1_i386.deb
15M 14. November 03.58 linux-image-2.6.39_1_i386.deb
Kernel-Dateien in den Laptop:
5.4M 14. November 04.09 initrd.img-2.6.39
1.6M 14. November 03.57 System.map-2.6.39
3.6M 14. November 03.57 vmlinuz-2.6.39
Dateien unten sind generische Debian i686-Kernel.
8.4M 12. November 19.15 initrd.img-2.6.32-5-686
6.0M 14. Juli 13.44 initrd.img-2.6.26-2-686
908K 12. Juni 01.35 System.map-2.6.26-2-686
1.5M 12. Juni 01.34 vmlinuz-2.6.26-2-686
Auf diesen Kommentar antworten
3. Dezember 2011 um 07.49 Uhr
Die deboostrap System nicht weiß, der Befehl "make". Was soll ich tun?
Auf diesen Kommentar antworten
21. März 2012 um 7:13 Uhr
Haben Sie nie versuchen:
machen ARCH = i386
Auf diesen Kommentar antworten
23. März 2012 um 10:34 Uhr
[...] Nach DEM obligaten Behaken einschlägiger Suchmaschen Fand ich schliesslich drei Artikel [1] [2] [3], Welscherland mich zur Losung [...]