コンテンツにスキップするには Enter キーを押してください

【解決策】Ubuntu 24.04+NVIDIA環境で複数モニターを使おうとすると解像度が860×480に固定される問題

Last updated on 2025年4月24日

なにもしてないのにモニターが壊れた。

本当に何もしてないんよ。

モニターをもらったので快適2枚モニター生活を始めようと思ったら新しい方だけ解像度が860×480で固定されてしまい変更できない。

ubuntuのディスプレイ設定画面で解像度を変更しようとしても860×480以外の選択肢が表示されない。ディスプレイのベンダー名が表示されるべきところもNvidiaとだけ書かれている。

本来あるべき姿

モニターの解像度が860×480で固定されてしまう理由

LinuxとNvidia製グラボの相性の悪さに加えて、Linuxのデュアルモニター対応自体がバグだらけで死屍累々らしい。

ネットで検索すると大量の記事が見つかる。みんな苦しんでいる。

原因は大きく分けて2つあるみたい。

A. Nvidiaのドライバがちゃんと読み込まれていない。またはオープンソースのドライバnouveauが読み込まれてしまっており、不具合が発生している。

こっちの方なら治すのは簡単。

B.モニターの EDID がおかしい。

EDIDは画像を出力するためにモニターやグラボがやり取りする情報のことで、ケーブルを抜き差しするだけでOKのこともあるが、おそらくそれだけでは直らない。

二ヶ月ぐらい苦しみまくってたくさん調べたので、似たような問題の解決策はほぼ網羅してあると思う。

ちなみに、セキュアブートが有効になっているとNvidiaが不具合起こす可能性があるらしいのでまだ無効にしていない場合はBIOSで無効にする。運が良ければそれで直る。

スペック:

OS:Ubuntu24.04

グラボ:NVIDIA GeForce GT 1030

モニター:BenQ(昔からある方), Dell(新しく追加した解像度がおかしいほう)

解像度を修正する方法

モニタの解像度がおかしな場合、大抵は次の3つの方法のどれかで直る。普通は方法1, 方法2までに解決すると思うけど自分は全部やった。

方法1.Nvidiaドライバを再インストール

方法2.xrandrで解像度を強制的に指定

方法3..EDIDを自作し、xorg.confをいじる

方法3のxorg.confをいじる方法はパソコンのシステムを不可逆的に破壊してしまう可能性があるのでなるべく方法1.2までに解決したい。

方法1.Nvidiaのドライバを再度インストールする

まずやるべきはこれ。

Nvidia-smiをやってみてNvidiaのドライバが読み込めていない、オープンソース(nouveau)のドライバが使用されている、みたいな場合はまずこれを試そうね。

最初にnouveauを無効化するためgeditであたらしく設定ファイルを作る。べつにnanoでもいい。

➜  ~sudo gedit /etc/modprobe.d/blacklist-nouveau.conf

作成したファイルにnouveauを無効化する設定を書き込む。

blacklist nouveau
options nouveau modeset=0

保存して、以下を実行。

➜  ~sudo update-initramfs -u

次に、Nvidiaドライバを再インストール。

GPUの確認が必要な場合は以下を実行

➜  ~ lspci | grep -i nvidia

自分の環境に適したドライバをインストールする前に現在入っているドライバを削除。

➜  ~ sudo apt-get --purge remove nvidia-*

導入可能なドライバを確認するために次のコマンドをばちーんと実行。

➜  ~ ubuntu-drivers devices

vendor   : NVIDIA Corporation
model    : GP108 [GeForce GT 1030]
driver   : nvidia-driver-570 - third-party non-free recommended
driver   : nvidia-driver-470-server - distro non-free
driver   : nvidia-driver-560 - third-party non-free
driver   : nvidia-driver-545 - third-party non-free
driver   : nvidia-driver-535-server - distro non-free
driver   : nvidia-driver-570-server - distro non-free
driver   : nvidia-driver-535 - third-party non-free
driver   : nvidia-driver-565 - third-party non-free
driver   : nvidia-driver-470 - third-party non-free
driver   : nvidia-driver-390 - third-party non-free
driver   : nvidia-driver-550 - third-party non-free
driver   : xserver-xorg-video-nouveau - distro free builtin

ここからドライバを選ぶが、recommendと書かれているドライバが最適とは限らないので自分で色々試す必要があるらしい。

とりあえず driver-570をインストールすると仮定。

➜  ~ sudo add-apt-repository ppa:graphics-drivers/ppa
➜  ~ sudo apt update
➜  ~ sudo apt install nvidia-driver-570

再起動し、うまく行ったか確認

➜  ~ nvidia-smi

表みたいなのが出てきてNVIDIA-SMI 570.124.04 Driver Version: 570.124.04 CUDA Version: 12.8のような記載があれば成功…

のはずが、Dellの解像度はまったく直っていない!

ドライバのせいではなかったらしい。

ということで次の方法を試す。

方法2.xrandrで解像度を無理やり変更

xrandrというライブラリを使用して解像度を体で覚えさせる

xrandrについてはArch wikiの説明が一番充実していると思うので時間があればぜひ。

https://wiki.archlinux.jp/index.php/Xrandr

最初に利用可能な出力端子と解像度を調べる。おもむろにxrandrと入力。

➜  ~ xrandr
Screen 0: minimum 8 x 8, current 3840 x 1080, maximum 32767 x 32767
DP-0 connected 860x480(normal left inverted right x axis y axis) 500mm x 281mm
   860x480    
DP-1 disconnected (normal left inverted right x axis y axis)
HDMI-0 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 527mm x 296mm
   1920x1080     60.00*+  59.94    50.00    60.05    60.00    50.04  
   1680x1050     59.95  
   1600x900      60.00  
   1280x1024     75.02    60.02  
   1280x800      59.81  
   1280x720      60.00    59.94    50.00  
   1024x768      75.03    60.00  
   800x600       75.00    60.32  
   720x576       50.00  
   720x480       59.94  
   640x480       75.00    59.94    59.93  

自分の環境ではDP-0, HDMI-0でモニタが接続されているみたい。

HDMI-0のほうがまともな方のモニタ(BenQ)、DP-0が新しく導入しようとしているDellのモニタ(解像度がおかしい)のようだ。

cvtのあとに設定したい解像度を記入。

➜  ~ cvt 1920 1080                                                                                                               
# 1920x1080 59.96 Hz (CVT 2.07M9) hsync: 67.16 kHz; pclk: 173.00 MHz
Modeline "1920x1080_60.00"  173.00  1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync

このコマンドは次のステップ用の引数を取得するためのもの。

指定できる解像度はそれぞれのモニタの設定画面で調べることができる。

xrandr --newmodeのあとにcvtで調べたModelineをコピペして実行。

➜  ~ xrandr --newmode "1920x1080_60.00"  173.00  1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync

作成した新しいモードをモニタの出力に追加。今回はDP-0を指定。

➜  ~xrandr --addmode DP-0 1280x1024_60.00

新しいモードを追加できるはずが痛恨のエラー。

X Error of failed request: BadMatch

よくわからないがEDID のチェックサムが間違っているらしい。

Arch wikiでNvidiaの記事を調べたところ、モニタのEDIDが間違っているかNvidiaドライバの制限が厳しすぎてモニタ側の設定をうまく反映できていないとのこと。

Archwikiの記事

カーネルを修正しろという不吉な記述もあったが、最初にEDIDの上書きを試してみる。

方法3.EDIDを自作し、Xorg.confを設定する

要はモニタのEDID情報がおかしいので、自分でそれを作ってしまおうということ。

最初に、xorg.confを作成する。

アプリ一覧からNVIDIA X Server Settingsを開き、メニューからX Server Display Configurationを選択。

右下のSave to X Configuration Fileをおすことでファイルを新規作成できる。

修正用の設定ファイルは作成できたので今度は必要なツールを揃えていく。

➜  ~ sudo apt install zsh edid-decode automake dos2unix
➜  ~ sudo apt install build-essential

githubにedid generatorを公開している親切な人がいるので、ダウンロードさせてもらう。

➜  ~ git clone https://github.com/akatrevorjay/edid-generator

作成したディレクトリに移動

➜  ~ cd edid-generator

満を持してEDID作成のためのコマンド実行。

➜  ~ ./modeline2edid /etc/X11/xorg.conf
Searching for modelines in '/etc/X11/xorg.conf'
➜  ~ make

これで、1920×1080.binがedid-generatorディレクトリに作成された。

このファイルを/etc/X11にコピーする。

設定ファイルが置かれている/etcには普通のやり方ではコピペできないので、root権限で操作する必要がある。

root@〇〇:/# cp /home/〇〇/1920x1080.bin  /etc/X11

ここまで来たのだが、今更ながらxorg.confをいじるのは非推奨と判明。

https://forums.developer.nvidia.com/t/prime-display-is-not-detected-after-generating-xorg-conf-file/171014

Nvidia親切おじさんの助言に従い、/etc/X11にあるxorg.confをetc/X11/xorg.conf.d/に移動し、xorg.confの名前を20-nvidia.confに変更

準備が整ったところで、設定ファイルをいじっていく。

 ➜  ~ sudo nano /etc/X11/xorg.conf.d/20-nvidia.conf

設定がびゃーっと出てくるので頑張ってDeviceセクションを探す。

Section "Device"       
    Identifier     "Card0"
    Driver         "nvidia"
EndSection

おそらく最小限の情報しか書かれていないので青字部分を追記。

Section "Device"    
    Identifier     "Card0"
    Driver         "nvidia"
    Option         "ConnectedMonitor" "DP-0"
    Option         "CustomEDID" "DP-0:/etc/X11/1920x1080.bin"
    Option         "IgnoreEDID" "false"
    Option         "UseEDID" "ture"
EndSection

DP-0の部分はそれぞれ設定したモニタの出力を入力する。

祈るような気持ちで再起動…

直った!Dellのモニタが美しい1920×1080に…!

正常だったもう一方のモニタが映らなくなる

代償としてさっきまで映っていたはずのBenQの方が映らなくなった(T_T)

困惑しつつxrandrしたところ、さっきまでHDMI-0で出力されていたBenQモニタが認識されていない。

➜  ~ xrandr
Screen 0: minimum 8 x 8, current 3840 x 1080, maximum 32767 x 32767
DP-0 connected 1920x1080+1920+0 (normal left inverted right x axis y axis) 500mm x 281mm
   1920x1080     60.00*+
DP-1 disconnected (normal left inverted right x axis y axis)
HDMI-0 disconnected (normal left inverted right x axis y axis)

壊れていたほうが普通になって、普通だったほうが壊れるってどういうことなん泣

設定ファイルを軽い気持ちでいじってはいけない(教訓)

直ったばかりのDellモニタを使い、泣きながら解決方法を探す。

一週間くらいかけて探したものの、みんな上記の方法で直ったらしく参考になる記事が見つからない。

色々考えたけど20-nvidia.confの記述方法が間違っている気がしてきた。

Deviceセクションに Option(Option "ConnectedMonitor")を追加したらDP-0のモニタが直ったのだから、HDMI-0のほうについても同じOptionを追加すればいいのでは?というシンプルな解答をおもいつく。(伏線)

Deviceセクションに下記赤字部分を追加。(注.これは実行してはいけません。)

青字が前回入力した部分、赤字が今回追加した部分。

Section "Device"  
      Identifier     "Card0"
      Driver         "nvidia"
      Option         "ConnectedMonitor" "DP-0"
      Option         "CustomEDID" "DP-0:/etc/X11/1920x1080.bin"
      Option         "IgnoreEDID" "false"
      Option         "UseEDID" "ture"

      Option     	"ConnectedMonitor" "HDMI-0"
      Option     	"CustomEDID" "HDMI-0:/etc/X11/1920x1080.bin"
      Option     	"IgnoreEDID" "false"
      Option     	"UseEDID" "ture"
EndSection

再起動する…

パソコンが起動しなくなった!

(T_T)

接続するモニタを単純に追記すればいいじゃん、という浅はかな考えによりパソコンがぶっ壊れた。

xorg.conf(20-nvidia.conf)を素人がうかつにいじくり回すと自分のパソコンを破壊してしまうので皆さんも気をつけてください。

怒りのOS再インストール。

また会ったね

DP-0で出力しているDellモニタの解像度は当然のごとく860×480に戻ってしまっているので最初からやり直し。

20-nvidia.confのDeviceセクションにConnectedMonitor オプションを追加するところまで再度すすめた。現在のDeviceセクションはこんなかんじになっている。

Section "Device"    
    Identifier     "Card0"
    Driver         "nvidia"
    Option         "ConnectedMonitor" "DP-0"
    Option         "CustomEDID" "DP-0:/etc/X11/1920x1080.bin"
    Option         "IgnoreEDID" "false"
    Option         "UseEDID" "ture"
EndSection

Linux Mintフォーラムに救われる。Xorgの文法を学ぶ

完全に行き詰まり半泣きになりながら調べていたところ、Mintのフォーラムで次のような記事を見つけた。

https://forums.linuxmint.com/viewtopic.php?t=360670)

やはり設定ファイルの書き方が間違っていたらしい。

正しい文法で20-nvidia.confを書き直す。緑字が今回追記した部分。(青字は前回までに追記したところ)

Section "ServerLayout"
	Identifier 	"X.org Configured"
	Screen  	0  "Screen0" 0 0
	InputDevice	"Mouse0" "CorePointer"
	InputDevice	"Keyboard0" "CoreKeyboard"
EndSection


Section "Monitor"
	Identifier 	"Monitor0"
	VendorName 	"Monitor Vendor"
	ModelName  	"Monitor Model"
EndSection

Section "Device"
	Identifier 	"Card0"
	Driver     	"nvidia"
	Option     	"ConnectedMonitor" "DP-0"
	Option     	"CustomEDID" "DP-0:/etc/X11/1920x1080.bin"
	Option     	"IgnoreEDID" "false"
	Option     	"UseEDID" "ture"

EndSection



Section "Screen"
	Identifier 	"Screen0"
	Device     	"Card0"
	Monitor    	"Monitor0"
	DefaultDepth	24

	Option     	"ConnectedMonitor" "DP-0, HDMI-0"
	Option     	"metamodes" "HDMI-0: nvidia-auto-select, DP-0: 1920x1080_60+0+0"
EndSection


Section "OutputClass"
	Identifier "nvidia"
	MatchDriver "nvidia-drm"
	Driver "nvidia"
EndSection

DeviceセクションではなくScreenセクションにOptionを追加して2つの出力端子を指定すべきだったらしい。

ちなみに各SectionはIdentifierでそれぞれのセクションを相互に参照している。

なので、例えばScreenセクションのDeviceMonitorにはそれぞれDeviceセクションやMonitorセクションのidendifierで設定した名前を入力する必要がある。

やれることをすべてやり尽くし、勝負の再起動。

これでだめならLinuxやめてMac mini買う。

sudo reboot

直った!クララが立った!モニタも映った!

Dellのモニタは相変わらずThe Linux Foundation 23″となっているがとりあえず良しとする。

解像度を強制的に指定したせいで1920×1080しか選べないがもはやどうでもいい。

参考文献

*Nvidiaドライバをインストールする方法

https://qiita.com/porizou1/items/74d8264d6381ee2941bd

*xrandrで解像度を指定する方法

https://qiita.com/KaoruHosokawa00/items/1a39aebb58f3d8ac962e

https://wiki.archlinux.jp/index.php/Xrandr#.xinitrc_.E3.81.8B.E3.82.89.E8.A7.A3.E5.83.8F.E5.BA.A6.E3.82.92.E8.A8.AD.E5.AE.9A.E3.81.97.E3.81.A6.E3.82.82.E3.81.86.E3.81.BE.E3.81.8F.E3.81.84.E3.81.8B.E3.81.AA.E3.81.84

*xrandr BadMatchについてのarch wiki

https://wiki.archlinux.jp/index.php/NVIDIA/%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0#xrandr_BadMatch

*xrandr EDID checksum is invalidに関するarch wikiの解説

https://wiki.archlinux.org/title/Xrandr#EDID_checksum_is_invalid

*xrandr BadMatchへの対応(EDID作成方法)

https://akenji3.github.io/post/20220914_xrandr_badmatch

*edid genenrator (github)

https://github.com/leeseungcheol/edid-generator

*edid generatorからのダウンロード方法(Method2の節を参照)

https://kodi.wiki/view/Archive:Creating_and_using_edid.bin_via_xorg.conf

*xorg.confを使用するなというnvidiaのフォーラム

https://forums.developer.nvidia.com/t/prime-display-is-not-detected-after-generating-xorg-conf-file/171014

*xorg.conf(20-nvidia.conf)の記載方法に関する解説(Linux Mintフォーラム)

https://forums.linuxmint.com/viewtopic.php?t=360670)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です