106
Help us understand the problem. What are the problem?

posted at

updated at

重要なのに忘れがちなapt関係のコマンドのメモ

いい加減にapt-getからaptに乗り換えようと思った

 Linux(Ubuntu)やラズパイ(Raspberry Pi OS)でよく使う、パッケージ管理コマンドのapt。今まで、互換性を重視して基本的にapt-getを使うようにしてきました。ただ、Ubuntuは6年前の14.04から、Raspberry Pi OSもRaspbian Jessieからaptコマンドが使えるようになったので、そろそろ互換性の問題が起こることもよほど無いだろうと思いaptコマンドに乗り換えることにしました。

 というわけで、apt-getaptの違いと忘れがちなaptコマンドとかを備忘録がわりにまとめておきたいと思います。随時更新していきます。

apt-getaptの違い

 そもそもaptが何で、apt-get(apt-cache)と何が違うかというと、以下くらいのようです。

  • aptは新しいパッケージ管理コマンドで apt-getapt-cacheが統合したもの
  • aptはプログレスバーがついて進捗がわかりやすい
  • upgradeのときaptよりapt-getの方が条件が厳しい(慎重)

 あんまり使い手側が意識する必要はないですね。apt-cacheも古いからaptを使うようにした方がよいのと、aptはプログレスバーが出るのでちょっとカッコいい(?)くらいでしょうか。コマンドの対応表を最後の方にのっけたのでそちらも参考にしてみてください。

 他パッケージインストールするコマンドで似たものにaptitudesnapといったものがあります。aptitudeaptと似た外部パッケージですが、基本的に積極的に使用する必要はないと思います。snapaptがdebパッケージをインストールするのに対して、snapsnapパッケージをインストールします。仕組みの詳細は割愛しますがsnapパッケージはクリーンにインストールしやすく、aptとも共存可能なので、パッケージによってはsnapを選択するのも良いかと思います。

aptコマンド基本

 パッケージのリストをアップデートして、インストールするのが基本ですね。<package>のところは、対象のパッケージの名前を入れてください。

$ sudo apt update
$ sudo apt install <package>

 インストールするとき、いちいち Yes or Noを聞かれるのが嫌な場合(特にスクリプトで自動化したい場合)は、以下のように-yオプションをつけましょう。-yの位置はinstallの前でも後ろでもOKです。

$ sudo apt -y install <package>

 ログを極力表示させたくないときは-qqオプションを使います。

$ sudo apt -qq update
$ sudo apt -qq install <package>

 ログを全く表示させたくないときは、コマンドの後に> /dev/null 2>&1をつける。これはapt以外のコマンドでも使える。

$ sudo apt update > /dev/null 2>&1
$ sudo apt install <package> > /dev/null 2>&1

パッケージのバージョン一覧確認

 インストール可能なパッケージのバージョンの一覧の確認方法です。<package>のところは、対象のパッケージの名前を入れてください。

$ apt list -a <package>

 インストール済みのパッケージのバージョンを確認する方法は、正確にはaptコマンドではないですがapt-show-versionsというパッケージを使う方法があります。

$ apt-show-versions <package>

 apt-show-versionsがインストールされていなかったら、以下コマンドでインストールしましょう。

$ sudo apt-get install apt-show-versions

 もしくは、以下のようにdpkgコマンドでも確認できます。

$ dpkg -l <package>

 ついでですが、aptでインストールしたパッケージのインストール場所を知りたい場合は、以下のように-Lオプションを使います。

$ dpkg -L <package>

自動更新を止める

 パッケージの更新を止める場合は以下です。

$ sudo apt-mark hold <package>

 使うのは、例えばCUDA関係とかですかね。ついでに、aptではないですがカーネルの自動更新を止める方法は以下です。

$ sudo dpkg-reconfigure --priority=low unattended-upgrades

 続いて出てくる画面で「自動的に安定版の更新をダウンロードしてインストールしますか?」というようなことが聞かれるので「いいえ」を選択すれば自動更新を止められます(「はい」にすると、自動で更新されます)。

 実際に設定されるのは以下のファイルです。

/etc/apt/apt.conf.d/20auto-upgrades

 手動で設定したい場合は、以下の通りに0に設定することで自動更新を停止できます(1にすると自動更新します)。

APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Unattended-Upgrade "0";

aptコマンドとapt-get/apt-cacheコマンドの対応表

 代表的なコマンドの対応表を載せます。apt-getapt-cacheを使っている人はaptコマンドへ置き換えを進めると良いのではないかと思います。

apt apt-get/apt-cache/dpkg 内容
sudo apt update sudo apt-get update パッケージリストの更新
sudo apt install <package> sudo apt-get install <package> パッケージのインストール
apt search <package> apt-cache search <package> パッケージの検索
sudo apt remove <package> sudo apt-get remove <package> パッケージの削除
sudo apt remove --purge <package> sudo apt-get remove --purge <package> パッケージの完全な削除
sudo apt upgrade sudo apt-get upgrade パッケージの更新(apt-getの方が慎重)
apt list -a apt-cache policy <package> バージョンの一覧確認
apt list --installed dpkg -l インストールされているパッケージの一覧表示

スクリプトではファイルではaptでなくapt-getが推奨

 もうこれで完全にapt-getからaptに乗り換えられますね。といいたいところですが、aptのマニュアルを読むと、ユーザーが使う場合はaptが推奨ですが、スクリプトに関してはなんとapt-getが推奨のようです。

All features of apt(8) are available in dedicated APT tools like apt-get(8) and apt-
cache(8) as well. apt(8) just changes the default value of some options (see apt.conf(5)
and specifically the Binary scope). So you should prefer using these commands (potentially
with some additional options enabled) in your scripts as they keep backward compatibility
as much as possible.

Ubuntu aptのマニュアルより引用

 bashのスクリプトの他、Dockerfile等もDocker ドキュメントをみたところaptでなくapt-getが推奨されているのは、これが理由のようですね。

 全部aptに置き換えたいのに、紛らわしいです…

まとめ

 apt関係の情報をまとめました。apt-getaptを正しく使い分けていきましょう。

関連ページ

参考

変更履歴

  • 2022/02/10 スクリプトに関しての注記を追記
  • 2021/07/23 コマンド追加
  • 2020/11/27 Dockerfileに関して追記
  • 2020/11/04 基本コマンドと対応表を追記

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
106
Help us understand the problem. What are the problem?