FreeBSD で ports を使う

pkg だけでは要件を満たせなければ使います。

前提条件


ports ツリーの管理

ports ツリーの展開

# portsnap fetch extract

ports ツリーの更新

# portsnap fetch update

ports 管理用 portupgrade のインストール

# pkg install portupgrade

pkg のリポジトリを latest にする

ports ツリーと乖離しないように。

# mkdir -p /usr/local/etc/pkg/repos
# echo "FreeBSD: { enabled: no }" > /usr/local/etc/pkg/repos/FreeBSD.conf

/usr/local/etc/pkg/repos/latest.conf

latest: {
    url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
    mirror_type: "srv",
    signature_type: "fingerprints",
    fingerprints: "/usr/share/keys/pkg",
    enabled: yes
}

ports からパッケージをインストールする

# portinstall [package name]

ports からパッケージをアップデートする

通常アップデート

# portupgrade [package name]

緊急アップデート

緊急セキュリティフィックスでパッケージをアップデートしたくても、 ports の更新が追い付いていない場合があります。 その場合は、ports のインストールバージョンを適宜変更してアップデー トします。

tomcat 8.0.36 から8.0.37 へアップデートする例

# cd /usr/ports/www/tomcat8
# cp -p Makefile Makefile.orig
# cp -p distinfo distinfo.orig
# cat Makefile.orig | sed 's/8.0.36/8.0.37/' > Makefile
# cat distinfo.orig | sed 's/8.0.36/8.0.37/' > distinfo
# make DISABLE_SIZE=yes fetch
# portupgrade -m NO_CHECKSUM=yes tomcat8

ports をまとめてアップデートする

アップデートが必要なパッケージをチェックするため、 以下のスクリプトを実行します。

#!/bin/sh

pkg version -l '<' | awk 'BEGIN { printf("#!/bin/sh\n\n"); }{ printf("portupgrade %s\n", $1); }' > portupgrade.sh
chmod 700 portupgrade.sh

一括でアップデートします。

# ./portupgrade.sh

ロックしているパッケージのアップデート

FreeBSDでは通常のpkgとは異なるオプションでインストールしたportsは pkg upgradeで不用意に置き換えられないようにロックしておきますが、 それを手動でロックを外してportupgradeするのは面倒なのでスクリプト で一括アップグレードします。
いま稼働していてアップグレードしたくないパッケージはEXCLUDESに書い て除外します。

#!/bin/sh

EXCLUDES="ja-wordpress-4.9.4"
PKGS=`pkg lock -l | grep -v 'Currently locked packages:'`

for pkg in $PKGS
do
    for excl in $EXCLUDES
    do
        if [ "$pkg" = "$excl" ]; then
            echo "$pkg excluded"
        else
            echo "pkg unlock -y $pkg"
            pkg unlock -y $pkg
            echo "portupgrade $pkg"
            portupgrade $pkg
            echo "pkg lock -y $pkg"
            pkg lock -y $pkg
        fi
    done
done

参考