「E: Sub-process /usr/bin/dpkg returned an error code (1)」が発生したので解決してみた

## はじめに

久しぶりにWSL上のUbuntuをアップデートしようとした際、エラーが発生しました。今回はそのエラーの解決手順について解説します。

まず、以下のコマンドでシステムのアップデートを実行しました。

```bash: 実行したコマンド
sudo apt update
sudo apt upgrade
```
しかし、アップグレード中に以下のエラーが発生しました。

```bash:出力されたエラー
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
Get more security updates through Ubuntu Pro with 'esm-apps' enabled:
  libheif1 libde265-0
Learn more about Ubuntu Pro at https://ubuntu.com/pro
The following packages have been kept back:
  libnetplan0 netplan.io
The following packages will be upgraded:
  nodejs
1 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.
Need to get 0 B/25.4 MB of archives.
After this operation, 120 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
(Reading database ... 36019 files and directories currently installed.)
Preparing to unpack .../nodejs_14.21.3-deb-1nodesource1_amd64.deb ...
Unpacking nodejs (14.21.3-deb-1nodesource1) over (12.22.9~dfsg-1ubuntu3.6) ...
dpkg: error processing archive /var/cache/apt/archives/nodejs_14.21.3-deb-1nodesource1_amd64.deb (--unpack):
 trying to overwrite '/usr/share/systemtap/tapset/node.stp', which is also in package libnode72:amd64 12.22.9~dfsg-1ubuntu3.6
Errors were encountered while processing:
 /var/cache/apt/archives/nodejs_14.21.3-deb-1nodesource1_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
```

コンソールに表示されるエラーメッセージが長くて複雑に見えることもありますが、重要なのはその中でどの部分が本質的なエラーメッセージなのかを理解することです。

## エラーの分析

エラーメッセージ全体を確認する中で、注目すべきポイントは以下の部分です。

```bash: 今回のエラー内容
dpkg: error processing archive /var/cache/apt/archives/nodejs_14.21.3-deb-1nodesource1_amd64.deb (--unpack):
 trying to overwrite '/usr/share/systemtap/tapset/node.stp', which is also in package libnode72:amd64 12.22.9~dfsg-1ubuntu3.6
Errors were encountered while processing:
 /var/cache/apt/archives/nodejs_14.21.3-deb-1nodesource1_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
```

このエラーメッセージから読み取れるのは、`nodejs`パッケージをアップグレードしようとした際に、`/usr/share/systemtap/tapset/node.stp`というファイルが既に`libnode72:amd64`パッケージに存在しており、ファイルの上書きができないという問題です。このようなファイル競合が原因でアップグレードが中断されています。

## エラー解決へのアプローチ

エラーの原因がわかりました（正確には「エラーの原因と思われるもの」となりますが、簡便化のためここでは言い切らせていただきます）。ここでは競合を解消するための具体的な手順について解説します。

1. `libnode`の存在チェック
2. `nodejs`の削除
3. `libnode`の削除
4. `nodejs`を再インストール
5. 最終確認

### 1. `libnode`の存在チェック

`libnode`の存在チェックをします。

```bash: 実行コマンド
dpkg -l | grep libnode
```

```bash: 出力
ri  libnode72:amd64                    12.22.9~dfsg-1ubuntu3.6                      amd64        evented I/O for V8 javascript - runtime library
```

### 2. `nodejs`の削除

次に依存先の`nodejs`を削除しましょう。

```bash: 実行コマンド
sudo apt remove --purge nodejs
```

```bash: 出力
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages will be REMOVED:
  node-typescript* nodejs*
0 upgraded, 0 newly installed, 2 to remove and 2 not upgraded.
After this operation, 62.2 MB disk space will be freed.
Do you want to continue? [Y/n] Y
(Reading database ... 36019 files and directories currently installed.)
Removing node-typescript (4.5.4+ds1-1) ...
Removing nodejs (12.22.9~dfsg-1ubuntu3.6) ...
Processing triggers for man-db (2.10.2-1) ...
```

### 3. `libnode`の削除

無事削除できました。続いて`libnode72`を削除しましょう。

```bash:実行コマンド
sudo apt remove --purge libnode72
```

```bash: 出力
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages will be REMOVED:
  libnode72*
0 upgraded, 0 newly installed, 1 to remove and 2 not upgraded.
After this operation, 41.2 MB disk space will be freed.
Do you want to continue? [Y/n] Y
(Reading database ... 35846 files and directories currently installed.)
Removing libnode72:amd64 (12.22.9~dfsg-1ubuntu3.6) ...
Processing triggers for libc-bin (2.35-0ubuntu3.8) ...
```

無事削除できました。これで`nodejs`と`libnode72`が削除された状態となります。

### 4. `nodejs`を再インストール

再度`nodejs`をインストールしましょう。

```bash:実行コマンド
sudo apt install nodejs
```

```bash: 実行コマンド
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
  nodejs
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 25.4 MB of archives.
After this operation, 121 MB of additional disk space will be used.
Get:1 https://deb.nodesource.com/node_14.x jammy/main amd64 nodejs amd64 14.21.3-deb-1nodesource1 [25.4 MB]
Fetched 25.4 MB in 2s (10.7 MB/s) 
Selecting previously unselected package nodejs.
(Reading database ... 35856 files and directories currently installed.)
Preparing to unpack .../nodejs_14.21.3-deb-1nodesource1_amd64.deb ...
Unpacking nodejs (14.21.3-deb-1nodesource1) ...
Setting up nodejs (14.21.3-deb-1nodesource1) ...
Processing triggers for man-db (2.10.2-1) ...
```

無事 `nodejs` をインストールすることができました。

### 5. 最終確認

念のため確認しましょう。

```bash: 実行したコマンド
sudo apt update
sudo apt upgrade
```

```bash: 出力
Hit:1 https://dl.yarnpkg.com/debian stable InRelease
Hit:2 https://deb.nodesource.com/node_14.x jammy InRelease                                                                                   
Hit:3 http://archive.ubuntu.com/ubuntu jammy InRelease                                                                                       
Get:4 http://security.ubuntu.com/ubuntu jammy-security InRelease [129 kB]                                                                    
Get:5 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [128 kB]                                           
Hit:6 https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy InRelease                                          
Hit:7 http://archive.ubuntu.com/ubuntu jammy-backports InRelease                          
Fetched 257 kB in 2s (165 kB/s)                         
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
1 package can be upgraded. Run 'apt list --upgradable' to see it.
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
Get more security updates through Ubuntu Pro with 'esm-apps' enabled:
  libheif1 libde265-0
Learn more about Ubuntu Pro at https://ubuntu.com/pro
The following packages will be upgraded:
  snapd
1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 26.4 MB of archives.
After this operation, 2134 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 snapd amd64 2.65.3+22.04 [26.4 MB]
Fetched 26.4 MB in 6s (4480 kB/s)
(Reading database ... 40775 files and directories currently installed.)
Preparing to unpack .../snapd_2.65.3+22.04_amd64.deb ...
Unpacking snapd (2.65.3+22.04) over (2.63+22.04ubuntu0.1) ...
Setting up snapd (2.65.3+22.04) ...
Installing new version of config file /etc/apparmor.d/usr.lib.snapd.snap-confine.real ...
snapd.failure.service is a disabled or a static unit not running, not starting it.
snapd.snap-repair.service is a disabled or a static unit not running, not starting it.
Processing triggers for dbus (1.12.20-2ubuntu4.1) ...
Processing triggers for mailcap (3.70+nmu1ubuntu1) ...
Processing triggers for man-db (2.10.2-1) ...
```

無事インストールすることができました。

## おわりに

定期的に環境をアップデートやアップグレードしないと、今回のようにエラーが発生することがあります。この文章を読んで、その点をご理解いただければ幸いです。ぼく自身も、このようなエラーに直面した際に、適切に対応できるようになりたいと感じました。

## おまけ

`nodejs`を先に削除してから`libnode`を削除するとうまくいきますが、逆に`libnode`を先に削除しようとすると、依存関係のエラーが発生します。

```bash: 実行コマンド
sudo apt remove --purge libnode72
# sudo dpkg --remove --force-remove-reinstreq libnode72 などのコマンドもあります
```

```bash: 出力
dpkg: dependency problems prevent removal of libnode72:amd64:
 nodejs depends on libnode72 (= 12.22.9~dfsg-1ubuntu3.6).

dpkg: error processing package libnode72:amd64 (--remove):
 dependency problems - not removing
Errors were encountered while processing:
 libnode72:amd64
```

これを日本語に翻訳すると以下のようになります。

```bash: 出力（日本語訳）
dpkg: 依存関係の問題により libnode72:amd64 の削除を防止しています:
 nodejs は libnode72 (= 12.22.9~dfsg-1ubuntu3.6) に依存しています。
dpkg: パッケージ libnode72:amd64 の処理中にエラーが発生しました (--remove): 依存関係の問題 - 削除されていません
処理中にエラーが発生しました: libnode72:amd64
```

`nodejs`が`libnode`に依存しているので削除できない状態です。`nodejs`がメンヘラ彼女で`libnode`が彼氏だとしたとき、彼氏（`libnode`）がいなくなったらメンヘラ彼女（`nodejs`）が発狂してしまう、というイメージです。

## 参考記事

https://virment.com/fix-sub-process-returned-an-error-code/

https://qiita.com/yukari-n/items/d1b17bd37036f120153c

https://phoenixnap.com/kb/fix-sub-process-usr-bin-dpkg-returned-error-code-1

https://www.veeble.org/kb/sub-process-usr-bin-dpkg-returned-an-error-code-1/