Ubuntu22.04でfirefoxが/home以外で起動しない

背景

2024/01時点だとUbuntu22.04 LTSでfirefoxをインストールしようとするとSnap版がインストールされます。

Snapは、アプリケーションとその依存関係を含む自己完結型のパッケージ形式で、異なるLinuxディストリビューション間での互換性を提供します。 Snapパッケージは独自のサンドボックス環境で実行され、セキュリティと隔離を強化します。自動更新機能により、常に最新のソフトウェアバージョンを維持することを目的としています。

仕組み自体は良い仕組みだと思います。ただ私の環境では動作しなかったので、回避方法のメモを残します。

回避策

snapのfirefoxではなくMozillaチームのfirefoxを入れます。

ハマりやすいポイント

Snap自体は割と20.04の頃から存在しており使ったりしていたのですが、22.04から apt install firefox とした場合でもsnapのパッケージがインストールされるようになりました。 (つまりdebでインストールされるように見えるが実はSnapパッケージ)

エラーメッセージ

「/home以外にホームディレクトリがあると追加で設定が必要ですよ」というメッセージが出る。

$ firefox

Sorry, home directories outside of /home needs configuration.
See https://forum.snapcraft.io/t/11209 for details.

オススメされているURLが Support for non /home homedirs 内容を見ると、 Home directories outside of ‘/home’に情報がまとまっているとの事。アプローチとしては2つ

  1. sudo snap set system homedirs=<destination-directory> を実行してね
  2. /home配下のホームディレクトリ配下にbindマウントしてね

1のアプローチを試してみるがエラー

$ sudo snap set system homedir=/mnt/nfs/home/exampleuser/
error: cannot perform the following tasks:
- Run configure hook of "core" snap (run hook "configure": cannot set "core.homedir": unsupported system option)

現在の状況を snap get で取得するもエラー

$ sudo snap get system homedir
error: snap "core" has no "homedir" configuration option

そもそもhomedirという機能はロードされているのか?を確認してもロードされていない。

sudo snap get system
Key      Value
refresh  {...}
seed     {...}
system   {...}

https://snapcraft.io/docs/home-outside-home?_ga=2.190030251.1609473829.1706598251-671978911.1706598251 を確認するとSnapのバージョン2.59から、と書いてあるので、現在のバージョンを確認してみる。 対応済みのバージョンの模様。

sudo snap version
snap    2.61.1
snapd   2.61.1
series  16
ubuntu  22.04
kernel  6.5.0-15-lowlatency

1のアプローチはそのままではうまく行かない。2のアプローチを試す。

sudo mount --bind /mnt/nfs/home/exampleuser /home/exampleuser
sudo vi /etc/passwd # ホームディレクトリを/home配下に修正

この状態であればSnapパッケージは動作する事が分かった。 ただ、できれば設定はシンプルにしたい。また/etc/passwdのホームディレクトリを変えてしまうのはNFSホームの設定との両立に支障がある(/homeは/homeでNFSマウントできない障害時のために残したい)

このためSnapではなくMozillaのパッケージを用いたい。下記でMozillaのPPAを追加

sudo add-apt-repository ppa:mozillateam/ppa
sudo apt update

特定のPPAからパッケージを優先的にインストールするために、「パッケージピンニング」を使用。 これにより、特定のソース(PPAなど)からのパッケージに優先順位を付けることができます。

例えば、/etc/apt/preferences.d/ ディレクトリ内にピンニング設定ファイル(例えば mozillateam.pref)を作成します:

Package: *
Pin: release o=LP-PPA-mozillateam
Pin-Priority: 1001

Package: firefox*
Pin: release o=Ubuntu*
Pin-Priority: -1

上記の状態で選択されるパッケージを確認する

apt-cache policy firefox

下記のような状態だった。

$ apt-cache policy firefox
firefox:
  インストールされているバージョン: 125.0.1+build1-0ubuntu0.22.04.1~mt1
  候補:               125.0.1+build1-0ubuntu0.22.04.1~mt1
  バージョンテーブル:
     1:1snap1-0ubuntu2 -1
        500 http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages
 *** 125.0.1+build1-0ubuntu0.22.04.1~mt1 1001
       1001 http://ppa.launchpad.net/mozillateam/ppa/ubuntu jammy/main amd64 Packages
        100 /var/lib/dpkg/status

これでdebパッケージでのFirefoxが起動した。

debパッケージのFirefox起動後、再度、再現性を確認するため、debのFirefoxを削除、Snapの状況を確認したところsnap set が可能だった(何かがトリガーになってロードされたようだ)

sudo snap set system homedir=/mnt/nfs/home/exampleuser/

値も取得できる。

$ sudo snap get system
Key       Value
homedirs  /mnt/nfs/home/exampleuser/
refresh   {...}
seed      {...}
system    {...}

上記の状態でapt install firefoxを使ってsnapパッケージのfirefoxのインストールを試す。インストールはできる。

$ sudo apt install firefox
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  firefox
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
72.3 kB 中 0 B のアーカイブを取得する必要があります。
この操作後に追加で 261 kB のディスク容量が消費されます。
パッケージを事前設定しています ...
以前に未選択のパッケージ firefox を選択しています。
(データベースを読み込んでいます ... 現在 492581 個のファイルとディレクトリがインストールされています。)
.../firefox_1%3a1snap1-0ubuntu2_amd64.deb を展開する準備をしています ...
=> Installing the firefox snap
==> Checking connectivity with the snap store
==> Installing the firefox snap
firefox 122.0-2.1 from Mozilla✓ installed
=> Snap installation complete
firefox (1:1snap1-0ubuntu2) を展開しています...
firefox (1:1snap1-0ubuntu2) を設定しています ...
desktop-file-utils (0.26-1ubuntu3) のトリガを処理しています ...
hicolor-icon-theme (0.17-2) のトリガを処理しています ...
mailcap (3.70+nmu1ubuntu1) のトリガを処理しています ...

起動するかテスト -> 起動しない。

$ firefox

update.go:85: cannot change mount namespace according to change mount (/var/lib/snapd/hostfs/usr/local/share/doc /usr/local/share/doc none bind,ro 0 0): cannot open directory "/usr/local/share": permission denied
update.go:85: cannot change mount namespace according to change mount (/var/lib/snapd/hostfs/usr/share/gimp/2.0/help /usr/share/gimp/2.0/help none bind,ro 0 0): cannot open directory "/var/lib": permission denied
update.go:85: cannot change mount namespace according to change mount (/var/lib/snapd/hostfs/usr/share/gtk-doc /usr/share/gtk-doc none bind,ro 0 0): cannot open directory "/var/lib": permission denied
update.go:85: cannot change mount namespace according to change mount (/var/lib/snapd/hostfs/usr/share/libreoffice/help /usr/share/libreoffice/help none bind,ro 0 0): cannot open directory "/var/lib": permission denied
update.go:85: cannot change mount namespace according to change mount (/var/lib/snapd/hostfs/usr/share/xubuntu-docs /usr/share/xubuntu-docs none bind,ro 0 0): cannot open directory "/var/lib": permission denied
Sorry, home directories outside of /home needs configuration.
See https://forum.snapcraft.io/t/11209 for details.

現状はMozillaのPPAを追加し、debパッケージをインストールする方法が良いようだ。

Snapパッケージの削除

下記の両方が必要。

sudo apt remove firefox
sudo snap remove firefox

MozillaチームのPPA追加とPPAを優先するように変更してインストール

sudo add-apt-repository ppa:mozillateam/ppa
sudo apt update
sudo vi /etc/apt/preferences.d/mozillateam.pref

下記を書き込む。

Package: *
Pin: release o=LP-PPA-mozillateam
Pin-Priority: 1001

インストール

sudo apt update
sudo apt install firefox