2009-05-06 10 views
5

Nach einem Linux-Kernel-Upgrade kann mein VMWare-Server erst gestartet werden, wenn vmware-config.pl verwendet wird, um einige Neukonfigurationsarbeiten durchzuführen (einschließlich der Erstellung einiger Kernel-Module).Warum muss ich das vmware-Kernel-Modul nach einem Linux-Kernel-Upgrade neu kompilieren?

Wenn ich meinen Windows VMWare-Host mit dem neuesten Windows Service Pack aktualisiere, muss ich normalerweise nichts tun, um VMWare auszuführen.

Warum funktioniert VMWare anders zwischen Linux und Windows? Führt diese Neukompilierungsaktion zu Vorteilen auf der Linux-Plattform über Windows?

Antwort

12

Go lesen The Linux Kernel Driver Interface.

Dies wird geschrieben, um zu erklären, warum Linux weder eine binäre Kernel-Schnittstelle noch eine stabile Kernel-Schnittstelle hat. Bitte beachten Sie, dass dieser Artikel die Kernel-Interfaces von _in kernel_ beschreibt, nicht die Benutzeroberflächen von Kernel zu Userspace. Die Kernel-zu-Userspace-Schnittstelle ist diejenige, die von Anwendungsprogrammen verwendet wird, die Syscall-Schnittstelle. Diese Schnittstelle ist über die Zeit stabil und bricht nicht. Ich habe alte Programme, die auf einem Kernel vor 0.9 gebaut wurden, der immer noch gut funktioniert auf dem neuesten 2.6 Kernel-Release. Diese Schnittstelle ist diejenige, auf die sich Benutzer und Anwendungsprogrammierer verlassen können, die stabil ist.

Es spiegelt den Blick auf einen großen Teil der Linux-Kernel-Entwickler: die Freiheit in-Kernel-Implementierung Details und APIs jederzeit ändern können sie viel schneller und besser entwickeln.

Ohne das Versprechen, die Kernel-Schnittstellen von Release zu Release identisch zu halten, gibt es keine Möglichkeit, dass ein Binärkernel-Modul wie VMWare zuverlässig auf mehreren Kernen arbeitet.

Wenn sich beispielsweise einige Strukturen bei einer neuen Kernel-Version ändern (für bessere Leistung oder mehr Funktionen oder andere Gründe), kann ein binäres VMWare-Modul unter Verwendung des alten Strukturlayouts katastrophale Schäden verursachen. Wenn das Modul erneut aus der Quelle kompiliert wird, wird das neue Strukturlayout erfasst, und es besteht somit eine bessere Chance zu arbeiten - wenn auch nicht zu 100%, wenn Felder entfernt oder umbenannt wurden oder andere Zwecke erfüllt wurden.

Wenn eine Funktion ihre Argumentliste ändert oder umbenannt wird oder auf andere Weise nicht mehr verfügbar ist, funktioniert nicht einmal das erneute Kompilieren aus demselben Quellcode. Das Modul muss sich an den neuen Kernel anpassen. Da jeder (sollte) eine Quelle haben sollte (und jemanden finden kann), der in der Lage ist, ihn zu modifizieren."Push work to the end-nodes" ist eine gängige Idee sowohl bei der Vernetzung als auch bei freier Software: da die Ressourcen [am Rande]/[der Entwickler außerhalb des Linux-Kernels] größer sind als die begrenzten Ressourcen [des Backbones]/[der Linux-Entwickler], der Kompromiss, um die ersteren machen mehr von der Arbeit wird akzeptiert.

Auf der anderen Seite hat Microsoft die Entscheidung getroffen, dass sie die Kompatibilität der Binärtreiber so weit wie möglich erhalten müssen - sie haben keine Wahl, da sie in einer proprietären Welt spielen. In gewisser Weise ist dies für externe Entwickler, die nicht mehr mit einem beweglichen Ziel konfrontiert sind, und für Endbenutzer, die nie etwas ändern müssen, viel einfacher. Auf der anderen Seite zwingt dies Microsoft zu Abwärtskompatibilität, die (bestenfalls) zeitaufwendig für die Entwickler von Microsoft ist und (im schlimmsten Fall) ineffizient ist, Fehler verursacht und den Fortschritt verhindert.

2

Linux hat keinen stabilen Kernel ABI - Dinge wie das interne Layout von Datenstrukturen usw. ändert sich von Version zu Version. VMWare muss neu erstellt werden, um das ABI im neuen Kernel zu verwenden.

Auf der anderen Seite hat Windows eine sehr stabile Kernel ABI, die nicht von Service Pack zu Service Pack ändert.

1

Um bdonlans Antwort hinzuzufügen, ist ABI-Kompatibilität eine gemischte Tasche. Auf der einen Seite erlaubt es Ihnen, binäre Module und Treiber zu verteilen, die mit neueren Versionen des Kernels funktionieren. Auf der anderen Seite zwingt es Kernel-Programmierer, eine Menge Kleber-Code hinzuzufügen, um die Rückwärtskompatibilität beizubehalten. Da Linux Open-Source ist und kernel developers even whether they're even allowed, wird die Fähigkeit, binäre Module zu verteilen, nicht als wichtig angesehen. Auf der anderen Seite müssen sich Linux-Kernel-Entwickler keine Gedanken über ABI-Kompatibilität machen, wenn sie Datenstrukturen ändern, um den Kernel zu verbessern. Auf lange Sicht führt dies zu einem saubereren Kernel-Code.