Plan 9とGo言語のブログ

主にPlan 9やGo言語の日々気づいたことを書きます。

業務端末としてLinuxデスクトップを使うために設定したこと

2021年の11月に、業務端末としてDELL XPS 13を購入して、Linuxデスクトップに移行しました。いまでは快適に使えるようになりましたが、Linuxデスクトップに慣れていないこともあって思ったように動かず困ったところがあったので、導入にあたって悩んだところをまとめました。

ディスクの暗号化

業務利用の要件にディスクの暗号化があるので、bootパーティションを除いて暗号化しました。手順は過去記事に追記しました。

blog.lufia.org

GNOME

KDE Plasmaの方がスタイルは好みですし、実際に業務端末でも2ヶ月ほど使っていましたが、Wayland環境ではタッチパッドの左右スワイプが動かないとか、XWaylandで動作するアプリケーションを4Kディスプレイで表示するとぼやけた表示になるなど厳しいなと思いました*1。個人で使うものなら、少し効率が悪い程度なら問題にしませんが、業務で利用する場合は些細なことに気をとられたくないので、GNOMEを使うことにしました。

$ sudo pacman -S noto-fonts-cjk
$ sudo pacman -S gnome-shell gnome-control-center gnome-terminal gdm nautilus
$ sudo systemctl enable gdm.service

基本的にはデフォルトで使う派ですが、どうしても外せない設定を入れます。これらの意味は過去記事に書きました。

$ gsettings set org.gnome.desktop.input-sources xkb-options "['lv3:ralt_switch', 'ctrl:nocaps']"
$ gsettings set org.gnome.desktop.interface gtk-key-theme Emacs
$ gsettings set org.gnome.desktop.interface gtk-enable-primary-paste false
$ gsettings set org.gnome.desktop.peripherals.touchpad tap-and-drag-lock true

必要なGNOMEアプリケーションを追加します。ここではsushi*2evince*3を追加します。これらはFlathubにもあるので、flatpakで入れてもいいかも。

# pacmanでインストールする場合
$ sudo pacman -S sushi evince eog

# flatpakでインストールする場合
$ flatpak install org.gnome.NautilusPreviewer
$ flatpak install org.gnome.Evince
$ flatpak install org.gnome.eog

Google Meetの画面共有などに必要なのでxdg-desktop-portalも入れます。

$ sudo pacman -S xdg-desktop-portal-gnome

GNOMEの壁紙

/usr/share/backgroundsまたは~/.local/share/backgroundsにファイルを置いておくと設定アプリから変更できるようになります。

GNOMEテーマの変更

GNOMEのデフォルトテーマは、あまり好みではないので変更します。GNOMEにおいて、テーマと名前のつくものは色々あります。

アイコンテーマを変更すると全体的にアイコンが変わります。GTKテーマを変更すると、アプリケーションの外観が変わります。GNOMEシェルテーマは少し分かりづらいですが、トップバーやアクティビティ画面などが該当します。

テーマはGnome Lookなどを探せば本当に色々ありますが、多すぎて逆に好みのものを見つけるのが困難ですね。今のところ、目に入ったなかではFlat-Remixが良いかなと思ったのでこれを設定します。

アイコンテーマの変更

AURにflat-remixがあるので使います。

$ git clone https://aur.archlinux.org/flat-remix.git
$ cd flat-remix
$ makepkg -si
$ gsettings set org.gnome.desktop.interface icon-theme Flat-Remix-Blue-Light

GTKテーマ

AURにflat-remix-gtkがあるので使います。

$ git clone https://aur.archlinux.org/flat-remix-gtk.git
$ cd flat-remix-gtk
$ makepkg -si
$ gsettings set org.gnome.desktop.interface gtk-theme Flat-Remix-GTK-Blue-Light

GNOMEシェルテーマ

シェルテーマを変更するにはUser Themes拡張が必要なので先に用意しておきます。GNOME Extensionsに色々な拡張があるのでそこから追加してもいいのですが、gnome-shell-extensionsパッケージにも含まれているのでそちらを使いました。

# pacmanでインストールする場合
$ sudo pacman -S gnome-shell-extensions

# flatpakでインストールする場合
$ flatpak install org.gnome.Extensions

テーマ自体は、AURにflat-remix-gnomeがあるので使います。

$ git clone https://aur.archlinux.org/flat-remix-gnome.git
$ cd flat-remix-gnome
$ makepkg -si
$ gsettings set org.gnome.shell.extensions.user-theme name Flat-Remix-Blue-Light

補足

上の手順ではAURからテーマをインストールしましたが、ユーザー単位でテーマを管理したい場合は~/.local/share以下にファイルを置くとgsettingsでテーマとして参照できるようになります。

$ mkdir -p ~/.local/share/{themes,icons}
$ mv themes/Flat-Remix-Blue-Light ~/.local/share/themes
$ mv themes/Flat-Remix-GTK-Blue-Light ~/.local/share/themes
$ mv icons/Flat-Remix-Blue-{Dark,Light} ~/.local/share/icons # LightからDarkへsymlinkしているので両方必要

指紋認証

XPS 13は指紋認証が使えるので設定します。ただし、2021年12月時点のfprintdパッケージは1.94.1でしたが、fprintdの1.92.0以上を使うと、

Impossible to enroll: GDBus.Error:net.reactivated.Fprint.Error.NoSuchDevice: No devices available

というエラーで指紋の登録ができません。journalctl -u fprintd.serviceすると、

Failed to clear storage before first enrollment: Device has no storage.

と記録があります。Dell XPS 13(9310) - ArchWikiによると、fprintd-1.92.0-1より新しいバージョンには問題があるらしいので、以下から1.92.0より古いパッケージを落としてくる必要がありました。

$ sudo pacman -U fprintd-1.90.9-1-x86_64.pkg.tar.zst

問題が解決するまではfprintをアップデートされると困るので、/etc/pacman.confで固定します。

--- /etc/pacman.conf.orig    2022-01-08 18:13:06.000000000 +0900
+++ /etc/pacman.conf  2022-01-16 23:03:32.302176992 +0900
@@ -22,7 +22,7 @@
 Architecture = auto
 
 # Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
-#IgnorePkg   =
+IgnorePkg    = fprintd
 #IgnoreGroup =
 
 #NoUpgrade   =

また、ドライバも必要です。XPS 13では以下の2つが必要です。

  • libfprint-tod-git
  • libfprint-2-tod1-xps9300-bin

どちらもAURからインストールします。

$ git clone https://aur.archlinux.org/libfprint-tod-git.git
$ cd libfprint-tod-git
$ makepkg -si

$ git clone https://aur.archlinux.org/libfprint-2-tod1-xps9300-bin.git
$ cd libfprint-2-tod1-xps9300-bin
$ makepkg -si

指紋で認証する

まず、指紋を登録するユーザーはinputグループに属している必要があるので、所属していない場合はグループに追加します。

$ sudo homectl update --member-of=wheel,input lufia

準備ができたら指紋を登録します。fprintd-enrollを実行するとユーザーのパスワードを聞かれるので、入力して指紋を登録します。ここでsudo fprintd-enrollのようにsudoを使ってしまうと、rootユーザーの指紋として扱われてしまいます。

$ fprintd-enroll

ここで登録した指紋は/var/lib/fprintに保存されます。登録した指紋を削除する場合はfprintd-deleteを使います。

$ fprintd-delete root

あとは必要に応じてPAMの設定を変更すれば終わりです。

  • /etc/pam.d/sudo
  • /etc/pam.d/sddm
  • /etc/pam.d/kde

KDE Plasma Desktopを使っている場合、ログイン時に参照するのは/etc/pam.d/sddmで、画面ロックの解除で参照するのは/etc/pam.d/kdeです。GDMでは特に変更しなくても指紋が登録されていれば有効になります。

上記のArchWikiでは、lsusbコマンドでデバイスを確認していますが、このコマンドはusbutilsパッケージに含まれています。

サウンド

ALSAとPulseAudioは何が違うのかについて、ざっくりとALSAとPulseAudioの関係がとても分かりやすいです。ところで最近はPulseAudioを置き代えるためにPipeWireというものが実装されていて、PipeWire, the media service transforming the Linux multimedia landscapeによると、ALSAやPulseAudio互換モードを持ち、個別のアクセス制御やパフォーマンスなど優位らしいのでPipeWireを使います。

$ sudo pacman -S alsa-firmware sof-firmeware
$ sudo pacman -S pipewire-pulse pipewire-alsa pipewire-jack

実行すると、pulseaudio, pulseaudio-alsa, pulseaudio-bluetoothなどが削除されますが、pipewireが代わりになるので今まで通り動作します。

PulseAudioもPipeWireもどちらもサウンドサーバとしてデバイスとアプリケーションの中間で動作しますが、PipeWireはセッションを開始するためにセッションマネージャーを必要とします。現在、セッションマネージャーはpipewire-media-sessionwireplumberのどちらかを使います。pipewire-media-sessionのドキュメントに

Note that we recommend the use of WirePlumber instead.

とあるのでwireplumberをインストールします。

$ sudo pacman -S wireplumber

ただし、2021年12月時点では、KDE PlasmaのWaylandセッションでWirePlumberを使うと、音がまったく鳴らないし動画も再生されない(一瞬だけ鳴るけどそのまま詰まって動かなくなっているような動きをする)*4問題がありました。この場合はpipewire-media-sessionを使いましょう。

$ pacman -S pipewire-media-session

Flatpak

Flatpakはディストリビューションに依存しないパッケージ管理システムです。主にアプリケーションの配布に使われていて、Flatpakにより管理されたアプリケーションはサンドボックスで動作するなどの特徴があります。

$ sudo pacman -S flatpak
$ flatpak --if-not-exists remote-add flathub https://flathub.org/repo/flathub.flatpakrepo

Flatpakには各種ブラウザ、Visual Studio Code、Slack、Discord、Zoomなど人気のあるアプリケーションはだいたい登録されています。

pacmanflatpakパッケージをインストールすると/etc/profile.d/flatpak.shが作られて、ここに記述されたXDG_DATA_DIRSが次のログイン以降に反映されます。GNOMEKDE PlasmaなどのデスクトップはXDG_DATA_DIRSにあるアプリケーションやテーマを認識するので、Flatpakでインストールしたアプリケーションであっても他のものと同様に起動できるようになっています。または、Flatpakのアプリケーションをコマンドラインから起動する場合は以下のようになります。

$ flatpak run com.example.app

不要になったアプリケーションはflatpak uninstallで削除できますが、アプリケーションが依存していたランタイムはそのまま残ります。どこからも参照されないランタイムも削除する場合は以下のように実行します。

$ flatpak uninstall com.example.app
$ flatpak uninstall --unused

Visual Studio Code

Goのコードを書くときはAcmeを使っていますが、TypeScriptなどはVisual Studio Codeを使っているのでFlatpakでインストールします。ここではflathubを明示していますが、IDが一意に定まるなら省略しても動作します。

$ flatpak install flathub com.visualstudio.code

Visual Studio Live Shareを使う場合はgnome-keyringが必要です。これはFlatpakには無いのでpacmanで入れましょう。

$ sudo pacman -S gnome-keyring

FlatpakアプリケーションをWaylandセッションで動作させる

Waylandセッションで起動したい場合は--socket=waylandオプションが必要です。都度flatpak runに与えるか、flatpak overrideで永続化して使いましょう。flatpak overrideした設定は、~/.local/share/flatpak/overridesまたは/var/lib/flatpak/overridesに書かれます。

$ flatpak run --socket=wayland com.example.app

$ flatpak --user override --socket=wayland
$ flatpak run com.example.app

ElectronアプリケーションをWaylandセッションで動作させる(問題あり)

Electronアプリの場合は、上記に加えてこれらのオプションも必要です。

$ flatpak run --socket=wayland com.example.app --enable-features=UseOzonePlatform --ozone-platform=wayland

これらのオプションは、~/.config/electron-flags.confに書くと参照するらしいのですが手元で試した限りでは反映されなかったので、~/.local/share/applications以下に.desktopファイルを作って、--enable-featuresを含めたコマンドを設定しておくといいでしょう。

また、Electronアプリは、Chromiumの問題によりWaylandセッションでは日本語入力ができません。Waylandで動くタイル型ウィンドウマネージャ・swayを使うによると2021年8月頃から発生していて、2022年1月でもまだ継続しているので、ブラウザやエディタではとても困りますね...

ブラウザ

2022年1月時点では、ChromiumはFlathubに登録されていますが、Google Chromeはありません。ただしFlathubのβチャンネルにChromeがあるので、これを使います。また、Microsoft Edgeもβチャンネルにあるので一緒にインストールしました*5

$ flatpak --user remote-add --if-not-exists flathub-beta https://flathub.org/beta-repo/flathub-beta.flatpakrepo
$ flatpak install com.google.Chrome
$ flatpak install com.microsoft.Edge

flatpak remote-add/var/lib/flatpak以下への書き込み権限を必要としますが、--userオプションを加えるとユーザー個別に設定させることができます。

Flatpakアプリケーションが一定時間で強制終了する

最初にアプリケーションを起動してしばらくすると、

background activity:

という通知が表示されることがあります。ここでAllowを選ぶことができますが、選ばずに閉じるなどをすると、アプリケーションが1分*6で落ちるようになります。アプリケーションがバックグラウンドに遷移したときに動作させたままにするかどうかの確認なんですが、厄介なことに、いちど閉じると再通知されません。

誤って通知を閉じてしまった場合、flatpak permission-resetでリセットできます。また、現在の設定はflatpak permissionsで確認でき、パーミッションを個別にセットする場合はflatpak permission-setです。

# 確認する
$ flatpak permissions

# リセットする
$ flatpak permission-reset com.example.app

# 個別にセットする
$ flatpak permission-set background com.example.app yes

ところで、このパーミッションは、インストールする際に表示されるパーミッションとは異なるものらしいです。アプリケーションが要求するパーミッションはインストール直前に表示されます。または、以下のコマンドで確認できます。

$ flatpak info --show-permissions com.example.app

Flatpakアプリケーションのデバッグ

--commandオプションで、実行するコマンドを切り替えられます。

$ flatpak run --command=sh com.example.app

アプリケーションのコンテナでシェルが動作するので、あとはデバッグ対象のアプリケーションを実行するといいです。

Flatpakとpacmanの使い分け

pacmanflatpakのどちらにも同じアプリケーションが利用可能になっている場合、どちらを使うのか迷いますが、個人で使うものはflatpakで、システム全体で持っている方が都合よいものはpacmanを使うといいのかなと思っています。

*1:Flatpakのところに書いているけどElectronアプリをWaylandで動かすのは厳しい

*2:macOSでのQuick Look

*3:macOSでのプレビュー

*4:https://twitter.com/plan9user/status/1472962934741823492

*5:Firefoxは普段使うブラウザなのでpacmanでインストールしていた

*6:時間は設定によるがデフォルトでは1分