Linux の標準規格である FHS( Filesystem Hierarchy Standard )を参考にしています。

概要

  • /usr/bin/
    • apt でインストールしたバイナリは、通常 /usr/bin に配置されます
    • /usr/bin のバイナリは apt(dpkg)の管理対象です(apt upgradeapt install による更新、apt remove による削除の対象)
    • 通常のユーザーが apt を通さずに直接触ることはありません
  • /usr/local/bin
    • apt を使わずにインストールしたバイナリ(make install でインストールしたもの、GitHub で配布されているバイナリなど)は、/usr/local/bin に配置します
    • apt 以外でインストールしたバイナリが自動で /usr/local/bin に置かれるとは限りません。明確な意図がない限り、慣習的に /usr/local/bin に置きます

[!NOTE] apt update はパッケージの一覧を更新するだけで、バイナリは更新しません。バイナリを更新するのは apt upgrade / apt install です。

apt でインストールしたバイナリの配置先は /usr/bin だけではありません。パッケージによって次の場所にも配置されます。

  • /usr/sbin(システム管理用のバイナリ)
  • /usr/lib/...(ライブラリや内部用のバイナリ)
  • /opt(一部のサードパーティ製パッケージ)
  • snap でインストールしたものは /snap/bin

注意点

/usr/local/bin への配置は「手動」が基本

apt を使わない場合は「自動でそこに配置される」わけではなく、インストール工程(スクリプトや手順書)がそこを指定しているだけです。

  • make install の場合: ソースコードの Makefile に PREFIX=/usr/local と書かれていることが多いため、結果としてそこにコピーされます
  • GitHub のバイナリ: ユーザーが手動で mv コマンドを使い、/usr/local/bin に移動させるのが一般的です

なぜ /usr/local/bin なのか

/usr/bin/foo に自作のバイナリを置くと、後日 sudo apt install foo を実行した際に、その自作ファイルが apt に上書きされるおそれがあります。

/usr/local/ 配下は、Debian / Ubuntu のポリシーで パッケージがファイルを置いてはいけない場所(管理者のために空けてある場所)です。このため、apt の管理対象外で、apt や apt upgrade によってファイルが上書き・削除されることはありません。OS をアップグレードしても消えません。

[!NOTE] /usr/local/bin のバイナリは残りますが、OS のアップグレードでライブラリが更新されると、自前でビルドしたバイナリが動かなくなる場合があります。アップグレード後に動作を確認してください。

$PATH の優先順位

Ubuntu の既定の PATH/etc/environment)は、次の順にコマンドを探します。

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

つまり /usr/local/bin/usr/bin よりに見られます。例えば OS 標準の python3/usr/bin)があっても、/usr/local/bin に別の python3 を入れると、設定を変えずにそちらが優先されます。

[!WARNING] 同名のコマンドを /usr/local/bin に置くと、意図せず OS 標準のコマンドが隠れます。特に python3 などは、他のツールの動作に影響する場合があります。どちらが実行されるかは which -a python3type -a python3 で確認できます。

[!NOTE] sudo は、sudoers の secure_path に設定された PATH を使います。対話シェルの PATH と異なる場合があります。

/bin と /usr/bin

Ubuntu 24.04 では、/bin/usr/bin へのシンボリックリンクです(/sbin/usr/sbin/lib/usr/lib。merged-usr)。22.04 でも、新規インストールでは同様です。

sbin (System Binaries)

システム管理のために使うバイナリです。root(スーパーユーザー)が使うことが多く、通常のユーザーの操作用ではありません。

種類 役割 主な内容
bin (Binaries) 全ユーザーが日常的に使うコマンド ls, cd, grep, python3, git
sbin (System Binaries) システム管理用のコマンド fdisk(ディスク操作), iptables(ファイアウォール), reboot

/usr/local/sbin と /usr/sbin の違い

  • /usr/sbin: apt でインストールされた、システム管理用のツール
  • /usr/local/sbin: 管理者が手動(ビルドや直接配置)で入れた、システム管理用のツール