inux(kernel ≧ 4.16)でnvidiaドライバのインストール
先日 Linux kernel 4.16がアナウンスされました。

Spectre/Meltdownの対応が一段落ついたバージョンということで
さっさと更新していきたいところだったのですが少々問題が発生しました。

現行のNvidiaのビデオカードドライバ (ver390.48)が動作、コンパイル不能で
不用意にアップデートするとX/waylandが立ち上がらなくなります。
Spectre/Meltdownの対応初期から報告されていたみたいですがなぜか治っていない
みたいですね…。

ドライバ側にパッチを当てることで動作するようなので
そのメモです。

最新ドライバのダウンロード
nvidiaの公式サイトから最新のドライバを
ダウンロードしてきます。この記事を書いている段階で最新版は 390.48 です。

ダウンロード後はわかりやすい位置に置いておきます。

パッケージの展開とパッチ
通常のドライバインストールでは、このあとランレベルを3(multi-user.target)にして
ダウンロードしたインストーラパッケージをそのまま実行すれば宜しくコンパイルや
ロードを行ってくれますが今回は先にパッチを当てたいのでダウンロードしたパッケージに
中身を吐き出してもらい、手を加える必要があります。

chmod +x NVIDIA-Linux-x86_64-390.48.run

./NVIDIA-Linux-x86_64-390.48.run --extract-only #パッケージを展開する

cd NVIDIA-Linux-x86_64-390.48

これでパッケージの中身が修正できます。

ここで以下のパッチを当てます

diff -ur NVIDIA-Linux-x86_64-390.25/kernel/common/inc/nv-linux.h NVIDIA-Linux-x86_64-390.25.patched/kernel/common/inc/nv-linux.h
--- NVIDIA-Linux-x86_64-390.25/kernel/common/inc/nv-linux.h 2018-01-25 06:09:41.000000000 +0100
+++ NVIDIA-Linux-x86_64-390.25.patched/kernel/common/inc/nv-linux.h 2018-02-01 22:25:01.935324696 +0100
@@ -175,7 +175,8 @@

if defined(NV_VM_INSERT_PAGE_PRESENT)

include <linux/pagemap.h>

-#include <linux/dma-mapping.h>
+#include <linux/dma-direct.h>
+//#include <linux/dma-mapping.h>

endif

if defined(CONFIG_SWIOTLB) && defined(NVCPU_AARCH64)

@@ -1236,7 +1237,7 @@
swiotlb_in_use = ((ops == &noncoherent_swiotlb_dma_ops) ||
(ops == &coherent_swiotlb_dma_ops));

else

  • swiotlb_in_use = (ops->map_sg == swiotlb_map_sg_attrs);
  • swiotlb_in_use = false;

    endif

    else

    swiotlb_in_use = (ops->map_sg == swiotlb_map_sg);
    390.25で作られたパッチですが該当部分は特に問題なさそうだったので
    390.48に当ててみましたがうまく行きました。

(# cd NVIDIA-Linux-x86_64-390.48)

patch -p1 < (パッチファイルのパス)

これで準備OKです。
あとはインストーラを走らせればいいのですが
展開したパッケージの中のnvidia-installerというバイナリがインストーラの
本体なのでパッケージを実行する代わりにこれを走らせればいいみたいです。

systemctl set-default multi-user.target

reboot

ランレベル3に切り替えて再起動後

(# cd NVIDIA-Linux-x86_64-390.48)

./nvidia-installer

インストーラを立ち上げます。
無事にビルドとロードができた風な画面にたどり着けば成功です。
途中にdkmsの設定が聞かれますが、一応offにしておきました
毎回ビルドするのは面倒だし大丈夫だとは思うですが…。

systemctl set-default graphical.target

reboot

最後にランレベルを戻して再起動すればちゃんとGUIが立ち上がるはずです…。

コメントを追加する