序章

FreeBSDは、さまざまな役割で機能できる強力なオペレーティングシステムです。 このオペレーティングシステムを多くのシナリオで理想的な選択肢にしている理由の1つは、柔軟性に対する評判です。 この評判への大きな貢献は、ポートシステムとして知られているソースからソフトウェアをインストールするためのFreeBSDのサポートされた方法から来ています。

このガイドでは、ポートシステムの利点のいくつかについて説明し、それを使用して追加のソフトウェアを取得および管理する方法を示します。 makeコマンドを使用してインストールする方法、アプリケーションをカスタマイズする方法、およびいくつかの一般的なツールを活用してポートのメンテナンスを容易にする方法について説明します。

前提条件

このガイドに従うには、FreeBSD 10.1サーバーと、sudo権限を持つ非rootユーザーアカウントにアクセスできる必要があります。 このガイドは、FreeBSDサーバーにログインし、適切な作業環境をセットアップするのに役立ちます。

さまざまな種類のFreeBSDソフトウェアの管理

FreeBSDチームは、基本のFreeBSDオペレーティングシステムを一貫したユニットとして維持しています。 そのコンポーネントはfreebsd-updateと呼ばれるツールを使用して更新され、それらの動作は主に/etcディレクトリ内にある構成ファイルを介して制御されます。 バンドルされているソフトウェアの代替ソフトウェアをインストールして使用することはできますが、基本システムに含まれているものはオペレーティングシステムの機能的に不可欠な部分と見なされるため、簡単または安全に削除することはできません。

対照的に、オプションのソフトウェアは、ファイルシステム内のさまざまなプロセス、ツール、および場所を使用して管理されます。 基本システムのソフトウェアとは異なり、オプションのソフトウェアは/usr/local/etcディレクトリ内に構成されます。 FreeBSDは、追加のソフトウェアをダウンロードしてシステムにインストールするための2つの認可された方法を提供します。

このガイドで説明するポートシステムは、/usr/portsにあるファイルシステム階層によって管理され、FreeBSDが構築方法を知っている利用可能な各ソフトウェアを分類します。 このディレクトリ内の第1レベルのサブディレクトリは、主に機能または言語に従ってソフトウェアを分類します。 これらのディレクトリ内には、ソフトウェアの個々の部分ごとにフォルダが存在します。 ソフトウェアは、単純なmakeコマンドまたは使用可能なヘルパーユーティリティを使用して、ダウンロード、構成、コンパイル、およびインストールできます。 portsコレクションのソフトウェアには、FreeBSDシステムでアプリケーションをビルドして実行するために必要なすべてのパッチが含まれています。

システムでサポートされている他のタイプのインストールは、 packages です。これは、適切なデフォルトを使用して、portsコレクションからコンパイルされたソフトウェアバイナリです。 これはソフトウェアをすばやく入手するための優れた方法ですが、ポートシステムによって提供されるカスタマイズのレベルを失います。 ソフトウェアパッケージの管理方法について詳しくは、このガイドをご覧ください。

ポートツリーの準備

ポートツリーは、/usr/portsディレクトリの下に存在する階層の名前です。 この階層には、ポートカテゴリに対応するディレクトリが含まれ、その中には、個々のポートに対応する他のディレクトリがあります。

ポートの操作を開始する前に、この階層が最新であることを確認する必要があります。 ポート階層の更新を忘れると、ポートが有効でなくなった可能性のあるファイルをフェッチしてビルドしようとするため、ビルドが失敗する可能性があります。

portsnapというユーティリティを使用してポートツリーを更新できます。 このツールは、FreeBSDポートサーバーに変更を問い合わせます。

最後の更新をメモする

実際の更新コマンドを実行する前に、/usr/ports/UPDATINGと呼ばれるポートツリー内の特定のファイルのタイムスタンプをメモする必要があります。 statツールを使用して、ファイルに関連付けられているさまざまなタイムスタンプを確認できます。

stat -x /usr/ports/UPDATING

次のような出力が表示されます。

  File: "UPDATING"
  Size: 375337       FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (    0/    root)  Gid: (    0/   wheel)
Device: 0,81   Inode: 2011338    Links: 1
Access: Thu Dec 11 22:24:59 2014
Modify: Thu Dec 11 15:40:12 2014
Change: Thu Dec 11 22:24:59 2014

代わりに、次のようなエラーが発生する可能性があります。

stat: /usr/ports/UPDATING: stat: No such file or directory

これが表示された場合は、システムでポートツリーが初期化されていないことを意味します。 この場合は、次のセクションに進んで、portsnapを使用してシステムに初期ポートツリーを抽出する方法を学習してください。

注意したい値は、上記の出力で強調表示されている「変更」時間と「変更」時間です。 この場合、「変更」タイムスタンプは、ポートメンテナが重要な情報でファイルを変更した最新の時刻になります。 「変更」タイムスタンプは、ファイルがサーバーに最後に同期された時刻になります。

ポートツリーを更新した後、どの更新メモに注意を払う必要があるかを知るために、タイムスタンプを覚えておく必要があります。 次のように入力して、これらをホームディレクトリのファイルに保存できます。

stat -x /usr/ports/UPDATING > ~/last_update

この情報が記録されたので、先に進んでポートツリーを更新できます。

Portsnapを使用したPortsツリーの更新

ポートツリーが最後に更新されたのがいつかがわかったら、ポートツリーをFreeBSDプロジェクトのサイトからの最新情報と同期させることができます。 これを行うには、portsnapというツールを使用します。

/usr/portsディレクトリに情報がない場合(前のセクションで説明したエラーが発生した場合)、portsnapを使用してポートツリー全体をダウンロードしてそのディレクトリに抽出できます。 このプロセスにはかなりの時間がかかる場合がありますが、/usr/portsディレクトリが空の場合にのみ必要であり、この状況は1回だけ発生するはずです。 FreeBSDサーバーがDigitalOcean上にある場合、portsツリーはすでに初期化されているはずです。

sudo portsnap fetch extract

これにより、ポートツリー全体がダウンロードされて/usr/portsディレクトリに抽出されます。

/usr/portsディレクトリにすでにポートツリーが構築されている場合(前のセクションでタイムスタンプを記録できた場合)、次のコマンドを使用してファイルを最新バージョンに更新できます。

sudo portsnap fetch update

このコマンドは、/usr/ports構造内のファイルとは異なるファイルのみを抽出するため、コマンドのextractバリアントよりも大幅に短い時間で済みます。 これは、portsツリーの日々の更新で使用する必要がある形式です。

ポートツリーが構築または更新されると、システム上のポートの管理と操作を開始できます。

ポートツリーでアプリケーションを検索する

システムのポートツリー階層が更新されたので、使用可能なソフトウェアの確認を開始できます。 これを行うにはいくつかの方法があり、それぞれに利点があります。

whereisで検索

アプリケーションを検索する最も簡単な方法は、whereisコマンドを使用して名前で検索することです。 これにより、システム上およびポートツリー内でコマンドが検索されます。 一致するものが見つかると、システム上のアプリケーションに関連するパス情報が返されます。

通常、アプリケーションがインストールされていないが、有効なポートを検索した場合は、ポートツリー内のポートへのパスが返されます。 アプリケーションでインストールされている場合、通常は実行可能ファイルへのパス、ポート、および多くの場合manページを返します。

たとえば、次のように入力して、wgetユーティリティを検索できます。

whereis wget

ポートがインストールされていない場合は、次のように表示されます。

wget: /usr/ports/ftp/wget

パスは/usr/portsで始まるため、これがインストール可能なポートであることがわかります。 このポートをインストールする場合は、返されたパスを使用できます。

wgetコマンドがすでにインストールされている場合は、次のような出力が表示される場合があります。

wget: /usr/local/bin/wget /usr/local/man/man1/wget.1.gz /usr/ports/ftp/wget

これには、実際にインストールされた実行可能ファイルへのパス、アプリケーションのmanページファイル、およびポートツリー内のポートの場所が含まれます。

ファイルシステム階層でechoコマンドを使用して検索する

FreeBSDハンドブックでは、著者はechoコマンドとportsツリーの組み込み構造のみを使用して検索するかなり斬新な方法も提案しています。

ポートツリーは、/usr/portsディレクトリの下にあるすべての関連ファイルとディレクトリで設定されます。 ファイルシステムでは、各ポートは、FreeBSDシステムでソフトウェアをビルドおよびインストールするために必要なすべての情報を含む個別のディレクトリで表されます。

整理を支援するために、これらのポートは/usr/ports内のカテゴリディレクトリ内の機能ごとにグループ化されています。 したがって、上記のwgetの例では、wgetコマンドがftpグループに分類されていることがわかります。 したがって、/usr/portsディレクトリにはカテゴリディレクトリが含まれ、カテゴリディレクトリにはポートのディレクトリが含まれます。

echoコマンドとワイルドカードを使用することで、この一貫した構造を活用できます。 ポートが存在するカテゴリがわからない可能性があるため、そのディレクトリレベルをアスタリスクに置き換えます。 マッチングをより柔軟にしたい場合は、検索語の前後にこれらを配置することもできます。 したがって、次のように入力して、wget関連のプログラムを検索できます。

echo /usr/ports/*/*wget*

これにより、次のようなものが返されます。

/usr/ports/ftp/gwget /usr/ports/ftp/wget /usr/ports/www/ruby-wgettsv /usr/ports/www/wgetpaste

これは、完全一致を必要としないため、whereisコマンドよりも少し柔軟性があります。

利用可能なmakeターゲットを使用した検索

ポートを検索する最も強力な方法は、makeコマンドを使用することです。

これは、システムにポートを構築してインストールするために使用されるコマンドでもありますが、より一般的には、構成ファイルで定義された複雑なタスクを簡単に実行するために使用できる柔軟なツールです。 FreeBSD開発者は、さまざまな基準でポートツリーの検索を実行するmake「ターゲット」(タスク定義)を作成しました。

この機能を使用するには、最初にポートツリーのベースに移動する必要があります。 ここで、makeターゲットが定義されます。

cd /usr/ports

検索を実行するための一般的な構文は次のとおりです。

make [search|quicksearch] [searchtype]=[searchquery] [modifiers]

ポートツリーを検索するために設計された2つのmakeターゲットは、searchquicksearchです。 これらの機能はまったく同じですが、デフォルトの表示のみが異なります。

searchターゲットは、ポートの名前、ポートツリー内のパス、一般的な説明、およびメンテナの電子メール、ビルドの依存関係、実行の依存関係、アップストリームURLなどのビルドに関する詳細を返します。 quicksearchターゲットは、ポート名、パス、および説明のみを返します。

検索タイプは次のいずれかになります。

  • name :ポートの名前フィールド内でのみ検索します。
  • key :ポートの名前、コメント、および依存関係のフィールド内を検索します。
  • path :ポート階層内の特定のパスを検索します。
  • info :ポートのinfo(説明)フィールド内を検索します。
  • maint :メンテナのメールアドレスで検索します。
  • cat :ポートのカテゴリに基づいて検索します。
  • bdeps :各ポートのビルド時の依存関係を検索します。
  • rdeps :各ポートの実行時の依存関係を検索します。
  • www :ポートのWebサイトを検索します。

上記のカテゴリの前に「x」を追加して、一致する結果を削除することもできます。 たとえば、検索にxname=apacheが含まれている場合、名前フィールドに文字列「apache」が含まれているポートは返されません。

いくつかの簡単な例を見てみましょう。 以下に、searchターゲットとquicksearchターゲットの出力の違いを示します。 searchターゲットには、一致に関する完全な情報が含まれています。

make search name=htop
Port:   htop-1.0.3
Path:   /usr/ports/sysutils/htop
Info:   Better top(1) - interactive process viewer
Maint:  [email protected]
B-deps: autoconf-2.69 autoconf-wrapper-20131203 automake-1.14_1 automake-wrapper-20131203 gettext-runtime-0.19.3 indexinfo-0.2.2 libexecinfo-1.1_3 libffi-3.0.13_3 libiconv-1.14_6 m4-1.4.17_1,1 ncurses-5.9.20141213 perl5-5.18.4_11 python2-2_3 python27-2.7.9 readline-6.3.8
R-deps: libexecinfo-1.1_3 lsof-4.89.b,8 ncurses-5.9.20141213
WWW:    http://htop.sourceforge.net/

一方、quicksearchターゲットは、検出した一致に関する重要な情報のみを表示します。

make quicksearch name=htop
Port:   htop-1.0.3
Path:   /usr/ports/sysutils/htop
Info:   Better top(1) - interactive process viewer

さまざまな検索タイプを組み合わせて、結果を絞り込むことができます。 たとえば、ntopネットワークモニターを検索すると、次のような結果が表示される場合があります。

make quicksearch name=ntop
Port:   ntopng-zmq-3.2.3_1
Path:   /usr/ports/devel/ntopng-zmq
Info:   NTOPNG specific ZMQ library

Port:   diveintopython-5.4_1
Path:   /usr/ports/lang/diveintopython
Info:   Free Python tutorial book that is "not For Dummies(tm)"

Port:   ntop-5.0.1_8
Path:   /usr/ports/net/ntop
Info:   Network monitoring tool with command line and web interfaces

Port:   ntopng-1.2.1_1
Path:   /usr/ports/net/ntopng
Info:   Network monitoring tool with command line and web interfaces

Port:   sntop-1.4.3_1
Path:   /usr/ports/net/sntop
Info:   Monitor status of network nodes using fping

ここでは、ほとんどの結果がntopに関連していることがわかりますが、Pythonの学習に関する本もあります。 パス指定を追加することで、さらにフィルタリングできます。

make quicksearch name=ntop path=/net
Port:   ntop-5.0.1_8
Path:   /usr/ports/net/ntop
Info:   Network monitoring tool with command line and web interfaces

Port:   ntopng-1.2.1_1
Path:   /usr/ports/net/ntopng
Info:   Network monitoring tool with command line and web interfaces

Port:   sntop-1.4.3_1
Path:   /usr/ports/net/sntop
Info:   Monitor status of network nodes using fping

また、いくつかの異なる方法で検索の動作を変更することもできます。 いくつかの有効な修飾子は次のとおりです。

  • icase :大文字と小文字を区別しないようにするには、これを「1」に設定します。 これがデフォルトです。 検索で大文字と小文字を区別するには、これを「0」に設定します。
  • display :これには、出力に表示するための、コンマで区切られたフィールドのリストが含まれます。
  • keylim :検索(「キー」検索タイプを使用)を、表示されているフィールドのみに制限します。 「1」に設定してオンにします。

たとえば、次のように入力して、大文字の文字列「Paste」を含む説明またはパスを検索できます。

make search key=Paste display=path,info keylim=1 icase=0
Path:   /usr/ports/devel/pear-SebastianBergmann_PHPCPD
Info:   Copy/Paste Detector (CPD) for PHP code

Path:   /usr/ports/devel/py-zope.copypastemove
Info:   Copy, Paste, and Move support for content components

Path:   /usr/ports/german/bsdpaste
Info:   Pastebin web application to upload and read text on a webserver

Path:   /usr/ports/www/p5-WWW-Pastebin-PastebinCom-Create
Info:   Paste to http://pastebin.com from Perl

Path:   /usr/ports/www/p5-WebService-NoPaste
Info:   Pastebin web application to upload snippets of text

Path:   /usr/ports/www/py-django-dpaste
Info:   Pastebin Django application that powers dpaste.de

Path:   /usr/ports/www/wgetpaste
Info:   Paste to several pastebin services via bash script

検索で遭遇する可能性のあるもう1つの状況は、ポートが移動または削除されたことです。 これらの結果は次のようになります。

make quicksearch name=wget
. . .

Port:   ftp/emacs-wget
Moved:
Date:   2011-05-02
Reason: Has expired: Upstream disappeared and distfile is no longer available

Port:   ftp/wgetpro
Moved:
Date:   2011-10-14
Reason: Vulnerable since 2004-12-14

Port:   www/wget4web
Moved:
Date:   2012-01-01
Reason: Has expired: Depends on expired www/apache13

ポートが新しい場所に移動された場合、「移動済み」フィールドには、ポートを見つけることができる新しい場所が含まれます。 このフィールドは存在するが空の場合、ポートは削除されています。

これらは削除されても、検索結果には表示されます。 移動または削除されたポートが表示されないようにする場合は、PORTSEARCH_MOVED環境変数を「0」に設定できます。

たとえば、デフォルトのtcshを使用して、後続のコマンドに対してのみこの変数を「0」に設定するには、次のように入力します。

env PORTSEARCH_MOVED=0 make quicksearch name=wget
Port:   gwget-1.0.4_9
Path:   /usr/ports/ftp/gwget
Info:   GNOME wget front-end

Port:   wget-1.16
Path:   /usr/ports/ftp/wget
Info:   Retrieve files from the Net via HTTP(S) and FTP

Port:   ruby20-ruby-wgettsv-0.95
Path:   /usr/ports/www/ruby-wgettsv
Info:   Collect WWW resources and generate TSV data

Port:   wgetpaste-2.25
Path:   /usr/ports/www/wgetpaste
Info:   Paste to several pastebin services via bash script

ご覧のとおり、移動または削除されたすべてのエントリが結果から除外されています。 これをデフォルトの動作にしたい場合は、make.confファイルでPORTSEARCH_MOVED=0を設定できます。

sudo sh -c 'echo "PORTSEARCH_MOVED=0" >> /etc/make.conf'

Makeを使用したポートのインストール

インストールするポートが見つかったら、必要なファイルを簡単にダウンロードしてバイナリをビルドし、makeコマンドを使用してインストールできます。

ポートをインストールするには、ポートツリー内のポートのディレクトリに移動します。 この場所は、上記の検索方法のいずれかを使用して見つけることができます。 これを実証するために、portmasterというポートをインストールします。これは、このガイドの後半で必要になります。

まず、ポートの場所に変更します。 portmasterポートは、ports-mgmtカテゴリに保持されます。

cd /usr/ports/ports-mgmt/portmaster

これで、makeターゲットを使用して、ポートを簡単にダウンロード、構成、コンパイル、およびインストールできます。 これらの操作はシステムに影響を与えるため、sudoを使用する必要があります。 これを行うための長い道のりは、このようにmakeを個別に呼び出すことです。 これらのコマンドはまだ入力しないでください。すぐに、はるかに短いバージョンが表示されます。

sudo make config
sudo make fetch
sudo make checksum
sudo make depends
sudo make extract
sudo make patch
sudo make configure
sudo make build
sudo make install

次のような単一のmakeコマンドの後に各ターゲットをリストすることにより、これを少し短縮することができます

sudo make config fetch checksum depends extract patch configure build install

ただし、これはほとんどの場合不要です。 上記の各ターゲットは、タスクを完了するために必要な先行するターゲットを呼び出します。 したがって、上記は単純に次のように要約できます。

sudo make install

通常、このコマンドチェーンを少し拡張して、すべてが正しく構成されていることを確認します。 通常、このポートの構成とインストールの開始時の依存関係を処理するために、installターゲットの前に、上記のパイプラインにないオプションであるconfig-recursiveを指定する必要があります。 そうしないと、ビルドプロセスが停止し、必要な依存関係のビルドの途中でユーザー入力を待つ可能性があります。

また、通常、インストール後に少しクリーンアップして、ディスクスペースを再利用し、システムをクリーンに保ちます。 これは、cleanまたはdistcleanターゲットで実行できます。 cleanターゲットは、このポートと依存関係ポートの構築に使用された抽出されたソースコードを削除します。 distcleanターゲットもこれを行いますが、このパッケージの圧縮されたソースアーカイブを/usr/ports/distfilesディレクトリから削除します。

したがって、一般的なインストールコマンドは次のようになります。

sudo make config-recursive install distclean

これにより、プロセスの開始時にポートと依存関係を構成するように求められます。 その後、ソースアーカイブの整合性をダウンロードして検証します。 次に、不足している依存関係を満たすためにコンテキストを変更します。 そのプロセスが完了すると、問題のポートに戻り、アーカイブを抽出し、必要なパッチを適用して、選択したオプションに従って構成します。 次に、アプリケーションをコンパイルしてシステムにインストールします。 その後、このポートと依存関係の拡張されたソースコードが削除されます。 次に、このポートのソースアーカイブを削除します。

/usr/ports/ports-mgmt/portmasterディレクトリ内で上記のコマンドを実行します。

sudo make config-recursive install distclean

アプリケーションの単一のダイアログボックスが表示されます。 リストされているシェルのいずれかを使用している場合は、ここでツールのシェル補完を構成することを選択できます。

FreeBSD port config

portmasterポートには依存関係がありませんが、依存関係がある場合は、上記のターゲットポートの構成の直後に依存関係の構成オプションが表示されます。 ポートがダウンロード、構成、およびインストールされます。

デフォルトのtcshを使用している場合は、インストールのたびにPATHを再スキャンして、シェル環境がインストールされているすべてのアプリケーションを認識できるようにする必要があります。

rehash

上記のプロセスが成功した場合は、最初のポートが正常にインストールされています。

メインのオペレーティングシステムと構成は従来の場所で行われますが、ポートシステムを介してインストールされるオプションのソフトウェアは/usr/local階層内にインストールされます。

これは、オプションのソフトウェアを構成するには、/usr/local/etcディレクトリを調べる必要があることを意味します。 実行可能ファイル自体は、主に/usr/local/binおよび/usr/local/sbinディレクトリに保持されます。 アプリケーションを構成または開始するときは、このことに注意してください。

サービスとして実行されるアプリケーションに関する注意事項

注意すべき点の1つは、サービスとして実行されるポートをインストールする場合、インストール手順ではサービスが自動的に開始されないことです。 実際、FreeBSD内でサービスを開始するためにあなたが取らなければならないいくつかのステップがあります。

サービスを1回だけ開始する場合は、次のように入力します。

sudo service servicename onestart

たとえば、MySQLを起動するには、次のように入力します。

sudo service mysql-server onestart

必要な構成が完了していると仮定すると、これによりサービスが1回開始されます。 後でサービスを停止する場合は、次のように入力できます。

sudo service mysql-server onestop

これはクイックテストでは機能しますが、FreeBSDでサービスを管理するための理想的な方法ではありません。 起動のたびに開始するようにサービスを構成するには、サービスを有効にする必要があります。 そのためには、/etc/rc.confファイルに行を追加する必要があります。

オプションサービスの開始方法を指定するinitファイルは、/usr/local/etc/rc.dディレクトリに保存されます。 これらの各initファイルで、rcvarという変数は、サービスを開始するかどうかを決定するために/etc/rc.confファイル内のどの変数を探すかをinitシステムに指示します。 オプションのサービスごとに、次のように入力して、/etc/rc.confファイルに追加する適切な行を見つけることができます。

grep rcvar /usr/local/etc/rc.d/*

次のようなリストが表示されます。

/usr/local/etc/rc.d/avahi-daemon:rcvar=avahi_daemon_enable
/usr/local/etc/rc.d/avahi-dnsconfd:rcvar=avahi_dnsconfd_enable
/usr/local/etc/rc.d/dbus:rcvar=dbus_enable
/usr/local/etc/rc.d/rsyncd:rcvar=rsyncd_enable

出力の強調表示された部分は、これらの各サービスを有効にするために「YES」に設定する必要がある変数を示しています。

たとえば、rsyncデーモンサービスを有効にするには、次の行を/etc/rc.confに追加します。

rsyncd_enable="YES"

通常のサービス管理コマンドを使用する前に、適切な行が/etc/rc.confファイルに含まれている必要があります。 たとえば、テキストエディタを使用するか、次のように入力して、/etc/rc.confファイルの下部に上記の行を追加できます。

sudo sh -c "echo 'rsyncd_enable="YES"' >> /etc/rc.conf"

これにより、起動のたびにrsyncデーモンが開始されます。 これで、「one」プレフィックスなしでserviceコマンドを使用してサービスを制御できます。 たとえば、次のように入力してサービスを開始できます。

sudo service rsyncd start

次のように入力すると、サービスを再度停止できます。

sudo service rsyncd stop

インストールされたポートの削除

不要になったポートをインストールした場合は、同様の、より簡単なプロセスを使用して、システムからアプリケーションを削除できます。

deinstallターゲットを使用して、システムからアプリケーションを削除できます。 ここでも、削除するアプリケーションに関連付けられているポートツリー内のディレクトリに移動します。

cd /usr/ports/ports-mgmt/portmaster

次のように入力して、システムからアプリケーションを削除できます。

sudo make deinstall

このポートに設定したオプションも削除する場合は、次のように入力します。

sudo make rmconfig

このポートとそのすべての依存関係の構成オプションを削除するには、次のように入力します。

sudo make rmconfig-recursive

上記のコマンドを使用してportmasterを削除した場合は、次のように入力して再インストールします。

sudo make reinstall distclean

アプリケーションの更新

プログラムをインストールまたは削除する方法がわかったので、アプリケーションを最新の状態に保つ方法を示す必要があります。

更新ファイルで重要な更新メモを確認する

このガイドの冒頭で、portsnapを使用してポートツリーを更新する前に、/usr/ports/UPDATINGファイルのタイムスタンプを保存しました。

/usr/ports/UPDATINGファイルには、管理者による追加の手動手順が必要になる可能性のある更新および変更に関する、ポートメンテナからの重要なメモが含まれています。 アプリケーションを更新する前にこのファイルを読み取らず、アドバイスを適用しないと、システムが使用できなくなったり、アプリケーションの機能に影響を及ぼしたりする可能性があります。

まず、ホームディレクトリのファイルに保存したタイムスタンプを確認します。

cat ~/last_update
  File: "/usr/ports/UPDATING"
  Size: 375337       FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (    0/    root)  Gid: (    0/   wheel)
Device: 0,81   Inode: 2011338    Links: 1
Access: Thu Dec 11 22:24:59 2014
Modify: Thu Dec 11 15:40:12 2014
Change: Thu Dec 11 22:24:59 2014

「変更」タイムスタンプは、システム上のUPDATINGファイルがポートメンテナによって最後に変更された時刻を示し、「変更」タイムスタンプは、最後に同期した時刻を示します。 上記の情報は古いタイムスタンプです。 この情報から、12月11日から現在の日付までのエントリに注意を払う必要があることがわかります。

更新されたUPDATINGファイルを今すぐ開きます。

less /usr/ports/UPDATING

ファイルは次のようになります。

This file documents some of the problems you may encounter when upgrading
your ports.  We try our best to minimize these disruptions, but sometimes
they are unavoidable.

You should get into the habit of checking this file for changes each time
you update your ports collection, before attempting any port upgrades.

20150101:
  AFFECTS: users of net/unison and net/unison-nox11
  AUTHOR: [email protected]

  Unison has been upgraded to version 2.48, which uses a different wire
  protocol than 2.40 did.  In order to support synchronization with
  other computers where Unison is still at version 2.40, a new port
  net/unison240 has been created.  It provides unison240 and if that is
  GTK2-enabled, also unison240-text.  This unison240 port can be
  installed in parallel with the existing net/unison port.

20141230:
  AFFECTS: users of deskutils/xpad
  AUTHOR: [email protected]

  deskutils/xpad has been moved to deskutils/xpad3, since 4.x has been around
  for a while.

  Should you wish to stick with legacy branch at this time;

  # portmaster -o deskutils/xpad deskutils/xpad3

. . .

このファイルには、2008年までさかのぼって、利用可能なすべてのポートの潜在的に重大な変更がすべて含まれています。 次の注意事項にのみ注意を払う必要があります。

  • 前回ポートを更新してから追加されています
  • システムにインストールしたポートを使用します

したがって、この例では、12月11日以降にインストールされたポートに関連して追加された通知にのみ注意を払う必要があります。 システムにインストールされているポートがわからない場合は、portmasterを使用して完全なリストを作成できます。

portmaster -l
===>>> Root ports (No dependencies, not depended on)
===>>> dialog4ports-0.1.5_2
===>>> pkg-1.4.0
===>>> pkgconf-0.9.7
===>>> portmaster-3.17.7
===>>> rsync-3.1.1_3
===>>> 5 root ports

===>>> Trunk ports (No dependencies, are depended on)
===>>> ca_root_nss-3.17.3_1
===>>> expat-2.1.0_2

. . .

出力は、依存関係に従ってセクションに分割されます。 この情報を使用して、更新ノートと照合します。

手動の手順が必要な場合は、残りの更新を続行する前にそれらを完了してください。

既知の脆弱性のチェック

更新時に留意すべきもう1つの考慮事項は、システムにインストールされているソフトウェアに既知のセキュリティの脆弱性があるかどうかです。

FreeBSDは脆弱性データベースを維持しており、ポートまたはパッケージにセキュリティ上の問題があるかどうかを確認できます。 この機能は、pkgツールに含まれています。 次のように入力して、セキュリティ監査を実行します。

sudo pkg audit -F

これにより、FreeBSDプロジェクトのサーバーから脆弱性データベースの最新バージョンがダウンロードされます。 次に、インストールされているすべてのポートまたはパッケージのバージョンをチェックし、セキュリティデータベースのエントリと比較します。

システムにインストールされているポートまたはパッケージのデータベースに既知の脆弱性がある場合は、警告が表示されます。 通常、これらには、問題にパッチを適用する少なくとも最新のポートが利用可能です。

以下では、システム上のすべてのポートまたはサブセットのみを更新する方法について説明します。 更新戦略に関係なく、少なくとも既知のセキュリティの脆弱性があるポートを更新することが不可欠です。

インストールされたポートの更新

UPDATINGファイルに概説されている手動の手順を実行した後、ソフトウェアを更新できます。

利用可能なアップデートがあるポートを確認するには、portmasterコマンドを-Lフラグとともに使用できます。

portmaster -L
===>>> Root ports (No dependencies, not depended on)
===>>> dialog4ports-0.1.5_2
===>>> pkg-1.4.0
        ===>>> New version available: pkg-1.4.3
===>>> pkgconf-0.9.7
===>>> portmaster-3.17.7
===>>> rsync-3.1.1_3
===>>> 5 root ports

===>>> Trunk ports (No dependencies, are depended on)
===>>> ca_root_nss-3.17.3_1
===>>> expat-2.1.0_2

. . .

===>>> 44 total installed ports
        ===>>> 4 have new versions available

これは、以前に使用したオプションの小文字のバリアントと同様の出力を提供しますが、利用可能な更新もチェックします。 ここでは、pkgポートに新しいバージョンが用意されていることがわかります。 新しいバージョンが利用可能な合計4つのポートがあることがわかります。

単一のポートをアップグレードするには、ポートツリー内のポートのディレクトリの場所に移動して、新しいバージョンのソフトウェアを再インストールします。

sudo make deinstall reinstall

portmasterコマンドでも同じことができます。 カテゴリとポート名を指定する必要があります。 たとえば、wgetコマンドをアップグレードするには、次のように入力します。

sudo portmaster ftp/wget

上記のコマンドを使用して、ポートをインストールすることもできます。 他のバックグラウンドから来た多くのユーザーは、portmasterは、上記で概説したmakeターゲットを使用するよりも使い慣れたソフトウェア管理エクスペリエンスであると感じています。

ポートを個別にアップグレードすることは可能ですが、通常はすべてのソフトウェアを一度に更新するのが最善です。 -aフラグを使用して、portmasterでこれを行うことができます。

sudo portmaster -a

これにより、システム上のすべてのポートが最新バージョンに更新されます。 新しい構成オプションは、プロセスの開始時に提示されます。 pkgでインストールされたパッケージがあり、新しいバージョンがポートシステムから利用できる場合、これらも更新され、ポートに移行されます。

結論

これまでに、FreeBSDシステムでポートを操作する方法をかなりよく理解しているはずです。 ポートは非常に柔軟性があり、サーバー上のアプリケーションの大部分をわずかな労力で簡単にカスタマイズできます。

多くの管理者は、コンパイル時間と制御の強化の間のトレードオフを歓迎しますが、ニーズは異なる場合があります。 ただし、FreeBSDでのソフトウェア戦略に関係なく、ポートシステムについて学ぶことは良い投資です。 重要なアップデートでまだパッケージが利用できない場合があります。また、ライセンスの制限により、パッケージ形式で配布できないソフトウェアもあります。 これらの場合は、好みに関係なくポートを使用する必要があります。