Wie kann man die Linux-Framebuffer-Konsole enger gestalten?

1237
einpoklum

Ich habe gerade eine Debian Wheezy Box installiert (Debian 7.0rc1). Standardmäßig wird die Konsole mithilfe des Bildpuffers angezeigt. Aufgrund einer bestimmten Hardwareeinstellung, auf die ich mich nicht einlasse, wird diese auf meinem Display zu breit angezeigt, z. B. wird die linke Spalte der Konsole nicht angezeigt.

Gibt es eine Möglichkeit, die Konsole ein oder zwei Spalten schmaler zu machen? Ich meine, ich möchte die Schrift nicht schmaler oder breiter machen, ich möchte, dass weniger Spalten mit derselben Breite vorhanden sind und der gesamte gerenderte Konsolenbildschirm weniger Breite beansprucht, aber auf dieselbe Weise zentriert ist.

Update: Basierend auf der Antwort von @ mr.spuratic, die ich installiert habe und zu verwenden versuchte fbset; was nicht genau das macht, was ich wollte, aber es könnte mir theoretisch helfen, das Problem zu überwinden. Wie auch immer, wenn ich versuche, den Modus damit einzustellen, bekomme ich:

fbset FBIOPUT_VSCREENINFO: invalid argument 

Anmerkungen:

  • Ich hätte gerne eine Lösung, sowohl durch die Manipulation von Grubs Konfiguration als auch durch die Konsole nach dem Booten.
  • Wenn Sie weitere Informationen benötigen, um eine Lösung bereitzustellen, kommentieren und fragen Sie.
3

2 Antworten auf die Frage

1
frr

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 vbetoolund 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, ewä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/grubin 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@60oder 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 @60Suffix 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 DMToder CVT,
  • und dann CVT-RB(reduzierte Ausblendung).
Sie können die Zahlen entweder von Hand berechnen oder es gibt einige Werkzeuge und Tabellen mit Standardmodi. Versuchen Sie, nach "EDID-Rechner" oder "Modeline-Rechner" zu suchen. Es gibt sogar ein ordentliches Linux-Befehlszeilentool für den Job. Siehe auch die Modeline-Datenbank .

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.

0
mr.spuratic

Normalerweise wird dies durch eine automatische Anpassung des Monitors behoben, und dies ist oft weitaus weniger problematisch als bei Softwarelösungen.

Überprüfen Sie andernfalls das Monitor-Info-Menü, um zu sehen, welche Auflösung / Aktualisierung ausgeführt wird, und suchen Sie dann nach dem Monitor-Modell und mit fbsetwelchem ​​Werkzeug Sie die Low-Level-Timings einstellen, die die Display-Timings steuern .

Die automatische Anpassung funktioniert in meinem Fall aufgrund bestimmter KVM-Probleme nicht (außerdem wird die Aktualisierungsrate nicht angepasst. Dies ist ein Problem, das ich nicht erwähnt habe.) Wenn Sie die Frage so bearbeiten, dass sie meine fbset-Erfahrung widerspiegelt. einpoklum vor 11 Jahren 0