노트북 모니터 및 HDMI 모니터의 initramfs에서 부팅 해상도 변경

노트북 모니터 및 HDMI 모니터의 initramfs에서 부팅 해상도 변경

내 노트북에는 Linux Mint 17이 있습니다. 또한 HDMI 케이블을 사용하여 노트북에 22인치 모니터를 연결했습니다. LUKS 및 LVM으로 완전히 암호화된 경우 내 디스크입니다. 부팅 시 암호화된 파티션의 비밀번호를 입력하라는 그래픽 프롬프트가 표시됩니다. 비밀번호를 요청할 때 노트북과 외부 모니터 모두의 화면 해상도가 잘못되었습니다. 그래픽 프롬프트와 Linux Mint 로고가 두 모니터의 왼쪽 상단으로 이동하고 나머지 공간은 검은색으로 표시됩니다. 내 프로필에 로그인한 후에만 해상도가 정확해집니다. xrandr로그인했을 때 표시되는 내용은 다음과 같습니다 .

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)

암호화된 디스크를 장착한 후 명령을 사용하여 모니터의 해상도를 변경할 수 있습니다 xrandr. 하지만 이 명령은 에서는 사용할 수 없습니다 initramfs.

최근에 스크립트를 사용하여 부팅 시 다른 노트북 화면 밝기를 수정했는데 initramfs제대로 작동했습니다. 이 스크립트는 올바른 값을 에 반영하여 밝기를 설정했습니다 /sys/class/backlight/acpi_video0/brightness. 어떻게든 화면 해상도를 변경하는 것과 비슷한 것을 사용할 수도 있나요?

업데이트

@mikeserv 솔루션을 사용해 보았습니다.

  1. 모니터의 EDID 파일(올바른지 확실하지 않음):

    # 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. initramfs용 후크 스크립트는 i915모듈을 로드하고 파일을 내부 디렉터리 EDID에 포함합니다 (확인해 보니 파일이 initramfs 안에 있습니다)./lib/firmware/edid/initramfsEDID

    # 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. 재부팅 시 부팅 매개변수를 추가했습니다(HDMI-1인지, HDMI1인지 또는 다른 것인지 확실하지 않음).

    drm_kms_helper.edid_firmware=HDMI1:/lib/firmware/edid/1920x1080.bin
    
  4. 아무것도 바뀌지 않았습니다. 그래서 나는 또한 다음을 시도했습니다.

    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
    

전혀 행운이 없습니다. 모든 것이 내가 위에서 조치를 취하기 전과 같습니다.

또한 HDMI 모니터 ID 연결이 끊긴 경우 노트북 모니터의 해상도가 정확하다는 점을 추가하고 싶습니다.

내가 도대체 ​​뭘 잘못하고있는 겁니까?

업데이트 2

그래도 작동이 안되는. 내가 취한 단계:

  1. 내 모니터의 올바른 이름을 찾았습니다.

    $ 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. linux-doc(사용자 정의 생성을 설명하는 문서를 얻기 위해 EDID), dos2unix( make파일 컴파일을 위해 EDID) 패키지 설치

    $ sudo apt-get install linux-doc dos2unix make
    
  3. 컴파일을 위한 임시 디렉토리를 생성하고 소스 파일을 복사합니다.EDID

    $ 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. 올바른 파일 1366x768.S편집가치, 컴파일, 복사 /lib/firmware/edid:

    • 내 노트북 ​​화면에 대해 현재 작동 중인 모델라인을 얻습니다.

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

      차례로 다음과 같습니다: resolution, clock MHz, hdisp, hsyncstart, hsyncend, htotal, vdisp, vsyncstart, vsyncend,vtotal

    • 값 계산:

      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
      
    • 최종 버전 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"
      
    • edid-decode파일을 컴파일하고 ( ) 를 사용하여 오류가 없는지 확인합니다 sudo apt-get install edid-decode.

      $ 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
      
    • 다음 위치로 파일 복사/lib/firmware/edid

      $ sudo cp *.bin /lib/firmware/edid
      
  5. 업데이트 initramfs, 후크 스크립트는 edid 파일을 추가해야 합니다(그 파일이 있습니다. 확인했습니다).

    $ sudo update-initramfs -u
    
  6. 부팅 시 다음에서 grub 명령줄을 편집합니다(부팅 시 Shift를 눌러 grub 메뉴를 표시하고 키를 누른 후 e).

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

    에게

    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
    

또한 하나의 모니터에만 설정해 보았습니다. 그러나 전혀 행운이 없습니다. 해상도의 문제가 아니라 플리머스 이미지 자체의 문제라는 생각이 들기 시작했습니다. 부팅 이미지를 볼 때 흐릿하거나 늘어지지 않고 Linux Mint 로고가 선명하고 명확합니다. 내 화면보다 작으며 내 노트북과 HDMI 화면의 왼쪽 상단 부분에 배치됩니다.

내가 발견했다이 버그그건 내 문제와 정말 비슷해요. 그래서 나는 그들이 이 문제를 고칠 때까지 기다려야 한다고 생각합니다.

답변1

모니터는 EDID라는 디지털 표준을 사용하여 자체 정보를 제공합니다. 커널은 디스플레이 장치를 감지할 때 이 정보를 읽고 디스플레이 장치의 디스플레이와 최대한 일치하도록 디스플레이를 자동으로 구성합니다.토종의해결. 실제로 LCD 장치는 단 하나의 해상도만 지원할 수 있습니다.토종의해상도 - 그리고에뮬레이트하다다른 모든. 에서위키피디아:

확장된 디스플레이 식별 데이터(EDID)비디오 소스(예: 그래픽 카드 또는 셋톱 박스)에 대한 기능을 설명하기 위해 디지털 디스플레이에서 제공하는 데이터 구조입니다. 이를 통해 최신 개인용 컴퓨터는 어떤 종류의 모니터가 연결되어 있는지 알 수 있습니다. EDID는 VESA(Video Electronics Standards Association)에서 발표한 표준에 따라 정의됩니다. EDID에는 제조업체 이름 및 일련 번호, 제품 유형, 형광체 또는 필터 유형, 디스플레이에서 지원하는 타이밍, 디스플레이 크기, 휘도 데이터 및 (디지털 디스플레이에만 해당) 픽셀 매핑 데이터가 포함됩니다.

이것의 문제는 매우 자주 제공된다는 것입니다.EDID~이다잘못된또는 어떤 방식으로든 손상되었습니다. 이는 일반적으로 해당 정보를 장치의 펌웨어에 프로그래밍해야 하는 제조업체가 게으르거나 잘못 안내했기 때문입니다. HDMI 와이어 불량으로 인해 발생할 수도 있지만 디지털 케이블이 품질이 좋지 않기 때문에 이러한 가능성은 훨씬 희박합니다.많이단순히 전혀 작동하지 않을 가능성이 더 높습니다. 그러나 다른 가능성도 있습니다. KMS를 사용하면 다음과 같은 흥미로운 사실을 발견하게 될 것입니다.

오늘날 커널 모드 설정의 출현으로 모든 구성 요소가 표준을 따르기 때문에 그래픽 보드가 올바르게 작동하거나, 부팅 후 화면이 어두워지거나 잘못된 영역을 표시하기 때문에 컴퓨터를 사용할 수 없게 됩니다. 이런 일이 발생하는 경우는 다음과 같습니다.

  • 그래픽 보드가 모니터를 인식하지 못합니다.

  • 그래픽 보드가 EDID 데이터를 감지할 수 없습니다.

  • 그래픽 보드가 EDID 데이터를 드라이버에 잘못 전달합니다.

  • 모니터가 잘못된 EDID 데이터를 보내거나 보내지 않습니다.

  • KVM은 연결된 모니터에 쿼리하는 대신 자체 EDID 데이터를 보냅니다.

커널 매개변수 "nomodeset"를 추가하면 대부분의 경우 도움이 되지만 나중에는 제한이 발생합니다.

Δ그렇다Δ에서 발췌한 것입니다kernel.org의 HOWTO.txtKMS EDID의 경우. 해당 텍스트 파일은 다음 위치에 있습니다.같은 폴더5개의 표준 해상도 EDID로 부팅 시 커널 매개변수와 initramfs를 통해 커널을 제공하여 모니터에서 제공하는 EDID를 우회할 수 있습니다.

오픈 소스 디스플레이 드라이버 중 하나를 사용하는 경우 커널 모드 설정을 사용하고 있으며 예를 들어 이미 언급한 5개의 KMS EDID 해상도 우회 사전 설정 중 하나를 사용할 수 있습니다. 또는 디스플레이 장치에서 제공하는 정보 대신 커널이 사용할 자체 EDID 파일을 완전히 제공할 수 있습니다.

보다이 구역자세한 내용은 Arch Linux 위키를 참조하세요. 하지만 아마도이 AskUbuntu 스레드귀하의 배포판에 더 잘 타겟팅 될 것입니다.

KMS를 사용하지 않고 대신 nvidia 또는 AMD 비공개 소스 드라이버를 사용하는 경우 제가 아는 한 부팅 시 해상도를 안정적으로 처리할 가능성은 거의 없습니다. grub또는 다른 부트 로더 에서 이를 구성하는 것이 가능할 수도 있습니다.~ 전에모든 initramfs 이미지가 마운트되지만 그렇게 하면 나중에 시작할 때 폐쇄 소스 드라이버의 자체 해상도 구성을 방해할 가능성이 X매우 높습니다. 당신이있는 경우매우grub다행스럽게도 마더보드 제조업체가 UEFI 펌웨어에서 부팅 시간 해상도 구성을 위한 설정을 친절하게 제공했으며 보조 부트 로더가 로드되기 전에도 설정할 수 있습니다 . 하지만 나는 개인적으로 그렇게 운이 좋은 사람을 본 적이 없습니다.

관련 정보