Änderung der Startauflösung in initramfs auf Laptop-Monitor und HDMI-Monitor

Änderung der Startauflösung in initramfs auf Laptop-Monitor und HDMI-Monitor

Ich habe Linux Mint 17 auf meinem Laptop. Außerdem ist ein 22-Zoll-Monitor über ein HDMI-Kabel mit dem Laptop verbunden. Meine Festplatte ist vollständig mit LUKS und LVM verschlüsselt. Beim Booten erhalte ich eine grafische Eingabeaufforderung zur Eingabe des Kennworts für verschlüsselte Partitionen. Die Bildschirmauflösung auf dem Laptop und dem externen Monitor ist bei der Kennwortabfrage falsch. Die grafische Eingabeaufforderung und das Linux-Mint-Logo werden auf beiden Monitoren in die obere linke Ecke verschoben und der Rest ist schwarz. Die Auflösung ist erst korrekt, nachdem ich mich bei meinem Profil angemeldet habe. Folgendes wird angezeigt, xrandrwenn ich angemeldet bin:

Screen 0: minimum 320 x 200, current 3286 x 1080, maximum 32767 x 32767
LVDS1 connected 1366x768+1920+312 (normal left inverted right x axis y axis) 344mm x 194mm
   1366x768       60.1*+   40.1
   1360x768       59.8     60.0
   1024x768       60.0
   800x600        60.3     56.2
   640x480        59.9
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 531mm x 298mm
   1920x1080      60.0*+
   1680x1050      59.9
   1600x900       60.0
   1280x1024      75.0     60.0
   1280x800       59.9
   1152x864       75.0
   1280x720       60.0
   1024x768       75.1     60.0
   832x624        74.6
   800x600        75.0     60.3
   640x480        75.0     60.0
   720x400        70.1
DP1 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)

Nach dem Einbinden der verschlüsselten Festplatte kann ich die Auflösung auf Monitoren mit xrandreinem Befehl ändern. Dieser Befehl ist jedoch mit nicht verfügbar initramfs.

Ich habe kürzlich die Bildschirmhelligkeit eines anderen Laptops beim Booten mithilfe initramfseines Skripts korrigiert und es hat funktioniert. Dieses Skript hat die Helligkeit eingestellt, indem es den korrekten Wert an zurückgegeben hat /sys/class/backlight/acpi_video0/brightness. Kann ich auch etwas Ähnliches verwenden, um die Bildschirmauflösung irgendwie zu ändern?

AKTUALISIEREN

Ich habe die Lösung von @mikeserv ausprobiert:

  1. EDID-Dateien von Monitoren (nicht sicher, ob sie korrekt sind):

    # cat /sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-LVDS-1/edid > /lib/firmware/edid/1366x768.bin
    # cat /sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-HDMI-A-1/edid > /lib/firmware/edid/1920x1080.bin
    
    # hexdump /lib/firmware/edid/1366x768.bin
    0000000 ff00 ffff ffff 00ff e430 033b 0000 0000
    0000010 1600 0401 2290 7813 610a 9ed5 5b5e 269a
    0000020 501a 0054 0000 0101 0101 0101 0101 0101
    0000030 0101 0101 0101 1de2 b456 0050 3038 3024
    0000040 0035 c258 0010 1900 13ec c656 0050 302e
    0000050 3024 0035 c258 0010 1900 0000 fe00 3500
    0000060 4833 3935 3180 3635 4857 0a34 0000 0000
    0000070 0000 3141 0096 0000 0100 0a01 2020 ac00
    0000080
    
    # hexdump /lib/firmware/edid/1920x1080.bin 
    0000000 ff00 ffff ffff 00ff d109 78a5 5445 0000
    0000010 1626 0301 3580 781e b72e a4d5 5456 279f
    0000020 500c a554 806b 0081 c081 8081 c0a9 00b3
    0000030 c0d1 0101 0101 3a02 1880 3871 402d 2c58
    0000040 0045 2a13 0021 1e00 0000 ff00 4c00 4339
    0000050 3030 3537 3039 3931 200a 0000 fd00 3200
    0000060 1e4c 1153 0a00 2020 2020 2020 0000 fc00
    0000070 4200 6e65 2051 4c47 3432 3035 200a d900
    0000080
    
  2. Hook-Skript für Initramfs, lädt i915Modul und Include- EDIDDateien in /lib/firmware/edid/das Verzeichnis darin initramfs(ich habe es geprüft und EDIDdie Dateien befinden sich in Initramfs)

    # cat /etc/initramfs-tools/hooks/include-edid-data 
    #!/bin/sh
    
    PREREQ="udev"
    prereqs()
    {
       echo "$PREREQ"
    }
    
    case $1 in
    prereqs)
       prereqs
       exit 0
       ;;
    esac
    
    . /usr/share/initramfs-tools/hook-functions
    # Begin real processing below this line
    
    if [ ! -e "${DESTDIR}/lib/firmware/edid" ]; then
        mkdir -p "${DESTDIR}/lib/firmware/edid"
    fi
    
    if [ -r "/lib/firmware/edid/1366x768.bin" ]; then
       cp "/lib/firmware/edid/1366x768.bin" "${DESTDIR}/lib/firmware/edid/"
    fi
    
    if [ -r "/lib/firmware/edid/1920x1080.bin" ]; then
       cp "/lib/firmware/edid/1920x1080.bin" "${DESTDIR}/lib/firmware/edid/"
    fi
    
    manual_add_modules i915
    
    exit 0
    
    # chmod a+rx /etc/initramfs-tools/hooks/include-edid-data
    # update-initramfs -u
    
  3. Beim Neustart habe ich den Boot-Parameter hinzugefügt (nicht sicher, ob es HDMI-1 oder HDMI1 oder etwas anderes sein sollte)

    drm_kms_helper.edid_firmware=HDMI1:/lib/firmware/edid/1920x1080.bin
    
  4. Es hat nichts geändert. Also habe ich auch versucht:

    drm_kms_helper.edid_firmware=HDMI-1:/lib/firmware/edid/1920x1080.bin
    drm_kms_helper.edid_firmware=HDMI1:edid/1920x1080.bin
    drm_kms_helper.edid_firmware=HDMI-1:edid/1920x1080.bin
    

Überhaupt kein Glück. Alles ist so, wie es war, bevor ich die Schritte von oben unternommen habe.

Ich möchte auch hinzufügen, dass die Auflösung auf dem Laptop-Monitor korrekt ist, wenn die HDMI-Monitor-ID getrennt ist.

Was mache ich falsch?

AKTUALISIERUNG 2

Funktioniert immer noch nicht. Schritte, die ich unternommen habe:

  1. Habe die richtigen Namen für meine Monitore herausgefunden:

    $ for p in /sys/class/drm/*/status; do if [ "$(cat "$p")" == "connected" ]; then echo -n "$p" | awk -F '/' '{print $5}'; fi; done
    card0-HDMI-A-1
    card0-LVDS-1
    
  2. Installieren linux-doc(um Dokumente zu erhalten, die die Erstellung von benutzerdefinierten EDID), dos2unix, make(zum Kompilieren von EDIDDateien) Paketen beschreiben

    $ sudo apt-get install linux-doc dos2unix make
    
  3. Erstellen Sie ein temporäres Verzeichnis für die Kompilierung und kopieren Sie die Quelldateien fürEDID

    $ mkdir ~/Tmp/edid
    $ cd ~/Tmp/edid
    $ cp /usr/share/doc/linux-doc/EDID/* .
    $ rm *.S
    $ cp /usr/share/doc/linux-doc/EDID/1920x1080.S .
    $ cp /usr/share/doc/linux-doc/EDID/1920x1080.S 1366x768.S
    
  4. Bearbeiten Sie die Datei 1366x768.Smit dem richtigenWerte, kompilieren, kopieren nach /lib/firmware/edid:

    • Aktuelle funktionierende Modeline für meinen Laptop-Bildschirm erhalten

      $ xvidtune -show
      "1366x768"     76.50   1366 1402 1450 1546    768  771  776  824 -hsync -vsync
      

      Dies sind wiederum: resolution, clock MHz, hdisp, hsyncstart, hsyncend, , htotal, vdisp, vsyncstart, vsyncend,vtotal

    • Werte berechnen:

      CLOCK = 76500
      XPIX    = hdisp                               = 1366
      XBLANK  = htotal - hdisp        = 1546 - 1366 = 180
      XOFFSET = hsyncstart - hdisp    = 1402 - 1366 = 36
      XPULSE  = hsyncend - hsyncstart = 1450 - 1402 = 48
      
      YPIX    = vdisp = 768
      YBLANK  = vtotal - vdisp             = 824 - 768      = 56
      YOFFSET = 63 + vsyncstart - vdisp    = 63 + 771 - 768 = 66
      YPULSE  = 63 + vsyncend - vsyncstart = 63 + 776 - 771 = 68
      
      TIMING_NAME "Linux HDR"
      CRC 0xcd
      
    • Endgültige Version 1366x768.S:

      $ cat 1366x768.S
      /* EDID */
      #define VERSION 1
      #define REVISION 3
      
      /* Display */
      #define CLOCK 76500 /* kHz */
      #define XPIX 1366
      #define YPIX 768
      #define XY_RATIO XY_RATIO_16_9
      #define XBLANK 180
      #define YBLANK 56
      #define XOFFSET 36
      #define XPULSE 48
      #define YOFFSET 66
      #define YPULSE 68
      #define DPI 96
      #define VFREQ 60 /* Hz */
      #define TIMING_NAME "Linux HDR"
      #define ESTABLISHED_TIMINGS_BITS 0x00 /* none */
      #define HSYNC_POL 1
      #define VSYNC_POL 1
      #define CRC 0xcd
      
      #include "edid.S"
      
    • Kompilieren Sie die Dateien und prüfen Sie mit edid-decode( sudo apt-get install edid-decode), ob keine Fehler vorliegen:

      $ make clean && make
      rm 1920x1080.o 1366x768.o
      
      $ ls -1 *.bin
      1366x768.bin
      1920x1080.bin
      
      $ edid-decode 1366x768.bin
      Extracted contents:
      header:          00 ff ff ff ff ff ff 00
      serial number:   31 d8 00 00 00 00 00 00 05 16
      version:         01 03
      basic params:    6d 23 14 78 ea
      chroma info:     5e c0 a4 59 4a 98 25 20 50 54
      established:     00 00 00
      standard:        8b c0 01 01 01 01 01 01 01 01 01 01 01 01 01 01
      descriptor 1:    e2 1d 56 b4 50 00 38 30 24 30 35 00 63 c8 10 00 00 1e
      descriptor 2:    00 00 00 ff 00 4c 69 6e 75 78 20 23 30 0a 20 20 20 20
      descriptor 3:    00 00 00 fd 00 3b 3d 30 32 08 00 0a 20 20 20 20 20 20
      descriptor 4:    00 00 00 fc 00 4c 69 6e 75 78 20 48 44 52 0a 20 20 20
      extensions:      00
      checksum:        cd
      
      Manufacturer: LNX Model 0 Serial Number 0
      Made week 5 of 2012
      EDID version: 1.3
      Analog display, Input voltage level: 0.7/0.7 V
      Sync: Separate Composite Serration 
      Maximum image size: 35 cm x 20 cm
      Gamma: 2.20
      DPMS levels: Standby Suspend Off
      RGB color display
      First detailed timing is preferred timing
      Established timings supported:
      Standard timings supported:
        1360x816@60Hz
      Detailed mode: Clock 76.500 MHz, 355 mm x 200 mm
                     1366 1402 1450 1546 hborder 0
                      768  771  776  824 vborder 0
                     +hsync +vsync
      Serial number: Linux #0
          Monitor ranges: 59-61HZ vertical, 48-50kHz horizontal, max dotclock 80MHz
      Monitor name: Linux HDR
         Checksum: 0xcd
      
      $ edid-decode 1920x1080.bin
      Extracted contents:
      header:          00 ff ff ff ff ff ff 00
      serial number:   31 d8 00 00 00 00 00 00 05 16
      version:         01 03
      basic params:    6d 32 1c 78 ea
      chroma info:     5e c0 a4 59 4a 98 25 20 50 54
      established:     00 00 00
      standard:        d1 c0 01 01 01 01 01 01 01 01 01 01 01 01 01 01
      descriptor 1:    02 3a 80 18 71 38 2d 40 58 2c 45 00 f4 19 11 00 00 1e
      descriptor 2:    00 00 00 ff 00 4c 69 6e 75 78 20 23 30 0a 20 20 20 20
      descriptor 3:    00 00 00 fd 00 3b 3d 42 44 0f 00 0a 20 20 20 20 20 20
      descriptor 4:    00 00 00 fc 00 4c 69 6e 75 78 20 46 48 44 0a 20 20 20
      extensions:      00
      checksum:        05
      
      Manufacturer: LNX Model 0 Serial Number 0
      Made week 5 of 2012
      EDID version: 1.3
      Analog display, Input voltage level: 0.7/0.7 V
      Sync: Separate Composite Serration 
      Maximum image size: 50 cm x 28 cm
      Gamma: 2.20
      DPMS levels: Standby Suspend Off
      RGB color display
      First detailed timing is preferred timing
      Established timings supported:
      Standard timings supported:
        1920x1152@60Hz
      Detailed mode: Clock 148.500 MHz, 500 mm x 281 mm
                     1920 2008 2052 2200 hborder 0
                     1080 1084 1089 1125 vborder 0
                     +hsync +vsync
      Serial number: Linux #0
          Monitor ranges: 59-61HZ vertical, 66-68kHz horizontal, max dotclock 150MHz
      Monitor name: Linux FHD
         Checksum: 0x5
      
    • Kopieren Sie Dateien nach/lib/firmware/edid

      $ sudo cp *.bin /lib/firmware/edid
      
  5. Update initramfs, Hook-Skript sollte EDID-Dateien hinzufügen (sie sind da, ich habe es überprüft)

    $ sudo update-initramfs -u
    
  6. Bearbeiten Sie beim Booten die Grub-Befehlszeile (drücken Sie während des Booten die Umschalttaste, um das Grub-Menü anzuzeigen, und drücken Sie anschließend e) von:

    linux   /vmlinuz-3.13.0-24-generic root=/dev/mapper/mint--vg-root ro   quiet splash $vt_handoff
    

    Zu

    linux   /vmlinuz-3.13.0-24-generic root=/dev/mapper/mint--vg-root ro   quiet splash $vt_handoff drm_kms_helper.edid_firmware=card0-LVDS-1:/lib/firmware/edid/1366x768.bin drm_kms_helper.edid_firmware=card0-HDMI-A-1:/lib/firmware/edid/1920x1080.bin
    

Ich habe auch versucht, es nur für einen Monitor einzustellen. Aber ohne Erfolg. Ich fange an zu glauben, dass es kein Problem mit der Auflösung ist, sondern mit dem Plymouth-Bild selbst. Wenn ich das Boot-Bild sehe, ist es nicht verschwommen, gestreckt oder so und das Linux-Mint-Logo ist scharf und klar. Es ist nur kleiner als mein Bildschirm und im linken oberen Teil meines Laptops und HDMI-Bildschirms platziert.

Ich habe gefundendieser Fehlerdas ist meinem Problem sehr ähnlich. Ich denke also, ich muss warten, bis sie das Problem beheben.

Antwort1

Ihr Monitor stellt Informationen über sich selbst mithilfe eines digitalen Standards namens EDID bereit. Der Kernel liest diese Informationen, wenn er ein Anzeigegerät erkennt, und konfiguriert seine Anzeige automatisch so, dass sie so gut wie möglich mit der des Anzeigegeräts übereinstimmt.einheimischAuflösung. LCD-Geräte können in Wahrheit nur eine Auflösung unterstützen - ihreeinheimischAuflösung - undemulieren, nacheifernalle anderen. VonWikipedia:

Erweiterte Display-Identifikationsdaten(EDID)ist eine Datenstruktur, die von einem digitalen Display bereitgestellt wird, um einer Videoquelle (z. B. Grafikkarte oder Set-Top-Box) seine Fähigkeiten zu beschreiben. Dadurch erkennt ein moderner PC, welche Arten von Monitoren an ihn angeschlossen sind. EDID wird durch einen von der Video Electronics Standards Association (VESA) veröffentlichten Standard definiert. Die EDID umfasst Herstellername und Seriennummer, Produkttyp, Phosphor- oder Filtertyp, vom Display unterstützte Timings, Displaygröße, Luminanzdaten und (nur für digitale Displays) Pixelmapping-Daten.

Das Problem dabei ist, dass sehr oft die bereitgestelltenEDIDIstfalschoder in irgendeiner Weise beschädigt - dies liegt im Allgemeinen an faulen oder fehlgeleiteten Herstellern, die diese Informationen in die Firmware des Geräts programmieren müssen. Es kann sogar an einem schlechten HDMI-Kabel liegen, aber die Wahrscheinlichkeit dafür ist viel geringer, da ein digitales Kabelvielwahrscheinlicher, dass es einfach überhaupt nicht funktioniert. Aber es gibt noch andere Möglichkeiten. Wenn Sie KMS verwenden, werden Sie das hier wahrscheinlich interessant finden:

Heute, mit dem Aufkommen des Kernel Mode Setting, funktioniert eine Grafikkarte entweder einwandfrei, weil alle Komponenten den Standards entsprechen – oder der Computer ist unbrauchbar, weil der Bildschirm nach dem Booten dunkel bleibt oder er den falschen Bereich anzeigt. Fälle, in denen dies passiert, sind:

  • Die Grafikkarte erkennt den Monitor nicht.

  • Die Grafikkarte kann keine EDID-Daten erkennen.

  • Die Grafikkarte leitet EDID-Daten fehlerhaft an den Treiber weiter.

  • Der Monitor sendet keine oder falsche EDID-Daten.

  • Ein KVM sendet seine eigenen EDID-Daten, anstatt den angeschlossenen Monitor abzufragen.

Das Hinzufügen des Kernelparameters „nomodeset“ hilft in den meisten Fällen, führt jedoch später zu Einschränkungen.

∆Das∆ist ein Auszug auskernel.orgs eigene HOWTO.txtfür KMS EDIDs. Diese Textdatei befindet sich imgleicher Ordnerals fünf EDIDs mit Standardauflösung, die Sie dem Kernel beim Booten über einen Kernelparameter und initramfs bereitstellen können, um die von Ihrem Monitor bereitgestellte EDID zu umgehen.

Wenn Sie einen der Open-Source-Anzeigetreiber verwenden, verwenden Sie die Kernelmoduseinstellung und können beispielsweise eine der fünf bereits erwähnten KMS EDID-Auflösungsbypass-Voreinstellungen verwenden. Alternativ können Sie Ihre eigene EDID-Datei bereitstellen, die der Kernel anstelle der vom Anzeigegerät bereitgestellten Informationen verwendet.

Sehendiese Abteilungdes Arch Linux Wikis für weitere Informationen, aber wahrscheinlichdieser AskUbuntu-Threadwäre besser auf Ihre Distribution ausgerichtet.

Wenn Sie KMS nicht verwenden und stattdessen entweder die Closed-Source-Treiber von Nvidia oder AMD verwenden, sind Ihre Chancen, die Boot-Time-Auflösungen zuverlässig zu handhaben, meines Wissens nach nahezu gleich Null. Es ist möglicherweise möglich, diese in einem grubanderen Bootloader zu konfigurieren.Vorein beliebiges initramfs-Image ist gemountet, aber die Wahrscheinlichkeit, dass dies später beim Start die Auflösungskonfiguration der Closed-Source-Treiber beeinträchtigt, Xist ziemlich hoch. Wenn SiesehrZum Glück hat Ihnen Ihr Motherboard-Hersteller freundlicherweise eine Einstellung in der UEFI-Firmware zur Verfügung gestellt, mit der Sie die Boot-Auflösung konfigurieren können, und Sie können sie dort festlegen, bevor überhaupt ein sekundärer Bootloader wie dieser grubgeladen wird. Ich persönlich kenne jedoch noch nie jemanden, der so viel Glück hatte.

verwandte Informationen