2019年11月06日

chromium-browser が snap に (あるいは: Lubuntu を Eoan に上げた)

Lubuntu 19.10 Eoan Ermine 来たれり。
今回のポイントは chromium-browser の提供方法が deb パッケージから snap に変わったこと。

手順

基本的には do-relase-upgrade で事足りる。途中で「snap に設定を移行するから起動中の chromium-browser があればすべて終了させてね」といったメッセージが出てくるのでおとなしく従う。

実行内容は、実行ファイルのラッパーを作成したり設定ファイルを ~/.config/chromium から ~/snap/chromium/current/.config/chromium/ にコピーしたり。

snap の chromium パッケージには driver が同梱されており、上記の移行スクリプトで作られるラッパーは /usr/bin/chromedriver/usr/bin/chromedriver

以前は chromium-browser は apt でインストールしつつ、 chromedriver は手動で /usr/local/bin に置くという運用をしていたのでこのままでは chromedriver だけ古い(手動インストールの)方が起動してしまう。

もともと手動でインストールしていたのは chromium のバージョンに合わせて更新を調整する必要があったためなので、snap でまとめて管理できるなら用はない。 /usr/local/bin の方は削除して、必要に応じてスクリプト類のパスを調整。

言語ファイルや codec などの関連パッケージは OS 更新の最後、不要なパッケージを削除する際にリストアップされたのでそのまま削除。

~/.config/chromium~/.cache/chromium は残っているがこれは当面、 snap の chromium が何回か更新されるまでは残しておこうと思う。

再起動が終わったら起動してみると問題だらけ

chromium-browser の問題

1. 中華フォント

中国っぽい漢字になった chromium-browser

以前にも snap で入れたときだけ日本語フォントが豆腐になるソフトがあったと思い出す。言語を英語にして起動させるラッパースクリプトを書いたが、ブラウザではブックマーク名やページタイトルが不細工なままなので困る。
が、調べるとそのあたりは修正済みらしい。

あとは fontconfig か。ローカルの設定で Noto をアンインストールしたりフォントのエイリアスをいじっているのでたぶんそれが原因。とりあえず見つけた対処法は設定ファイルをコピーすること 18.04 - Ubuntu snap packaging with Qt: fonts missing - Ask Ubuntu

mkdir ~/snap/chromium/current/.config/fontconfig/conf.d
cp ~/.config/fontconfig/conf.d/*.conf ~/snap/chromium/current/.config/fontconfig/conf.d/

これ chromium の更新が入るたびに毎回やらないとダメなんだろうか。リンク先ではラッパー作ってるらしい。

2. VPN 接続中に名前解決できない

VPN を起動していると「ERR_NAME_RESOLUTION_FAILED」や「DNS_PROBE_FINISHED_NO_INTERNET」となり名前解決ができない。

chromium-browser は resolv.conf を読まないとか DNS のキャッシュを削除しろみたいな解決法しか出てこない。が snap 以前は普通に動いていたので謎。

  • 実験的機能として DNS over HTTPS が使えるらしいが Linux は対象外
  • firefox も snap 経由での起動だと同じ症状。 apt はセーフ。

ちょうど同じネットワークで HTTP プロキシを動かしていたので経由させたら動いた。コマンドラインオプションで --proxy-server を指定するラッパースクリプトを(結局)書くことにする。

3. User Agent が改変されている

UA に「snap」の文字が含まれる。

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) snap Chromium/78.0.3904.108 Chrome/78.0.3904.108 Safari/537.36

フォーラムの Call for testing スレにて指摘されていて、#221 でメンテナから返信がある。

  • WhatsApp のウェブ版に非対応ブラウザ扱いされて読み込めない→いまどき UA を機能の判別に使うサイトがまだあるんですね。User-Agent Switcher for Chrome とか使ってください
  • そもそもこの文字列いる?→ snap:// プロトコルが使えるか判別するのに便利だから追加した機能だけど、理想的な実装ではないよね
  • fingerprint 増加しちゃう→ですよね。気になるなら上記のアドオン使ってください

そのうち修正されないかな。

自分は --user-agent 引数でいじってる。ついでに OS も Windows に偽装してる。(いまどき UA が Linux だと 503 返すサイトがあるんですよ)

chromedriver の問題

1. ログファイルが書き出せない

/var/log 以下のファイルが読み書きできなくなった。snap のセキュリティ対策が強すぎることの弊害。

$ chromedriver --log-path=/var/log/chromedriver/chromedriver.log
Starting ChromeDriver 75.0.3770.90 (a6dcaf7e3ec6f70a194cc25e8149475c6590e025-refs/branch-heads/[email protected]{#1003}) on port 9515
Only local connections are allowed.
Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
Failed to redirect stderr to log file.
Unable to initialize logging. Exiting...

Apache のアクセスログは /var/snap を使うというコメント を見かけたので /var/snap/chromium/current/chromedriver/chromedriver.log を作成、ログファイルに指定して再実行するとうまく行った。

2. ブラウザが起動しない

selenium で起動しようとするとエラー。

failed to write prefs file

はいはいセキュリティね。下記は Python だけどその他の言語でも同じ感じで。

  chrome_options = webdriver.chrome.options.Options()
- profile_path = os.path.expanduser("~{}/.config/chromium".format(get_driver_owner()))
+ profile_path = os.path.expanduser("~{}/snap/chromium/current/.config/chromium".format(get_driver_owner())
  chrome_options.add_argument("--user-data-dir="+profile_path)

解決策

場当たり的だが snap の launcher~/.chromium-browser.init を起動時に読み込むようなのでここにあれこれ足した。

cp -a "$REALHOME/.config/fontconfig" "$HOME/.config/"
CHROMIUM_FLAGS="$CHROMIUM_FLAGS --proxy-server=<PROXY_SERVER>"

インストールオプションを変えてみてもダメ。

  • classic →「flag –classic ignored for strictly confined」のメッセージが出て通常インストール
  • devmode → インストールはできたが特に何も変わらない。

snap は人類にはまだ早すぎるんだ…!

追記@2019-11-27
snap のサンドボックスを回避する方法を snap 関連のバグ報告 で見つけた。

実行する際に /snap/bin/chromium ではなく /snap/chromium/current/usr/lib/chromium-browser/chrome を指定する。影響としては:

  • メリット:
    1. fontconfig が正しく読み込まれ中華フォントが治った
    2. 正しい DNS サーバーを見に行くようになった
    3. プロファイルを元の ~/.config/chromium/ から読むようになった
    4. バグ報告をする際に snap の問題なのかどうかを切り分けられる
  • デメリット:
    1. snap のセキュリティ周りの利点が得られない
    2. 環境変数やファイル名まわりのお膳立てが整っていない

デメリットの2は、たとえば chromedriver を selenium から直接起動する際に chromedriver のパスを /snap/bin/chromium.chromedriver から /snap/chromium/current/usr/lib/chromium-browser/chromedriver にすると、プロセスが落ちたと勘違いされ動かない。シンボリックリンク(current)をバージョン番号に修正してもダメ。

The process started from chrome location /snap/chromium/current/command-chromium.wrapper is no longer running, so ChromeDriver is assuming that Chrome has crashed.

その他 Eoan 雑感

  • スクリーンショット撮影用のソフトが新しくなり使いやすくなった。撮ったファイルを編集ソフトに渡せるのが地味に便利
  • しかし新しい ScreenGrab と、イメージビューア(LXImage-Qt)付属のスクリーンショットと、CLI の scrot の3つが混在することになった
  • ネットワーク関連のタスクトレイアイコンも2個ある

リンク

posted by かぷらす at 22:56| Comment(0) | 作業記録 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください