Linux Mint(LMDE4)でNVIDIA Quadro4 980 XGLを使う/VIDIAレガシーグラボとnouveauドライバ#3

NVIDIAのレガシーグラボQuadro4 980XGLを持つワークステーションにLinux Mint LMDE4 32bitをインストールしました。nvidiaドライバを割り当てるのは難しいとわかっていたのでnouveauドライバを使いましたが、大量のカーネルメッセージを吐いたのちブートの最後にフリーズしてしまいました。※本記事はレガシードライバ「96.43.xx」を使うNV28ファミリーGPUの話です。

# 短く言うと

ハードウェアのなかにNVIDIAのレガシーグラフィックボードQuadro4 980 XGLがあるならnouveauドライバを割り当てたうえにアクセラレータをoffにしましょう。

+ USBメモリからliveブートしようとすると「Welcome to LMDE 4 Cinnamon 32-bit」の画面が出ます。ここでなにもせずに「Start LMDE 4」になるのを待ちます。

:::note warn
「Start LMDE 4 with NVIDIA driver」を選ばないでください。
:::

+ **「順調に進んでいたのに後少しのところでフリーズ」状態**になったら、グラフィックボードとnouveauドライバの相性が悪い可能性があります。

+ 強制終了して再度liveブートします。最初の画面で「tab」キーを押しオプションを指定し、「nouveau.noaccel=1」を追加します。


```:options
quiet splash nouveau.noaccel=1 --
```

+ うまく起動できたらHDDにインストールします。

+ HDDブートをするときも起動画面で「e」キーを押し、ブートオプションとして「nouveau.noaccel=1」を追加し、「F10」キーを押して起動します。

```:options
quiet splash nouveau.noaccel=1
```

+ うまくHDDブートできたら、GRUBメニューに登録します。

```:terminal
$sudo vi /etc/default/grub
```

> `#前略`
> GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nouveau.noaccel=1"
> `#後略`

```:terminal
$sudo update-grub
```
 
問題を解決してからさかのぼってみると以上が結論です。**しかし、「nouveau.noaccel=1」を知るまでだいぶ回り道をしました。回り道しながらどのように操作したかも記述します。**

#はじめに

公式サポートが終了したNVIDIAのレガシーグラボにnvidiaドライバを割り当てるのはとてもたいへんです。そこでは始めからnouveauドライバを割り当てました。しかし、NV28ファミリーGPUはnouveauドライバと相性が悪いらしく割り当てるだけでは起動できません。そこで、起動オプションに「nouveau.noaccel=1」を加えることで解決しました。このオプションを知るまでだいぶ遠回りをしましたがその間にいろいろなことがわかりました。

# 今回の環境

自宅に眠っていた古いワークステーションにLinuxをインストールし1600x900でグラフィックユーザーインターフェイス(GUI)を表示するのが目標です。

+ OS：Linux mint LMDE 4 Cinnamon 32-bit
+ Linuxカーネル：4.19.0-8-686
+ X.Org Server：1.20.4　※以下「Xorg」と記載します
+ X Window System：version 11.0 (X11)　※以下「X11」と記載します
+ モニター：Gateway HX 2000 20inch(1600x900)
+ LAN：有線LAN
+ ワークステーション：HP xw6000
+ グラフィック用拡張スロット：AGP 8x
+ グラフィックボード：
    * NVIDIA Quadro4 980 XGL (xw6000に予め導入されていたもの)
        - GPU：NV28ファミリー
        - 最新ドライバ：96.43.23(2012年9月14日)

# とにかくインストールしたらフリーズした

古いNVIDIAのグラボではnvidiaドライバを割り当てられないと分かっていたのでnouveauドライバを(デフォルトで)割り当てました。USBブートは途中まで順調でした。「LM」のシンボルマークが表示され、さて、最後にGUIが立ち上がるぞ、というタイミングでフリーズしました。

## Live USBを作ってLiveブートした

Windows10のPCがあれば「Rufus」とLMDE4のisoファイルを使って簡単にLive USBが作れます。Liveブートすると最初の起動画面「Welcome to LMDE 4 Cinnamon 32-bit」が表示され、以下のようにいくつか選択できます。NVIDIAのグラフィックボードを使っていますが一番上の**「Start LMDE 4」を選択しました。**

![IMG_20211020_204338.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2176246/de9831b1-894b-6e1c-6d0d-a2d54c8dd0d6.jpeg)

:::note info
「Start LMDE 4 with NVIDIA driver」を選択するのは間違いです。
:::

## 【Liveブート時】フリーズしてなにもできなくなった

USBブートは途中まで順調でした。ただ、下の写真の通り「nouveauドライバの動作がうまくいかないので待ちきれない」と繰り返し警告され(大量のカーネルメッセージを吐き？)、「GPUはロックアップした」といわれました。

![IMG_20211030_003946.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2176246/19c805a9-3e0c-3c36-881d-4862de3245c0.jpeg)

その後、「LM」のシンボルマークが表示され、さて、最後にGUIが立ち上がるぞ、というタイミングで下のような画面になりフリーズしました。まったく操作できない状態なので強制的に電源をオフにするしかありませんでした。

![IMG_20211029_233527.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2176246/12231e01-ab78-2cdf-abf9-78fe0793babe.jpeg)


## 【Liveブート時】起動オプションに「nomodeset」を加えた

あらためて始めからやり直しました。ネット検索をすると起動オプションに「nomodeset」を付け加えると良いとの記事をたくさんみかけるのでそうしました。最初の画面で「tab」キーを押して下記のように編集しました。

```:options
quiet splash nomodeset --
```

今回はGUI表示までたどり着きました。ただ、1600x900で表示したいところ1024x768となっているようで目標どおりとはなりませんでした。

## 【Liveブート時】Xorgの状態を調べた

Xorgの状態を調べるためのコマンドがいくつかありますので端末でとにかく調べてみました。
そのまえにLiveブート時はキーボードが英語配列として認識されているので、まずは「setxkbmap」で日本語キーボードであることを宣言しました。

```:Terminal
$setxkbmap jp
```
「Xorg」と「xdpyinfo」コマンドでXorgとX11のバージョンがわかりました。

```:Terminal
$sudo Xorg -version
$xdpyinfo | head
```

「export」コマンドで現在の環境変数がわかりました。下記の例では「DISPLAY」の環境変数は「:0」です。

```:Terminal
$export -p | grep DISPLAY
```

>    DISPLAY=":0"


「xrandr」と「xdpyinfo」コマンドで現在の解像度がわかりました。下記の例では1024x768で表示されています。

```:Terminal
$xrandr
$xdpyinfo | grep -10 screen #0
```

> `#前略`
>     1024x768 0.00*
> `#後略`

「lshw」と「lspci」ではグラフィックボードの種類がわかりました。下記の例ではGPUに**NV28ファミリー**の「Quadro4 980 XGL」が使われています。

```:Terminal
$sudo lshw -c video
$lspci | grep VGA
```

> `#前略`
>     product: NV28GL [Quadro4 980 XGL]
> `#後略`

「lsmod」コマンドではnouveauドライバはインストールされていることがなんとなくわかりました。

```:Terminal
$lsmod
$lsmod | grep nvidia
$lsmod | grep nouveau
```

「dpkg」(debianパッケージ)コマンドでもnouveauドライバがインストールされていることがなんとなくわかりました。

```:Terminal
$dpkg -l | grep nvidia
$dpkg -l | grep nouveau
$dpkg -l | grep vesa
```

「journalctl」コマンドや「dmesg」コマンドでLiveブート時のログを読むことができました。とても長く、4000行以上あったりしますが「PageUP」キーや「PageDown」キーを使ってザーッと流してみます。エラーは赤字で表示されていますがグラフィックドライバに関してはエラーはなさそうでした。このコマンドを終了するには「q」キーを押します。参考までに「org.bluez」がなんちゃらとエラーがでますが、これはbluetoothが見つからないからで、古い環境ではしかたのないことです。

```:Terminal
$sudo journalctl -xb
$dmesg
```
最後に「vi」コマンドを使ってXorgのログファイルを確認しました。vesaドライバを割り当てたことがわかるでしょう。

```:Terminal
$vi /var/log/Xorg.0.log
```

以上のことからnvidiaドライバはインストールされていないこと、nouveauドライバはインストールされdebianパッケージにあるけれども「nomodeset」と言われたのでXorgはそれを休止していること、代わりにvesaドライバを割り当てていたことがわかりました。

vesaドライバでは1024x678で表示するのが限界のようです。目標の1600x900ではありませんが今回は無視してHDDインストールに進みました。

:::note info
「nomodeset」ではnouveauドライバが休止、vesaドライバでX11が起動されます。
:::

# またも起動に失敗しフリーズした(HDDブート時)

インストールが完了しHDDからブートしたところLiveブートのときと同様に警告のログが連発し、「LM」のロゴマークが表示されたあとフリーズしました。さきほどと同じ症状ですから、nouveauドライバに問題があると想像できました。今回は1600x900で表示させたいのでvesaドライバ(1024x768)を使わずにすむ方法を考えなければなりませんでした。

## 【HDDブート時】起動オプションでランレベル3のCUIを指定した

ためしにランレベルを3にしてXrogやX11を休止して、テキストだけの表示にしました。完全にフリーズしていましたのでとりあえず電源OFFで強制的に終了し、再起動です。最初の画面で「e」キーを押して「GRUBメニュー」を呼び出し、GUIを使わないを意味する「systemd.unit=multi-user.target」を加え、例えば「F10」キーで起動しました。ちなみにキーボードが英語配列になっているので「=」を表示させるには「^」キーを押します。

```:GRUB_menu
ro quiet splash systemd.unit=multi-user.target
```

CUIで起動して、まず「w」コマンドを使いました。Xorg/X11が休止していることがわかりました。

```:CUI(runlevel3)
$w
```
まずはおまじない。お約束でアップデートしておきました。

```:CUI(runlevel3)
$sudo apt update
$sudo apt upgrade -y
```
「journalctl」コマンドや「dmesg」コマンドでLiveブート時のログを読むことができました。「PageUP」キーや「PageDown」キーを使ってザーッと流してみます。エラーは赤字で表示されていて起動時に表示されたのと同様に「GPUはロックアップした」と言われました。このコマンドを終了するには「q」キーを押します。

```:CUI(runlevel3)
$sudo journalctl -xb
$dmesg
```
「dpkg」(debianパッケージ)コマンドではnouveauドライバがインストールされていることがなんとなくわかりました。

```:CUI(runlevel3)
$dpkg -l | grep nvidia
$dpkg -l | grep nouveau
$dpkg -l | grep vesa
```

最後に「vi」コマンドを使ってXorgのログファイルを確認しました。nouveauドライバを割り当てたことがわかるでしょう。

```:CUI(runlevel3)
$vi /var/log/Xorg.0.log
```

以上のことからnvidiaドライバはインストールされ起動もしており、X11が休止していることがわかりました。

ここで試しにX11を起動してみました。これまで同様に完全にフリーズしてしまいました。ログファイルを見ることもできずどこに問題があるかわかりませんでした。結局何が何やらわからなかったのでここで挫折しました。初心者にはこれが限界でした。
以下ではとりあえずXorgにconfigファイルをはきだしてもらい(おそらく操作不要)→「vi」コマンドでconfigファイルの中身を確認し(こちらも不要)

```:CUI(runlevel3)
$sudo Xorg -configure
$sudo vi /root/xorg.conf.new
```

X11を立ち上げました。どちらのコマンドを使っても完全にフリーズしてしまいました。仕方がないので強制的に電源をオフにしました。

```:CUI(runlevel3)
$sudo X -config /root/xorg.conf.new
$sudo systemctl start lightdm
```


:::note info
「systemd.unit=multi-user.target」ではnouveauドライバが割り当てられ、X11は休止します。
:::

# GRUBメニューに「nouveau.noaccel=1」を加えてアクセラレーションをオフにする

完全に八方塞がりとなり操作することがなくなったのでひたすらweb検索をしたところ、どうやらグラフィックボードのOpenGLが古すぎてnouveauドライバの要求に答えられないのが原因のようだとわかってきました。さらに検索を進めると次のような文章を見つけました。

> もし「Systems with nVidia adapters using the nouveau driver lock up randomly」なら「Try adding the boot option nouveau.noaccel=1」

「システムがランダムにフリーズしたら」ということのようですが、今回のフリーズは「GUIが立ち上がる直前に必ず」起こるのでよくわかりません。フリーズしたときのザラザラした画面をrandomlyというのでしょうか？

https://fedoraproject.org/wiki/Common_kernel_problems#Systems_with_nVidia_adapters_using_the_nouveau_driver_lock_up_randomly

とにかくGRUBメニューに「nouveau.noaccel=1」を加えました。おそらく「nouveauはアクセラレーションを使うな(OpenGLを使うな)」という意味だと思います。

```:GRUB_menu
ro quiet splash nouveau.noaccel=1
```

nouveauドライバで1600x900表示ができました。しかし、起動直後に「Check your video drivers」と注意され、また、アクセラレーションがオフになっているからか動画の視聴はほぼ不可能です。ハードウェア構成が古すぎるのでこれくらいはあきらめて1600x900のGUI表示ができて良かったことにします。

:::note info
「nouveau.noaccel=1」ではnouveauドライバが割り当てられ、1600x900表示が可能です。ただし、動画の視聴はうまくいきません。
:::

うまくHDDブートできたので、GRUBメニューに登録しました。

```:terminal
$sudo vi /etc/default/grub
```

> `#前略`
> GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nouveau.noaccel=1"
> `#後略`

```:terminal
$sudo update-grub
$reboot
```

#おわりに

もし Systems with nVidia adapters using the nouveau driver lock up randomly なら Try adding the boot option nouveau.noaccel=1 という文章に出会うのにかなり苦労しました。直訳すると「nouveauドライバを使ったnVidiaアダプタを内蔵するシステムがランダムにロックアップしたら、ブートオプションnouveau.noaccel=1を試しに加えろ」ということになるのかもしれません。これは実際に起こった症状に合わないような気がします。**「Linux」「nvidia」「グラフィックボード」「nouveauドライバ」「フリーズ」**あたりを検索したらこの文章にたどりつけるようになったらうれしいです。

# 参考

https://cpplover.blogspot.com/2012/03/nomodesetlinuxgpu.html

https://www.express.nec.co.jp/linux/distributions/knowledge/system/grub.html

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