KVS für Rohrstandorte Optimiert für schwere Serverlasten und vor Überlastungen geschützt Sie brauchen kein Geld für teure Serverhardware oder Serverfarmen. KVS ist bereit, Tonnen Verkehr sofort zu behandeln. Über 10 Millionen Hits pro Tag ist ein alltäglicher Durchschnitt für KVS-Standorte. Seine niemals die kritische Schwelle zu sein, nach der Ihre Website aufhört zu wachsen und wird träge. Mit dem Anti-Overload-Schutz können Sie die potenziell problematischen Seitenblöcke identifizieren und optimieren, bevor sie Probleme verursachen. 100 offene PHP-Code kann gekauft werden Ihre Website ist 100 Backdoor-frei, und Sie sind der einzige, der es kontrolliert. Sie haben nie Gründe, daran zu zweifeln. Sie haben die volle Kontrolle über alles, in der Lage, unbegrenzte Änderungen zu machen, wann immer Sie brauchen. Umfangreiche, leicht verständliche Kategorisierung Erstellen Sie neue Abschnitte schnell und einfach ohne PHP-Entwicklung Fähigkeiten. Kategorisieren Sie Ihre Inhalte, die Ihre Daten genau so strukturieren, wie Sie es benötigen. Mehrsprachige Unterstützung für Site und Content Dont begrenzen Sie Ihr eigenes Wachstum. Erstellen Sie mehrere Website-Versionen in verschiedenen Sprachen und erhalten Sie mehr internationalen Verkehr. Verwalten Sie die Sprachversionen im Admin-Bedienfeld, mit dem Sie Ihre Übersetzer problemlos steuern und Ihre Kopie aktualisieren können. Multi-Server-Content-Konvertierung und - Speicherung Zeit ist Geld. Dont Abfälle sowohl die Verarbeitung großer Mengen an Inhalten. KVS unterstützt die parallele Verarbeitung von Inhalten durch mehrere Konvertierungsserver. Sie werden beeindruckt sein, wie schnell KVS sein kann. Verwenden Sie mehrere Server, um Ihre Inhalte zu speichern. Einen günstigeren Server gefunden Perfekt, mit KVS, können Sie Ihre Inhalte dort leicht verschieben, keine Verluste oder Grenzen. Erstellen Sie Website-Netzwerke mit der gleichen Datenbank Starten Sie mehr Websites verbringen weniger Geld und Zeit. Erhalten Sie mehr SE-Verkehr, indem Sie verschiedene Kopie für verschiedene Aufstellungsorte verwenden. Build Nischen-Sites mit Ihrem primären Multi-Nischen-Website. Der gesamte Inhalt wird in Ihrem Adminbereich verwaltet. Probieren Sie es aus, es ist wirklich einfach. Eingebettete Codes werden unterstützt und bieten flexible Anzeigenkonfigurationseinstellungen und detaillierte Statistiken. Steigern Sie Ihre Website und Ihre Benutzerbasis, indem Sie die Besucher auf Ihre Embed-Codes verteilen. Fügen Sie einen Einbettungscode für Anzeigen hinzu und konfigurieren Sie Ihre Einstellungen. Der Code kann eine niedrigere Qualität Video oder sogar einen Anhänger haben. So viele Einstellungen zur Auswahl. Auf Social - und Community-Features ausgerichtet Machen Sie Ihren Nutzern mehr Zeit auf Ihrer Website. Sie sollen miteinander interagieren, Informationen austauschen und Gemeinschaften von Gleichgesinnten beitreten. KVS kann Ihnen dabei helfen, eine große Kombination von Community-Features und Abonnement-basierten Diensten zu erstellen. Je mehr motiviert sie sind, desto mehr tun sie auf Ihrer Website Ermutigen Sie Ihre Nutzer zur Teilnahme an Token als Anreize. Diese können auf Prämien ausgegeben werden, einschließlich Zugang zu Premium-Abschnitten. Professionelle Unterstützung auf Englisch, aus erster Hand von Entwicklern Wir bieten keine Unterstützung durch Drittanbieter. Alle Ihre Fragen und Probleme werden von den Entwicklern selbst behandelt, die offensichtlich ihr Produkt innen und außen kennen. Alle Fragen sind sofort gelöst, ohne sich unendlich zwischen Support und Tech. Wir verstehen, wie absolut wichtig das ist, und Kundenfeedback beweist, dass wir es richtig machen. Unglaublich flexible Seiten-Builder mit einfachen, einfach zu bedienenden Design-Vorlagen Erstellen Sie neue Seiten und ändern Sie die, die Sie bereits haben, ohne dass alle Entwickler bezahlen müssen. Die von unserem Site-Builder erstellten modularen Seiten erfordern keine Bearbeitung des PHP-Codes. Sie brauchen nur grundlegende HTML und Smarty Fähigkeiten. Verringern Sie die Entwicklungskosten und halten Sie Ihren Code fehlerfrei. Wir haben nie aufhören, up-to-date-Features, um neue KVS-Updates. Video-Player unterstützt HTML5, mehrere Qualitäts-Modi und praktisch grenzenlose Monetarisierung Optionen Monetarisieren Sie Ihre Website ohne Hektik und machen alle Anpassungen von einer bestimmten Kampagne erforderlich. Unser Spieler wurde für Rohrstandorte gebaut und erfüllt alle aktuellen Marktanforderungen. Absolute Sicherheit und 100 Standortkontrolle Ihre KVS-Website ist immer durch unser mehrstufiges Schutzsystem gesichert. Sie können Anti-Hacking-Schutz mit permanenter Software-und Hardware-Performance-Analyse, System-Datei ändern Audit, Alert-System und detaillierte Statistiken. Bleiben Sie aktualisiert, wie Ihre Website führt zu allen Zeiten. Multiformat-Content-Unterstützung und das Erstellen von Formaten, wie Sie bauen und wachsen Ihre Website Machen Sie Ihre Website einfacher zu bedienen. Bieten Sie Videos in mehr Auflösungen, Formaten und Qualitätseinstellungen an. Monetarisieren Sie Ihre Website mit kostenlosen Video-Trailer und voller Filme für Abonnenten. Verwalten Sie Ihre Videoformate beim Erstellen und Erweitern Ihrer Website anhand Ihrer Quelldateien. Sie wählen einfach die Parameter, und KVS macht den Rest. Video-und Video-Screenshot-Rotation Behavior-based Rotator wählt beste Videos und beste Screenshots für Videos. Ihre am meisten anklickbare und spannende Inhalte ist immer an der Spitze. Importieren und Exportieren von Feeds Publisher-definierte Inhalte sind für Webmaster, die diese Inhalte verwenden, immer leicht zugänglich für Publisher-Websites. Außerdem können Sie automatisiert das Hinzufügen großer Mengen von Inhalten aus praktisch jeder Quelle. Mehrfach bezahlte Zugriffsoptionen Monetarisieren Sie Ihre Website mithilfe unseres erweiterten Abrechnungssystems. KVS unterstützt alle gängigen Zahlungsprozessoren wie CCBill, Epoch, SegPay, NATS, Zombaio, Vendo, SMSCiuk, SMSDostup, xBill etc. Wählen Sie zwischen dauerhaften Mitgliedschaften (monatliche oder andere Perioden) sowie Pay-per-View mit Token. Neue Abrechnungsfunktionen sind immer auf dem Weg. Benutzer-Wiedergabelisten, öffentlich und privat Noch ein ehrfürchtiges Merkmal, das Ihre Benutzer leicht strukturieren kann, site Inhalt in ihren kundenspezifischen privaten Playlists und den Inhalt zu finden, den sie in den öffentlichen Wiedergabelisten benötigen. Dies kann die Benutzer-Loyalität drastisch zu erhöhen und machen Sie Ihre Website mehr SE-freundlich. Updates und Verbesserungen nie aufhören KVS bedeutet 9 Jahre non-Stop Entwicklung und Verbesserung. Obwohl das Produkt sehr schnell populär und stabil wurde, hörten wir nie auf, es zu perfektionieren. Die meisten unserer Kunden besitzen Top-Level-Sites, deshalb müssen wir immer aktuelle Features und Services anbieten, die zusammenpassen. KVS ist alles über die neuesten Features, die voll und ganz die aktuellen Bedürfnisse der Website-Besitzer auf der ganzen Welt zu erfüllen. Schauen Sie sich alle Kernel Video-Sharing-Funktionen jetzt. Werfen Sie einen Blick auf unsere Demo-Website und bestellen Sie die neue Version jetzt arbeiten mit den Besten, werden die besten Bravo Media Group Alex Wir verwenden KVS jetzt für einige Zeit und wir havent sah zurück. Unsere Erfahrung ist seit dem ersten Tag nichts Besonderes. KVS erfüllt alle heutigen Anforderungen im heutigen dynamischen Markt. Es eignet sich für alle Geschäftsmodelle als neue Versionen werden häufig mit neuen Funktionen hinzugefügt die ganze Zeit veröffentlicht. Darüber hinaus ist das Skript erstaunlich flexibel und lässt Sie es neu konfigurieren. Wir verwenden dieses Skript schon seit ein paar Jahren. Waren so glücklich waren allmählich bewegen unsere wichtigsten Standorte. KVS bietet eine große Kombination von Features, Content-Verarbeitung und Website-Verwaltung Optionen und eine sehr einfach zu Template-Engine verwenden. Fügen Sie die hoch professionelle Support-Team und erhalten Sie eines der führenden Produkte auf dem Markt heute. Unsere Empfehlungen Wir verwenden KVS auf mehreren erfolgreichen Websites mit mehr als 1 Million Pageviews pro Tag und es war immer ein stabiles und effizientes Skript. Es kann große Websites mit Leichtigkeit behandeln. Ihr Support-Personal ist schnell und außerordentlich hilfreich und es ist einer der vielen Gründe, warum wir immer wieder auf KVS für unsere neuen Seiten. Ich gebe es meine höchste Empfehlung für den Bau Ihrer Tube-Website. Wir haben dieses Skript getestet und es für ein paar Jahre jetzt. Ich glaube, kein Skript kann ein Wettbewerb zu KVS im heutigen Markt sein. Ein beeindruckendes Gleichgewicht zwischen Benutzerfreundlichkeit, Anpassungsoptionen und einem vielversprechenden Satz an leistungsstarken Funktionen. RC Support Royal Cash Wir haben dieses Produkt verwendet, um einige unserer Seiten zu bauen und zu betreiben. Es bietet unglaubliche Benutzerfreundlichkeit bei der Verwaltung und Konfiguration einer Website, die Server-Last ist minimal und Seiten laden wirklich schnell. Wir schätzen alle Hilfe, die Kernel Team bei der Einrichtung und Anpassung von Kernel Video Sharing für diese Seiten anbot. Wir wünschen ihnen nichts als Erfolg, wenn sie ihr Produkt weiter nehmen. Ich mag wirklich Kernel Video Sharing. Ich bin immer auf der Suche nach einem neuen Skript, um mir zu helfen, meine Arbeit schneller und einfacher zu gestalten. Ich achte immer auf Schwierigkeiten beim Hinzufügen eines neuen Scripts. Viele dieser Dinge einfach nicht funktionieren und es braucht Tage, um die Fehler zu beheben, die sie verursachen. Also, ich war angenehm überrascht, als dieses Skript nur keine Probleme zeigte. Dann blies mir die einfache Bedienung wirklich. Tay Tony Bucks Lassen Sie mich alle Leute hier beitreten und sagen, dass dieses Skript rockt. Ich kann nicht sogar beginnen, alle Funktionen aufzurufen. Sein ein reales Rubiks Würfel, kombinieren Sie gerade die Teile in der Weise, die Sie wünschen. Unser Team hat bereits seit mehreren Jahren Vorlagen für KVS geschnitten. Wir lieben, wie dynamisch dieses Skript ist, immer vorwärts. Nach unserer Erfahrung wurden alle Fragen sofort von der Supportabteilung behandelt. Wenn Sie etwas, das noch nicht da ist, brauchen, können Sie sicher sein, es wird ziemlich bald, nachdem Sie ihnen darüber erzählen. Nachdem wir Dutzende von KVS-basierten Websites gebaut haben, sind wir jetzt sicher. Seit einiger Zeit bauen und unterstützen wir schlüsselfertige Adult Sites. Dazu gehören CJ-Sites, Tubes, TGPs, Paysites, AVS-Sites, Blogs und vieles mehr. Für die meisten Video-basierten Websites verwendeten wir Kernel Video Sharing. Derzeit ist KVS die beste Wahl für Rohrstandorte. Es gibt nur so viele Möglichkeiten, um die Vorlagen an Ihre Bedürfnisse anzupassen. Wir mögen, dass Sie grundlegende Funktionen für verwenden können. Bereit zum Start Geschäft mit Profis und bauen eine erfolgreiche KVS-powered siteUpdated: June 14, 2010 Dieser Artikel ist ein Teil meines Linux Kernel Crash Buch. Es steht zum kostenlosen Download als PDF zur Verfügung. Endlich ist der große Moment gekommen. Lesen der Informationen, die vom Crash-Dienstprogramm angezeigt werden, verstehen, was diese neugierigen Linien bedeuten und hacken Sie Ihren Weg durch das Problem auf die andere Seite. Wir haben gelernt, wie unsere Systeme für Kernel-Crash-Dumping zu konfigurieren, mit LKCD und Kdump. Sowohl lokal als auch über das Netzwerk. Wir haben gelernt, wie man den Crash-Dumping-Mechanismus auf CentOS und openSUSE einrichtet. Und wir haben die subtilen Unterschiede zwischen den beiden Betriebssystemen überprüft. Als nächstes beherrschten wir die grundlegende Verwendung des Crash-Dienstprogramms und nutzten es, um den gedumpten Speicherkern zu öffnen und die darin enthaltenen Informationen zu verarbeiten. Aber wir haben noch nicht gelernt, die Ausgabe zu interpretieren. Voranstellung Heute werden wir uns darauf konzentrieren. Lesen Sie die vmcore-Analyse, verstehen Sie, was die Einträge bedeuten, führen Sie eine grundlegende Untersuchung des Problems durch, untersuchen Sie den Quellcode und leiten Sie eine effiziente Methode zur Behandlung von Kernel-Crash-Problemen in der Zukunft ab. Also, wenn youre in einer Stimmung für einige super-ernsthafte Hackologie, folgen Sie mir bitte. Inhaltsverzeichnis Notwendige Lesung Sie müssen die anderen Artikel in anderen zu verstehen, wie Crash funktioniert. Die detaillierte Liste der Referenzen finden Sie unten. Ohne die grundlegenden Konzepte, einschließlich Kdump und Crash-Funktionalität, werden Sie nicht in der Lage, dieses Tutorial effizient zu folgen. Analysieren des Absturzberichts - Erste Schritte Sobald Sie Crash gestartet haben, erhalten Sie die ersten Berichtsinformationen, die auf die Konsole gedruckt werden. Hier beginnt die Analyse des Crashs. Crash 4.0-8.9.1.el5.centos Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Alle Rechte vorbehalten -2006 Hewlett-Packard Co Urheberrecht (C) 2005, 2006 Fujitsu Limited Copyright (C) 2006, 2007 VA Linux Systems Japan KK Mission Critical Linux, Inc. Dieses Programm ist freie Software, die von der GNU General Public abgedeckt ist. Copyright (C) 1999 (2002) Lizenz, und Sie sind herzlich eingeladen, es zu ändern und verteilen Kopien davon unter bestimmten Bedingungen. Geben Sie die Hilfe ein, um die Bedingungen zu sehen. Dieses Programm hat absolut keine Garantie. Geben Sie die Hilfegarantie für Details ein. GDU ist eine kostenlose Software, die von der GNU General Public License abgedeckt ist, und Sie sind herzlich eingeladen, es zu ändern und zu verbreiten Kopien davon unter bestimmten Bedingungen. Geben Sie das Kopieren ein, um die Bedingungen anzuzeigen. Es gibt keine Garantie für GDB. Typ-Show-Garantie für Details. Dieser GDB wurde als x8664-unknown-linux-gnu konfiguriert. bt: kann nicht von Ausnahme-Stack auf aktuelle Prozessstapel Übergang: Ausnahme-Stack-Zeiger: ffff810107132f20 Prozess Stapelzeiger: ffff81010712bef0 currentstackbase: ffff8101b509c000 KERNEL: usrlibdebuglibmodules2.6.18-164.10.1.el5.centos. plusvmlinux DUMPFILE: vmcore CPUS: 2 Datum: Tue Jan 19 20.21.19 2010 UPTIME: 00.00.00 LOAD MITTELWERT: 0,00, 0,04, 0,07 AUFGABEN: 134 NODENAME: testhost2localdomain RELEASE: 2.6.18-164.10.1.el5 VERSION: 1 SMP Do 7. Januar 19.54: 26 EST 2010 MASCHINE: x8664 (3000 Mhz) MEMORY: 7,5 GB PANIK: SysRq. Lösen Sie eine crashdump PID: 0 COMMAND: Swapper AUFGABE: ffffffff80300ae0 (1 von 2) Threadinfo: ffffffff803f2000 CPU: 0 Zustand: TASKRUNNING (ACTIVE) Ermöglicht durch den Bericht gehen. Das erste, was Sie sehen, ist eine Art von einem Fehler: bt: Ausnahme-Stack-Zeiger: ffff810107132f20 Prozess Stapelzeiger: ffff81010712bef0 currentstackbase: kann nicht auf aktuelle Prozess Stapel von Ausnahme-Stack-Übergang ffff8101b509c000 Die technische Erklärung für diesen Fehler ein wenig schwierig ist. Zitat aus dem Crash-Dienstprogramm Mailing-List-Thread über Änderungen in der Crash-Dienstprogramm 4.0-8.11 Release, erfahren wir die folgenden Informationen: Wenn ein kdump NMI, die an eine nicht-abstürzende x8664-CPU ausgegeben wurde während der Ausführung in Zeitplan () empfangen wurde, Nächste Task als aktuell im cpus runqueue, aber vor dem Ändern des Kernel Stack zu dem der nächsten Task, dann würde ein Backtrace nicht den Übergang vom NMI Exception Stapel zurück in den Prozess Stack, mit der Fehlermeldung bt: können nicht Übergang vom Ausnahme-Stack zum aktuellen Prozess-Stack. Dieser Patch zeigt Inkonsistenzen an, die zwischen einer Task, die als aktuelle Task in einem Cpus-Runqueue markiert ist, und der Task, die im pcurrent-Feld pro-cpu x8664pda (2.6.29 und früher) oder der pro-cpu currenttask-Variable (2.6.30 und später). Wenn es sicher festgestellt werden kann, dass die Runqueue-Einstellung (die standardmäßig verwendet wird) verfrüht ist, wird die interne aktive Task für die interaktive interne CPU als die durch den entsprechenden architekturspezifischen Wert angegebene Aufgabe geändert. Was bedeutet dies, dass es eine Warnung, die Sie beachten sollten, wenn die Analyse der Absturz Bericht. Es wird uns helfen, festzustellen, welche Task-Struktur, die wir brauchen, um auf die Störung der Crash-Grund zu suchen. Jetzt ignorieren Sie diesen Fehler. Es ist nicht wichtig zu verstehen, was der Absturzbericht enthält. Sie können es sehen oder nicht. Nun untersuchen wir den Code unterhalb dieses Fehlers. KERNEL: gibt den Kernel an, der zum Zeitpunkt des Crashs ausgeführt wird. DUMPFILE: ist der Name des gedumpten Speicherkerns. CPUS: ist die Anzahl der CPUs auf Ihrem Rechner. DATE: gibt die Zeit des Absturzes an. TASKS: Zeigt die Anzahl der Tasks im Speicher zum Zeitpunkt des Absturzes an. Task ist ein Satz von Programm-Anweisungen in den Speicher geladen. NODENAME: ist der Name des abgestürzten Hosts. RELEASE: und VERSION: Geben Sie die Version und Version des Kernels an. MACHINE: gibt die Architektur der CPU an. MEMORY: ist die Größe des physischen Speichers auf der abgestürzten Maschine. Und nun kommen die interessanten Bits: PANIC: gibt an, welche Art von Crash auf der Maschine aufgetreten ist. Es gibt mehrere Arten, die Sie sehen können. SysRq (System Request) bezieht sich auf Magic Keys, mit denen Sie Anweisungen direkt an den Kernel senden können. Sie können mit einer Tastatur-Sequenz aufgerufen werden oder durch echoing Buchstaben Befehle an procsysrq-Trigger. Sofern die Funktionalität aktiviert ist. Wir haben dies in der Kdump Tutorial diskutiert. Oops ist eine Abweichung vom erwarteten, korrekten Verhalten des Kernels. In der Regel, die oops führt zu der beanstandeten Prozess wird getötet. Das System kann sein normales Verhalten wieder aufnehmen. Höchstwahrscheinlich tritt das System in einen unvorhersehbaren, instabilen Zustand ein, der zu Kernel-Panik führen könnte, wenn einige der Buggy-getöteten Ressourcen später angefordert werden. Zum Beispiel, in meinem Ubuntu Karmic und Fedora Constantine Bewertungen, weve gesehen Beweise von Kernel Abstürze. Das System funktionierte weiter. Diese Abstürze waren in Wirklichkeit oopses. Wir werden später über den Fedora-Fall diskutieren. Panik ist ein Zustand, in dem das System einen schwerwiegenden Fehler festgestellt hat und nicht wiederherstellen kann. Panik kann verursacht werden, indem versucht wird, auf nicht zugelassene Adressen, erzwungenes Laden oder Entladen von Kernelmodulen oder Hardwareproblemen zuzugreifen. In unserem ersten, am meisten benign Beispiel, die PANIC: Zeichenfolge bezieht sich auf die Verwendung von Magic Keys. Wir haben bewusst einen Absturz ausgelöst. PANIC: SysRq. Trigger ein crashdump PID: ist die Prozess-ID des. Das den Absturz verursacht hat. COMMAND: ist der Name des Prozesses, in diesem Fall Swapper. Swapper. Oder PID 0 ist der Scheduler. Es ist der Prozess, delegiert die CPU-Zeit zwischen runnable Prozesse und wenn es keine anderen Prozesse in der runqueue, es nimmt die Kontrolle. Vielleicht möchten Sie sozusagen den Swapper als Leerlaufaufgabe bezeichnen. Theres ein Swapper pro CPU, den Sie bald sehen werden, wenn wir anfangen, den Abbruch in der größeren Tiefe zu erforschen. Aber das ist nicht wirklich wichtig. Wir begegnen vielen Prozessen mit unterschiedlichen Namen. TASK: ist die Adresse im Speicher für den beanstandeten Prozess. Wir werden diese Informationen später verwenden. Es gibt einen Unterschied in der Speicheradressierung für 32-Bit - und 64-Bit-Architekturen. CPU: ist die Nummer der CPU (relevant, wenn mehr als eine), bei der der beanstandete Prozess zum Zeitpunkt des Crashes ausgeführt wurde. CPU bezieht sich auf CPU-Kerne und nicht nur auf physische CPUs. Wenn youre läuft Ihr Linux mit Hyperthreading aktiviert, dann werden Sie auch die Zählung von einzelnen Threads als CPUs. Dies ist wichtig, sich zu erinnern, weil wiederkehrende Abstürze auf nur einer bestimmten CPU ein CPU-Problem anzeigt. Wenn Sie Ihre Prozesse mit Affinität auf bestimmte CPUs (Tasket) eingestellt haben, können Sie bei der Analyse der Absturzberichte Schwierigkeiten bei der Ermittlung von CPU-Problemen haben. Sie können die Anzahl der CPUs überprüfen, indem Sie cat proccpuinfo ausführen. STATE: zeigt den Prozesszustand zum Zeitpunkt des Crashs an. TASKRUNNING bezieht sich auf ausführbare Prozesse, d. h. Prozesse, die ihre Ausführung fortsetzen können. Wir werden später noch darüber reden. Immer wärmer Weve gesehen ein gutartiges Beispiel so weit. Nur eine Einführung. Wir werfen einen Blick auf einige weitere Beispiele, einschließlich realer Fälle. Für den Moment wissen wir wenig über den Absturz, außer dass der Prozess, der es verursacht hat. Wir werden nun einige weitere Beispiele untersuchen und versuchen, zu verstehen, was wir dort sehen. Fedora Beispiel Lets zurück zu Fedora Fall. Werfen Sie einen Blick auf den Screenshot unten. Während die Informationen etwas anders angeordnet sind als das, was wir früher gesehen haben, ist es im Wesentlichen das Gleiche. Aber theres eine neue Information: Pid: 0, comm: swapper Nicht verdorben. Lets Fokus auf die nicht tainted Zeichenfolge für einen Moment. Was bedeutet es? Das bedeutet, dass der Kernel kein Modul ausführt, das kraftvoll geladen wurde. Mit anderen Worten, wir sind wahrscheinlich vor einem Code-Fehler irgendwo eher als eine Verletzung des Kernels. Sie können Ihre laufenden Kernel durch Ausführen zu untersuchen: So weit, weve gelernt, ein weiteres Stück von Informationen. Wir werden später darüber sprechen. Ein weiteres Beispiel aus dem White Paper Schauen Sie sich das an: MEMORY: 128MB PANIC: Oops: 0002 (Details zur Prüfung) PID: 1696 COMMAND: insmod Was gibt es hier Eine neue Information. Oops: 0002. Was bedeutet dies Kernel Page Error Die vier Ziffern sind ein Dezimal-Code des Kernel Page Error. Lesen von OReillys Unter Linux-Kernel, Kapitel 9: Prozessadressraum, Seitenfehler-Ausnahme-Handler, Seiten 376-382, erfahren wir die folgenden Informationen: Wenn das erste Bit klar (0) ist, wurde die Ausnahme durch einen Zugriff auf eine Seite verursacht Ist nicht vorhanden, wenn das Bit gesetzt ist (1), dies bedeutet ungültiges Zugriffsrecht. Wenn das zweite Bit frei (0) ist, wurde die Ausnahme durch Lesen oder Ausführen des Zugriffs verursacht, wenn set (1), die Ausnahme durch einen Schreibzugriff verursacht wurde. Wenn das dritte Bit gelöscht (0) ist, wurde die Ausnahme verursacht, während der Prozessor im Kernel-Modus war, ansonsten trat er im Benutzermodus auf. Das vierte Bit zeigt an, ob der Fehler ein Instruction Fetch war. Dies ist nur für 64-Bit-Architekturen gültig. Da unsere Maschine 64-bit ist, hat das Bit hier Bedeutung. Das ist sehr interessant. Scheinbar unverständliche Informationen fühlen sich sehr logisch an. Sie können auch die Kernel-Seitenfehler im folgenden Format als Tabelle sehen: Manchmal wird ein ungültiger Zugriff auch als Schutzfehler bezeichnet: Um zu verstehen, was passiert ist, müssen wir den Dezimalcode in Binär übersetzen und dann untersuchen Die vier Bits, von rechts nach links. Sie finden diese Informationen unter archarchmmfault. c im Kernel-Quellbaum: Seitenfehler Fehlercode Bits definieren PFPROT (1ltlt0) oder keine Seite gefunden Definition PFWRITE (1ltlt1) definieren PFUSER (1ltlt2) definieren PFRSVD (1ltlt3) definieren PFINSTR (1ltlt4) In In unserem Fall ist Dezimalzahl 2 binär 10. Von rechts nach links schauen, Bit 1 ist Null, Bit 2 leuchtet, Bit 3 und 4 sind Null. Beachten Sie die Binärzahl, beginnend bei Null. 0002 (dez) --gt 0010 (binär) --gt Nicht Befehl fetchKernel modeWriteInvalid access Daher haben wir eine Seite nicht gefunden, während einer Schreiboperation im Kernel-Modus war der Fehler nicht ein Instruction Fetch. Natürlich ist es ein wenig komplizierter als das, aber immer noch eine sehr gute Idee, was los ist. Nun, seine anfangen, interessant zu werden, ist es nicht Betrachten des beleidigenden Prozesses, insmod. Das sagt uns einiges. Wir haben versucht, ein Kernel-Modul zu laden. Es versuchte, auf eine Seite zu schreiben, die es nicht finden konnte, was einen Schutzfehler bedeutet, der unser System zum Absturz brachte. Dies könnte ein schlecht geschriebenes Stück Code sein. Statusüberprüfung OK, so weit, weve gesehen ziemlich viel nützliche Informationen. In dem Absturzbericht haben wir die grundlegenden Kennungsfelder kennen gelernt. Wir erfuhren die verschiedenen Arten von Panik. Wir lernten über die Identifizierung der beleidigenden Prozess, die Entscheidung, ob der Kernel verdorben ist und welche Art von Problem zum Zeitpunkt des Absturzes aufgetreten ist. Aber wir haben gerade unsere Analyse begonnen. Nehmen wir das auf eine neue Ebene. Getting hot Im ersten Artikel über Crash, lernten wir über einige grundlegende Befehle. Es ist Zeit, sie gut zu nutzen. Der erste Befehl, den wir wollen, ist bt - backtrace. Wir wollen die Ausführungsgeschichte des beleidigenden Prozesses sehen, d. H. Zurückverfolgen. PID: 0 AUFGABE: ffffffff80300ae0 CPU: 0 COMMAND: Swapper 0 ffffffff80440f20 crashnmicallback bei ffffffff8007a68e 1 ffffffff80440f40 donmi bei ffffffff8006585a 2 ffffffff80440f50 NMI bei ffffffff80064ebf Ausnahme RIP: defaultidle61 RIP: ffffffff8006b301 RSP: ffffffff803f3f90 RFLAGS: 00000246 RAX: 0000000000000000 RBX: ffffffff8006b2d8 RCX: 0000000000000000 RDX RDI 0000000000000001:: 0000000000000000 RSI ffffffff80302698 RBP: 0000000000090000 R8: ffffffff803f2000 R9: 000000000000003e R10: ffff810107154038 R11: 0000000000000246 R12: 0000000000000000 R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000 ORIGRAX: FFFFFFFFFFFFFFFF CS: 0010 SS: 0018 --- ltexception stackgt - - 3 ffffffff803f3f90 defaultidle at ffffffff8006b301 4 ffffffff803f3f90 cpuidle at ffffffff8004943c Wir haben viele Daten hier, lass es beginnen langsam zu verdauen. Call Trace Die Sequenz der nummerierten Zeilen, beginnend mit dem Hash-Zeichen (), ist die Call-Trace. Es ist eine Liste der Kernel-Funktionen, die kurz vor dem Absturz ausgeführt werden. Dies gibt uns einen guten Hinweis darauf, was passiert, bevor das System ging. 0 ffffffff80440f20 crashnmicallback bei ffffffff8007a68e 1 ffffffff80440f40 donmi bei ffffffff8006585a 2 ffffffff80440f50 NMI bei ffffffff80064ebf Ausnahme RIP: defaultidle61 RIP: ffffffff8006b301 RSP: ffffffff803f3f90 RFLAGS: 00000246 RAX: 0000000000000000 RBX: ffffffff8006b2d8 RCX: 0000000000000000 RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffffffff80302698 RBP: 0000000000090000 R8 ffffffff803f2000 R9: 000000000000003e R10: ffff810107154038 R11: 0000000000000246 R12: 0000000000000000 R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000 ORIGRAX: FFFFFFFFFFFFFFFF CS: 0010 SS: 0018 --- ltexception stackgt --- 3 ffffffff803f3f90 defaultidle bei ffffffff8006b301 4 ffffffff803f3f90 CpuIdle bei ffffffff8004943c Wir werden das später noch erörtern. Anweisungszeiger Die erste wirklich interessante Zeile ist diese: Ausnahme RIP: defaultidle61 Wir haben Ausnahme RIP: defaultidle61. Was bedeutet dies zuerst, diskutiert RIP. RIP ist der Befehlszeiger. Er zeigt auf eine Speicheradresse, die den Fortschritt der Programmausführung im Speicher anzeigt. In unserem Fall können Sie die exakte Adresse in der Zeile direkt unter der Klammerausnahmezeile sehen: Ausnahme RIP: defaultidle61 RIP: ffffffff8006b301 RSP: ffffffff803f3f90. Für jetzt ist die Adresse selbst nicht wichtig. Hinweis: Bei 32-Bit-Architektur wird der Befehlszeiger EIP genannt. Der zweite Teil der Information ist für uns viel nützlicher. Defaultidle ist der Name der Kernelfunktion, in der das RIP liegt. 61 ist der Offset im Dezimalformat innerhalb der Funktion, in der die Ausnahme auftrat. Dies ist das wirklich wichtige Bit, das wir später in unserer Analyse verwenden werden. Code-Segment (CS) - Register Der Code zwischen den Klammern bis zu --- ltexception stackgt --- ist das Dumping von Registern. Die meisten sind für uns nicht nützlich, mit Ausnahme des CS-Registers (Code-Segment). Auch hier treffen wir auf eine vierstellige Kombination. Um dieses Konzept zu erklären, muss ich ein wenig abweichen und reden über Privilege Ebenen. Privileg-Ebene ist das Konzept des Schutzes von Ressourcen auf einer CPU. Verschiedene Ausführungs-Threads können unterschiedliche Berechtigungsstufen aufweisen, die Zugriff auf Systemressourcen wie Speicherbereiche, IO-Ports usw. gewähren. Es gibt vier Ebenen, die von 0 bis 3 reichen. Pegel 0 ist der am meisten privilegierte Kernel-Modus. Stufe 3 ist die am wenigsten privilegierte, als User-Modus bekannt. Die meisten modernen Betriebssysteme, einschließlich Linux, ignorieren die mittleren zwei Ebenen, mit nur 0 und 3. Die Ebenen sind auch bekannt als Ringe. Eine bemerkenswerte Ausnahme von der Verwendung von Ebenen war IBM OS2-System. CPL (Current Privilege Level) Das Code-Segment (CS-Register) ist dasjenige, das auf ein Segment zeigt, in dem Programmbefehle gesetzt sind. Die beiden niederwertigsten Bits dieses Registers geben die Current Privilege Level (CPL) der CPU an. Zwei Bits, dh Zahlen zwischen 0 und 3. Deskriptor Privilege Level (DPL) amp Angeforderte Berechtigungsstufe (RPL) Der Deskriptor Privilege Level (DPL) ist die höchste Berechtigung, die auf die Ressource zugreifen kann und definiert ist. Dieser Wert ist im Segmentdeskriptor definiert. Angeforderte Berechtigungsstufe (RPL) wird in der Segmentauswahl, den letzten beiden Bits, definiert. Mathematisch darf CPL MAX (RPL, DPL) nicht überschreiten, und wenn dies der Fall ist, wird dies einen allgemeinen Schutzfehler verursachen. Nun, warum ist all dies wichtig, fragen Sie, Nun, zum Beispiel, wenn Sie einen Fall, bei dem System stürzte, während die CPL war 3, dann könnte dies defekte Hardware anzeigen, weil das System sollte nicht abstürzen, weil ein Problem im User-Modus . Alternativ könnte es ein Problem mit einem Buggy-System aufrufen. Nur einige grobe Beispiele. Für weitere Informationen wenden Sie sich bitte an OReillys Understanding Linux Kernel, Kapitel 2: Speicheradressierung, Seite 36-39. Hier finden Sie nützliche Informationen zu Segmentselektoren, Segmentdeskriptoren, Tabellenindex, globalen und lokalen Deskriptortabellen und natürlich der Current Privilege Level (CPL). Zurück zu unserem Crash-Protokoll: Wie wir wissen, geben die beiden niederwertigsten Bits die CPL an. Zwei Bits bedeuten vier Stufen, jedoch werden die Stufen 1 und 2 ignoriert. Dies lässt uns mit 0 und 3, die Kernel-Modus und User-Modus, jeweils. Übersetzt in das Binärformat, haben wir 00 und 11. Das Format zur Darstellung der Deskriptor-Daten kann verwirrend sein, aber es ist sehr einfach. Wenn die rechte Figur gerade ist, dann waren sie im Kernel-Modus, wenn die letzte Figur ungerade ist, dann im User-Modus. Daher sehen wir, dass CPL 0 ist, die beleidigende Aufgabe, die zum Absturz führte, im Kernelmodus. Das ist wichtig zu wissen. Es kann uns helfen, die Natur unseres Problems zu verstehen. Nur für Referenz, Heres ein Beispiel, wo der Absturz im User-Modus aufgetreten, gesammelt auf einem SUSE-Maschine: Aber das ist nur geeky sprechen. Zurück zu unserem Beispiel haben wir viele nützliche, wichtige Details gelernt. Wir kennen die genaue Speicheradresse, bei der der Befehlszeiger zum Zeitpunkt des Absturzes war. Wir kennen das Privileg. Noch wichtiger ist, dass wir den Namen der Kernelfunktion und den Offset kennen, auf dem das RIP zum Zeitpunkt des Crashs zeigte. Für alle praktischen Zwecke müssen wir nur die Quelldatei finden und den Code untersuchen. Natürlich kann dies nicht immer möglich sein, aus verschiedenen Gründen, aber wir werden das trotzdem als Übung tun. Also, wir wissen, dass crashnmicallback () - Funktion von donmi () aufgerufen wurde, donmi () wurde von nmi () aufgerufen, nmi () wurde von defaultidle () aufgerufen, die den Absturz verursacht. Wir können diese Funktionen untersuchen und versuchen, tiefer zu verstehen, was sie tun. Wir werden das bald tun. Jetzt können wir unser Fedora-Beispiel noch einmal besuchen. Fedora Beispiel, wieder Nun, da wir verstehen, was ist falsch, können wir einen Blick auf die Fedora-Beispiel wieder zu nehmen und versuchen, das Problem zu verstehen. Wir haben einen Absturz in einem nicht-tainted Kernel, verursacht durch den Swapper-Prozess. Der Absturzbericht verweist auf die nativeapicwritedummy-Funktion. Dann gibt es auch eine sehr lange Rufverfolgung. Eine ganze Menge nützliche Informationen, die uns helfen sollten, das Problem zu lösen. Wir werden sehen, wie wir die Absturzberichte verwenden können, um Entwicklern zu helfen, Fehler zu beheben und bessere, stabilere Software zu erzeugen. Nun, fokussiert man mehr auf Crash und die grundlegenden Befehle. Backtrace für alle Tasks In der Standardeinstellung zeigt crash backtrace für die aktive Task an. Sie können aber auch die Rückverfolgung aller Aufgaben sehen. In diesem Fall möchten Sie foreach ausführen. Dump system message buffer log - dump system message buffer Dieser Befehl speichert den Kernel-Logbuf-Inhalt in chronologischer Reihenfolge. Der Kernprotokoll-Bugger (logbuf) enthält möglicherweise nützliche Hinweise, die dem Absturz vorausgehen, was uns helfen könnte, das Problem einfacher zu lokalisieren und zu verstehen, warum unser System untergegangen ist. Der Log-Befehl kann nicht wirklich nützlich sein, wenn Sie intermittierende Hardware-Probleme oder rein Software-Bugs haben, aber es ist definitiv den Versuch wert. Heres unsere Crash-Log, die letzten paar Zeilen: ide: fehlgeschlagen opcode war: 0xec mtrr: Typenkonflikt für f8000000,400000 alt: unbrauchbar neu: Schreibkombination ISO 9660 Erweiterungen: Microsoft Joliet Level 3 ISO 9660 Erweiterungen: RRIP1991A SysRq. Trigger ein crashdump Und theres die SysRq Mitteilung. Nützlich zu wissen. In realen Fällen kann es etwas weitaus interessanteres geben. Prozessstatusinformationen anzeigen ps - Prozessstatusinformationen anzeigen Dieser Befehl zeigt den Prozessstatus für ausgewählte oder alle Prozesse im System an. Wenn keine Argumente eingegeben werden, werden die Prozessdaten für alle Prozesse angezeigt. Werfen Sie einen Blick auf das Beispiel unten. Wir haben zwei Swapper-Prozesse Wie ich schon sagte, hat jede CPU ihren eigenen Scheduler. Die aktive Aufgabe ist mit gt markiert. Das Absturz-Dienstprogramm kann das Laden auf eine Task, die nicht die Panik verursachen kann oder möglicherweise nicht in der Lage, die Panik-Task zu finden. Es gibt keine Garantien. Wenn youre mit virtuellen Maschinen, einschließlich VMware oder Xen, dann könnte es noch komplizierter. In this case, the pointer in the ps output marks the wrong process: Using backtrace for all processes (with foreach) and running the ps command, you should be able to locate the offending process and examine its task. Other useful information you may need: Bracketed items are kernel threads for example, init and udevd are not. Then, theres memory usage information, VSZ and RSS, process state, and more. Super geeky stuff Note: This section is impossibly hard. Too hard for most people. Very few people are skilled enough to dabble in kernel code and really know whats going on in there. Trying to be brave and tackle the possible bugs hidden in crash cores is a noble attempt, but you should not take this lightly. I have to admit that although I can peruse crash reports and accompanying sources, I still have a huge deal to learn about the little things and bits. Dont expect any miracles. Theres no silver-bullet solution to crash analysis Time to get ultra-serious. Lets say you may even want to analyze the C code for the offending function. Needless to say, you should have the C sources available and be able to read them. This is not something everyone should do, but its an interesting mental exercise. Source code All right, you want examine the code. First, you will have to obtain the sources. Some distributions make the sources readily available. For example, in openSUSE, you just have to download the kernel-source package. With CentOS, it is a little more difficult, but doable. You can also visit the Linux Kernel Archive and download the kernel matching your own, although some sources may be different from the ones used on your system, since some vendors make their own custom changes. Once you have the sources, its time to examine them. Example, on openSUSE: You could browse the sources using the standard tools like find and grep, but this can be rather tedious. Instead, why not let the system do all the hard work for you. A very neat utility for browsing C code is called cscope. The tool runs from the command line and uses a vi-like interface. By default, it will search for sources in the current directory, but you can configure it any which way. cscope is available in the repositories: Now, in the directory containing sources (by default, usrsrclinux ), run cscope: This will recursively search all sub-directories, index the sources and display the main interface. There are other uses as well try the man page or --help flag. Now, its time to put the tool to good use and search for desired functions. We will begin with Find this C symbol. Use the cursor keys to get down to this line, then type the desired function name and press Enter. The results will be displayed: Depending on what happened, you may get many results or none. It is quite possible that there is no source code containing the function seen in the crash report. If there are too many results, then you might want to search for the next function in the call trace by using the Find functions called by this function option. Use Tab to jump between the input and output section. If you have official vendor support, this is a good moment to turn the command over and let them drive. If you stick with the investigation, looking for other functions listed in the call trace can help you narrow down the C file you require. But theres no guarantee and this can be a long, tedious process. Furthermore, any time you need help, just press. and you will get a basic usage guide: In the kernel source directory, you can also create the cscope indexes, for faster searches in the future, by running make cscope. Disassemble the object Assuming you have found the source, its time to disassemble the object compiled from this source. First, if youre running a debug kernel, then all the objects have been compiled with the debug symbols. Youre lucky. You just need to dump the object and burrow into the intermixed assembly-C code. If not, you will have to recompile the source with debug symbols and then reverse-engineer it. This is not a simple or a trivial task. First, if you use a compiler that is different than the one used to compile the original, your object will be different from the one in the crash report, rendering your efforts difficult if not impossible. Trivial example I call this example trivial because it has nothing to do with the kernel. It merely demonstrates how to compile objects and then disassemble them. Any source will do. In our case, well use MPlayer, a popular open-source media player as our scapegoat. Download the MPlayer source code, run. configure, make. After the objects are created, delete one of them, then recompile it. Run make ltobject namegt. for instance: Please note that make has no meaning without a Makefile, which specifies what needs to be done. But we have a Makefile. It was created after we ran. configure. Otherwise, all this would not really work. Makefile is very important. We will see a less trivial example soon. If you do not remove the existing object, then you probably wont be able to make it. Make compares timestamps on sources and the object, so unless you change the sources, the recompile of the object will fail. Now, heres another simple example, and note the difference in the size of the created object, once with the debug symbols and once without: If you dont have a Makefile, you can invoke gcc manually using all sorts of flags. You will need kernel headers that match the architecture and the kernel version that was used to create the kernel where the crash occurred, otherwise your freshly compiled objects will be completely different from the ones you may wish to analyze, including functions and offsets. A utility you want to use for disassembly is objdump. You will probably want to use the utility with - S flag, which means display source code intermixed with assembly instructions. You may also want - s flag, which will display contents of all sections, including empty ones. - S implies - d. which displays the assembler mnemonics for the machine instructions from objfile this option only disassembles those sections which are expected to contain instructions. Alternatively, use - D for all sections. Thus, the most inclusive objdump would be: objdump - D - S ltcompiled object with debug symbolsgt gt ltoutput filegt It will look something like this: And an even better example, the memhog dump: Moving on to kernel sources Warming up. Once youre confident practicing with trivial code, time to move to kernel. Make sure you do not just delete any important file. For the sake of exercise, move or rename any existing kernel objects you may find lurking about. Then, recompile them. You will require the. config file used to compile the kernel. It should be included with the sources. Alternatively, you can dump it from procconfig. gz. zcat procconfig. gz gt. config On RedHat machines, you will find the configuration files also under boot. Make sure you use the one that matches the crashed kernel and copy it over into the source directory. If needed, edit some of the options, like CONFIGDEBUGINFO. More about that later. Without the. config file, you wont be able to compile kernel sources: You may also encounter an error where the Makefile is supposedly missing, but its there. In this case, you may be facing a relatively simply problem, with the wrong ARCH environment variable set. For example, i585 versus i686 and x86-64 versus x8664. Pay attention to the error and compare the architecture to the ARCH variable. In the worst case, you may need to export it correctly. For example: As a long term solution, you could also create symbolic links under usrsrclinux from the would-be bad architecture to the right one. This is not strictly related to the analysis of kernel crashes, but if and when you compile kernel sources, you may encounter this issue. Now, regarding the CONFIGDEBUGINFO variable. It should be set to 1 in your. config file. If you recall the Kdump tutorial, this was a prerequisite we asked for, in order to be able to successfully troubleshoot kernel crashes. This tells the compiler to create objects with debug symbols. Alternatively, export the variable in the shell, as CONFIGDEBUGINFO1. Then, take a look at the Makefile. You should see that if this variable is set, the object will be compiled with debug symbols (-g). This is what we need. After that, once again, we will use objdump. Now, Makefile might really be missing. In this case, you will get a whole bunch of errors related to the compilation process. But with the Makefile in place, it should all work smoothly. And then, theres the object up to date example again. If you do not remove an existing one, you wont be able to compile a new one, especially if you need debug symbols for later disassembly. Finally, the disassembled object: What do we do now Well, you look for the function listed in the exception RIP and mark the starting address. Then add the offset to this number, translated to hexadecimal format. Then, go to the line specified. All that is left is to try to understand what really happened. Youll have an assembly instruction listed and possibly some C code, telling us what might have gone wrong. Es ist nicht einfach. In fact, its very difficult. But its exciting and you may yet succeed, finding bugs in the operating system. Whats more fun than that Above, we learned about the compilation and disassembly procedures, without really doing anything specific. Now that we know how to go about compiling kernel objects and dissecting them into little bits, lets do some real work. Intermediate example We will now try something more serious. Grab a proof-of-concept code that crashes the kernel, compile it, examine the crash report, then look for the right sources, do the whole process we mentioned above, and try to read the alien intermixed assembly and C code. Of course, we will be cheating, cause we will know what were looking for, but still, its a good exercise. The most basic non-trivial example is to create a kernel module that causes panic. Before we panic our kernel, lets do a brief overview of the kernel module programming basics. Create problematic kernel module This exercise forces us to deviate from the crash analysis flow and take a brief look at the C programming language from the kernel perspective. We want to crash our kernel, so we need kernel code. While were going to use C, its a little different from everyday stuff. Kernel has its own rules. We will have a sampling of kernel module programing. Well write our own module and Makefile, compile the module and then insert it into the kernel. Since our module is going to be written badly, it will crash the kernel. Then, we will analyze the crash report. Using the information obtained in the report, we will try to figure out whats wrong with our sources. Step 1: Kernel module We first need to write some C code. Lets begin with hello. c. Without getting too technical, heres the most basic of modules, with the init and cleanup functions. The module does not nothing special except print messages to the kernel logging facility. hello. c - The simplest kernel module. include ltlinuxmodule. hgt Needed by all modules include ltlinuxkernel. hgt Needed for KERNINFO int initmodule(void) printk(KERNINFO Hello world. n) A non 0 return means initmodule failed module cant be loaded. return 0 void cleanupmodule(void) printk(KERNINFO Goodbye world. n) We need to compile this module, so we need a Makefile: all: make - C libmodules(shell uname - r)build M(PWD) modules clean: make - C libmodules(shell uname - r)build M(PWD) clean Now, we need to make the module. In the directory containing your hello. c program and the Makefile, just run make. You will see something like this: Our module has been compiled. Lets insert it into the kernel. This is done using the insmod command. However, a second before we do that, we can examine our module and see what it does. Maybe the module advertises certain bits of information that we might find of value. Use the modinfo command for that. In this case, nothing special. Now, insert it: If the module loads properly into the kernel, you will be able to see it with the lsmod command: sbinlsmod grep hello Notice that the use count for our module is 0. This means that we can unload it from the kernel without causing a problem. Normally, kernel modules are used for various purposes, like communicating with system devices. Finally, to remove the module, use the rmmod command: If you take at a look at varlogmessages, you will notice the Hello and Goodbye messages, belonging to the initmodule and cleanupmodule functions: That was our most trivial example. No crash yet. But we have a mechanism of inserting code into the kernel. If the code is bad, we will have an oops or a panic. Step 2: Kernel panic Well now create a new C program that uses the panic system call on initialization. Not very useful, but good enough for demonstrating the power of crash analysis. Heres the code, we call it kill-kernel. c. kill-kernel. c - The simplest kernel module to crash kernel. include ltlinuxmodule. hgt Needed by all modules include ltlinuxkernel. hgt Needed for KERNINFO int initmodule(void) printk(KERNINFO Hello world. Now we crash. n) panic(Down we go, panic called) void cleanupmodule(void) printk(KERNINFO Goodbye world. n) When inserted, this module will write a message to varlogmessages and then panic. Indeed, this is what happens. Once you execute the insmod command, the machine will freeze, reboot, dump the kernel memory and then reboot back into the production kernel. Step 3: Analysis Lets take a look at the vmcore. And the backtrace: What do we have here First, the interesting bit, the PANIC string: Kernel panic - not syncing: Down we go, panic called That bit looks familiar. Indeed, this is our own message we used on panic. Very informative, as we know what happened. We might use something like this if we encountered an error in the code, to let know the user what the problem is. Another interesting piece is the dumping of the CS register - CS: 0033. Seemingly, we crashed the kernel in user mode. As Ive mentioned before, this can happen if you have hardware problems or if theres a problem with a system call. In our case, its the latter. Well, that was easy - and self-explanatory. So, lets try a more difficult example. For more information about writing kernel modules, including benevolent purposes, please consult the Linux Kernel Module Programming Guide. Difficult example Now another, a more difficult example. We panicked our kernel with. panic. Now, lets try some coding malpractice and create a NULL pointer testcase. Weve seen earlier how to create a kernel module. Now, lets spice up our code. We will now create a classic NULL pointer example, the most typical problem with programs. NULL pointers can lead to all kinds of unexpected behavior, including kernel crashes. Our program, called null-pointer. c. now looks like this: null-pointer. c - A not so simple kernel module to crash kernel. include ltlinuxmodule. hgt Needed by all modules include ltlinuxkernel. hgt Needed for KERNINFO int initmodule(void) printk(KERNINFO We is gonna KABOOM nown) void cleanupmodule(void) printk(KERNINFO Goodbye world. n) We declare a NULL pointer and then dereference it. Not a healthy practice. I guess programmers can explain this more eloquently than I, but you cant have something pointing to nothing get a valid address of a sudden. In kernel, this leads to panic. Indeed, after making this module and trying to insert it, we get panic. Now, the sweet part. Step 1: Analysis Looking at the crash report, we see a goldmine of information: Lets digest the stuff: PANIC: Oops: 0002 1 SMP (check log for details) We have an Oops on CPU 1. 0002 translates to 0010 in binary, meaning no page was found during a write operation in kernel mode. Exactly what were trying to achieve. Were also referred to the log. Mehr dazu bald. WARNING: panic task not found There was no task, because we were just trying to load the module, so it died before it could run. In this case, we will need to refer to the log for details. This is done by running log in the crash utility, just as weve learned. The log provides us with what we need: The RIP says nullpointer:initmodule0x190x22. Were making progress here. We know there was a problem with NULL pointer in the initmodule function. Time to disassemble the object and see what went wrong. Theres more useful information, including the fact the kernel was Tainted by our module, the dumping of the CS register and more. Well use this later. First, lets objdump our module. objdump - d - S null-pointer. ko gt tmpwhatever Looking at the file, we see the Rain Man code: The first part, the cleanup is not really interesting. We want the initmodule. The problematic line is even marked for us with a comment: 27 ltinitmodule0x19gt. 27: c6 00 01 movb 0x1,(rax) What do we have here Were trying to load (assembly movb ) value 1 ( 0x1 ) into the RAX register ( rax ). Now, why does it cause such a fuss Lets go back to our log and see the memory address of the RAX register: RAX register is: 0000000000000000. In other words, zero. Were trying to write to memory address 0. This causes the page fault, resulting in kernel panic. Problem solved Of course, in real life, nothing is going to be THAT easy, but its a start. In real life, you will face tons of difficulties, including missing sources, wrong versions of GCC and all kinds of problems that will make crash analysis very, very difficult. Remember that For more information, please take a look at the case study shown in the crash White Paper. Again, its easier when you know what youre looking for. Any example you encounter online will be several orders of magnitude simpler than your real crashes, but it is really difficult demonstrating an all-inclusive, abstract case. Still, I hope my two examples are thorough enough to get you started. Alternative solution (debug kernel) If you have time and space, you may want to download and install a debug kernel for your kernel release. Not for everyday use, of course, but it could come handy when youre analyzing kernel crashes. While it is big and bloated, it may offer additional, useful information that cant be derived from standard kernels. Plus, the objects with debug symbols might be there, so you wont need to recompile them, just dump them and examine the code. Next steps So the big question is, what do crash reports tell us Well, using the available information, we can try to understand what is happening on our troubled systems. First and foremost, we can compare different crashes and try to understand if theres any common element. Then, we can try to look for correlations between separate events, environment changes and system changes, trying to isolate possible culprits to our crashes. Combined with submitting crash reports to vendors and developers, plus the ample use of Google and additional resources, like mailing lists and forums, we might be able to narrow down our search and greatly simply the resolution of problems. Kernel crash bug reporting When your kernel crashes, you may want to take the initiative and submit the report to the vendor, so that they may examine it and possibly fix a bug. This is a very important thing. You will not only be helping yourself but possibly everyone using Linux anywhere. What more, kernel crashes are valuable. If theres a bug somewhere, the developers will find it and fix it. Kerneloops. org is a website dedicated to collecting and listing kernel crashes across the various kernel releases and crash reasons, allowing kernel developers to work on identifying most critical bugs and solving them, as well as providing system administrators, engineers and enthusiasts with a rich database of crucial information. Remember the Fedora 12 kernel crash report We had that nativeapicwritedummy Well, lets see what kerneloops. org has to say about it. As you can see, quite a lot. Not only do you have all sorts of useful statistics, you can actually click on the exception link and go directly to source, to the problematic bit of code and see what gives. This is truly priceless information As we mentioned earlier, some modern Linux distributions have an automated mechanism for kernel crash submission, both anonymously and using a Bugzilla account. For example, Fedora 12 uses the Automatic Bug Reporting Tool (ABRT), which collects crash data, runs a report and then sends it for analysis with the developers. For more details, you may want to read the Wiki. Beforehand, Fedora 11 used kerneloops utility, which sent reports to, yes, you guessed it right, kerneloops. org. Some screenshots. Heres an example of live submission in Fedora 11. And more recently in Fedora 12. Hopefully, all these submissions help make next releases of Linux kernel and the specific distributions smarter, faster, safer, and more stable. Google for information Sounds trivial, but it is not. If youre having a kernel crash, theres a fair chance someone else saw it too. While environments differ from one another, there still might be some commonality for them all. Then again, there might not. A site with 10 database machines and local logins will probably experience different kinds of problems than a 10,000-machine site with heavy use of autofs and NFS. Similarly, companies working with this or that hardware vendor are more likely to undergo platform-specific issues that cant easily be find elsewhere. The simplest way to search for data is to paste the exception RIP into the search box and look for mailing list threads and forum posts discussing same or similar items. Once again, using the Fedora case an an example: Crash analysis results And after you have exhausted all the available channels, its time to go through the information and data collected and try to reach a decisionresolution about the problem at hand. We started with the situation where our kernel is experiencing instability and is crashing. To solve the problem, we setup a robust infrastructure that includes a mechanism for kernel crash collection and tools for the analysis of dumped memory cores. We now understand what the seemingly cryptic reports mean. The combination of all the lessons learned during our long journey allows us to reach a decision what should be done next. How do we treat our crashing machines Are they in for a hardware inspection, reinstallation, something else Maybe theres a bug in the kernel internals Whatever the reason, we have the tools to handle the problems quickly and efficiently. Finally, some last-minute tips, very generic, very generalized, about what to do next: Single crash A single crash may seem as too little information to work with. Dont be discouraged. If you can, analyze the core yourself or send the core to your vendor support. Theres a fair chance you will find something wrong, either with software at hand, the kernel or the hardware underneath. Hardware inspection Speaking of hardware, kernel crashes can be caused by faulty hardware. Such crashes usually seem sporadic and random in reason. If you encounter a host that is experiencing many crashes, all of which have different panic tasks, you may want to considering scheduling some downtime and running a hardware check on the host, including memtest, CPU stress, disk checks, and more. Beyond the scope of this article, Im afraid. The exact definition of what is considered many crashes, how critical the machine is, how much downtime you can afford, and what you intend to do with the situation at hand is individual and will vary from one admin to another. Reinstallation amp software changes Did the software setup change in any way that correlates with the kernel crashes If so, do you know what the change is Can you reproduce the change and the subsequent crashes on other hosts Sometimes, it can be very simple sometimes, you may not be able to easily separate software from the kernel or the underlying hardware. If you can, try to isolate the changes and see how the system responds with or without them. If theres a software bug, then you might be just lucky enough and have to deal with a reproducible error. Kernel crashes due to a certain bug in software should look pretty much the same. But theres no guarantee youll have it that easy. Now, if your system is a generic machine that does not keep any critical data on local disks, you may want to consider wiping the slate clean - start over, with a fresh installation that you know is stable. Its worth a try. Submit to developervendor Regardless of what you discovered or you think the problem is, you should send the kernel crash report to the relevant developer andor vendor. Even if youre absolutely sure you know what the problem is and youve found the cure, you should still leave the official fix in the hands of people who do this kind of work for a living. I have emphasized this several times throughout the article, because I truly believe this is important, valuable and effective. You can easily contribute to the quality of Linux kernel code by submitting a few short text reports. Its as simple and powerful as that. And that would be all for now, I think. Im spent. I still owe you some information, but I cant possibly include everything in a single article. We will revisit some of the stuff when we discuss gdb. Official documentation Heres a selection of highly useful articles and tutorials:
Comments
Post a Comment