カーナビでYoutubeを見る方法を探してつけてみようと思った Anycast導入編

ということで、カーナビでYoutubeを見るためにHDMIを使った接続をしてみよう、ただし480pなどの解像度もサポートされているようにしたい、ということで値段も手頃なAnycastを導入してみることにしました。ここからはかなり技術の話になりますので難しい表現が出てくるかもしれません。

 

Anycastの購入

つまりこれですね。

ただし、ある理由で購入には踏み切りづらいものがあります。というのも、

  • そもそも中国製で信頼していいのか悪いのか不明
  • 購入するサイトや発送元によっては互換品や偽物をつかまされる可能性がある
  • 正式な型番が何かが書かれていない場合があり、手元に届いたときに初めて型番がわかることがある

というものです。こればっかりはどうすることもできないかな、と思います。とりあえず上の画像のリンクで購入した場合は「私が購入した場合」はこれになりました。

Anycast M18 Plusd

「Anycast M18 Plus」というものです。安定版がM9 Plusだったのでそれになるのかな~と思ったらこれでした。M9 Plusより新しい世代ですので性能がよいことを期待しましょう。あと、金額も(現在は)2,200円ほどですので怪しげなサイトでもない限りはほしい場合は買ってみてもよいような気はします。自己責任ですが。

 

Anycastとは

ここで、Anycastについて確認しておきましょう。単純にいうと「Wi-FI経由でHDMIの信号を受信する端末」だと思えばよいです。現段階でスマートフォンと画像を送受信する場合は

  • Miracastを使う(Androidの場合)
    • AirPlayを使う(iOS系の場合)
    • GoogleHome経由でChromecastに接続する(Android,iOSともに可能)

といったものがあります。Anycastはこの全てに対応している…型番があります、というところです。型番によっては対応してないものがあったり、これらの接続の待ち受けを手動で切り替えたり、4Kまで対応していたりしていなかったり、とかなりブレがあります。なのでそこまで考えて購入するのであれば型番を指定できるサイトを使うべきかな~というのが実情です。

 

Anycastに接続してみる

使っている端末がAndroid系なので、Miracastの機能を使って接続してみました。セットアップなどは次のようになります。

  1. Anycastに付属のケーブルを接続する
  2. AnycastのHDMI端子をディズプレイなどに接続する
  3. AnycastのUSB端子を電源に接続する
  4. しばらく待つとディスプレイに待機画面が表示される
  5. スマートフォンの端末などでWi-Fiを有効にするとAnycastの端末が見える(待機画面に端末名が表示されている)ので、そのWi-Fiに接続する
  6. パスワードを入力する(初期パスワードから変更した場合でも待機画面に表示されているパスワードを入力すればよい)
  7. Wi-Fiを接続した端末でブラウザを開き、待機画面に表示されているIPを直接入力する
  8. 設定画面が表示されるので必要な設定を行う(特にこの後でカーナビに接続する場合は画面解像度の設定を忘れないこと)
  9. Wi-Fiの接続を切断する
  10. 画面を表示したい端末の設定からMiracastの機能を検索して接続する
  11. 画面に端末の画面が表示される

という流れです。ちなみにMiracastに相当する機能の名前は端末によって異なるらしく、Xperia系では「スクリーンミラーリング」、Zenfone系では「PlayTo」という名前になっているようです。

 

端末によってAnycastで動画再生をしたときの状態がかなり異なる

どちらかというとこの話が今回のメインです。まず、Miracastの機能は端末のパワーをかなり使うらしく、多少古い端末だったり、解像度が高めに設定されていると送受信が間に合わなくなり、音が飛んだり画像が飛んだりしてしまいます。ある程度力がある端末でやりましょう。

そしてAnycastが「スマートフォンなどの端末の画面を表示するもの」、ということから来る悲しい性質があります。その性質とは、次のようなものです。

  • Anycastの出力はアスペクト比が16:9を想定している(480p、720pなど)
  • 端末のアスペクト比が16:9でない場合、Anycastはレターボックスやピラーボックスにより、多少表示領域を削っても元の端末のアスペクト比の表示となるようにする
  • ここに(例えば)16:9の動画を表示しようとすると端末側はレターボックスやピラーボックスにより端末の画面に合うように表示する
  • ところが、Anycast側にはすでに端末の画面を表示するためのボックスが入っているため、動画が画面全体に表示されず、中央に少し小さめに表示されてしまう

おまけにカーナビの画面側のアスペクト比も16:9でない場合はレターボックスとピラーボックスが何段階にも挿入されて動画が中央に小さく表示、という現象が発生してしまうことが発覚しました。

簡単にどうにかできる方法としては「端末自体が16:9のアスペクト比のものを使う」です。こうすれば少なくても端末からAnycastの段階で画面が小さくなることは防げるので多少ましになります。

ちなみにこれが検証段階でわかったので、Youtube用の端末も用意する必要もあることを考えて、(私の中では)現役を引退していたZenfone3が復活する、という事態になったわけです。何じゃそりゃ…

 

Youtubeでの検証はまだ

適当なデータ通信用SIMを契約して入れてあげれば完成なのであとは処理能力との釣り合いがどうなっているか、というところですか…。

 

カーナビでYoutubeを見る方法を探してつけてみようと思った 考察編

というわけで、様々なサイトでやり方が紹介はされていますが、カーナビでYoutubeを見てみよう、という話です。正確にはカーナビでYoutubeやモバイル回線を使わないでスマートフォンに入っている動画をカーナビ上でうまく見られないか?というところから始まっています。ただし、このサイトは技術的な要素も大きく説明していますのでご注意を。

 

簡単な方法から準備に品物がいる例まであるが…

一応前提条件としては

  • Youtubeを見るための端末は用意されている
  • 端末はモバイル回線に接続可能、テザリングも可能、HDMI出力も可能
  • カーナビ側にはHDMI入力やRCA入力、USB入力、Bluetooth接続が可能

という条件はつけておきます。この条件がないと下の方法のいくつかができませんので気をつけてください。

 

音声(音楽)だけならかなり簡単

というか、ほとんどのカーナビは運転中に安全機能として映像を映すことができないような仕掛けになっていますので、後部座席にいる人(主に子どもを想定)に見せることがこの話の前提になってきます。運転中に動画を見ると集中力がそちらにとられて運転がおざなりになり事故を起こす可能性が非常に高くなりますので。

まずは音声(音楽)だけです。音声(音楽)だけならそれほど難しくはありません。その場合はBluetooth接続でBluetooth Audioモードにすればたいていは終わりです。それ以外の入力を使うとピットインしての作業が必要になってくると思います。

 

映像も見たい人向け

やっと本題です。可能性がある方法としては

  • USB接続する(Apple CarPlay、Android Autoなど)
  • HDMI出力をRCAコンバータを通してRCAで入力する
  • 端末のHDMI出力とカーナビ側のHDMI入力をつないでHDMIで信号を送る
  • Wi-FI経由で映像を飛ばしてHDMIに変換して入力する(AppleTV、FireTVStick、Anycastなど)

なんですが、これがまた知識がないとかなり難しいです。

 

USB接続を使った方法はかなり知識が必要

というか、前提条件として「CarPlayやAndroid AutoにYoutubeを見る機能はどこにもない」ということなんです。つまり、この方法はすでに破綻しています。無理にやろうとすると特別なAndroidが入った端末をUSBで接続することでYoutubeを見られるようにすることなのですが、買う端末の種類や使い方がわからない人は怖すぎて無理があると思います。常にテザリングをしないとだめですからね。

 

RCA接続も初期投資が大変

そもそもRCA接続するための端子はカーナビの裏側にあることがほとんどなので、一度裏側にアクセスして線を接続する必要があります。結局一度ピットインして作業する必要がありますし、変換のための機材が必要になってきます。調べた限りだとこれが有効でしょうか。

BeatSonicの「IF36」というもので、HDMI入力をRCA出力に変換するものです。車用品らしく、電源も12Vから直接とれるようになっています。もちろんこれだけではなく電源端子からとるような細工をしたり、RCAケーブルをカーナビに接続したりするので一度カー用品店に相談する必要はあると思います。それが終われば普通に見ることができそうです。

 

HDMIでもちょっとした細工が必要

HDMIの場合はカーナビ側の前提条件を確認する必要があります。ここ数年間で発売されたカーナビにはHDMIの入力に前提条件がある場合が多く、それが「入力の画像解像度として受け入れ可能なものが480pしかない」というパターンです。

で、これの何が問題かというと「Youtubeを見るための端末がある程度高性能(もしくは逆にかなり古い)でない限りはHDMIの出力解像度として480pをサポートしていない」ということが考えられるからです。この場合、HDMI出力にそのままつないでも映像を見ることができません。

実際、私が自分のカーナビと端末(スマートフォン)がこの状態で、スマートフォンの画面が横長になっていると16:9の出力モードを持っていなかったり、持っていても1080pしかない、なんてパターンがかなりあります。ということで、直接接続だけだとうまくいかないパターンがかなりあるということは認識しておいてください。そうなると考えられる方法は、

  • HDMIコンバータを通して解像度を強制的に固定させる
  • 480pを出力できるHDMI出力器にWi-Fi等で接続して映像送信をする

となってしまいます。それぞれ見ていきましょう。

 

HDMIコンバータは…うまくいくのか?

商品的にはこれが可能のように見えるのですが、試していません。

BeatSonicの「IF33A」です。本来はHDMIの信号を2つのディズプレイに送信するためのもので、フロントモニタとリアモニタに送る、という機能がメインです。が、これの副機能として「送信するときの解像度を720pや480pに強制的に固定する」機能があります。この機能を利用してHDMI入力に入れてしまおう、という発想です。

まあ、電源が12Vからとるようなケーブルになっていますのでシガーソケットからとるように細工するには手間がかかりますし、値段もそれ相応なのでやっぱり初期投資が必要です。さらには今のスマートフォンから入力させたら本当に480pにできるのか?がわからないのが痛いです。他の人のレビューを見ている限りはできそうな気はするのですが…

 

無線接続を考える

ということで、最後のWi-Fi経由で接続する方法です。この辺になってくるとほかのサイトに解説を譲った方が早そうですね。とりあえず欠点だけ先に書くと

AppleTV:100V電源端子が必要なのでシガーソケットからの変換などが必要。少し大きい。Android系は不可。

FireTVStick:Wi-FI接続が必要なのでテザリングやWi-Fiルータが必要。ネットからの動画は見られるがスマートフォンに入れてあるコンテンツは直接見られない。

Anycast:種類がありすぎ+説明書がわかりづらいなど初心者には難しい。接続が安定せず切れることがある。iOS系から接続しようとするとWi-Fiルータに接続する必要がある。買うサイトを間違えると変なものをつかまされるかも。

ということで、どれも一癖二癖あるのが実情です。もちろん、このサイトは技術系なのでAnycastに挑んでみようと思います。はずれをひかないように注意して試してみたいと思います。

 

 

micro:bitのタスクシステムを考察してみた

というわけで、なんとなく気になったので書いてみたくなったネタです。電子工作系と教育系を兼ね備えるものといえばmicro:bitな訳ですが、そのタスクシステムにちょっとした疑問があるので考察して+調べてみよう、というわけです。

 

MakeCode(Scratch)でmicro:bitのプログラムを作った時を前提とする

micro:bitで動くプログラムを作ることができるツールはいくつかあるわけですが、今回はMicrosoftのMakeCodeを前提としたいと思います。MuやらPython Editor for micro:bitやらあるのですが、小学校や中学校でも使えるレベルで、となると大半がMakeCode経由のような気がしますので、これで話をしたいと思います。

 

「ずっと(forever)」を何個も使うと一体どんな実行のされ方をするのか?

まずはこれを見てください。

 

MakeCodeである3つのブロックを使おうとしたときの状態です。見てわかるとおり「最初だけ」のように複数あると意味がわからなくなるものや「ボタン○○を押したとき」のように、入力の割り込みによって動くのものは1つしか有効にならないようになっています。これはわかります。

ところが、「ずっと(forever)」に当たるブロックを作ろうとすると上の図にあるように2個作ってもどちらも有効です。なお、基本的には何個でも有効になります。つまり、「すべて動作させることができる」という(プログラムをやったことがない人から見ると)不思議な現象が発生します。だとすると「Aをずっと繰り返す」「Bをずっと繰り返す」「Cをずっと繰り返す」を同時にしたいときに「A、B、Cの順にしてそれを繰り返す」のように無理に直列化して書かなくても個別に書いてよい、ということになるのでしょうか。これをちょっと見てみたいと思います。

 

次のように書くとどう実行されるのか?

というわけで、こういうプログラムを作りました。

「ずっと」ブロック×3と「ボタンAが押されたとき」の動作です。ちなみにこれはちょっとしたトリックがあって、「ずっと」のブロックの上下が0の出力と256の出力だと256の出力が下になるように配置しています。

で、これを(あくまでシミュレータ上ですが)実行するとこういう動きになります。

「0を出力」→「256を出力」→「512を出力」→「0を出力」→「256を出力」→「512を出力」→「0を出力」→…

つまり、「ずっと」のブロックを上から3つを順番に回しながらに実行しているだけ、となりました。ちなみにボタンAによる割り込みをかけてみたのですが、「ずっと」による実行順番は変わらず、という結果になっています。あくまでシミュレータ上ですのでオシロスコープなどで実機計測すると微妙に違うかもしれません。

これについてはある程度推測ができて、

  • 「ずっと」ブロックを使うとそれぞれがタスクとして独立に実行待ちキューに入る
  • 実行時間になると実行待ちキューの先頭にあるタスクが実行状態となり実行される
  • ブロックの実行が終了すると再度実行待ちキューの最後に入り待機状態となる
  • 割り込みは特別なタスク扱いとなり、「ずっと」のタスクが実行されていないときにチェックされて状態が確認されればタスクとして実行される

という動きになっているのではないか、というものです。で、これをチェックするために「このプログラムをPython(もどき)で表したもの」とタスク実行に関する説明書(のようなもの)を見て確認してみました。

 

このプログラムをPythonで表すと…

MakeCodeのPythonで表す機能を使ってプログラムを変換するとこうなりました。

def on_button_pressed_a():
    pins.analog_write_pin(AnalogPin.P0, 768)
input.on_button_pressed(Button.A, on_button_pressed_a)

def on_forever():
    pins.analog_write_pin(AnalogPin.P0, 0)
basic.forever(on_forever)

def on_forever2():
    pins.analog_write_pin(AnalogPin.P0, 256)
basic.forever(on_forever2)

def on_forever3():
    pins.analog_write_pin(AnalogPin.P0, 512)
basic.forever(on_forever3)

どうでしょうか。「ずっと」の3つのブロックがon_forever関数、on_forever2関数、on_forever3関数の3つとして定義され、basic.forever関数を呼び出して渡されています。このコードとシミュレータの動きから推測するとbasic.foreverの動きは「渡された関数を(無限実行をする)実行待ちキューに登録する」ものだと考えられます。リファレンスのbasic.foreverの説明ではforeverのループとeventのループについて少し書いてありましたが、この動作については明確には改訂ないような気がします。

 

タスク実行に関する説明から考察してみる

で、このforeverの動きや「バックグラウンドで実行する」とはどういうことか?を説明しているのが(直リンクは張りませんが)「The micro:bit – a reactive system」というところです。micro:bitのタスク実行について実行間隔やポーリング、タスクを並行(Concurrent)で実行する方法について、ボタンを押す、などのイベントがあったときにどう動くのか?といったことについて詳しく書いてありますので見てみるとよいと思います。プログラム、特に組み込み処理に関して詳しい人ならば読めると思いますが、今回の処理に必要な部分を読んでみると、

  • サブルーチン(この場合はforeverとして登録されるタスク)を登録するときには優先度がないタスクとして実行待ちキューに入る
  • 一時停止(Pause処理)がタスク上で発生したときに一時停止キューで時間待ちを行う
  • システムによりタスクが実行可能となったときは実行待ちキューの先頭にあるタスクを削除し実行状態に戻す
  • 実行終了するか一時停止時間が経過したサブルーチン(foreverタスク)は実行待ちキューの最後に戻す

と書いてあることから上の考察の大半は合っているのではないか、と思われます。

 

「ずっと」ブロック内の時間待ちについて

micro:bitの時間待ちのうち「一時停止」よる時間待ちは上の説明から「一時停止キューにタスクを移す」ことにより待ちを行っていますので一度実行状態から抜けることになります。そのため、別のforever処理や入力割り込みによる処理などがあればそれを実行する時間がとれることになります。しかし「whiteなどによる無駄ループを使った時間待ち」は上の説明からmicro:bitのタスクとして待ち状態や実行待ちには移らず実行状態のままになりますのでタスク切り替えがうまくできません。そのため、入力の検知などを行う時間で割り込みそのものは検知できるのですが、割り込み後に動かすルーチンは実行待ちキューに移されるだけとなり実行されない、ということになるかと思います。

これは特にforever関数で長い処理を実行するタイプのタスク+ある程度の反応速度が求められる処理だとちょっと厳しいことになるかと思いますのでロボット操作をやるときやある程度速い周期で処理する必要があるルーチンでは気をつける必要があるかと思います。そもそもタスクの切り替え周期もどれだけ出せるのか微妙なところですか。

 

単に教育用として簡単なものを作るだけなら知る必要はないが…

例えば自由研究などで複雑なプログラムを作り実行させるとうまく動かない、というときにこういうことが絡んでいる可能性はあるかな~という例でした。MicroPythonを入れる例だとこういう風に動くのかどうかはまた別の検証が必要そうなので今はしません。ADVゲームシステムなどで本体内に別のスクリプトシステム(Luaなど)を使うタイプだと似たような現象が発生するのでちょっと調べてみた、というところにしておいてください。はい。

 

 

Fedora36インストールメモ

1年に1回は出るFedoraのインストールの話です。いろいろな都合でこの時期に書いています。名目上は「ソフトウェア等の開発やテストサーバ」として使うためのものなのですが、今現在は単に外部回線から内部データにアクセスするため+VPNなどを使うことでアクセス元を変更するために使っている状態になっています。

今回は「インストールメモ」ということで、来年にも同じことをやるのであれば何をしたのかを残しておくことを主目的に、一部発生した問題についての解説をしながらやっていきたいと思います。

 

そもそもサーバとして何で使っているのか?

今現在は開発系の要件がないので使っているサービスはかなり少ないです。とりあえずは

  • ファイルサーバ(Samba)
  • Webサーバ(http+phpなど)
  • サーバ操作(SSHなど)
  • 動画変換(ffmpeg+QSV)
  • DDNS管理

が使えればそれほど問題はないんですよね…。実はというと動画配信サーバ的な使い方(Webミーティング)もテストしてみたいな~とかは考えているのですが、とりあえず「いざとなったら外部からサービスを追加して動かせる状態にしておく」ことができれば対応は可能なので…。そういうことにしておいてください。

 

インストール前のデータ待避

今回もそうですがサーバのアップグレードではなく新規インストールをして環境を構築します。そのため、元のサーバのデータはできる限り待避しておく必要があります。また、何かの都合で前のサーバの設定ファイルを見る可能性がかなりあると思います。ということで、

  • /etc/以下の領域
  • /usr/local/以下の領域(何かをインストールしたとき)
  • /var/以下にあるデータ
  • /home/以下にあるユーザデータ

はしっかり待避しておきましょう。

 

Fedora36のインストール

インストールメディアを作るのが面倒なのでUSBメモリでのインストールです。今の時代光学ドライブをつけていないことも普通にありますからね…。Rufusを使えば作れますのでISOのデータを書き写してブートしましょう。

ちょっと気になったのはrootの扱いです。Fedora34のインストールの時にはなかったような気がするのですが、rootの設定で「rootパスワードを無効にする」という状態が追加されていました。これにより無理にrootにパスワードを設定する必要はなくなっています。もちろんrootアカウントが利用できないわけではなく、sudoを使って昇格すればいいだけですが、これのおかげでrootが乗っ取られる心配が多少下がります。基本的にはrootパスワードは無効にしてsudoにより処理するのが前提になるようですね。

また、WakeOnLanを使う場合にはネットワークインタフェースにしっかりとその設定(MagicPacketによるWakeOnLanを有効にする)をしておきましょう。そうするとインストール後にWakeOnLanの設定をnmcilで…などと考える必要はなくなります。

 

各種サービスの設定

というわけでサービスを設定しておきます。今回はインストール方法もメモとして残しておきます。ちなみにsudoは省略してroot権限でインストールしている扱いにしています。

 

Telnet

SSHを使えばよいはずなのでいまさら使わなくてもよいとは思いますがなんとなく入れてしまうtelnetです。ちなみに外部からtelnetでアクセスできるなんてセキュリティ的にダメダメな設定にはしませんよ。もちろん内部でのやりとりだけです。

# dnf install telnet telnet-server
# systemctl enable telnet.socket
# firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=[ローカルアドレスIPアドレス/マスク] port port=23 protocol=tcp accept"

ファイアウォールにしっかりと「ローカルIPしか受け付けない」としておかないと大変なことになります。また、今回はIPv4のみ受け付ける設定にしています。

 

Samba

ネットワーク内のファイル共有(特にWindows)だとこれを入れないと始まりません。あと、このサーバから別のサーバに接続することも考えてクライアントも入れていますので注意してください。

# dnf install samba samba-client
# pdbedit -a [ユーザ名]
# vi /etc/samba/smb.conf
# setsebool -P samba_domain_controller=on
# setsebool -P samba_enable_home_dirs=on
# setsebool -P samba_export_all_ro=on
# setsebool -P samba_export_all_rw=on
# setsebool -P smbd_anon_write=on
# firewall-cmd --permanent --add-service=samba
# systemctl enable smb
# systemctl start smb
# systemctl enable nmb
# systemctl start nmb

SELinuxも入れて設定しているのでこんな感じになっています。ちゃんとSambaで接続するためのユーザを追加するpdbeditもはいっています。

 

sslh

実は今回一番苦労したのがこれです。sslhとは何かというと「特定のポート(主に443)」に接続したとき、その接続方法によりWebサービスやSSH、OpenVPNなどの適切なサービスに接続するマルチプレクサ」で、sshのポートを特別に開く必要がなくなり、いくつかのネットワーク環境で接続時にはねられる可能性が少なくなるという利点があるので使っています。それはいいのですが…。

今回苦労した点が「Fedora35およびFedora36に初期から入っているsslhは1.21系統で、これにはバグがあり、特定の条件でSegmentFaultを出して停止するため、1.22系統を使う必要があるが、今現在のFedora36には1.22系統のパッケージがない」という点です。つまり、ソースコードをダウンロードして作り直さないとまともに使えない、ということになります。今回はそのビルドの手順になっています。次回のアップデートでは別のものに変えるか、このバグがなくなればよいな~と思っています。

# dnf install pcre2-devel pcre2-static systemd-devel libconfig-devel libev-devel
# wget "https://github.com/yrutschle/sslh/archive/refs/heads/master.zip"
# cd /usr/local/src
# unzip master.zip
# cd sslh-master
# make install

ということでビルドに必要な一部develパッケージのインストール、ソースコードの取得およびビルドを行っています。ちなみにこれより前にFedora36についているsslhもインストールしているのでそちらに入っているデータが使われている可能性はありますが…。

 

httpd,php

これも今回迷いました。どうせならHTTP3を使ったテストができるようにNginxを入れようか、とも思ったのですが、結局Apacheにすることにしてphpも標準のものを使うことにしました。設定がかなり面倒ですからね…。ちなみにSSLについては自己署名で作っています。Let’s Encryptあたりから署名をとってくればすむような気はするのですが、今回はしていません。あと、暗号形式は楕円曲線暗号を利用しています。

# dnf install httpd mod_ssl php 
# vi /etc/httpd/conf/httpd.conf
# vi /etc/httpd/conf.d/ssl.conf
# vi /etc/httpd/conf.d/php.conf
# cd /etc/pki/tls/
# openssl ecparam -name [楕円曲線種別] -genkey -out server.key
# openssl req -new -key server.key -out server.crt -subj "/C=JP/ST=[都道府県名]/L=[都市名]/O=[組織名]/OU=[部門名]/CN=[証明書を使うサーバのDNS]"
# openssl x509 -req -in server.csr -out server.crt -signkey server.key -days [日数] -sha384
# systemctl start httpd
# systemctl enable httpd
# firewall-cmd --permanent --add-service=http --add-service=https

ちょっと注意なのが証明書に入れるハッシュ形式です。OpenSSL側はSHA3に対応しているようなのですが、Apache側がSHA3に対応していないらしく、証明書を発行するときにSHA3を使った形式にするとサーバが起動できないという事態になります。また、HTTPSを利用するときにはsslhを利用する関係でApache側のリッスンをlocalhostだけにしておかないとこちらもサーバが起動できなくなる原因になります。

 

ffmpeg+QSV

最後に動画変換用のffmpegとハードウェアエンコード(QSV)を行うための設定です。

# dnf install "https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm"
# dnf install ffmpeg
# dnf install libva libva-utils libva-intel-driver libva-intel-hybrid-driver

ちょっと問題になるのはRPMFusionを入れる必要があったことです。ffmpegだけならばRPMFusionを入れなくてもFedora36側にffmpeg-freeというパッケージがあるのでそれを使えばよいのですが、QSVを使うためにlibvaを使おうとするとinte-hybrid-driverのインストールだけではQSVをうまく使うことができない様子だったのでRPMFusionをインストールしてそちらからffmpegやlibva-intel-driverを持ってきています。ちょっとした手順の差があるようです。

 

ということで設定完了

実は細かい点(DDNSのアップデート処理)を書いていなかったりするのですが、メモ代わりなので書きません。記事を見に来てくれた人向けにある程度有用な情報をメモ代わりに書いておいて共有しておきたいと思います。

 

VPNの設定が非常に苦労した… RTX810系+Win10編

ということで、とある出張に出かけたときのこと。ビジネスホテルに宿泊したときにこういう状況になることはよくあると思います。

  • ビジネスホテル側からWi-Fiもしくは有線LANが無料で提供される
  • ビジネスホテル側の通信環境そのものはそこまで悪くはない
  • ただし、通信先を知られたくないorデータサーバへの通信が必要なパターンがある

このような状況を解消するためによく使われるのがVPNなのですが、Win10の標準でVPNを構築しようと思ったらRTX810の設定とかなりかみ合わずにつながるまでに四苦八苦したので、その記録を書いておきたいと思います。実は設定の書き換えも外部から行っており、SSHを通せるようにしておいたからなんとかなったようなものなのですが…。

 

RTX810で使えるVPNの種類

いまだとちょっと古いルータになるので微妙なのですが、とりあえずRTX810上から設定できるVPNの種類を確認しておきましょう。実はターミナル上から手動ならばIKEv2が設定「できそう」に見えるのですが、これに成功したことがないので、GUIで設定できる方だけに限定しておくと

  • L2TP/IPSec
  • PPTP

あたりが可能です。ただし、PPTPはすでにセキュリティ的に使うべきではないレベルなので除外されて、L2TP/IPSecくらいになってしまいます。ちなみに、Twitterでもすこしつぶやきましたが、L2TP/IPSecはAndroid12系統では設定できなくなっているのでそうなってくるとAndroidで考えたら一つもない、という話になってしまいます。Win10であればL2TP/IPSecは標準で利用可能なので今回はそちらで設定します。

 

Win10でL2TP/IPSecによる接続を行うためのサーバ(RTX810)側の設定

今回はまってしまったのは実はこれです。Win10でL2TP/IPSecを使うときに「いくつかの設定をするとアルゴリズムが利用できないために接続不可になる」という現象が発生する、ということがわかったのがかなり後(いろいろと検索してみてやっと出てきた)だったのが痛かったです。具体的にはこのようにします。

  • 接続タイプ:L2TP/IPSec(Anonymous)
  • 接続ユーザIDおよびパスワード:適当に
  • 事前共有キー:適当に
  • 認証アルゴリズム:HMAC-SHA (HMAC-SHA256では認証不可になってしまう)
  • 暗号アルゴリズム:AES-CBC (AES256-CBSでは認証不可になってしまう)
  • キープアライブ:使用する
  • NATトラバーサル:使用する
  • PPP認証方式:MS-CHAP v2

ここで書いているとおり、認証アルゴリズムと暗号アルゴリズムがWin10標準のVPNだと制限されてしまう、ということです。暗号強度を上げておこうかと思って上位の設定をしていたのがまさか裏目に出るとは。ちなみにこれより暗号強度が低いアルゴリズムは逆にVPNとしての安全性を(現段階でも)保てないので論外です。今でさえこのアルゴリズムだと不安になりつつあるのに…。

あと、ちゃんとIPSecパススルー設定などに相当するespやUDPのPort500、1701、4500は通しておかないとつながりませんからね。

 

Win10でL2TP/IPSecによる接続を行うためのクライアント側の設定

こちらは適当に検索をかけると出てくる項目を片っ端からやっているのでどれが正解とかはあまり書くことができません。大事そうなのが

  • NATトラバーサルを有効にするためにレジストリの設定を行う(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgentにAssumeUDPEncapsulationContextOnSendRuleの値をDWORD型で2にセットする)
  • 接続の設定を作った後にネットワークの「アダプターの設定」から対象のVPN接続のプロパティを開き、「セキュリティ」の設定をサーバ側の設定と合わせる。ネットワークの設定でIPv6の設定を外した方がよい場合は外しておくこと
  • たまに一部のサービス(IKE and AuthIP IPsec Keying Modulesなど)が動いていないことがあるらしいのでそれを動かしてみる
  • ファイアウォールのアプリケーションごとの許可から「ルーティングとリモートアクセス」を許可する

といったところでしょうかね。特に最初の設定はほぼ確実に必要だと思われます。これを設定してから再起動してもつながらなかったら…後何が必要なのでしょうかね。

 

まず出張に行く前に接続できるか試しておきましょう

何事も事前準備が大切です、という当たり前のことを書いて終わりにしておきたいと思います。