Ubuntuのaptを調べたのでまとめておく
目的
WindowsでLinux開発環境(Ubuntu)を作ったのだけど、如何せんUbuntu素人である。
なので、何をするにしても現れるapt
コマンドについて、ソフトウェアをインストールするやつ~。って程度の雰囲気理解しかしてなかった。
そんな状態だと当然の如く躓くわけで、その折に調べたことを(自分用に)残しておく。
aptとは
Debian系のLinuxでソフトウェアのインストールや管理、アンインストールに用いられるパッケージ管理コマンド。(RedHat系Linuxのyum
、dnf
に相当する)
UbuntuはDebianをベースとして派生したLinuxディストリビューションであるため、同様にapt
コマンドを利用する。
経緯
もともと、Linuxへソフトウェアをインストールしたい時は、信頼できる場所から圧縮・アーカイブされたソースコードを取得し、手動で解凍&配置を行っていた。
この手動管理は、ソフトウェアが必要とするファイルの整合性を保つのが、非常に面倒かつ、難しいという悩みがあった。
管理が複雑で難しい
これを解決するべくDebianの開発者たちは、ソフトウェアをパッケージという単位で管理する管理コマンドdpkg
を作った。
このdpkg
を更に進化させたものが、apt
(Advanced Package Tool)である。
パッケージ管理の導入
色々なaptコマンド
Ubuntuでのインストール方法を調べているとapt
の他に、apt-get
やapt-cache
のコマンドを見かける。
それぞれの違いについて、以下のようになっている。
-
apt
apt-get
とapt-cache
を包括するコマンド。
対話的な(インタラクティブな)使用に適したオプションがデフォルト設定される。 -
apt-get
パッケージのインストール/アンインストールを行うコマンド。 -
apt-cache
パッケージの情報を参照・検索するコマンド。
使い分け
コマンドラインからパッケージを操作する場合はapt
の使用が推奨されている。
bashやDockerfileなどのスクリプトからの場合はapt-get
とapt-cache
の使用が推奨されている。
スクリプトの使い方およびほかの APT ツールとの違い
apt(8) コマンドラインはエンドユーザ向けツールとして設計されています。動作はバージョン間で変更される可能性があります。後方互換性を損なうことのないようには努めますが、変更がインタラクティブな使用に有益と思われる場合には、その保証はありません。apt(8) のすべての機能は、apt-get(8) や apt-cache(8) など専用の APT ツールで利用可能です。apt(8) は、単にいくつかのオプションのデフォルト値を変更します (apt.conf(5) の特にバイナリ範囲を参照)。可能な限り下位互換性を保つように、スクリプトでは (潜在的に有効になっているいくつかの追加オプションをつけて) コマンドを使うべきです。
aptリポジトリとは
パッケージってどこから取得しているんだろう。答えはaptリポジトリである。
リポジトリとは、大量のパッケージ情報を集約・保存・管理しているサーバのことだ。
apt
コマンドは、aptリポジトリよりパッケージをダウンロード&インストールを行っている。
aptリポジトリには、Ubuntu公式のものとサードパーティのものがある。
Ubuntu公式のリポジトリ情報は/etc/apt/sources.list
に記述され、サードパーティのリポジトリ情報は/etc/apt/sources.list.d/
以下に「~.list」または「~.sources」というファイル名で記述する。
aptインストールについて
apt
コマンドによるインストールは、必ず以下の2つがセットになっている。
それぞれ何が行われているのだろうか。
sudo apt update
sudo apt install [パッケージ]
-
sudo apt update
aptリポジトリからパッケージインデックスを取得するコマンド。/var/lib/apt/lists/
に格納される。
パッケージインデックスとは、リポジトリが保有しているパッケージのリストである。例えて言えば、レストランのメニュー表にあたるだろう。そして、メニュー表にない品は注文(インストール)できない。
当然だが、リポジトリが保有するパッケージインデックスの内容は随時更新され得るため、インストールする前には、最新に更新するのがお決まりとなっている。 -
sudo apt install [パッケージ]
aptリポジトリからパッケージをダウンロード&インストールするコマンド。また、インストール時のパッケージを/var/cache/apt/archives/
にキャッシュする。
このキャッシュはディスク容量を圧迫する一因となるため、sudo apt-get clean
コマンドで定期的にクリアしたほうが良いようだ。
aptインストールのイメージ
サードパーティリポジトリの登録方法
サードパーティのaptリポジトリを登録するには、単純に/etc/apt/sources.list.d/
以下に「~.list」「~.sources」を作成するだけではない。
aptリポジトリ側が、パッケージ対してOpenPGPに則ったデジタル署名を行っているからだ。
そのため、パッケージの署名検証に用いるOpenPGP公開鍵もインポートする必要がある。
OpenPGP公開鍵は、バイナリ形式とASCII armored形式(テキスト形式)の2種類が存在する。(RFC 4880 - OpenPGP Message Format)
それぞれの形式によってリポジトリ登録方法が異なるため、それぞれに分けて記載する。
【A】バイナリ形式OpenPGP公開鍵の登録方法
- 前提:コマンド例の【】箇所は適宜読み替えること
- メリット:
apt
コマンドのバージョンに依存せず登録可能(古い環境にも互換性がある) - デメリット:
OpenPGP公開鍵がASCII armored形式(テキスト形式)で公開されている場合、デコードしてバイナリ形式に戻す必要がある
- リポジトリが公開しているOpenPGP公開鍵を取得する
例)wgetで取得sudo wget -qO ~/【myrepo.asc】 【https://myrepo.example/myrepo.asc】
- 【ASCII armored形式(テキスト形式)の場合】
gpg
コマンドでデコードするsudo gpg --dearmor -o ~/【myrepo】.gpg ~/【myrepo.asc】
- OpenPGP公開鍵を
/etc/apt/keyrings/
に格納する(拡張子「gpg」)sudo mv /etc/apt/keyrings/【myrepo】.gpg
-
/etc/apt/sources.list.d/
配下にリポジトリ情報ファイル(~.list)を作成する。その際、Signed-Byオプションで公開鍵のパスを指定するecho "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/【myrepo】.gpg] 【https://myrepo.example】 "$(lsb_release -cs)" 【example】" | sudo tee /etc/apt/sources.list.d/【myrepo】.list > /dev/null
【B】ASCII armored形式OpenPGP公開鍵の登録方法①
- 前提:コマンド例の【】箇所は適宜読み替えること
- メリット:
OpenPGP公開鍵がASCII armored形式(テキスト形式)で公開されている場合、そのまま扱える - デメリット:
全てのapt
コマンドのバージョンが1.4以上の必要がある
- リポジトリが公開しているOpenPGP公開鍵を取得する
例)curlで取得sudo curl -fsSLo ~/【myrepo】.asc 【https://myrepo.example/myrepo.asc】
- OpenPGP公開鍵を
/etc/apt/keyrings/
に格納する(拡張子「asc」)sudo mv /etc/apt/keyrings/【myrepo】.asc
-
/etc/apt/sources.list.d/
配下にリポジトリ情報ファイル(~.list)を作成する。その際、Signed-Byオプションで公開鍵のパスを指定するecho "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/【myrepo】.asc] 【https://myrepo.example】 "$(lsb_release -cs)" 【example】" | sudo tee /etc/apt/sources.list.d/【myrepo】.list > /dev/null
【C】ASCII armored形式OpenPGP公開鍵の登録方法②
- 前提:コマンド例の【】箇所は適宜読み替えること
- メリット:
OpenPGP公開鍵がASCII armored形式(テキスト形式)で公開されている場合、そのまま扱える
OpenPGP公開鍵をリポジトリ情報ファイル(~.sources)に同梱できる - デメリット:
apt
コマンドのバージョンが2.4以上の必要がある
-
/etc/apt/sources.list.d/
配下にリポジトリ情報ファイル(~.sources)を、DEB822スタイルで作成する。その際、Signed-ByオプションでOpenPGP公開鍵を直接記載するcat << EOS | sudo tee /etc/apt/sources.list.d/【myrepo】.sources > /dev/null Types: deb URIs: 【https://myrepo.example】 Suites: $(lsb_release -cs) Components: 【example】 Architectures: $(dpkg --print-architecture) Signed-By: $(curl -fsSL 【https://myrepo.example/myrepo.asc】 | sed "s/^/ /") EOS
注意
公開鍵の定義は各行頭に「半角スペース」を必要とする。
(マニュアルを見ると、空行の場合はピリオド"."も必要のように読めるが、空行のままで問題ない? 動作は確認済み)
THE DEB AND DEB-SRC TYPES: OPTIONS
·Signed-By (signed-by) is an option ...
:
Special care is needed to encode the empty line with leading spaces and ".":
:
引用:Ubuntu sources.listの公式マニュアル(英語)
補足:リポジトリ情報ファイル(~.list、~.sources)の定義仕様
定義のスタイルが、2パターン存在する。
詳しくは Ubuntu sources.listの公式マニュアル を参照。
- 1行 スタイル形式:ファイル拡張子「.list」
deb [ option1=value1 option2=value2 ] uri suite [component1] [component2] [...]
- DEB822 スタイル形式:ファイル拡張子「.sources」
Types: deb deb-src URIs: uri Suites: suite Components: [component1] [component2] [...] option1: value1 option2: value2
apt-key
コマンドについて
蛇足:前までは、OpenPGP公開鍵を登録・管理するためにapt-key
コマンドが使われていた模様。
現在は非推奨とされ「Debian 11」「Ubuntu 22.04」が最後の利用可能バージョンとのこと。
DESCRIPTION
apt-key is used to manage the list of keys used by apt to authenticate packages.
Packages which have been authenticated using these keys will be considered trusted.Use of apt-key is deprecated, except for the use of apt-key del in maintainer scripts to remove existing keys from the main keyring.
If such usage of apt-key is desired the additional installation of the GNU Privacy Guard suite (packaged in gnupg) is required.apt-key(8) will last be available in Debian 11 and Ubuntu 22.04.
参考
Linuxのパッケージ管理についてapt
コマンドについて
サードパーティのリポジトリ登録について
ASCII armoerdエンコードについて
GPGについて(GnuPG公式ページ)
Discussion
分かりやすかったです!