カーナビで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など)が動いていないことがあるらしいのでそれを動かしてみる
  • ファイアウォールのアプリケーションごとの許可から「ルーティングとリモートアクセス」を許可する

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

 

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

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

48TBファイルサーバに起こった異変から大修理に(3) 再同期完了編(交換2台目)

今回の話はそこまで怖い話ではなく、単に流れをみているだけです。

 

8番目の交換が完了した時点で3番目のHDDはどうなっていたのか?

SMARTの出力で主要な部分だけ書くとこんな感じです。

…
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail  Always       -       112
…
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       -       0
…
ATA Error Count: 2
…
Error 2 occurred at disk power-on lifetime: 11521 hours (480 days + 1 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  40 53 00 ff ff ff 0f  Error: UNC at LBA = 0x0fffffff = 268435455

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  60 00 58 ff ff ff 4f 00      00:06:58.915  READ FPDMA QUEUED
  60 00 58 ff ff ff 4f 00      00:06:58.913  READ FPDMA QUEUED
  60 00 58 ff ff ff 4f 00      00:06:58.913  READ FPDMA QUEUED
  60 00 00 ff ff ff 4f 00      00:06:58.909  READ FPDMA QUEUED
  60 00 58 ff ff ff 4f 00      00:06:58.908  READ FPDMA QUEUED
…

SMARTの状態を知っている人ならわかると思いますが、Reallocated Sector Countが出ている時点ですでに危険な状態です。とりあえず予備のSectorでカバーできているけれども使えないSectorが出始めている、という意味です。これが行き過ぎると不良セクタが発生してデータ破損につながります。なので、もうこれは交換しないと近々故障することが確定しているディスクとなります。しかも、Read Errorについてもこちらに報告されているということはその意味でも故障寸前ということが推察されます。ちなみに、この修復作業をする前はReallcated Sector Countは数十セクタほどで、Read Errorに関する報告もSMARTからは出ていなかったので、resilver作業によってかなり危険度が増していることになります。

 

今回の交換はそれほど難しくはない

というのも、前回の話のせいで何回もresilver処理を行っている(この場合はscrub処理に近い処理を行った、という意味も含まれる)ため、ZFS側のファイル破損の可能性はほとんどない状態ということで、ZFSにおけるストレージ1つ分の交換処理だけですむからです。これに関しては本当にこちらの記事を読めばOKです。HDDの場所もしっかり確認しているためその手の問題はありませんでした。

 

修理するために使った金額はいくら?

結局交換用SATAインタフェースカード(SATA3-6I-PCIE×2)+故障したHDDの交換分(2台分)ということになります。約5万円ですか。ちょっとした出費となり痛かったです。

 

破損したファイルはほかにあったのか?

なんとか初期に発覚した1つだけで済んだようです。といっても破損したファイルのデータは全く戻ってこないので痛いですね。なお、ZFSの領域は私の設定だと圧縮領域なので途中でデータ破損がすればまず間違いなく破損部分以降の読み出しは不可能で、アーカイブファイルにリカバリレコードをつけることで…とかは全く意味がなかったことも付け加えておきましょう。圧縮領域でなければ読み出せたのか?といわれるとおそらく無理、となるのでしょうが。

 

こうならないように故障の前兆はつかむようにしましょう

今回はSATAインタフェースカードとHDDの同時故障が原因だったのでなかなか難しいところではありますが…。SATAインタフェースカードの場合はdmesgなどでI/Oエラーが出ていないか?がチェックの対象になりますし、そうでなかったとしてもzpool statusから見ることができるエラー状況は「なぜ起こったのか」をSMARTやdmesgなどである程度理由をつかんでおかないといかにRAID-Z2といえども危ない状況になることはある、というのが今回の教訓ですね。つまりは定期的にPCの状態は確認して管理しましょう、というところですか。あとはzpoolの修復も途中のエラーによってはやり方を変えないといつまでたっても終わらない、ということがわかってよかったです。日本語の記事でこれに言及しているものがほとんどなく、英語の記事でも詳細なものはほとんどない様子でしたので。もしzpoolの修復の話でこの記事にたどり着いた人は前回修復手順を参考にしてみてください。