🐏

Ubuntuのaptを調べたのでまとめておく

2023/05/07に公開
1

目的

WindowsでLinux開発環境(Ubuntu)を作ったのだけど、如何せんUbuntu素人である。
なので、何をするにしても現れるaptコマンドについて、ソフトウェアをインストールするやつ~。って程度の雰囲気理解しかしてなかった。
そんな状態だと当然の如く躓くわけで、その折に調べたことを(自分用に)残しておく。

aptとは

Debian系のLinuxでソフトウェアのインストールや管理、アンインストールに用いられるパッケージ管理コマンド。(RedHat系Linuxのyumdnfに相当する)
UbuntuはDebianをベースとして派生したLinuxディストリビューションであるため、同様にaptコマンドを利用する。

経緯
もともと、Linuxへソフトウェアをインストールしたい時は、信頼できる場所から圧縮・アーカイブされたソースコードを取得し、手動で解凍&配置を行っていた。
この手動管理は、ソフトウェアが必要とするファイルの整合性を保つのが、非常に面倒かつ、難しいという悩みがあった。
no package
管理が複雑で難しい

これを解決するべくDebianの開発者たちは、ソフトウェアをパッケージという単位で管理する管理コマンドdpkgを作った。
このdpkgを更に進化させたものが、apt(Advanced Package Tool)である。
package
パッケージ管理の導入

色々なaptコマンド

Ubuntuでのインストール方法を調べているとaptの他に、apt-getapt-cacheのコマンドを見かける。
それぞれの違いについて、以下のようになっている。

  • apt
    apt-getapt-cacheを包括するコマンド。
    対話的な(インタラクティブな)使用に適したオプションがデフォルト設定される。
  • apt-get
    パッケージのインストール/アンインストールを行うコマンド。
  • apt-cache
    パッケージの情報を参照・検索するコマンド。

使い分け
コマンドラインからパッケージを操作する場合はaptの使用が推奨されている。
bashやDockerfileなどのスクリプトからの場合はapt-getapt-cacheの使用が推奨されている。

スクリプトの使い方およびほかの APT ツールとの違い
apt(8) コマンドラインはエンドユーザ向けツールとして設計されています。動作はバージョン間で変更される可能性があります。後方互換性を損なうことのないようには努めますが、変更がインタラクティブな使用に有益と思われる場合には、その保証はありません。

apt(8) のすべての機能は、apt-get(8) や apt-cache(8) など専用の APT ツールで利用可能です。apt(8) は、単にいくつかのオプションのデフォルト値を変更します (apt.conf(5) の特にバイナリ範囲を参照)。可能な限り下位互換性を保つように、スクリプトでは (潜在的に有効になっているいくつかの追加オプションをつけて) コマンドを使うべきです。

引用:Ubuntu aptの公式マニュアル

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 install
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形式(テキスト形式)で公開されている場合、デコードしてバイナリ形式に戻す必要がある
  1. リポジトリが公開しているOpenPGP公開鍵を取得する
    例)wgetで取得
    sudo wget -qO ~/【myrepo.asc】 【https://myrepo.example/myrepo.asc】
    
  2. 【ASCII armored形式(テキスト形式)の場合】gpgコマンドでデコードする
    sudo gpg --dearmor -o ~/【myrepo】.gpg ~/【myrepo.asc】
    
  3. OpenPGP公開鍵を/etc/apt/keyrings/に格納する(拡張子「gpg」)
    sudo mv /etc/apt/keyrings/【myrepo】.gpg
    
  4. /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以上の必要がある
  1. リポジトリが公開しているOpenPGP公開鍵を取得する
    例)curlで取得
    sudo curl -fsSLo ~/【myrepo】.asc 【https://myrepo.example/myrepo.asc】
    
  2. OpenPGP公開鍵を/etc/apt/keyrings/に格納する(拡張子「asc」)
    sudo mv /etc/apt/keyrings/【myrepo】.asc
    
  3. /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以上の必要がある
  1. /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.

引用:Ubuntu apt-keyの公式マニュアル(英語)

参考

Linuxのパッケージ管理について
https://www.infraexpert.com/infra/linux08.html
aptコマンドについて
https://eng-entrance.com/linux-package-apt-2
サードパーティのリポジトリ登録について
https://zenn.dev/spiegel/articles/20220508-apt-key-is-deprecated
ASCII armoerdエンコードについて
https://kiririmode.hatenablog.jp/entry/20151101/1446303600
GPGについて(GnuPG公式ページ)
https://gnupg.org/

Discussion