Linux基礎(パッケージ管理について)

#これはなに？
Linuxのパッケージ管理の仕組みを読み解いていく記事

##パッケージ管理とは
ソフトウェアをパッケージと呼ばれる単位で配布と管理する仕組み。
パッケージファイルとは実行プログラム、設定ファイル、ライブラリ、マニュアルなどを1つのんファイルにまとめたもの。

##代表的な例

|パッケージ方式|説明|パッケージの拡張子|管理ツール|
|---|---|---|---|
|Debian形式|Debian GNU/Linuxなどで採用されている方式|.deb|dpkgコマンド|
|RPM形式|RedHat Enterprise Linuxなどで採用される方式|.rpm|rpmコマンド|

##パッケージ依存の関係
パッケージ管理によりソフトウェアのインストール、削除、依存関係のチェックの管理が容易になる。
パッケージAには、Bが必要。パッケージBには、Cが必要。つまり、間接的にパッケージAを実行するために、パッケージCが必要となっている。このような依存関係における複雑性をパッケージ管理の仕組みが解決してくれる。

パッケージA　⇆　パッケージB　⇆　パッケージC

パッケージ管理により、パッケージのインストール、アンインストール、アップデート作業でどのようなパッケージがどこにインストールされているかを確認したり、パッケージ間の競合を回避したりする仕組みを提供している。

|パッケージの関係|説明|
|---|---|
|パッケージの依存関係|あるパッケージに含まれるるファイルを、別のパッケージが利用している関係|
|パッケージの競合関係|あるパッケージによってインストールされるファイルが、すでに別のパッケージによりインストールされている場合、すでにインストールされているファイルと競合する場合の関係|

##高度なパッケージ管理
dpkg/rpmのようなパッケージ管理を行う基本コマンドでは、管理者がある程度手動で依存関係を解決する必要があり、パッケージファイルを1つ1つ用意する必要があった。そこで、高度なパッケージ管理を提供する仕組みであるAPTツール/YUMツールを使用してパッケージ管理ができるようになった。

1. パッケージのダウンロードサイト(リポジトリ)から最新パッケージのダウンロードやインストールを行う
2. 各パッケージ間の依存関係を解決しながら、パッケージのインストール、アップグレード、削除等が行える

|パッケージ方式|高度な管理ツール|
|---|---|
|Debian|APT(Advanced Package Tool)ツール|
|RPM形式|YUM(Yellowdog Updater Modified)ツール|

###Debian系｜dpkgツール
Debian形式のパッケージファイル名の見方
![スクリーンショット 2019-09-21 16.47.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374557/375166b5-e0af-b265-a887-ea7730c3942d.png)

Debian形式のパッケージを扱うためには、dpkgコマンドを使用する。
構文｜dpkg [オプション] アクション パッケージ名

|オプション|説明|
|---|---|
|-E|同じバージョンがすでにインストールされている場合、インストールは行わない|
|-G|新バージョンがすでにインストールされている場合、インストールはしない|
|-R|ディレクトリ構造を再帰的に処理する|

|アクション|説明|
|---|---|
|-i|パッケージファイル名をして、パッケージをインストール|
|-l|パッケージファイル名をして、インストール済みの詳細情報を表示|
|-r|パッケージ名をして、パッケージをアンインストール(設定ファイルは残す)|
|-P|パッケージ名をして、パッケージをアンイストール(設定ファイルを含めて完全に削除)|
|-L|パッケージ名をして、パッケージからインストールされたファイルを一覧表示|
|-s|パッケージ名をして、インストール済みのパッケージの詳細情報の表示|
|-S|指定したファイルが、どのパッケージからインストールされたものかを調査|
|-c|パッケージファイル名を指定して、パッケージに含まれるファイルの一覧表示|
|-C|パッケージのインストール状態を検査|

以下では、実際にtreeパッケージをダウンロードしてから、dpkgコマンドでステータスの確認まで行う。

```shell
# パッケージファイルの取得
# 一般的には、Debianパッケージ管理はaptツールを使用してダウンロード＆インストールするためwgetは不要だったりする。
$ wget https://ftp.nara.wide.ad.jp/debian/main/t/tree/tree_1.6.0-1_i386.deb

# treeパッケージのインストール
$ dpkg -i tree_1.6.0-1_i386.deb

# パッケージファイル名を指定して、インストール済みの詳細情報を表示
$ dpkg -l tree_1.6.0-1_i386.deb

# パッケージ名を指定して、パッケージからインストールされたファイルを一覧表示
$ dpkg -L tree

# パッケージ名を指定して、インストール済みのパッケージの詳細情報の表示
$ dpkg -s tree

# パッケージファイル名を指定して、パッケージに含まれるファイルの一覧表示
$ dpkg -c tree_1.6.0-1_i386.deb

# パッケージをアンインストール(設定ファイルは残す)
#dpkg -r tree

# パッケージをアンインストール(設定ファイル含め完全に削除)
#dpkg -P tree
```

###RPM系｜
RPM形式のパッケージファイル名の見方
![スクリーンショット 2019-09-21 17.08.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374557/fc3dceb6-6a98-c87f-1c1c-9b929ff7d681.png)
RPM形式のパッケージを扱うためには、dpkgコマンドを使用する。

構文｜rpm [オプション] パッケージ名
[RPMコマンド｜インストール]

|インストーリ・アップグレードモード|説明|
|---|---|
|-i パッケージファイル名|指定したキーワードを含むパッケージをインストール|
|-U パッケージファイル名|指定したパッケージのアップフレード(存在しない場合はインストールする)|
|-F パッケージファイル名|指定したパッケージのアップグレード(存在しない場合はインストールしない)|
|-v (併用オプション)|詳細な情報を表示する|
|-h (併用オプション)|インストールの進行状況を#で表示する|
|-nodeps (併用オプション)|パッケージの依存関係を無視してインストール|
|-force (併用オプション)|既存のファイルを新しいものに置き換える|
|-prefix (併用オプション)|パッケージをインストールするディレクトリを指定|
|-test (併用オプション)|インストールはせずにテストを実施|

|アンインストーリモード|説明|
|---|---|
|-e パッケージ名|パッケージをアンインストール|
|-nodeps (併用オプション)|依存関係を無視してアンインストール|

|照会モード|説明|
|---|---|
|-q パッケージ名|指定したパッケージがインストールされているか照会|
|-a (併用オプション)|インストール済みの全てのパッケージを表示|
|-c (併用オプション)|設定ファイルのみを表示|
|-d (併用オプション)|ドキュメントのみを表示|
|-i (併用オプション)|指定したパッケージの詳細情報を表示|
|-l (併用オプション)|指定したパッケージに含まれているファイルを一覧表示|
|-R (併用オプション)|指定したパッケージが依存しているファイルなどを表示|
|-f ファイル名(併用オプション)|指定したファイルを含むパッケージ名を表示|
|-p パッケージファイル名(併用オプション)|指定したパッケージファイルの情報を表示|
|-changelog (併用オプション)|パッケージの変更履歴を表示|

以下では、実際にnmapパッケージをダウンロードしてから、dpkgコマンドでステータスの確認まで行う。
*「nmap」は、ポートスキャンを行うアプリケーション

####パッケージのインストールとアンインストール

```shell
# パッケージファイルの取得
# 一般的には、RPMパッケージ管理はyumツールを使用してダウンロード＆インストールするためwgetは不要だったりする。
$ wget https://ftp.riken.jp/Linux/centos/6.4/os/i386/Packages/nmap-5.51-2.el6.i686.rpm

# treeパッケージのインストール
$ rpm -ivh nmap-5.51-2.el6.i686.rpm

# パッケージのアンインストール
$ rpm -e nmap-5.51-2.el6.i686.rpm

# パッケージのアップグレード(パッケージが存在しない場合、新規インストールを行う)
$ rpm -Uvh nmap-5.51-2.el6.i686.rpm

# パッケージのアップグレード(パッケージが存在しない場合、新規インストールを行わない)
$ rpm -Fvh nmap-5.51-2.el6.i686.rpm
```

####パッケージの依存関係

```shell
# 依存関係に問題があり、エラーが発生して処理を中断する
$ rpm -ivh emacs-23.1-31.el6_2.3.i686.rpm

# 依存関係を無視して、インストール
$ rpm -ivh --nodeps emacs-23.1-31.el6_2.3.i686.rpm
```

####パッケージの情報の参照

```shell
# インストール済みのパッケージ一覧の表示
$ rpm -qa

# インストールされたファイルの一覧を表示
$ rpm -l nmap

# インストール済みのパッケージ一覧の表示
$ rpm -qa

# インストール済みのパッケージの詳細情報を表示
$ rpm -qi namp

```

|オプション|説明|
|---|---|
|-qa|インストール済みのパッケージ一覧の表示|
|-ql パッケージ名|インストール済みのパッケージに含まれるファイルの一覧表示|
|-qi パッケージ名|インストール済みのパッケージの詳細情報表示|
|-qlp ファイル名|インストール前のパッケージに含まれるファイルの一覧表示|
|-qip ファイル名|インストール前のパッケージの詳細情報を表示|