Ubuntu - パッケージ間の依存関係

# 概要
パッケージ間の依存関係について調べてみた。このあたりの仕組みをきちんと理解していなくて、意図した通りにパッケージがインストールできずハマってしまった。

# 環境
Ubuntu 22.04.2 LTS (Jammy)
```shell-session
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.2 LTS
Release:        22.04
Codename:       jammy
```
aptコマンドのバージョン
```shell-session
$ apt --version
apt 2.4.9 (amd64)
```

# パッケージの依存関係
パッケージ間の依存関係には、Depends、Recommends、Suggests、Conflicts、Replaces、Breaks、Providesがある。詳細は下記ページに載っている。

https://www.debian.org/doc/manuals/debian-faq/pkg-basics.en.html#depends

https://www.debian.org/doc/manuals/debian-faq/pkg-basics.ja.html#depends

# apt / apt-cache
`apt`や`apt-cache`を使って、libc6についていろいろ調べてみた。
## apt list
`apt list`でlibc6パッケージを検索してみる。2.35-0ubuntu3.1がインストールされているのがわかる。
```shell-session
$ apt list libc6 --all-versions
Listing... Done
libc6/jammy-updates,now 2.35-0ubuntu3.1 amd64 [installed,automatic]
libc6/jammy 2.35-0ubuntu3 amd64
```

## apt show
`apt show`でlibc6パッケージの詳細情報を見てみると。上述のDepends、Recommendsなどの依存関係の情報が含まれているのがわかる。
```shell-session
$ apt show libc6
Package: libc6
Version: 2.35-0ubuntu3.1
Priority: required
Section: libs
Source: glibc
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 13.9 MB
Depends: libgcc-s1, libcrypt1 (>= 1:4.4.10-10ubuntu4)
Recommends: libidn2-0 (>= 2.0.5~), libnss-nis, libnss-nisplus
Suggests: glibc-doc, debconf | debconf-2.0, locales
Breaks: busybox (<< 1.30.1-6), fakeroot (<< 1.25.3-1.1ubuntu2~), hurd (<< 1:0.9.git20170910-1), ioquake3 (<< 1.36+u20200211.f2c61c1~dfsg-2~), iraf-fitsutil (<< 2018.07.06-4), libgegl-0.4-0 (<< 0.4.18), libtirpc1 (<< 0.2.3), locales (<< 2.35), locales-all (<< 2.35), macs (<< 2.2.7.1-3~), nocache (<< 1.1-1~), nscd (<< 2.35), openarena (<< 0.8.8+dfsg-4~), openssh-server (<< 1:8.2p1-4), r-cran-later (<< 0.7.5+dfsg-2), wcc (<< 0.0.2+dfsg-3)
Replaces: libc6-amd64
Homepage: https://www.gnu.org/software/libc/libc.html
Task: minimal, server-minimal
Original-Vcs-Browser: https://salsa.debian.org/glibc-team/glibc
Original-Vcs-Git: https://salsa.debian.org/glibc-team/glibc.git
Download-Size: 3235 kB
APT-Manual-Installed: no
APT-Sources: http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
Description: GNU C Library: Shared libraries
 Contains the standard libraries that are used by nearly all programs on
 the system. This package includes shared versions of the standard C library
 and the standard math library, as well as many others.

N: There is 1 additional record. Please use the '-a' switch to see it
```

## apt-cache
### dependsコマンド
`apt-cache depends`でlibc6が直接に依存しているパッケージを表示する。インストールされていないパッケージも含めて表示する。また、`--recurse`オプションを付けると、依存しているパッケージを再帰的に表示する。
```shell-session
$ apt-cache depends libc6
libc6
  Depends: libgcc-s1
  Depends: libcrypt1
  Breaks: busybox
  Breaks: fakeroot
  Breaks: <hurd>
  Breaks: ioquake3
  Breaks: iraf-fitsutil
  Breaks: libgegl-0.4-0
  Breaks: <libtirpc1>
  Breaks: locales
  Breaks: locales-all
  Breaks: macs
  Breaks: nocache
  Breaks: nscd
  Breaks: openarena
  Breaks: openssh-server
  Breaks: r-cran-later
  Breaks: wcc
  Recommends: libidn2-0
  Recommends: libnss-nis
  Recommends: libnss-nisplus
  Suggests: glibc-doc
 |Suggests: debconf
  Suggests: <debconf-2.0>
    cdebconf
    debconf
  Suggests: locales
  Replaces: <libc6-amd64>
```
`apt-cache depends`は、`--installed`オプションを付けると、インストールされているパッケージにのみ表示する。
```shell-session
$ apt-cache depends libc6 --installed
libc6
  Depends: libgcc-s1
  Depends: libcrypt1
  Breaks: fakeroot
  Breaks: locales
  Breaks: openssh-server
  Recommends: libidn2-0
 |Suggests: debconf
  Suggests: locales
```
`--installed`オプションの有無での差分を表示してみる。赤文字で行頭に`-`があるのものがインストールされていないパッケージとなる。
```diff
$ diff -u <(apt-cache depends libc6) <(apt-cache depends libc6 --installed)
--- /dev/fd/63  2023-05-21 17:45:26.026407399 +0900
+++ /dev/fd/62  2023-05-21 17:45:26.026407399 +0900
@@ -1,29 +1,9 @@
 libc6
   Depends: libgcc-s1
   Depends: libcrypt1
-  Breaks: busybox
   Breaks: fakeroot
-  Breaks: <hurd>
-  Breaks: ioquake3
-  Breaks: iraf-fitsutil
-  Breaks: libgegl-0.4-0
-  Breaks: <libtirpc1>
   Breaks: locales
-  Breaks: locales-all
-  Breaks: macs
-  Breaks: nocache
-  Breaks: nscd
-  Breaks: openarena
   Breaks: openssh-server
-  Breaks: r-cran-later
-  Breaks: wcc
   Recommends: libidn2-0
-  Recommends: libnss-nis
-  Recommends: libnss-nisplus
-  Suggests: glibc-doc
  |Suggests: debconf
-  Suggests: <debconf-2.0>
-    cdebconf
-    debconf
   Suggests: locales
-  Replaces: <libc6-amd64>
```

### dottyコマンド
`dotty`コマンドを使って、`apt-cache depends`で得られる情報をGraphvizを使って可視化できる。

normal packagesは四角形、pure virtual packagesは三角形、mixed virtual packagesは菱形、missing packagesは六角形で表示される。オレンジ色の四角形は再起を停止(leaf packages)、青色の線はpre-depends、緑色の線はconflictsを意味する。

```shell-session
$ apt-cache dotty libc6 | dot -Tpng > libc6.png
```
![libc6_dotty.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591123/9ccb92cf-de6c-4e3a-5d48-e20d775e4cf4.png)

出力される図が大きすぎる場合は、`APT::Cache::GivenOnly`オプションを使って、コマンドラインで指定したパッケージのみに限定できる。
```shell-session
$ apt-cache dotty libc6 --option APT::Cache::GivenOnly=true | dot -Tpng > libc6.png
```
![libc6_dotty_dep1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591123/a47f8f10-aff8-8917-a490-1086b5a9f817.png)

# 参考情報
## apt
https://manpages.ubuntu.com/manpages/jammy/man8/apt.8.html

https://manpages.ubuntu.com/manpages/jammy/ja/man8/apt.8.html

## apt-cache
https://manpages.ubuntu.com/manpages/jammy/man8/apt-cache.8.html

https://manpages.ubuntu.com/manpages/jammy/ja/man8/apt-cache.8.html

## graphviz
https://manpages.ubuntu.com/manpages/jammy/man7/graphviz.7.html

## Debian Package Meta-Information
https://debian-handbook.info/browse/en-US/stable/sect.package-meta-information.html

https://debian-handbook.info/browse/ja-JP/stable/sect.package-meta-information.html