ubuntuにsnap版のSMPlayerをインストールしたら文字化けしていた。

ubuntuソフトウェアを使ってubuntu20.04にSMPlayerをインストールしたのですが、メニューバーが文字化けしていました(文字の形からか豆腐と呼ばれているらしい)。SMPlayerは動画再生ソフトです。こんな感じです。

インストールした後に気付いたのですが、snap版のSMPlayerがインストールされたようです。このままでは使えないので直してみました。

snapアプリのフォントの設定ですが、ホームディレクトリ配下のfonts.confというファイルにあるようです。fonts.confはsnapアプリごとにあるようで、SMPlayerの場合は以下になります。

fonts.conf の場所
ホームディレクトリ/snap/smplayer/数字(リビジョン)/.config/fontconfig

fonts.confを見てみました。

文字化けの原因ですが、赤枠で囲ったディレクトリ配下にフォントが足りないためのようです。/usr/share/fonts 配下と比べてみると全然足りていません。

では、どうするか?

ですが、/snap ディレクトリ配下にREADMEがあり、これには以下のように記載されています。

難しいことはわからないのですが /snap/<snapname>/<revision> はマウントポイントになっているようです。ですので、/snap/smplayer/58/usr/share/fonts に /usr/share/fonts をマウントします。ただ /usr/share/fonts はデバイスではなくディレクトリですのでバインドマウントにします。且つ、読み取り専用とします。以下のコマンドです。


$ sudo mount -o ro,bind /usr/share/fonts /snap/smplayer/58/usr/share/fonts

これをしてからSMPlayerを再起動させると、無事、画面の文字化けが解消しました。動画の再生もできます。

なお、これだけだとubuntuを再起動する度にマウントが外れてしまうので、OS起動時に自動でマウントされるようにfstabファイルに設定を追加しておきます。以下を追記します。

fstabの場所
/etc の配下

追加する1文
/usr/share/fonts  /snap/smplayer/58/usr/share/fonts  none  ro,bind  0  0

赤枠の部分です。これでubuntu起動時にマウントがされるようになります。

ここからは別の話題です。

文字化けは解消したのですが別のところで不都合がありました。DVDをSMPlayerが認識しません。通常の動画ファイルは再生できるのですが、DVDをドライブに入れて再生しようとしてもうまく再生されません。

DVDを再生するにはlibdvd-pkgのインストールが必要らしいのでインストールしてみたのですが解決しません。他にもlibdvdnav4を入れたりしてみたのですが状況は変わらずでした。

ここであることに気づきました。

SMPlayerはsnap版だからsnap版の(snapディレクトリの)ライブラリを追加しないと意味がないのでは?

どういうことかというと、libdvd-pkgをインストールすると /usr/lib/x86_64-linux-gnu 配下にlibdvdcss.soファイルが配置されます。これが /snap/smplayer/58/usr/lib/x86_64-linux-gnu 配下にあるかというと、、ありません。比べてみると以下です。

/usr/lib/x86_64-linux-gnu の下

/snap/smplayer/58/usr/lib/x86_64-linux-gnu の下

/snap・・配下にDVD関連のライブラリ(soファイル)を追加しないとDVDの再生が出来ないのではないかと思います。文字化けのときと同じようにマウントしてみたのですが、これができない。またダメ元でシンボリックリンク、ハードリンクをやってみましたが、やはりできませんでした。

ですので今はSMPlayerでのDVDの再生ができないままです(悲)。もともとのsnapパッケージにライブラリを追加する方法があるのかどうかわからないですが、やり方が不明なのでどうしようもないです。

ICMPリダイレクトはどういうときに使われるのか?

ICMPの主な機能として「エラー通知」と「問い合わせ」があります。エラー通知は、パケットが何らかの理由で送信先のノードまで到達できなかった場合やパケットが経路の途中で破棄されてしまった場合、および、最適経路が他にあることを知らせたい場合に、送信元のノードにその旨のメッセージを通知する機能です。問い合わせは、特定のノードに対してネットワーク診断のために問い合わせを行い、応答を受け取る機能です。pingコマンドが問い合わせの代表的なコマンドです。

ICMPのタイプ
0:Echo Reply(エコー応答)
3:Destination Unreachable(宛先到達不能)
5:Redirect(経路変更)
8:Echo Request(エコー要求)
11:Time Exceeded(時間超過)

エラー通知で使われるタイプは「3、5、11」です。問い合わせではタイプ「0、8」が使われます。ICMPリダイレクトはタイプ5の経路変更の機能の1つです。

では、ICMPリダイレクトはどういうときに使われるのでしょうか?

これについて例を示して説明してみます。以下のようなネットワークがあったとします。パソコン1からパソコン4は、それぞれNetwork1からNetwork4に属しています。

パソコン1からパソコン4のデフォルトゲートウェイを考えてみた場合、パソコン1および2はRouter1になります。パソコン4はRouter2です。では、パソコン3のデフォルトゲートウェイはRouter1かRouter2のどちらにするべきでしょうか?

答えを言うと、どちらでも構いません。どちらを設定しても通信はできます。パソコン3のデフォルトゲートウェイをRouter1にした場合、パソコン3はパソコン4と通信ができるのか?と思うかもしれませんが、通信はできます。Router1はNetwork4がどこにあるかを知っているのでパケットをRouter2に転送してくれます。

またこのときにRouter1はパケットをRouter2に転送するだけではなく、パソコン3に対して「パソコン4向けの通信はRouter2のほうが近いから、Router2のほうに送りなさい」という旨の通知を送ります。これがICMPリダイレクトというものです。

通知を受け取ったパソコン3は次回からパソコン4向けの通信をRouter2に送るようになります。これはパソコン3が自身で持つツーティングテーブルにパソコン4向けのルーティング情報を追加することで実現します。ただこれはセキュリティ上の問題(※)となることもあり、ICMPリダイレクトを受け取ってもOSで無視する設定になっていることが多いです。

(※)悪意ある者がICMPリダイレクトを意図的に送ることで、ルーティングテーブルを好きなように書き換えることが可能となってしまうため。

実際にICMPリダイレクトのパケットをキャプチャしてみました。先ほどの例に示したようなネットワークの構築はできないので、少し小細工をしてICMPリダイレクトをキャプチャしました。

ルーター機能を持つ無線LANにパソコンA、Bを接続します。パソコンA、Bは同一のネットワークです。パソコンAからパソコンBにpingを打つと、パソコンA、B間でエコー要求とエコー応答のやり取りが行われます。

ここでパソコンAのARPテーブルを手動で書き換えます。パソコンBのMACアドレスを無線LANのものにします。これでパソコンAからパソコンBにpingを打つとどうなるかというと、パソコンAは無線LANに対してエコー要求を送ります。無線LANは自分宛てでないエコー要求が来たので、このエコー要求をパソコンBに転送します。それと同時にパソコンAにICMPリダイレクトを送ります。

ちなみに戻りのパケット(パソコンBからのエコー応答)は無線LANを経由しません。パソコンBからパソコンAに直接送られます。

このときのやりとりをWiresharkでキャプチャしたものが以下です。ICMPリダイレクトのパケットを表示しています。

赤枠がICMPリダイレクトのタイプとコードです。ICMPリダイレクトはタイプが 5、コードが 1 です。青枠の Gateway address は、無線LANが 192.168.0.7 のほうが近いから直接そちらに送りなさい、ということをパソコンAに伝えています。黄色枠には元々のパケット(無線LANが転送したパケット)が格納されています。

ちなみに今回は意図的にARPテーブルを書き換えてパケットを無線LANに向けたわけですが、これはARPスプーフィング(ARP spoofing)という攻撃手法と同じです。ARPスプーフィングはARP要求に対して偽のARP応答を返すことで不正なARPテーブルのエントリを作成させる手法です。使い方によっては便利でもあるけれど、悪用もされやすい、ということです。