Raspbianでaptコマンドを実行したらメタデータがぶっ壊れていると言う現象に出くわして、エッなんでってなった話。
もろもろ調べて回ったら、どうもRaspbian2017-05以降(私が出くわした一番古いバージョンがこれだった)のイメージではイメージの作りが変わったらしく、ddコマンドでSDカードに書き込むときにオプションが必要になったようです。国内外ですでに報告が上がっていました。
- apt - Files list file for package 'qdbus' is missing final newline (Raspbian) - Unix & Linux Stack Exchange
- Raspberry Piでのdpkg: unrecoverable fatal error, aborting:というエラー - Caffè Latte
- 萍:ウキクサ: Raspbianの apt-get upgrade が失敗する
具体的にはpython3とかqt回りのパッケージでリストファイルが破損していて、何かしらパッケージを入れようとした時に初めて気づくというものです。
解決方法として、データが壊れたパッケージをインストールし直すと言う荒治療もあるようですが、他のファイルが壊れていないとも限らないのでイマイチです。正しい解決法は最後のリンクのブログにあるとおり、ddコマンドにconv=(f)syncオプションを足す方法です。公式ドキュメントにも記述されています。
オフィシャルなインストール方法の解説 INSTALLING OPERATING SYSTEM IMAGES ON MAC OS にも、conv=syncを付けるように書かれている。
はて? 昔は、そんな記載なかったような気がするのだが……
そり!!そんなオプションおじさんは知らんぞ!
ドキュメントのページはGitHubで管理されており、変更履歴を見てみると1ヶ月前にしれっと更新されていました。もしかしたらどこかリリースのタイミングで書かれていたのを見落としていたのかもしれませんが、気づかんわこれ。
よって、上記変更履歴より、Linuxの場合はconv=fsync
$ sudo dd bs=4M if=2017-07-05-raspbian-jessie.img of=/dev/sdX conv=fsync
Macの場合はconv=sync
$ sudo dd bs=1m if=2017-07-05-raspbian-jessie.img of=/dev/rdiskX conv=sync
と言うオプションが新たに必要になるようです。
Man page of DD いわく、fsyncは「終了前に出力ファイルデータを物理的に書き込み、メタデータに対しても使用する」となるようですがわからん。
で、この件があまり言われていないのは、NOOBSではそのへんの対応もなされているであろう(試してないけど)可能性、もしくは最近だとEtcherと言うイケてるGUIツールが登場したのでこれが使われている可能性が考えられます。みんな最近ナニでイメージ書き込んでます?
というわけで気をつけてね〜って話でした。
ちなみに私はpimoroniパッケージを入れようとしてこの件に気づきました。pimoroniパッケージはPimoroni製品のドライバー類を簡単にインストールできる便利ツールなのでこちらもぜひ覚えてください(ドサクサ)。