2017-07-24

Raspbianの apt-get upgrade が失敗する

2017-07-05-raspbian-jessie.zip が出ていたので、Raspberry Pi 3 Model Bのシステムを入れ替えることにした。

いつものようにmacOSのターミナルからddコマンドを使ってSDカードに書き込み、RasPiを起動、パッケージを最新のものに更新しようとしたところ、

$ sudo apt-get update
$ sudo apt-get upgrade
... 中略 ...
Reading changelogs... Done
Preconfiguring packages ...
dpkg: unrecoverable fatal error, aborting:
 files list file for package 'qdbus' is missing final newline
E: Sub-process /usr/bin/dpkg returned an error code (2)

のようなエラーが発生する。 package 'qdbus' だけでなく、いくつかの別のパッケージもおかしい。 次の例では、'python3.4'でエラーが発生している。

dpkg: unrecoverable fatal error, aborting:
 files list file for package 'python3.4' is missing final newline
E: Sub-process /usr/bin/dpkg returned an error code (2)

エラーの原因が違う次のようなパターンもある。

dpkg: unrecoverable fatal error, aborting:
 files list file for package `raspberrypi-kernel' contains empty filename
E: Sub-process /usr/bin/dpkg returned an error code (2)

どうやら /var/lib/dpkg/info ディレクトリーにあるインストール済みパッケージの情報が壊れているようだ。

SDカードは新品だし、ダウンロードしてきたファイルのSHA-1ハッシュも合致しているのでイメージファイルが壊れているとも思えない。

ネットで解決策を探るも、日本語の情報だと、壊れた /var/lib/dpkg/info/<pakage-name>.list ファイルを削除して、パッケージを再インストールしろみたいな記事しか出てこない。

まあ、確かにそれで直るには治るけど、根本的になにか違うでしょ。ウチと同じ怪現象で悩んでいる人はいないのか?

しかたないので、英語の情報も調べてみると、起動用SDカードを作成するとき、

ddコマンドに conv=sync を付けていないことが原因

で、イメージファイル末尾のブロックが正常に書き込まれていないと、このようなトラブルが起きる。という記事をフォーラムで発見。

そう言えば、自分も指定していなかった。試しに起動ディスクを作り直してみると、

$ sudo dd bs=1m if=raspbian.img of=/dev/rdiskN conv=sync

あっさり apt-get upgrade に成功してしまった(それが普通)。

オフィシャルなインストール方法の解説 INSTALLING OPERATING SYSTEM IMAGES ON MAC OS にも、conv=syncを付けるように書かれている。

はて? 昔は、そんな記載なかったような気がするのだが……

今まで conv=sync なしでうまくいっていたのは、配布イメージが巧みに地雷を避けるように作られていて運が良かっただけなのか。

そう言えば、2017-07-05-raspbian-jessie.imgをFinder上でダブルクリックすると、

次のディスクイメージは開けませんでした

理由 image not recognized

という警告が表示されて開けないので不審に思っていた。以前のRaspbianのSDカードイメージはダブルクリックするとMS-DOS(FAT)部分だけはマウントできていたのにヘンだな〜、と。

ファイルサイズを確認してみると512バイト論理ブロックの境界にすら整列していない。試しに、

$ dd if=2017-07-05-raspbian-jessie.zip of=jessie-aligned.img conv=sync

のようにイメージファイルのサイズを変更してやると、いままでと同じようにFAT32部分がマウントできるイメージになる。

どうやら、2017-06-21-raspbian-jessie.zipあたりから中途半端なサイズになっているようだ。なぜ、そんなことに。

というわけで、ddコマンドを使ってRasPi起動用のSDカードを作るときはオペランド conv=sync の指定をお忘れなく。

0 件のコメント:

コメントを投稿