作成開始 : 平成22年12月05日(日) 最終更新 : 平成22年12月18日(土)

Portsの管理 (FreeBSD 8.1 RELEASE)


FreeBSD ハンドブック を参照するとよいです。

FreeBSDには、コンパイル済みのアプリケーションを利用する「packages」と、ソースから使用しているマシンの環境に合わせてコンパイルする「ports」を利用する二つの方法があります。
それぞれ長所・短所があるので環境に応じて利用するとよいでしょう。

私のこの非力なPCだと、例えば ports からコンパイルすると膨大な時間がかかりそうなもの(XorgとかGnomeとか)は、「packages」でインストールした方がいいです。
ApacheとかSambaとかネットワーク系のツールは頻繁にセキュリティ更新とかありますので、それの最新バージョンを導入したりまた、コンパイル時にパラメータを渡して希望にあったオプションを導入したい時は 「Ports」を利用すればいいと思います。

ただ、CF-IDE変換アダプタとCFカードの実験で使った環境では、OSインストール時に「Ports」を導入しましたが、Xorgとgnomeを導入したためディスク容量が非常に少なくなってしまいました。

/usr の使用率が 97% となりこのままでは ports は使えません。
ports colection はディフォルトインストールで約417MBあるらしいです。
作業領域とかも指定することにします。
ディフォルトの場所(/usr/ports)を変更して ports を利用する方法が見つかったので 検証で使った 2G の CFカードをCF-IDE変換アダプタの slave 側にさして活用することにします。


1.CFカード(slave)に領域作成

まずは、認識できているか確認してみます。

ssh でログインし /usr/sbin/sysinstall です。

 ↑
Main Menu から 「Configure」を選択します。

 ↑
FreeBSD Configuration Menu から「Fdisk」を選択します。

 ↑
Select Drive(s) で ad1 で認識していました。

 ↑
「A」でディスク全体を使用するようにして、「Q」で終了します。

 ↑
ブートマネージャはいらないので「None」を選択します。
Select Drive(s) に戻るので「Cancel」で抜けます。FreeBSD Configuration Menuに戻ります。

 ↑
「Label」を選択します。

 ↑
Select Drive(s) で ad1 を選択します。

 ↑
次のようにしてみます。
640MBをWebコンテンツ用(/usr3)
残りをports用にしてみます。(/usr2)
「C」で新規にパーティションを作成し、「W」で書き込み「Q」で終了します。

 ↑
Select Drive(s) に戻るので「Cancel」で抜けます。FreeBSD Configuration Menuに戻ります。
「Exit」を選択します。Main Menuに戻ります。

 ↑
「Exit Install」を選択して終了です。
この時点で /etc/fstab を見ると /usr2, /usr3 が書かれていませんでした。
もしかしたら、OS再起動してもマウントできていないかも・・・・

OSを再起動してみます。

やっぱりマウントできませんでした。なので、もう一度パーティションを作成し直し(マウトポイント指定)、/etc/fstab を次のようにしてOSを再起動したらOKでした。

2.Ports Colection の移動

FreeBSD 日本語マニュアルによると、次の環境変数が /etc/make.conf で設定できるようです。
PORTSDIR port ツリーの場所を指定します。
これは、FreeBSD と OpenBSD では、/usr/ports で、NetBSD では、/usr/pkgsrc です。

WRKDIRPREFIX 一時ファイルを作成する場所(作業領域)です。PORTSDIR が読み込み専用の場合 (おそらく CD-ROM をマウントした場合) 有用です。

DISTDIR distfile を探す場所であり、取得した distfile を置く場所で す。通常は、PORTSDIR の下の distfiles/ です。
/usr/ports を /usr2 の下に移動して使用してみます。以下のコマンドで移動します。
fmv645# mv /usr/ports /usr2

 ↑
こんなんなりました。
そして、/etc/make.conf に以下を追加する。
PORTSDIR=/usr2/ports
WRKDIRPREFIX=/usr2/ports/tmp ・・・・・・これは tmp を mkdir で作ります。
DISTDIR=/usr2/ports/distfiles

3.Portsの更新

Portsを管理するには、csupを使う方法とportsnapを使う方法があります。
ここでは、csupを使う方法で管理してみたいと思います。
csupcvsup の機能を一部置き換えるようなもので,最近の FreeBSD には標準で含まれているとのことです。
/usr/local/etc/csup に設定ファイルを置いて作業してみましょう。
fmv645# mkdir -p /usr/local/etc/csup
fmv645# cd /usr/local/etc/csup
fmv645# cp /usr/share/examples/cvsup/ports-supfile .
次は、コピーした ports-supfile を編集します。
*default host=CHANGE_THIS.FreeBSD.org
    ↓
*default host=cvsup.jp.FreeBSD.org

CVS サーバーを指定します。近くのサーバーを指定しましょう。
国内の他の CVS サーバーは他にcvsup2からcvsup6まで存在します.相手先の負荷の状況によって適切に選択します。
*default base=/var/db
    ↓
*default base=/usr2/db

mkdir /usr2/db で作成しました。

“base” ディレクトリと呼ばれる場所に、ある status ファイルを維持しています。すでに受け取った更新情報を追従し続けることで、 これらのファイルは CVSup がより効果的に動作することを支援します。
package に関するすべての情報は /var/db/pkg ディレクトリ以下に置かれています。 このディレクトリの下にあるファイルの中に、インストールされたファイルの一覧やインストールされた各 package についての説明が含まれています。
*default prefix=/usr
 ↓
*default prefix=/usr2/src
cvsup に受け取ったファイルをどこに置くかを伝えます。
これも、/usrではなくPorts用に確保した /usr2 に mkdir /usr2/src として作成しました。
*default compress
 ↓
#*default compress  (コメントアウトします)

圧縮データの転送を無効化する場合は コメントアウトします.
利用している計算機のネットワーク回線の帯域が十分に広く,圧縮を行うことが相手先の CVS サーバーへの負荷になると思われる場合,圧縮を無効化した方が良いでしょう。
次に, ports ツリーの内のいくつかの更新を行わない場合は /var/db/sup/refuse という設定ファイルを利用します.例えば,以下の内容を記述することで日本語以外の多国語対応の ports の更新を抑制できます。
この環境では、/usr2/db/sup/refuse になります。
ports/arabic
ports/chinese
ports/french
ports/german
ports/hebrew
ports/hungarian
ports/korean
ports/polish
ports/portuguese
ports/russian
ports/ukrainian
ports/vietnamese
/etc/make.confに以下の記述を追加します。
SUP_UPDATE = yes
SUP = /usr/bin/csup
SUPFLAGS = -g -L 2
SUPHOST = cvsup.jp.freebsd.org
PORTSSUPFILE = /usr/local/etc/csup/ports-supfile
この記述を追加し,以下のようにすることでportsを最新版に更新できます。
fmv645# cd /usr2/ports
fmv645# make update
・・・と思って実行したら以下のメッセージで止まってしまった。
/usr2: create/symlink failed, no inodes free
Updater failed: Cannot create directories leading to "/usr2/src/ports/devel/cvsgraph/files/patch-cvsgraph.c": No space left on device
*** Error code 1

 ↑
なんてこったい、i-nodeを使い切ってしまったよ。
inode密度 ディフォルト値 : 2048 (最小値 : 1024 -> これで newfs してみよう)

※iノード数は「ファイルシステムサイズ(バイト) ÷ iノード密度= iノード数」という計算式で決定されるため、iノードを増やしたい場合は「iノード密度」の値を小さくしていきます。

全てのディレクトリとファイルを一旦退避します。(ファイルシステムの再構成を行うため)

  fmv645# newfs -i 1024 /dev/ad1s1e

  ※/や/varといったシステム領域は、OSが起動している状態では再構築できません。
   OSのCD/DVD-ROMからいったん起動させてから作業を行ってください。・・・とのことです。

あれ?

  newfs: /dev/ad1s1e: failed to open disk for writing ・・・だって!

コマンドでは、どうしてもうまくいかなかったので、以下の方法をしました。

・/etc/fstab で /usr2, /usr3 の記述を外し OS リブート
・/usr/sbin/sysinstall の Label で /dev/ad1s1d は /usr3 へマウント、/dev/ad0s1e を一旦 Delete そして /usr2 として Create して Newfs Option に -i 1024 をセットし Write しました。
・/usr/sbin/sysinstall を終了し df -i で確認すると iノード数が増えていました。
・/etc/fstab に /usr2, /usr3 の記述を追加し OSリブートしました。

その時の状態は下記のとおりです。
気を取り直して続きをします。
退避していたデータを戻します。
そして、以下のコマンド実行します。

fmv645# cd /usr2/ports
fmv645# make update
今度はうまくいったようです。約30分かかりました。実施後のディスク情報です。

 ↑
ありゃー /usr2 の使用率が 96% で残り 40MB になっちゃった。やっぱり CFカード購入した方がよかったかな?
やっぱり ports から samba3 をインストールしようとして /usr2 が一杯になってしまいました。
なので、手持ちのUSBメモリを挿入してマウントし /usr4 としてそこに /usr2/ports, /usr2/db, /usr2/src を移動しました。
それに伴って上記の各設定を変更しました。

戻る

サイトトップへ