Ich habe mich schon gefragt, wo ich diesen Text platzieren soll. Eine eigene Website ist ein möglicher Kandidat, oder Sie finden einen Thread bei superuser.com, der meinem Thema am nächsten kommt (und mir möglicherweise geholfen hat). So bin ich hier angekommen :-)
Mein besonderes Problem war, wie ich meinen Textkonsolen einen bestimmten Videomodus aufzwingen kann. Systemeinrichtung: Debian 9 Stretch auf Haswell-Hardware, dessen IGP vom i915-Treiber in Linux verwaltet wird (der nun seit geraumer Zeit KVM und DRI / DRM unterstützt). Ein blöder analoger KVM-Switch, der dem PC per DDC / EDID mitteilt, dass die maximale Auflösung 1600x1200 betrug, in Wirklichkeit jedoch ein LCD-Display mit einer Auflösung von 1280x1024 gespeist wird :-)
Ich habe angefangen, mit vbetool
und zu spielen fbset
, die jedoch nicht mehr aktuell sind, da sie mit KMS + DRM nicht kompatibel sind. Die "inteldrmfb" scheint nur ein Shim über KMS + DRM zu sein (und scheint nicht in einem eigenen Kernel-Modul enthalten zu sein). Die Geometrieparameter sind schreibgeschützt. Nun, zumindest kann fbset die aktive Auflösung, die einen Informationswert hat, passiv anzeigen.
Es scheint jedoch eine Möglichkeit für Sie und mich zu geben, die AKA-Bildfrequenz für die Auflösung und vertikale Aktualisierung von der Kernel-Befehlszeile (Bootloader-Parameter in der Zeile beginnend mit "Linux") einzustellen, die zufällig gegen Ende einer modernen Umgebung liegt mehrzeilige grub.conf-Sektion).
Sie können beim Booten mit den Parametern arbeiten, wenn Sie drücken, e
während Grub das Zeitlimit herunterzählt. Folgen Sie der Hilfe von dort. Wenn Sie mit Ihren Änderungen zufrieden sind, drücken Sie Strg + X oder F10, um das geänderte Profil zu starten. (Ihre Änderungen sind kurzlebig - sie werden in Ihrem laufenden Kernel in / proc / cmdline auf diesem Boot angezeigt, werden jedoch nicht in die Datei grub.conf geschrieben.) Für die dauerhafte Speicherung Ihrer zusätzlichen Bootparameter (Kernel cmdline args) in Debian Sie sollten sie /etc/default/grub
in einer Variablen namens eingeben GRUB_CMDLINE_LINUX_DEFAULT
. Und laufe update-grub
.
Nun zu den Args. Zunächst benötigen Sie i915.modeset=1
(vorausgesetzt, Ihr Grafik-Subsystem ist ein Intel IGP). Wenn Sie unter dem gleichen Problem leiden wie ich, dh dass der Kernel eine zu hohe Auflösung einstellt, haben Sie wahrscheinlich bereits modeset = 1 (standardmäßig im Kernel kompiliert). Während Sie mit der Syntax der Cmdline-Curses zu kämpfen haben und manchmal nur einen funktionierenden Grafikmodus wünschen, möchten Sie dies vielleicht versuchen i915.modeset=0
. Das verhindert anscheinend die Änderung des grafischen Modus insgesamt, und Sie haben eine fast klassische 80 x 25-Konsole, bis hin zum Konsolen-Login. Sie werden auch feststellen, dass es in dmesg keine / dev / fb0 und keine DRM-Debug-Meldungen gibt (lesen Sie weiter für weitere Informationen).
Beachten Sie auch die Option quiet
. Dies funktioniert mit oder ohne Modesetting. Es verhindert anscheinend das Drucken von Kernel-Nachrichten an Ihre Konsole (/ dev / tty) = Sie erhalten für einige Sekunden einen leeren dunklen Bildschirm und werden dann mit der Anmeldeaufforderung begrüßt. Dies ist ein Standard in Debian. (Tatsächlich erhalten Sie in modernen Debian mit systemd wahrscheinlich die systemd-Bootmeldungen anstelle des Kernel-Logs auf Ihrem Bildschirm ...) Der Punkt ist, wenn Sie die Kernelmeldungen zurück wollen, sollten Sie einfach das Wort "quiet" löschen. von der Kernel-Befehlszeile aus, und verwenden Sie diese Befehlszeile nur für einen Startvorgang (drücken Sie in Grub "e", bearbeiten Sie Strg + x, um fortzufahren) oder dauerhaft (Bearbeiten Sie / etc / default / grub &&-update-grub).
Nun endlich zum Punkt: Sobald Sie haben i915.modeset=1
, müssen Sie auch hinzufügen video=<xres>x<yres>@framerate
. Wie in meinem Fall video=1280x1024@60
oder video=1024x768@60
. Es gibt weitere mögliche Optionen, siehe das entsprechende Kapitel im Arch-Wiki . Sie können beispielsweise auch die Farbtiefe angeben oder den Modus auf nur einen Videoausgang (im DRM-Bereich "Connector" genannt) anwenden. Beachten Sie, dass Ihr angegebener Modus wahrscheinlich mit einem der dem Kernel bekannten Modi übereinstimmen muss, dh einer der "EDID-Modelllinien". Der Kernel führt eine Liste dieser Datenblöcke, die entweder über DDC von einem Monitor oder von / lib / firmware abgerufen oder möglicherweise in kompiliert werden. Dh, Sie können keine beliebige ungerade Geometrie angeben.
In einigen Howtos finden Sie nur video=<xres>x<yres>
, wie video=1024x768
. Dies hat den gewünschten Effekt, da die Auflösung in der Ausgabe angezeigt wird. Sie haben jedoch die Entscheidung über die Bildrate den Treibern überlassen, die tendenziell die höchstmögliche Bildrate wählen (unter den "Moduszeilen", die in verfügbar sind der Satz von EDID-Blöcken). In meinem Fall hat sich herausgestellt, dass der Fahrer die Wahl getroffen hat 1024x768@85
, was in der CRT-Ära eine gute Wahl gewesen wäre, für viele heutige LCD-Displays jedoch außerhalb der Reichweite liegt. Beachten Sie, dass billige moderne LCD-Bildschirme (vor FreeSync) normalerweise eine Bildfrequenz von 60 Hz benötigen. Daher müssen Sie dies explizit einstellen, wenn Ihr DDC nicht vorhanden ist.
Bei meiner Suche nach Antworten stolperte ich immer wieder über Hinweise zu diesem Patch-Set von Dave Airlie - was die Verarbeitung von video = cmdline arg mit sich bringt. Es stellt sich heraus, dass dies vor einigen Jahren in Vanilla Linux integriert wurde.
In meinem Fall wurde der Monitor mit 1600x1200 betrieben und meldete "out of range", da er nicht mithalten konnte. Da ich verschiedene cmdline-Argumente ausprobierte, versuchte ich es einfach video=1024x768
, was zu "out of range" auf dem Monitor führte. Äußerlich, durch die vage Fehlermeldung, schien es, dass der Befehl cmdline überhaupt keine Wirkung hatte. Erst später fand ich heraus, dass mir nur ein @60
Suffix fehlte :-)
Das interessante hier ist, wie ich herausgefunden habe. Es gibt ein weiteres Kernel-Cmdline-Argument, das das DRI / DRM-Subsystem dazu veranlasst, ein gesprächeres Debug-Protokoll zu drucken:
Kernelversion unter 4.1:
drm.debug=0xe
Kernel Version 4.1 oder neuer:
drm.debug=0x1e log_buf_len=1M
( Quelle )
Ich füge ein Beispiel-Debug-Protokoll von meinem Computer an . Dinge zu konzentrieren (Schlüsselwörter suchen): Kernel command line
, cmdline
, adjusted mode
,[drm:
Die "Connector-Namen" können hier abgerufen werden: ls /sys/class/drm/
Beachten Sie, dass die Syntax video = ... cmdline arg nicht das Präfix "card-" verwendet, das Sie in / sys / class / drm sehen können. Die Syntax von video = und Connector-Namen wird in einem relevanten Kapitel des Arch Linux-Wikis detailliert beschrieben .
Lassen Sie mich jetzt einen Gang wechseln / das Thema ein wenig ändern.
Die ursprüngliche Frage in diesem Thread war, wie die Geometrie des Videomodus geändert werden kann. Ich habe das schon in X und in Windows gemacht (mit der späten Intel IEGD). In Linux unter kvm + drm besteht die einzige Möglichkeit, Geometrie und Timing zu optimieren, darin, dass Sie offenbar Ihre eigene EDID-Datei übergeben, die Sie zunächst handwerklich herstellen müssen. Naja fast.
Die EDID-Konstruktion wird kurz in einem Dokumentationsabschnitt beschrieben, der in der Vanilla-Kernel-Quelle enthalten ist.
Das Makefile und die Beispiel-EDID-Definitionen befinden sich im übergeordneten Verzeichnis .
Wählen Sie einige .S-Dateien aus, kopieren Sie sie in Ihre eigene Datei (siehe Namenskonvention oben im Makefile), bearbeiten Sie die Timings, erstellen Sie Ihre EDID-Binärdatei und ... hoffentlich löst es Ihr Problem :-)
Die Timings / Pixel-Werte erfordern einige Berechnungen, um richtig zu werden. Außerdem gibt es mehrere alternative historische Standards, an die Sie sich besser halten sollten und die miteinander in Konflikt stehen (sie sind Evolutionsstadien der Timing-Standards für Anzeige):
- die CRT-Ära
GTF
, - die LCD-Ära
DMT
oderCVT
, - und dann
CVT-RB
(reduzierte Ausblendung).
Ihr spezielles Problem könnte möglicherweise gelöst werden, indem der HSYNC-Impuls nach rechts verschoben wird (Sie können auch versuchen, die Polarität zu ändern), oder indem Sie den Synchronisationsimpuls und / oder die gesamte Austastzeit relativ breiter machen, oder (wie Sie vorgeschlagen haben), indem Sie den Wert verringern sichtbare / angezeigte Pixelauflösung (in Vielfachen von 8). Wenn Sie das Ausblenden breiter machen, müssen Sie möglicherweise den Pixeltakt erhöhen, um die ursprüngliche Bildrate zu erhalten.