Sub-process /usr/bin/dpkg returned an error code を解決する手順
はじめに
Ubuntuでapt upgrade
したところSub-process /usr/bin/dpkg returned an error code (1)
というエラーがでました。この記事では、このエラーの解決策をまとめます。
前提と環境
以下の通りとなります。
- OS : Ubuntu18.04
エラーが発生するまでの経緯
はじめに、Sub-process /usr/bin/dpkg returned an error code (1)
が出るまでの経緯をメモしておきます。解決策だけ必要な方はとばしてください。
まずapt upgrade
をいつも通りに実行したところ、以下のようなエラーが表示されました。
$ sudo apt upgrade
E: dpkg was interrupted, you must manually run 'sudo dpkg --configure -a' to correct the problem.
上記の指示通りにsudo dpkg --configure -a
を実行したところ、以下のようなエラーが表示されました。
$ sudo dpkg --configure -a
Setting up btrfs-tools (4.4-1ubuntu1.1) ...
update-initramfs: deferring update (trigger activated)
Setting up mysql-server-5.7 (5.7.27-0ubuntu0.16.04.1) ...
debconf: DbDriver "config": /var/cache/debconf/config.dat is locked by another process: Resource temporarily unavailable
dpkg: error processing package mysql-server-5.7 (--configure):
subprocess installed post-installation script returned error exit status 1
Setting up libcups2:amd64 (2.1.3-4ubuntu0.10) ...
dpkg: dependency problems prevent configuration of mysql-server:
mysql-server depends on mysql-server-5.7; however:
Package mysql-server-5.7 is not configured yet.
dpkg: error processing package mysql-server (--configure):
dependency problems - leaving unconfigured
Setting up libcupsimage2:amd64 (2.1.3-4ubuntu0.10) ...
Processing triggers for libc-bin (2.23-0ubuntu11) ...
Processing triggers for initramfs-tools (0.122ubuntu8.14) ...
Errors were encountered while processing:
mysql-server-5.7
mysql-server
どうやらmysql-server-5.7
関連でエラーが出ていることが分かります。
そして適当に改めてapt upgrade
を実行してみたところ、問題のSub-process /usr/bin/dpkg returned an error code (1)
が出ました。
$ sudo apt upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
golang-go
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
2 not fully installed or removed.
After this operation, 0 B of additional disk space will be used.
Do you want to continue? [Y/n] Y
debconf: DbDriver "config": /var/cache/debconf/config.dat is locked by another process: Resource temporarily unavailable
Setting up mysql-server-5.7 (5.7.27-0ubuntu0.16.04.1) ...
debconf: DbDriver "config": /var/cache/debconf/config.dat is locked by another process: Resource temporarily unavailable
dpkg: error processing package mysql-server-5.7 (--configure):
subprocess installed post-installation script returned error exit status 1
dpkg: dependency problems prevent configuration of mysql-server:
mysql-server depends on mysql-server-5.7; however:
Package mysql-server-5.7 is not configured yet.
dpkg: error processing package mysql-server (--configure):
dependency problems - leaving unconfigured
No apport report written because the error message indicates its a followup error from a previous failure.
Errors were encountered while
processing:
mysql-server-5.7
E: Sub-process /usr/bin/dpkg returned an error code (1)
このエラーは、以上の作業を行った場合だけでなく、apt update
の実行時やapt install
で新しくパッケージをインストールしようとした場合にも発生することがあります。
原因と解決策
原因は、何かしらの理由でインストール、またはアップデートしようとしたパッケージが壊れてしまったためです。壊れているというのは、例えばパッケージが使用するライブラリの依存関係が干渉してしまったり、整合性が取れなくなったりする場合です。今回の私のケースでは、おそらくアップデート中にインターネット接続が切断されてさらにフリーズしてしまい、パッケージの操作が意図せず中断しまったことで壊れてしまったと考えられます。考えられる解決策としては以下があります。
- 該当パッケージを完全にインストールし直す
- 該当パッケージを再構成する
- 該当パッケージに関する一時ファイルを削除して再インストール、アップデートする
それぞれについて以降で説明します。
該当パッケージを完全にインストールし直す
もしすでに使っているアプリやパッケージではなく、新しくインストールしようとしていたものならば、一度全て削除して再度インストールし直すことで修復できる可能性があります。
例えば、mysql-server-5.7
を入れ直す場合ならば、以下のコマンドを実行します。
$ sudo apt remove mysql-server-5.7
$ sudo apt autoremove
$ sudo apt install mysql-server-5.7
該当パッケージを再構成する
以下のコマンドで、壊れたパッケージとその依存関係を解決します。
$ sudo dpkg --configure -a
該当パッケージに関する一時ファイルを削除して再インストール、アップデートする
今回の私のケースではこの方法で解決に至りました。
Ubuntuでは/var/lib/dpkg/info
配下に、パッケージのインストール前、インストール後に実行するためのスクリプトファイルや、その他パッケージに関する情報を含むファイルが置かれています。そしてこのディレクトリにある問題のパッケージ(ここではmysql-server-5.7
)のpreinst
とprerm
(インストール前用スクリプトファイル)、postinst
とpostrm
(インストール後用スクリプトファイル)の削除します。その後でapt update
やapt upgrade
が正常に実行できるようになりました。
具体的には、以下のコマンドを実行します。
$ cd /var/lib/dpkg/info
$ sudo mv mysql-server-5.7.post* /tmp
$ sudo mv mysql-server-5.7.pre* /tmp
mysql-server-5.7.post*
は、ワイルドカードによる指定でファイル名にmysql-server-5.7.post
が付くもの全てという意味です。mysql-server-5.7.pre*
も同じです。そしてこれらを/tmp
に移動します。/tmp
に移動しているのは、本当は削除すればいい場合でも念の為に一時退避する意味です。なお、/tmp
は設定によっては一定時間で自動削除されるようになっている場合も多いので、確実に確保しておきたい場合は他のディレクトリに一時退避してもいいかもしれません。
上記を実行後、apt upgrade
を問題なく実行できました。
まとめ
備忘録のためにまとめました。同様のエラーに遭遇している方の助けに少しでもなれば幸いです。
関連記事
- 公開日:2020/02/16 更新日:2020/02/16
圧縮、暗号化、リモート対応の差分バックアップを作成できる「Borg Backup」の使い方
圧縮、暗号化に対応し差分バックアップを作成できるソフトウェアである「Borg Backup」をUbuntuにインストールして使ってみたのでその手順をまとめます。「Borg Backup」はLinux、macOSに対応しています。
- 公開日:2020/02/14 更新日:2020/02/14
自分専用の後で読むサービスを構築できる「Wallabag」をUbuntu + Nginxで構築する手順
後で読むサービスのPocketにかなり近く、機能豊富なオープンソースのWallabagをUbuntuにインストールしたのでその手順をまとめます。
- 公開日:2020/02/12 更新日:2020/02/12
ファイル単位で暗号化して保存できるCryptomatorをインストールして使う手順
Cryptomatorは、ファイル単位での暗号化が可能なソフトウェアです。この記事では、UbuntuにCryptomatorをインストールする手順と使い方をまとめます。
- 公開日:2020/01/22 更新日:2020/01/22
WireGuardでVPNサーバーを構築してスマホやPCから接続する手順
WireGuardはOpenVPNよりもシンプルで高速、より安全なVPNとして開発が進められており、OpenVPNに代わるVPNとして期待されています。この記事ではWireGuardを使ってVPNサーバーを構築し、そのVPNサーバーにUbuntuやiPhoneから実際に接続してみるまでの手順をまとめます。
- 公開日:2020/01/17 更新日:2020/01/17
ディレクトリ表示や移動をインタラクティブに実行できるコマンドツール「Broot」
Linuxで端末を使っている時にディレクトリ構造をざっくり確認したり各ディレクトリにどのようなファイルが入っているかを確認したりしたい場合があると思います。Brootはディレクトリ構造を表示しつつさらにそこから各ディレクトリに移動したりファイルを検索したりできるコマンドラインツールです。