classDiagram
direction LR
namespace Package {
class Program {
ソースコードやそれをコンパイル
したバイナリ形式のファイル
(例) /usr/bin/vim, /usr/bin/ls
}
class Library {
よく使用されるプログラムの共通
部分を抜き出し, 他のプログラム
からも利用できるようにしたもの
}
class Config {
プログラムが動作するための設定
値を格納したファイル
(例) config.yamlなど
}
class Document {
パッケージのメタ情報や依存関係を
記載したファイルやマニュアル
(例) README.md
}
}
パッケージとは?
Definition 1 Package
Linuxでは「パッケージ」という単位でソフトウェアを管理する.パッケージとは,インストールに必要なファイル(バイナリ・ライブラリ・設定ファイル・ドキュメント・メタ情報)を一つにまとめたアーカイブのこと.
パッケージの中身は概ね以下の4種類のファイルで構成されます.
代表的なパッケージ形式は以下の2つがあります.
| 形式 | 拡張子 | 採用ディストリビューション例 | パッケージ管理コマンド例 |
|---|---|---|---|
| Debian形式 | .deb |
Debian GNU/Linux, Ubuntu | dpkg, apt, apt-get |
| RPM形式 | .rpm |
Red Hat Enterprise Linux, Fedora, CentOS | rpm, yum, dnf |
Debian形式パッケージの構成要素
.deb パッケージはアーカイブとして ar コマンドで展開可能であり,Ubuntu用の Zoom パッケージを例にとると以下4ファイルから構成されます.
% ar t zoom_amd64.deb
debian-binary
control.tar.xz
data.tar.xz
_gpgbuilder| ファイル名 | 内容 |
|---|---|
debian-binary |
パッケージフォーマットのバージョンを記載したテキストファイル |
control.tar.xz |
パッケージ名・バージョン等のメタ情報,依存関係,インストール前後に実行されるスクリプト |
data.tar.xz |
実際にインストールされる実行ファイル・ライブラリ・ドキュメント等 |
_gpgbuilder |
GPG鍵を用いたパッケージ署名(配布元検証用) |
- Debian形式パッケージは
ar,tar,xzといった古典的UNIXコマンドだけで展開できるよう設計されています dpkgやaptを誤って削除してしまっても,パッケージ自体の展開は可能
パッケージマネジャーとは?
Definition 2 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
パッケージマネジャーはこれらをユーザーが意識することなく自動的に処理してくれます.
主要なLinuxディストリビューションのパッケージ管理ツールは以下:
| 系統 | パッケージ管理ツール |
|---|---|
| Red Hat系 | rpm(低レベル),yum / dnf(高レベル) |
| Debian系 | dpkg(低レベル),apt(高レベル) |
依存関係
Definition 3 依存関係 (Dependencies)
あるアプリケーション \(A\) のコマンドを実行するために,別のアプリケーション \(B\) のファイルが必要となるとき,\(A\) は \(B\) に依存しているという.
例として,音声合成ソフトの festival は alsa-utils に依存しており,festival を機能させるためには依存パッケージも合わせてインストールする必要があります.
apt-cache show で gzip パッケージの依存情報を確認してみます.
% apt-cache show gzip
Package: gzip
Architecture: amd64
Version: 1.10-0ubuntu4
Priority: required
Essential: yes
...
Pre-Depends: libc6 (>= 2.17)
Depends: dpkg (>= 1.15.4) | install-info
Suggests: less
...依存記述で使用される演算子
| 演算子 | 意味 |
|---|---|
<< |
より低い(未満) |
<= |
以下 |
= |
等しい(2.6.1 は 2.6.1-1 と等しくない) |
>= |
以上 |
>> |
より高い |
, |
論理積(AND) |
\| |
論理和(OR) |
Pre-Depends は Depends よりも強い依存関係を示し,対象パッケージのインストール前に必ず満たされていなければなりません.
APT: Advanced Packaging Tool
Definition 4 APT
APT (Advanced Packaging Tool) は Debian系ディストリビューションで使われるパッケージ管理システム.あらかじめ設定されたリポジトリからパッケージとパッケージ情報を取得し,依存関係を自動的に解決しながらインストール・アップグレード・削除を行う.

- レポジトリとは,ファイルやデータを集積している場所,及びその情報を管理しているデータベース
- 単なるファイル置き場というよりかは,「パッケージ本体+メタデータ」をセットで提供する配布基盤
- 後述するが,
/etc/apt/sources.listでレポジトリ情報を管理している
apt vs dpkg
dpkg と apt は次のように役割が分かれています.
| コマンド | レベル | 役割 |
|---|---|---|
dpkg |
低レベル | パッケージのインストール・削除のみ.依存関係の問題はエラー表示するだけ |
apt |
高レベル | 依存関係を解決しながらインストール.内部では dpkg を呼び出す |
apt コマンドの基本構文
Basic Syntax
apt [option] subcommand主なオプション
| オプション | 説明 |
|---|---|
-c <設定ファイル> |
設定ファイルを指定する(デフォルトは /etc/apt/sources.list) |
-d |
パッケージのダウンロードのみ行う |
-y |
問い合わせに対して自動的に yes と回答 |
--no-install-recommends |
推奨パッケージはインストールしない |
--install-suggests |
提案パッケージもインストールする |
--reinstall |
インストール済みパッケージの再インストールを許可 |
主なサブコマンド
| サブコマンド | 説明 |
|---|---|
update |
パッケージリストを更新 |
search <keyword> |
正規表現でパッケージの説明文を検索 |
install <package> |
パッケージをインストール |
remove <package> |
パッケージを削除(設定ファイルは残る) |
purge <package> |
パッケージと設定ファイルを削除(依存パッケージは残る) |
upgrade |
インストール済みパッケージを新しいバージョンへアップグレード |
show <package> |
指定したパッケージの情報を表示 |
list |
パッケージリストを表示 |
list --installed |
インストール済みパッケージの一覧 |
list --upgradable |
アップグレード可能なパッケージの一覧 |
depends <package> |
パッケージの依存関係を表示 |
autoremove |
不要となった依存パッケージを削除 |
パッケージの説明文ではなくファイル名で検索したい場合は apt-file または dpkg -S を使うこと.
パッケージ情報の取得
リポジトリにあるパッケージであれば,インストールの有無に関わらず apt show で情報を表示できます.
% apt show code
Package: 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/
APT-Sources: https://packages.microsoft.com/repos/code stable/main amd64 Packages
...Provides / Conflicts / Replaces を同一バーチャルパッケージに対し同時宣言することで,そのバーチャルパッケージを提供する実パッケージのうち確実に一つだけがインストールされる状態を保証することができます.
依存関係のみを確認したい場合は apt depends を使います.
% 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部分一致でリポジトリ上のパッケージを検索したい場合は apt search を使用:
sudo apt search <keyword>apt install --reinstall の使用用途
パッケージをインストールしたあとで重要な構成ファイルを誤って削除してしまった場合,システム上はすでにインストール済みと認識されているため,通常の install では上書きインストールができません.このようなときに --reinstall オプションが有効です.
sudo apt install --reinstall postfix不要になったパッケージの削除
man apt を確認すると,パッケージ削除に関する記述として以下があります.
install, reinstall, remove, purge (apt-get(8))
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.
サブコマンドの使い分けは以下:
| サブコマンド | 動作 |
|---|---|
remove |
パッケージ本体を削除.ユーザー設定ファイルは残る |
purge |
設定ファイルも含めて削除.ただし依存関係上不要となったパッケージは残る |
autoremove |
他のパッケージの依存対象でなくなり,かつ自動でインストールされたパッケージを削除 |
autoremoveは,依存関係上の参照がなくなったパッケージを一括削除するため,現役で使用しているパッケージまで削除されてしまうケースがあります- 実行前に
--just-print(または--dry-run,-s)でDry Runすることを推奨
Autoremoveの実行結果を事前に確認
% 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]依存対象としてインストールされたが現在では明示的に使用しているパッケージは,apt-mark manual <package> で「手動インストール」扱いに変更しておくことで,autoremove の対象から外すことができます.
パッケージがインストールしたファイル群を確認する
パッケージがインストールしたファイル一覧の確認は,「低レベル」パッケージマネジャーである dpkg の担当領域です.
% 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
...逆に,あるファイルがどのパッケージから提供されているかを調べるには dpkg -S を用います.
% dpkg -S /usr/bin/vim.basic
vim: /usr/bin/vim.basicリポジトリの設定
Debian系では,リポジトリ情報は以下の2箇所で管理されています.
| 配置 | 用途 |
|---|---|
/etc/apt/sources.list |
Ubuntu公式リポジトリ情報を記述 |
/etc/apt/sources.list.d/*.list |
サードパーティ製・PPAなどの追加リポジトリ情報を .list ファイルとして配置 |
sources.list のフォーマット
/etc/apt/sources.list の記述ルール
<パッケージの種類> <取得先URI> <Ubuntu version=suite> <component>
Example 1
$ cat /etc/apt/sources.list | head -10
# 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/ noble main restricted
# deb-src http://jp.archive.ubuntu.com/ubuntu/ jammy main restricted
## Major bug fix updates produced after the final release of the
## distribution.
deb http://jp.archive.ubuntu.com/ubuntu/ noble-updates main restrictedパッケージの種類
| 種類 | 説明 |
|---|---|
deb |
バイナリパッケージを取得 |
deb-src |
ソースパッケージを取得 |
component
| component | 説明 |
|---|---|
main |
Canonicalがサポートするフリーなオープンソースソフトウェア |
restricted |
プロプライエタリなソフトウェア(主にデバイスドライバー) |
universe |
コミュニティによってメンテナンスされるフリーなオープンソースソフトウェア |
multiverse |
著作権・法的問題によって利用が制限されるソフトウェア |
実例
% 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(22.04 LTS) - 取得対象のコンポーネントは
mainとrestricted