Arch Linux + Nvidia 環境で X なしに Weston を起動
Arch Linux + Nvidia ドライバの環境にて X を起動せずに Weston (Wayland コンポジタのリファレンス実装)を起動したときのメモ。
X 上 (Fvwm が起動した状態) でコンソールから weston を実行すると、weston ウィンドウが表示された。
だけど X を起動していない状態で weston を実行すると、DRM を使用しようとしてエラーを吐いて起動しなかった。
これは、X上だと X がディスプレイサーバとして機能している一方、Xが起動していないとDRMを使おうとするが、nvidia ドライバだとデフォルトでは DRM が有効になっていないため、weston が起動に失敗しているため。
Arch Wiki の NVIDIA のページによると NVIDIA ドライバも 364.16 からは DRM カーネルモードセッティングのサポートがなされているとのこと。
そこで、Arch Wiki を参考に設定し、X が起動していない状態から weston を起動するまでできたので備忘録として残す。
一時的な設定による起動
Arch Linux の NVIDIA のページによると、DRMを有効にするにはカーネルにパラメータを渡し、mkinitcpio でモジュールをロードする必要がある。
mkinitcpio で BOOT 前に nvidia モジュールを読み込ませるよう設定する。
/etc/mkinitcpio.conf の MODULES に nvidia 関係を追記した。
変更前:MODULES=()
変更後:MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)
次は カーネルパラメータのページを参考に、ブートローダに GRUB を使用しているので、以下の手順でカーネルパラメータを設定した。
・PCを再起動する。
→BIOS 起動に移るスプラッシュ画面が出た後、GRUB が Linux を選択する画面を表示する。
・ここでキーボードの e を押す。
→起動コマンドが一覧で表示される
・Linux で始まる行(vmlinuz の実行)の行末に nvidia-drm.modeset=1 を追記する。
・F10 を押す。
→OSが起動される。
X が起動していれば X を終了し、ログインシェルにて weston と入力すると、weston が起動した!
weston を終了させるには、
$ pkill weston
や、kill コマンドで weston のPIDを指定すればよい。
永続的な設定
GRUBへの永続的な設定は、カーネルパラメータのページから、以下の手順で実施した。
/etc/default/grub を開いて、GRUB_CMDLINE_LINUX_DEFAULT の設定値に nvidia-drm.modeset=1 を追記する。
それから grub の設定を再構築する。
# grub-mkconfig -o /boot/grub/grub.cfg
nvidia のバージョンが上がったときに initramfs をアップデートするよう、Arch Wiki の NVIDIA に記載のとおり /etc/pacman.d/hooks/nvidia.hook を作成して以下を入力した。
[Trigger] Operation=Install Operation=Upgrade Operation=Remove Type=Package Target=nvidia [Action] Depends=mkinitcpio When=PostTransaction Exec=/usr/bin/mkinitcpio -P
インストールしたパッケージは nvidia だった(pacman -Rs nvidia<タブ> で表示される)ので、上記のまま。もし違う場合は Target を nvidia から nvidia-???? (???? はインストールされたパッケージ) に変更する必要がある。
weston を触った感想
動作が非常に軽快になった。いままで fvwm を単独で(デスクトップ環境なしに)使っていて、メモリをそんなに使用しないが、それでも weston だとウェブの画面などが「サッと」素早く出てくるように感じた。
あと、心持ちか画面が綺麗に見える。これもレンダリングの加減だろうか。
GTK のウィンドウは表示できたが、Qt のウィンドウは追加パッケージが必要のようで動かなかった。
emacs も当然ながらコンソール内で表示された。
これまで ずっっっとX の上でやってきたので、なんだか外国に来た感覚が少しする。
xinit も xmodmap も関係ない。不思議な気分だった。