Linux環境構築基礎知識:パッケージマネジャーの導入

APTによるパッケージ管理 1/N

公開日: 2020-12-20
更新日: 2023-07-28

  Table of Contents

What is “Package”?

1
2
3
4
5
6
7
8
% apt moo
                 (__) 
                 (oo) 
           /------\/ 
          / |    ||   
         *  /\---/\ 
            ~~   ~~   
..."Have you mooed today?"...

Linuxではパッケージという単位でソフトウェアを管理しています. パッケージにはいろいろな種類がありますが, 概念としてはインストールに必要なファイルをまとめたものです.

Debian GNU/LinuxやUbuntuではDebian形式,.deb拡張子のパッケージを採用しています. 一方, Red HatやFedora, CentOSではRPM形式, .rpmパッケージを採用しています.

classDiagram
direction LR
namespace Package {
    class Program {
      ソースコードやそれをコンパイル
      したバイナリ形式のファイル
      \n
    }

    class Library {
      よく使用されるプログラムの共通
      部分を抜き出し, 他のプログラム
      からも利用できるようにしたもの
    }

    class Config {
      プログラムが動作するための設定
      値を格納したファイル
      (例) config.yamlなど
    }

    class Document {
      パッケージのメタ情報や依存関係を
      記載したファイルやマニュアル
      (例) Readme.md
    }
}

Debian形式パッケージはar, tar, and xzといった古典的UNIXコマンドしか使えない環境でも 展開できるように設計されています. 基本的にはDebian形式パッケージの展開はdpkg, aptといったコマンドを使いますが, これらコマンドを誤って削除してしまった時でも, パッケージが展開できなくなるという事態を回避することができます.

バイナリパッケージの構造

.debパッケージの構成要素を確認してみましょう. Ubuntu用のZoomパッケージを例に確認してみます:

1
2
3
4
5
% ar t zoom_amd64.deb
debian-binary
control.tar.xz
data.tar.xz
_gpgbuilder

これをみるとZoom Debian パッケージは4つのファイルから成り立っています

debian-binary .debファイルパッケージフォーマットバージョンのバージョンを示すテキストファイルです
control.tar.xz パッケージ名やバージョンなどのメタ情報, およびパッケージのインストール前, インストール中, またはインストール後に実行するスクリプトが含まれています
data.tar.xz パッケージから展開されるすべてのファイルが含まれています. 実行ファイル, ライブラリ, ドキュメントなどがすべて保存されています
_gpgbuilder GPG Keys生成関連ファイル

Zoomをインストールする場合は, dpkgaptコマンドを使用してzoom_amd64.debからバイナリ形式のプログラムをインストールします.

Column: GPG Keys生成関連ファイルがなぜパッケージにあるのか?

Linux環境では, インストールしようとしているパッケージが正しい配布先のものか?本物であるか?を検証してから インストールします. このとき, ソフトウェアの検証に使用される仕組みがGNU Privacy Guard (GnuPG, GPG)でなので, GPG Keys生成関連ファイルがパッケージに含まれています.

What is “Package Manager”?

Def: Package Manager

Package Managerとは, パッケージファイルを用いてシステム上におけるパッケージの

  • パッケージ更新情報の検索
  • インストール
  • 依存関係の解決
  • 設定管理
  • アンインストール

などを管理する機能を持つツールのこと.

任意のソフトウェアを今利用している環境にインストールする場合, 作業者は以下のことを実行する必要があります:

---
title: Package Installation Flow
---
classDiagram
  direction LR

%%--- Entityの定義

    class download{
        任意のディレクトリ
        にパッケージ
        ファイルを保存
    }


    class extract{
        指定した場所に
        ファイルを展開
        \n
    }

    class interpret{
    readmeを読んで, 必要な
    コンポーネントやバイナリ, 
    コンパイラの一覧を把握 
    }

    class build{
    configスクリプト, 
    Makefileを読み込み, 
    依存関係に留意した上でbuild
    }

    class install{
      Buildしたコード群を
      適切な場所に配置し,
      実行 & エラー対処
    }

%%--- Entity Relationの定義

download --> extract
extract --> interpret
interpret --> build
build --> install

Package Managerはこの一連の作業をユーザーが特段意識することなく自動的に管理してくれます. Linuxディストリビューションにおける代表的なパッケージ管理ツールは以下です:

Redhat系 RPM(Redhat Package Manager)
yum(Yellow dog Updater, Modified)
Debian系 dpkg, APT

パッケージの依存関係

Def: 依存関係

あるアプリケーションAのコマンドを実行するのに, 別のアプリケーションBのファイルが必要となるとき, AはBに依存しているという

多くのパッケージにはdependenciesが設定されています. 例えば, 音声合成ソフトのfestivalalsa-utilsに依存おり, festivalが機能するためにはalsa-utilsを始めとする依存パッケージを踏まえた上で インストールを実行しなくてはなりません.

apt-cache showコマンドをもちいてgzsipパッケージの依存情報を確認してみます.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
% apt-cache show gzip              
Package: gzip
Architecture: amd64
Version: 1.10-0ubuntu4
Priority: required
Essential: yes
Section: utils
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Bdale Garbee <bdale@gag.com>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 245
Pre-Depends: libc6 (>= 2.17)
Depends: dpkg (>= 1.15.4) | install-info
Suggests: less
Filename: pool/main/g/gzip/gzip_1.10-0ubuntu4_amd64.deb
...

依存関係について、以下の記述が確認できます. システム安定稼働の観点から

1
2
Pre-Depends: libc6 (>= 2.17)
Depends: dpkg (>= 1.15.4) | install-info

この情報がどのように取得しているかというとcontrol.tar.xzの情報を読み込んで表示しています. >= という記号がありますが、これはどのversionを許容しているかを示します.

<< より低いこと(未満)を意味します
<= 以下を意味します
= 等しいことを意味します (「2.6.1」は「2.6.1-1」と等しくありません)
>= 以上を意味します
>> より高いことを意味します。
  • |という記号は論理演算の OR を示しています. ANDの場合は , で表現されます.
  • Pre-dependsとDependsの違いは前者のほうが後者より強い依存関係であることを示しています.

APT: Advanced Packaging Tool

APT(Advanced Packaging Tool)は, Debian系ディストリビューションで使われているパッケージ管理システムで, 2014年に追加されました. APTでは, あらかじめ設定された(多くの場合インターネット上の)リポジトリからパッケージとパッケージの情報を取得します. その情報を用いて, 依存関係を自動的に調整しながら, パッケージのインストールやアップデート, 削除を行います. なお, この文脈におけるリポジトリとは, ファイルやデータを集積している場所及びその情報を管理しているデータベースを意味します.

この概念としてのAPTに対応するコマンドがaptとなります.

Debian系OSのパッケージマネジャー: なぜaptが便利なのか?

Debian形式のパッケージを管理するにあたって, パッケージのインストールや削除だけに限ればdpkgコマンドを使うだけで十分ですが, 上で見たようにパッケージには相互に依存関係があります. 手動で管理するのは大変ですが, そこのところをうまい具合に対応した上でパッケージを管理してくれるソフトウェアがAPTです.

「パッケージのインストールや削除」の機能を担当するパッケージマネジャーを「低レベル」と分類し, 「依存関係やメタデータ検索」の機能を担当するパッケージマネジャーを「高レベル」と分類しますが, aptdpkgの棲み分けも「高レベル」「低レベル」で理解することができます.

dpkg 低レベルパッケージマネジャー, 依存関係の問題が出てきた場合エラーメッセージの出力のみ
apt 高レベルパッケージマネジャー, 低レベルの機能もカバーしているが内部でdpkgを利用している

aptコマンドのSyntax

1
% apt [option] subcommand

aptコマンドの主なオプション

option 説明
-c 設定ファイル 設定ファイルを指定する(デフォルトは/etc/apt/sources.list)
-d パッケージのダウンロードのみ行う(installとともに実行)
-y 問い合わせに対して自動的にyesと回答する
--no-install-recommends 必須ではない推奨パッケージはインストールしない
--install-suggets 提案パッケージもインストールする
--reinstall インストール済みパッケージの再インストールを許可する

aptコマンドの主なサブコマンド

subcommand 説明
update パッケージリストを更新する
search 正規表現を使ってキーワードを設定することで、パッケージの説明文を参照しながらパッケージを探すことができます

パッケージの説明文ではなく、パッケージに含まれているファイル名で検索したい場合はapt-fileコマンド、またはdpkgコマンドを使用
install <package name> パッケージをインストールする
remove <package name> パッケージを削除する(設定ファイルは残る)
purge <package name> パッケージと設定ファイルを削除する(依存パッケージは残る)
upgrade インストール済みのパッケージ更新をおこない、新しいバージョンにアップグレードする
show <package name> 指定したパッケージに関する情報を表示する
list パッケージリストを表示する
list --installed インストールされたパッケージを一覧表示する
list --upgradable アップデート可能なパッケージを一覧表示する
depends <package name> パッケージの依存関係を表示する
autoremove 他のパッケージが削除されたことで「必要なくなった」パッケージを削除するコマンド

パッケージの情報の取得

パッケージの情報はshowサブコマンドで表示できます、リポジトリにあるパッケージであれば、インストールされているかどうかにかかわらず表示できます。VScodeのパッケージ情報を表示してみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
% apt show code
ackage: code
Version: 1.52.1-1608136922
Priority: optional
Section: devel
Maintainer: Microsoft Corporation <vscode-linux@microsoft.com>
Installed-Size: 273 MB
Provides: visual-studio-code
Depends: libnss3 (>= 2:3.26), gnupg, apt, libxkbfile1, libsecret-1-0, libgtk-3-0 (>= 3.10.0), libxss1, libgbm1
Conflicts: visual-studio-code
Replaces: visual-studio-code
Homepage: https://code.visualstudio.com/
Download-Size: 64.8 MB
APT-Manual-Installed: yes
APT-Sources: https://packages.microsoft.com/repos/code stable/main amd64 Packages
Description: Code editing. Redefined.
 Visual Studio Code is a new choice of tool that combines the simplicity of a code editor with what developers need for the core edit-build-debug cycle. See https://code.visualstudio.com/docs/setup/linux for installation instructions and FAQ.

なお、正常な設定として “Provides” と “Conflicts” と “Replaces” とを単一バーチャルパッケージに対し同時宣言することがあります。こうするといかなる時にも当該バーチャルパッケージを提供する実パッケージのうち確実に一つだけがインストールされます。

依存関係だけ確認したい場合はapt dependsコマンドを用います。

1
2
3
4
5
6
7
8
9
10
11
12
13
% apt depends code
code
  Depends: libnss3 (>= 2:3.26)
  Depends: gnupg
  Depends: apt
  Depends: libxkbfile1
  Depends: libsecret-1-0
  Depends: libgtk-3-0 (>= 3.10.0)
  Depends: libxss1
  Depends: libgbm1
  Conflicts: <visual-studio-code>
  Replaces: <visual-studio-code>
    code

なお部分一致でリポジトリ上のパッケージを調べたい場合は

1
% sudo apt search {パッケージ名}

apt install --reinstallの使用用途

パッケージをインストールしたあとで、重要な構成ファイルを削除してしまったとします。そのファイルだけを取得するために再インストールしようとしても、システム的にはすでにインストールされているので、そのままでは上書きインストールができません。このときにapt install --reinstallを用います。

postfixパッケージを再インストールする場合:

1
% sudo apt install --reinstall postfix

不要になったパッケージの削除

manコマンドでaptを見てみると、パッケージ削除に関して以下のような記述が確認できます.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
% man apt
install, reinstall, remove, purge (apt-get(8))
           Performs the requested action on one or more packages specified via
           regex(7), glob(7) or exact match. The requested action can be overridden
           for specific packages by appending a plus (+) to the package name to
           install this package or a minus (-) to remove it.

           A specific version of a package can be selected for installation by
           following the package name with an equals (=) and the version of the
           package to select. Alternatively the version from a specific release can
           be selected by following the package name with a forward slash (/) and
           codename (buster, bullseye, sid ...) or suite name (stable, testing,
           unstable). This will also select versions from this release for
           dependencies of this package if needed to satisfy the request.

           Removing a package removes all packaged data, but leaves usually small
           (modified) user configuration files behind, in case the remove was an
           accident. Just issuing an installation request for the accidentally
           removed package will restore its function as before in that case. On the
           other hand you can get rid of these leftovers by calling purge even on
           already removed packages. Note that this does not affect any data or
           configuration stored in your home directory.

apt remove <package name>によって不要となったパッケージを削除することができますが、ユーザー設定ファイルなどの関連ファイルは残ってしまいます. 設定ファイルも含めて削除したい場合は、apt purge <package name>を実行します. ただし、この場合も依存関係上不要となったパッケージは残り続けます. 依存関係上参照されてなくなったパッケージを除去したい場合はapt autoremoveコマンドを実行します. 実際にサービスとして使っているパッケージも削除されたというケースもあるので、注意が必要です.

1
2
3
4
5
6
7
8
9
10
11
12
% man apt
autoremove (apt-get(8))
           autoremove is used to remove packages that were automatically installed
           to satisfy dependencies for other packages and are now no longer needed
           as dependencies changed or the package(s) needing them were removed in
           the meantime.

           You should check that the list does not include applications you have
           grown to like even though they were once installed just as a dependency
           of another package. You can mark such a package as manually installed by
           using apt-mark(8). Packages which you have installed explicitly via
           install are also never proposed for automatic removal.

Autoremoveの実行結果を事前に確認する

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
% apt autoremove --just-print    
NOTE: This is only a simulation!
      apt needs root privileges for real execution.
      Keep also in mind that locking is deactivated,
      so don't depend on the relevance to the real current situation!
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  libevent-core-2.1-7 libevent-pthreads-2.1-7 libopts25 sntp
0 upgraded, 0 newly installed, 4 to remove and 67 not upgraded.
Remv sntp [1:4.2.8p12+dfsg-3ubuntu4.20.04.1]
Remv libevent-pthreads-2.1-7 [2.1.11-stable-1]
Remv libevent-core-2.1-7 [2.1.11-stable-1]
Remv libopts25 [1:5.18.16-3]

パッケージがインストールしたファイル群を確認する

パッケージがインストールしたファイルの確認は「低レベル」パッケージマネジャーの担当領域なので、dpkgコマンドを用います. 一例として、

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
% dpkg -L vim   
/.
/usr
/usr/bin
/usr/bin/vim.basic
/usr/share
/usr/share/bug
/usr/share/bug/vim
/usr/share/bug/vim/presubj
/usr/share/bug/vim/script
/usr/share/doc
/usr/share/doc/vim
/usr/share/doc/vim/NEWS.Debian.gz
/usr/share/doc/vim/changelog.Debian.gz
/usr/share/doc/vim/copyright
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/vim

リポジトリの設定

apt-get, apt updateで最新のパッケージ情報を取得 & インストールができるが, そのパッケージ保管場所の情報は どのように管理しているのか?

パッケージの保管場所であるリポジトリの設定は, Debian系では

  • /etc/apt/sources.listファイル
  • /etc/apt/sources.list.dディレクトリ以下の.listファイル

で管理しています. この2つの種類の使い分けとして, Ubuntu公式のリポジトリ情報を/etc/apt/sources.listに記述し, サードパーティの情報は/etc/apt/sources.list.d/以下に.listというファイル名で保存するのが一般的です.

sources.listのフォーマット

Column: /etc/apt/sources.listの記述ルール

1
<パッケージの種類> <取得先URI> <Ubuntu version=suite> <component>
パッケージの種類 説明
deb バイナリパッケージを取得する
deb-src ソースパッケージを取得する
component 説明
main Canonicalがサポートするフリーなオープンソースソフトウェア
restricted プロプライエタリなソフトウェア(主にデバイスドライバー)
universe コミュニティによってメンテナンスされるフリーなオープンソースソフトウェア
multiverse 著作権もしくは法的な問題によって制限されたソフトウェア

一例として,

1
2
3
4
5
6
7
% cat /etc/apt/sources.list
# deb cdrom:[Ubuntu 22.04.2 LTS _Jammy Jellyfish_ - Release amd64 (20230223)]/ jammy main restricted

# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://jp.archive.ubuntu.com/ubuntu/ jammy main restricted
...

上のラインの意味するところは

  • http://jp.archive.ubuntu.com/ubuntu/からdebパッケージを取得する
  • Ubuntuディストリビューションはjammy
  • main restrictedはコンポーネントが属するクラス

References

関連記事

オンラインマテリアル



Share Buttons
Share on:

Feature Tags
Leave a Comment
(注意:GitHub Accountが必要となります)