July 6, 2025

asdfをLinuxの全ユーザーで使う

いろんなツールのバージョンマネージャの asdf は、個人が占有するPCでユーザーのホームディレクトリにインストールして使うもの。
WindowsやmacOSは個人が占有して使うことが多い気がするけど、Linuxは複数ユーザーで使うこともある。
ユーザー毎にホームディレクトリにインストールするのもなんだかなーと思ったので、全ユーザー用にシステムワイドにasdfを使う方法を考えてみた。

確認のために用意した環境

Debian 12を最小セットアップしたマシン

asdfを全ユーザー用にインストール

  1. 必要なパッケージを追加
    $ sudo apt update
    $ sudo apt install curl git acl
    
  2. 同じ名前のファイルが無いことを確認。
    $ ls -l /usr/local/bin/asdf
    ls: '/usr/local/bin/asdf' にアクセスできません: そのようなファイルやディレクトリはありません
    
  3. asdfインストール
    asdfはv0.16.0でGoで書き直されてバイナリファイルが1つだけなので、https://github.com/asdf-vm/asdf/releases から自分のOS、アーキテクチャのファイルをダウンロードして展開するだけ。
    AMD64のv0.18.0の例:
    $ curl -OL https://github.com/asdf-vm/asdf/releases/download/v0.18.0/asdf-v0.18.0-linux-amd64.tar.gz
    $ sudo tar xzf ~/asdf-*.tar.gz -C /usr/local/bin
    $ $ asdf version
    v0.18.0 (revision 2114f1e)
    
  4. asdf設定
    1. asdf用の各種プラグインのインストール先ディレクトリ作成
      あるグループに属するユーザーは全員読み書きしたいのでSGIDビットを立てる
      $ sudo mkdir -m 2775 /opt/asdf
      
    2. ここではグループをadmにするけど、もちろん新規に専用グループを作っても構わない
      $ sudo chgrp adm /opt/asdf
      
    3. 新規作成されるファイルやディレクトリは、admグループが読み書きできるようにしたい
      umaskでは実現できないのでACLを使う
      $ sudo setfacl -d -m g:adm:rwx /opt/asdf
      
    4. 全ユーザー用に環境変数をセットする
      /etc/profile.d/asdf.sh を新規作成する、中身はこんな感じ
      export ASDF_DATA_DIR="/opt/asdf"
      export PATH="$ASDF_DATA_DIR/shims:$PATH"
      
  5. /etc/bash.bashrc に以下を追記してasdf コマンドを上書きする
    asdf install中に実行されるtarinstallコマンドはACLを無視するようで、グループの書き込み権が落ちてしまう。
    asdf install実行後にsetfaclで再度書き込み権を付与する。
    asdf() {
      if [ "$1" = "install" ]; then
        echo "'sudo setfacl' の実行権限を確認..."
        if sudo -l setfacl >/dev/null 2>&1; then
          echo "'asdf install' を実行します。"
          command asdf "$@"
          local exit_code=$?
          if [ $exit_code -eq 0 ]; then
            local plugin_name=$2
            local version=$3
            if [ -n "$plugin_name" ] && [ -n "$version" ]; then
              local install_path
              install_path=$(command asdf where "$plugin_name" "$version")   
              if [ -d "$install_path" ]; then
                echo "グループに書き込み権を付与します。"
                sudo setfacl -R -m mask::rwx "$install_path"
              fi
            fi
          fi
          return $exit_code
        else
          echo ""
          echo "------------------------------------------------------------------"
          echo "エラー: このユーザーには 'sudo setfacl' を実行する権限がありません。"
          echo "     'asdf install' を実行できませんでした。"
          echo "------------------------------------------------------------------"
          return 1
        fi
      else
        command asdf "$@"
      fi
    }
    
  6. SSHを入り直すか、exec $SHELL -l でシェルを読み直す

あとは公式ドキュメントのとおりに各種プラグインを入れていけばいい。
asdf set HOGE latest 等でそれぞれのプラグイン毎にインストールしたバージョンを指定するのはユーザー毎に実施する。

© 2020 nissy-lab.com