FreeBSD Ports Collection からユーザ権限でインストール

ぐだぽよー、おきなわです。

最近、一ユーザとして利用しているサーバにて、いろいろソフトをインストールしたくなり、root 権限を使えなくても ports を利用出来るように設定しました。今後また同じことをしたくなった時のために、今回やったことをメモっておきたいと思います。

やりたい事

FreeBSD サーバにて、root 権限を持っていなくても Ports からソフトウェアをインストールできるようにしたい。

設定手順

以下のサイトを参考にしました。

otsune’s FreeBSD memo :: ユーザー領域にFreeBSD portsをインストールする方法

設定ファイルの作成

まず ports のインストール先などを環境変数の指定により変更します。

僕は .bash_profile に以下の用に環境変数を記述しました。


# setting for ports to install by user privileges
export __MAKE_CONF=/dev/null
export INSTALL_AS_USER=yes
export PREFIX=${HOME}/usr/local
export LOCALBASE=${HOME}/usr/local
export PKG_DBDIR=${LOCALBASE}/var/db/pkg
export PORT_DBDIR=${LOCALBASE}/var/db/pkg
export DISTDIR=${LOCALBASE}/tmp/dist
export WRKDIRPREFIX=${LOCALBASE}/tmp/work
export PORTSDIR=${HOME}/usr/ports
export PKGTOOLS_CONF=${LOCALBASE}/etc/pkgtools.conf
export DEPENDS_TARGET='install clean'
export LDCONFIG="/sbin/ldconfig -f ${LOCALBASE}/var/run/ld-elf.so.hints -i -R ${LOCALBASE}/etc/ld-elf.so.conf"
export LD_LIBRARY_PATH=${LOCALBASE}/lib
export LD_RUN_PATH=${LOCALBASE}/lib
export PATH=${LOCALBASE}/bin:${LOCALBASE}/sbin:${PATH}
export MANPATH_MAP="${LOCALBASE}/bin ${LOCALBASE}/man"
# enable .bashrc
source ~/.bashrc

view raw

.bash_profile

hosted with ❤ by GitHub

なお、各環境変数やその値の示す意味は以下の通りです。

(説明は ports/Mk/bsd.port.mk 等を参考にしています。)

  • __MAKE_CONF : make コマンドを実行する際に参照する make.conf のパスを明示的に指定します。デフォルトでは /etc/make.conf を参照するため、そちらに環境変数の記述があるとその値を使用します。そのため、今回は /dev/null を指定してシステム全体での設定が記述されている make.conf を参照しないようにします。
  • INSTALL_AS_USER : root アクセスを利用せずに現在のユーザとしてインストールを行うために利用します。
  • PREFIX : ports からのファイルのインストール先を指定します。デフォルトでは USE_LINUX_PREFIX がセットされていれば ${LINUXBASE} を、されていなければ ${LOCALBASE} を適用します。
  • LOCALBASE : ports からのファイルのインストール先を指定します。デフォルトでは /usr/local です。
  • PKG_DBDIR : どのパッケージをインストールしたかの記録を保存する場所を指定します。デフォルトでは /var/db/pkg です。
  • PORT_DBDIR : port の設定オプションを保存する場所を指定します。デフォルトでは /var/db/ports です。
  • DISTDIR : ダウンロードしたソースコードの保管場所を指定します。デフォルトでは ${PORTSDIR}/distfiles です。
  • WRKDIRPREFIX : コンパイルなどを行う際に利用する一時的な作業用ディレクトリの場所を指定します。
  • PORTSDIR : ports tree のルートディレクトリを指定します。デフォルトでは /usr/ports です。
  • PKGTOOLS_CONF : pkgtools の設定ファイルの場所を指定します。
  • DEPENDS_TARGET : 依存する ports をインストールする際の挙動を設定します。デフォルトでは install です。
  • LDCONFIG : リンカに利用可能な共有ライブラリを伝えるための変数のようです。
  • LD_LIBRARY_PATH : 共有ライブラリの場所を指定します。
  • LD_RUN_PATH : プログラム実行時に利用する共有ライブラリの場所を指定します。
  • PATH : 実行可能なコマンド群の場所を指定します。
  • MANPATH_MAP : PATH にある各ディレクトリに対して、man ページファイルの検索パスに追加すべきディレクトリを一つづつ指定します。

なお、LD_RUN_PATH の LD_LIBRARY_PATH との違いですが、

LD_RUN_PATH で指定したパスは実行ファイルに埋めこまれますが、LD_LIBRARY_PATH はダイナミックリンカ ld-elf.so が利用します。コンパイル時に共有ライブラリの検索パスを指定するのが LD_RUN_PATH で、実行時に指定するのが LD_LIBRARY_PATH。

FreeBSD-users-jp 60135

らしいです。

必要なディレクトリやファイルの作成

設定ファイルに記述したディレクトリを作成します。

$ mkdir -p ~/usr/local/etc ~/usr/local/lib ~/usr/local/tmp/dist ~/usr/local/tmp/work ~/usr/local/var/db/pkg

ライブラリの場所を記述したファイルを作成します。

$ ldconfig -r | awk '/search/ {print $3}' | tr ":" "\n" > ~/usr/local/etc/ld-elf.so.conf
$ echo ${HOME}/usr/local/lib >> ~/usr/local/etc/ld-elf.so.conf

僕の環境の場合は

$ sysctl -n kern.osreldate

が実行出来たのでここまでですが、上記のコマンドが実行出来なかった場合は環境変数にさらなる追加記述が必要のようです。(ここでの記述はめんどくさいので省略します。参考元サイトの方にきちんと記述されていたため、そちらを参考にしてください。)

ports の展開

github にも公開されているため、そちらからダウンロードして来ても良いかもしれません。

freebsd/freebsd-ports · GitHub

$ git clone --depth 1 github:freebsd/freebsd-ports.git ~/usr/ports

もし既にシステム全体で使用している ports があるなら、そちらを利用した方が早いと思います。

.bash_profile に記述した環境変数のうち、PORTSDIR を記述しなければデフォルトの ports (/usr/ports)を利用します。

Let’s インストール

ここまでくればあとは通常通り

$ cd ~/usr/ports/editors/vim
$ make install clean

とかやるとインストールすることが出来ます。やったぜ!