Ubuntu Weekly Recipe

第915回aptの新機能あれこれUbuntu 26.04 LTS版]

「apt」は言わずとしれたUbuntuの基本を担うパッケージ管理システムです。今回はUbuntu 26.04 LTSに搭載されたapt 3.2.0に関して、前回のLTSである24.04の「apt 2.8.0」以降に実装された機能について紹介しましょう。

図1 表示がカラフルになったaptコマンド

ちなみにaptの機能紹介は本連載でも何度か行っています。特にUbuntu 24.04 LTS以前の情報を知りたい場合は、次の記事やそこからリンクされている記事を参照してください。

お手軽にロールバックもできるようになったapt

aptはUbuntuを含むDebian系のLinuxディストリビューションにおいて採用されているパッケージ管理システムで、その要とも言えるソフトウェアです。

1997年頃に開発が始まった前身のDeityが、1998年4月1日にAPT(A Package Tool)と名前を変更します[1]それから16年後の2014年4月に1.0がリリースされ、その後も現在にいたるまでの30年近く世界中で使われ続けてきました。

Ubuntu 24.04 LTSからUbuntu 26.04 LTSの間において、apt 3.0がリリースされます。Steve Langaseckに捧げられ、Debian 13で採用されたこのapt 3.0では、新しい依存関係解決エンジン(solver3)を採用したのが最大の特徴です。それによりロールバックなどのさまざまな機能の追加が可能になりました。

この依存解決エンジンの追加も含めて、大きな変更点をあげてみましょう。

  • 新しい依存関係解決エンジン(solver3)の採用
  • 履歴の管理とロールバックに対応
  • パッケージがインストールされた・されなかった理由の表示
  • カラー設定をカスタマイズ可能に
  • ページャーの対応
  • UIの固定化に対応

新しい依存関係解決エンジン(solver3)の採用

パッケージ管理システムの最大の目的はパッケージ間の依存関係の解決です。

あるパッケージをインストールしようとすると、別のパッケージが必要になる状況を「依存関係」と呼びます。単純にAがBに依存しているだけなら話はかんたんなのですが、Bは「CもしくはD」に依存しているけれども「AとCは一緒にインストールできないので、Dを選ぶべき」なんてケースもあります。

さらにUbuntuのあるリリースでは「AはBに依存し、BはCに依存していた」が、次のリリースでは「AはCだけに依存する」ようになることも多々あります。

パッケージ管理システムはこのような「依存関係地獄(Dependency Hell⁠⁠」から、人類とその毛髪を救うことが求められています[2]

apt(libapt)のフロントエンドとして人気のある「aptitude」は、この依存関係の解決が強力でした。従来のaptではうまく解決できずに諦めるケースでも、aptitudeならなんとかしてくれることもあったのです。

apt 3.0では、aptitudeと同じくらい「賢い」依存関係解決エンジンとして「DPLL(Davis-Putnam-Logemann-Loveland)ソルバー」を活用した「solver3(Solver 3.0⁠⁠」が開発されました。特に次のような恩恵が存在します。

  • これまで解決できなかった依存関係でも諦めずに別案を提示してくれる
  • リリース間のアップグレード時に新規インストールとの差異が小さくなる
  • autoremove時にこれまで意図せず残っていたパッケージも削除
  • 依存関係解決の高速化

solver3については、APTの開発者のブログも参考になります。

履歴の管理とロールバックに対応

aptによる操作履歴をトランザクションとして、コマンドからも管理できるようになりました。これはhistory-FOOコマンドとして実装されています。

  • history-list:履歴の表示
  • history-info:操作の詳細表示
  • history-undo:操作を元に戻すUndo機能
  • history-redo:操作をやり直すRedo機能
  • history-rollback:特定の履歴へのロールバック

順番に見ていきましょう。まずhistory-listはこれまでに行ったaptの操作をすべて一覧表示できます。

$ apt history-list
ID  Command line             Date and Time          Action    Changes

0   apt-get --yes -oDebug... 2026-04-23  01:16:08   Install   1310
1   apt-get --yes -oDebug... 2026-04-23  01:28:06   Purge     47
2   apt-get --quiet --ass... 2026-05-12  02:04:04   I,R       16
3   apt-get --quiet --ass... 2026-05-12  02:04:13   I,U       15
(snip)
25  install openssh-server   2026-06-13  22:19:09   Install   4
26  /usr/bin/unattended-u... 2026-06-15  06:03:37   Upgrade   1

apt-getはおおよそ手動で操作したときのログです。ただし0と1はインストール時のログである可能性が高いです。自動アップグレードは26のような「unattended」コマンドと表示されます。

個別に詳細を確認したいならhistory-infoを実行します。

$ apt history-info 25
Transaction ID: 25
Start time: 2026-06-13  22:19:09
End time: 2026-06-13  22:19:11
Requested by: shibata (1000)
Command line: apt install openssh-server
Packages changed:
    Install ncurses-term:amd64 (6.6+20251231-1, automatic)
    Install openssh-server:amd64 (1:10.2p1-2ubuntu3.2)
    Install openssh-sftp-server:amd64 (1:10.2p1-2ubuntu3.2, automatic)
    Install ssh-import-id:amd64 (5.11-0ubuntu4, automatic)

どのタイミングで何がインストールされ、何が削除されたかがわかるようになっています。これにより「そのときインストールしたものを削除する」ことも可能です。これがUndo機能です。

$ sudo apt history-undo 25
REMOVING:
  ncurses-term  openssh-server  openssh-sftp-server  ssh-import-id

Summary:
  Upgrading: 0, Installing: 0, Removing: 4, Not Upgrading: 0
  Freed space: 7,581 kB

Continue? [Y/n]

普通の削除と異なり依存関係などで同時にインストールしたパッケージも一緒にアンインストールしてくれます。逆にアンインストールの履歴にUndoすると、再インストールできます。たとえば上記のように25をUndoした処理が48として記録されていたら、48のUndoはopenssh-serverのインストールを意味するのです。

指定した履歴の処理をもう一度実施したい場合は、Redo機能を使います。

$ sudo apt history-undo 25

複数の履歴をまとめて特定の状態まで戻したい場合は、ロールバック機能を使います。たとえば次のような履歴だったとします。

46  /usr/bin/unattended-u... 2026-06-15  06:04:56   Upgrade   1
47  install hello            2026-06-15  23:40:35   Install   1
48  history-undo 47          2026-06-15  23:41:08   Remove    1
49  history-redo 47          2026-06-15  23:43:36   Install   1
50  install tio              2026-06-15  23:49:42   Install   1

この状態で履歴の46にロールバックすると、50から47までの操作を逆順に実行してくれます。つまりtioとhelloをインストールする前の状態になるのです。

$ sudo apt history-rollback 46
REMOVING:
  hello  tio

Summary:
  Upgrading: 0, Installing: 0, Removing: 2, Not Upgrading: 0
  Freed space: 323 kB

Continue? [Y/n]

ちなみにこれらの履歴管理機能は、ただの/var/log/apt/history.logのパーサーです。完全に「元に戻る」わけではなく、aptのインストールやアンインストールを、適切に再実行してくれるだけである点に注意してください。

また、history.logが流れてしまった過去には戻れません。

パッケージがインストールされた・されなかった理由の表示

依存関係解決エンジンの刷新によって、aptitudeにもあったwhy/why-notコマンドが実装されました。これは「そのパッケージがなぜインストールされているのか」⁠なぜインストールできないのか」を伝えてくれるコマンドです。

たとえばUbuntuなら必ずインストールされているvim-commonについて見てみましょう。

$ apt why vim-common
vim-common:amd64=2:9.1.2141-1ubuntu4.3 is selected for install because:
1. ubuntu-minimal:amd64 is selected for install
2. ubuntu-minimal:amd64 依存 vim-tiny
3. vim-tiny:amd64 is available in versions 2:9.1.2141-1ubuntu4.3, 2:9.1.2141-1ubuntu4
   [selected vim-tiny:amd64=2:9.1.2141-1ubuntu4.3 for install]
4. vim-tiny:amd64=2:9.1.2141-1ubuntu4.3 依存 vim-common (= 2:9.1.2141-1ubuntu4.3)
For context, additional choices that could not be installed:
* In vim-tiny:amd64 is available in versions 2:9.1.2141-1ubuntu4.3, 2:9.1.2141-1ubuntu4:
  - vim-tiny:amd64=2:9.1.2141-1ubuntu4 is not selected for install

その理由が1-4にあげられています。

  1. ubuntu-minimalがインストールされた
  2. ubuntu-minimalはvim-tinyに依存している
  3. vim-tinyは複数のバージョンがあり、2:9.1.2141-1ubuntu4.3が選択された
  4. vim-tinyの当該バージョンはvim-commonに依存している

どういう理由でインストールされたかが詳らかになるため、⁠このパッケージはなぜインストールされているの?」を調査しやすくなるでしょう。

逆にwhy-notはなぜインストールできないかを説明します。たとえば第913回でも紹介したように、Ubuntu 26.04 LTSのcoreutilsはcoreutils-from-FOOを排他的にすることにより、各コマンドのシンボリックリンクの設定を切り替えられます。

つまりcoreutils-from-uutilsがインストールされた環境では、coreutils-from-gnuパッケージをインストールできません。

$ apt why-not coreutils-from-gnu
coreutils-from-gnu:amd64 is not selected for install because:
1. coreutils-from-uutils:amd64 is selected for install
2. coreutils-from-uutils:amd64 is available in version 0.0.0~ubuntu25
3. coreutils-from-gnu:amd64 競合 coreutils-from
   [selected coreutils-from-uutils:amd64=0.0.0~ubuntu25]

why-notはパッケージの依存関係の結果としてうまくインストールできない場合の調査に使えます。

カラー設定をカスタマイズ可能に

aptコマンドの結果が、よりカラフルになりました。たとえばパッケージのインストール時や更新時は次のような色になります。

  • パッケージのアップグレードやインストールは緑色
  • パッケージのダウングレードは黄色
  • パッケージの削除は赤色

同様にパッケージ操作時の表示される項目がもう少し構造化され、読みやすくなりました。

図2 パッケージインストール時の表示が少し見やすくなった。左がUbuntu 26.04 LTSで、右が少し古いがUbuntu 22.04 LTS

表示色はapt.confで設定変更可能です。詳しい設定方法はman apt.conf「Color」を検索してください。また環境変数APT_NO_COLORや、--no-colorオプションを付けると一時的にカラー表示を無効化できます。

ちなみにスーパー牛さんパワーも最初からカラー表示に対応しました。マントが赤くなり、草原が緑色になっています。

図3 スーパー牛さんパワーも総天然色に!

「最初から」なのは、実は昔からapt -o APT::Moo::Color=1 moo mooと実行すれば、カラー表示してくれていたからです。設定しなくても色付きで表示されるようになったのが、新しいaptの特徴と言えるでしょう。

ページャーの対応

aptコマンド実行時に、自動的にページャーを使うようになりました。これは「apt search」のように画面が流れてしまうコマンドで便利です。

図4 apt showでも情報量が多いとページャーを使う。Depends行などは折り返さずに表示されてしまって不便

ただしページャーのオプションがless -FRSXMKになっています。特に-SがついているためにDependsフィールドのような横に長い行が、上記の図のように折り返さずに表示されてしまいます[3]

一時的に無効化したいなら、ページャーで-Sと入力してください。恒久的に変更したい場合は、環境変数を次のように設定すると良いでしょう。

$ export APT_PAGER="less -+S"

もしくはapt.confでVersion::3.0::Pagerを0に設定すると、ページャーそのものを使わなくなります。LESSやLVなどの環境変数も参照してくれるようなので、そちらを活用する手もあります。

UIの固定化に対応

aptコマンドの実行結果をパイプに渡そうとすると、これまで次のような警告が標準エラー出力に表示されていました。

$ apt search neovim > /dev/null

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

これはaptコマンドのUIを頻繁に変える可能性があったことによる警告です。たとえばaptをパイプに渡して、その内容から別の処理をするようなスクリプトを作ってしまうと、次のバージョンでスクリプトが動かなくなる可能性もあります。そこでインターフェースが安定していないことを明示するために警告を出していました。基本的にはパイプするケースなら、apt-getやapt-cacheを使っていたはずです。

新しいaptでは--cli-versionオプションが提供され、特定のバージョンのUIを再現できるようになりました。このオプションを指定した場合は、上記のような警告は出ません。

$ apt search --cli-version 3.2 neovim > /dev/null
(標準エラー出力には何も出ない)

たとえば1.0を指定すると、ソートされなかった頃の検索結果が表示されます。

$ apt search --cli-version 1.0 neovim | head
dh-vim-addon - debhelper addon to help package Vim/Neovim addons
hx - modal CLI text editor Helix
interception-caps2esc - interception plugin for dual function Esc/Ctrl key at CapsLock
neovim - heavily refactored vim fork
neovim-alpha - Customizable startup screen plugin for Neovim
neovim-autopairs - Autopair plugin for Neovim
neovim-gitsigns - Git integration for buffers in Neovim
neovim-gruvbox - Gruvbox Colorscheme for neovim
neovim-indent-blankline - Indentation guides for Neovim
neovim-lualine - fast and light statusbar for neovim

apt固有の便利なサブコマンドが増えたこともあって、今後はaptコマンドをスクリプトで活用したいケースも増えてくることでしょう。ちなみにより新しいaptでは、--cli-versionを使えるようになったため、警告そのものが削除されたようです。

一部の人には気になる機能

他にも便利な機能の追加や挙動の変更が行われています。

  • 古いsources.listを、deb822形式に変換するmodernize-sourcesサブコマンド
  • GnuTLSではなくOpenSSLを利用するように変更
  • GnuPGではなくSequoia-PGPを利用するように変更
  • FTP/RSH/SSHメソッド対応の削除
  • Include/Excludeオプションで特定のリポジトリからインストールできるパッケージをコントロールできるように

新しい依存関係解決エンジンの導入とともに、最近のaptはいつも以上に活発な開発と機能追加が続いています。次のリリースでも、より便利になっていることでしょう。

おすすめ記事

記事・ニュース一覧