カタカタブログ

SIerで働くITエンジニアがカタカタした記録を残す技術ブログ。Java, Oracle Database, Linuxが中心です。たまに数学やデータ分析なども。

apt-get install時に「 パッケージ 'wireless-tools' のファイル一覧ファイルに最後の改行がありません」エラー

久しぶりにRaspberry Piを触った。
Raspberry Pi 2にapt-getでchkconfigを入れようとしたときによくわからないエラーが出たので、対策をメモ。

エラーと対応方法

apt-getでchkconfigを入れようとしたときに、wireless-toolsパッケージ周りでエラーが発生し、インストールに失敗するという問題が発生。

# apt-get install chkconfig
(・・・略)
dpkg: 復旧不可能な致命的なエラーです。中止します:
パッケージ 'wireless-tools' のファイル一覧ファイルに最後の改行がありません
E: Sub-process /usr/bin/dpkg returned an error code (2)

apt-get update, upgradeをやってから再実行するも変わらず。

wireless-toolsのファイル一覧ファイルがおかしいということなのでファイルの中身を確認してみる。

# file /var/lib/dpkg/info/wireless-tools.list
/var/lib/dpkg/info/wireless-tools.list: PNG image data, 38 x 25, 8-bit/color RGBA, non-interlaced

なぜかPNG画像ファイルになっている。。
普通は以下のようにテキストファイルのはず。つまり、wireless-tools.listが破損してしまっているよう。

# file /var/lib/dpkg/info/*.list | head
/var/lib/dpkg/info/acl.list:                 ASCII text
/var/lib/dpkg/info/adduser.list:               ASCII text
/var/lib/dpkg/info/adwaita-icon-theme.list:          ASCII text
/var/lib/dpkg/info/alacarte.list:               ASCII text
/var/lib/dpkg/info/alsa-base.list:              ASCII text
/var/lib/dpkg/info/alsa-utils.list:              ASCII text
/var/lib/dpkg/info/apt-utils.list:              ASCII text
/var/lib/dpkg/info/apt.list:                 ASCII text
/var/lib/dpkg/info/aptitude-common.list:           ASCII text
/var/lib/dpkg/info/aptitude.list:               ASCII text
# head /var/lib/dpkg/info/acl.list
/.
/usr
/usr/bin
/usr/share
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/chacl.1.gz
/usr/share/man/man1/getfacl.1.gz
/usr/share/man/man1/setfacl.1.gz
/usr/share/man/man5

正しいwireless-tools.listを探す。適当にググると以下にそれっぽいものを発見。
信頼性はまったくもって怪しいが、どうせ自宅利用のRaspberry Piなのでこれで試してみる。
https://github.com/volumio/RootFS-RaspberryPI/blob/master/var/lib/dpkg/info/wireless-tools.list

# cd/var/lib/dpkg/info
# mv wireless-tools.list wireless-tools.list.org
# viwireless-tools.list

wireless-tools.listの中身は以下のようになった。

/.
/sbin
/sbin/iwgetid
/sbin/iwlist
/sbin/iwevent
/sbin/iwspy
/sbin/iwconfig
/sbin/iwpriv
/etc
/etc/network
/etc/network/if-pre-up.d
/etc/network/if-pre-up.d/wireless-tools
/etc/network/if-post-down.d
/etc/network/if-post-down.d/wireless-tools
/usr
/usr/share
/usr/share/doc/wireless-tools
/usr/share/doc/wireless-tools/changelog.Debian.gz
/usr/share/doc/wireless-tools/HOTPLUG-UDEV.txt.gz
/usr/share/doc/wireless-tools/PCMCIA.txt.gz
/usr/share/doc/wireless-tools/README.Debian
/usr/share/doc/wireless-tools/copyright
/usr/share/doc/wireless-tools/DISTRIBUTIONS.txt.gz
/usr/share/doc/wireless-tools/changelog.gz
/usr/share/doc/wireless-tools/README.gz
/usr/share/man
/usr/share/man/cs
/usr/share/man/cs/man8
/usr/share/man/cs/man8/iwspy.8.gz
/usr/share/man/cs/man8/iwpriv.8.gz
/usr/share/man/cs/man8/iwconfig.8.gz
/usr/share/man/cs/man8/iwevent.8.gz
/usr/share/man/cs/man8/iwgetid.8.gz
/usr/share/man/cs/man8/iwlist.8.gz
/usr/share/man/cs/man7
/usr/share/man/cs/man7/wireless.7.gz
/usr/share/man/fr.UTF-8
/usr/share/man/fr.UTF-8/man8
/usr/share/man/fr.UTF-8/man8/iwspy.8.gz
/usr/share/man/fr.UTF-8/man8/iwpriv.8.gz
/usr/share/man/fr.UTF-8/man8/iwconfig.8.gz
/usr/share/man/fr.UTF-8/man8/iwevent.8.gz
/usr/share/man/fr.UTF-8/man8/iwgetid.8.gz
/usr/share/man/fr.UTF-8/man8/iwlist.8.gz
/usr/share/man/fr.UTF-8/man7
/usr/share/man/fr.UTF-8/man7/wireless.7.gz
/usr/share/man/man8
/usr/share/man/man8/iwspy.8.gz
/usr/share/man/man8/iwpriv.8.gz
/usr/share/man/man8/iwconfig.8.gz
/usr/share/man/man8/iwevent.8.gz
/usr/share/man/man8/iwgetid.8.gz
/usr/share/man/man8/iwlist.8.gz
/usr/share/man/fr.ISO8859-1
/usr/share/man/fr.ISO8859-1/man8
/usr/share/man/fr.ISO8859-1/man8/iwspy.8.gz
/usr/share/man/fr.ISO8859-1/man8/iwpriv.8.gz
/usr/share/man/fr.ISO8859-1/man8/iwconfig.8.gz
/usr/share/man/fr.ISO8859-1/man8/iwevent.8.gz
/usr/share/man/fr.ISO8859-1/man8/iwgetid.8.gz
/usr/share/man/fr.ISO8859-1/man8/iwlist.8.gz
/usr/share/man/fr.ISO8859-1/man7
/usr/share/man/fr.ISO8859-1/man7/wireless.7.gz
/usr/share/man/man7
/usr/share/man/man7/wireless.7.gz

これでapt-get installを再実行する。

# apt-get install chkconfig
E: dpkg は中断されました。問題を修正するには 'dpkg --configure -a' を手動で実行する必要があります。

ファイルを手で直接いじったせいか、実行できなかったので、指示されたとおりのコマンドを実行する。

# dpkg --configure -a

再実行

# apt-get install chkconfig
(・・・略)
(データベースを読み込んでいます ... 現在 118819 個のファイルとディレクトリがインストールされています。)
.../chkconfig_11.4.54.60.1debian1_all.deb を展開する準備をしています ...
chkconfig (11.4.54.60.1debian1) を展開しています...
man-db (2.7.0.2-5) のトリガを処理しています ...
chkconfig (11.4.54.60.1debian1) を設定しています ...

今度は正常に完了した!

# which chkconfig
/sbin/chkconfig

ちゃんとchkconfigがインストールされた。

まとめ

なぜかapt-getであるパッケージのファイル一覧ファイルが壊れてしまったため、
そのパッケージに依存するパッケージのインストールに失敗してしまう、という問題が発生した。
ファイル一覧ファイル(xxx.list)を適当に拾ってきたものだが、差し替えたところ、正常にインストールできるようになった。

以上!