FreeBSD ハンドブック

This translation may be out of date. To help with the translations please access the FreeBSD translations instance.

trademarks

FreeBSD は The FreeBSD Foundation の登録商標です。

IBM, AIX, OS/2, PowerPC, PS/2, S/390 および ThinkPad は アメリカ合衆国、その他の国、または両方における International Business Machines Corporation の商標です。

IEEE, POSIX および 802 は アメリカ合衆国における Institute of Electrical and Electronics Engineers, Inc. の登録商標です。

Red Hat, RPM は アメリカ合衆国およびその他の国における Red Hat, Inc. の商標または登録商標です。

3Com および HomeConnect は 3Com Corporation の登録商標です。

Adobe, Acrobat, Acrobat Reader, Flash および PostScript は アメリカ合衆国および/またはその他の国の Adobe Systems Incorporated の登録商標または商標です。

Apple, AirPort, FireWire, iMac, iPhone, iPad, Mac, Macintosh, Mac OS, Quicktime および TrueType は Apple Inc. の商標で、 アメリカ合衆国およびその他の国で登録されています。

Intel, Celeron, Centrino, Core, EtherExpress, i386, i486, Itanium, Pentium および Xeon はアメリカ合衆国およびその他の国における Intel Corporation またはその関連会社の商標または登録商標です。

Linux は Linus Torvalds の登録商標です。

Microsoft, IntelliMouse, MS-DOS, Outlook, Windows, Windows Media および Windows NT は アメリカ合衆国および/またはその他の国における Microsoft Corporation の登録商標または商標です。

Motif, OSF/1 および UNIX は アメリカ合衆国およびその他の国における The Open Group の登録商標で、 IT DialTone および The Open Group は同じく商標です。

Sun, Sun Microsystems, Java, Java Virtual Machine, JDK, JRE, JSP, JVM, Netra, OpenJDK, Solaris, StarOffice, SunOS および VirtualBox は アメリカ合衆国およびその他の国における Sun Microsystems, Inc. の 商標または登録商標です。

RealNetworks, RealPlayer および RealAudio は RealNetworks, Inc. の登録商標です。

Oracle は Oracle Corporation の登録商標です。

3ware は 3ware Inc. の登録商標です。

ARM は ARM Limited の登録商標です。

Adaptec は Adaptec, Inc. の登録商標です。

Android は Google Inc. の商標です。

Heidelberg, Helvetica, Palatino, および Times Roman はアメリカ合衆国およびその他の国における Heidelberger Druckmaschinen AG の登録商標または商標です。

Intuit および Quicken は アメリカ合衆国およびその他の国における Intuit Inc. またはその関連会社の 商標および/または登録商標です。

LSI Logic, AcceleRAID, eXtremeRAID, MegaRAID および Mylex は LSI Logic Corp. の商標または登録商標です。

MATLAB は The MathWorks, Inc. の登録商標です。

SpeedTouch は Thomson の商標です。

VMware は VMware, Inc. の商標です。

Mathematica は Wolfram Research, Inc. の登録商標です。

Ogg Vorbis および Xiph.Org は Xiph.Org の商標です。

XFree86 は The XFree86 Project, Inc. の商標です。

製造者および販売者が製品を区別するのに 用いている表示の多くは、商標とされています。この文書に登場する表示のうち FreeBSD Project がその商標を確認しているものには、その表示に続いて“™” または “®” 記号がおかれています。

[ Split HTML / Single HTML ]

概要

FreeBSD へようこそ! このハンドブックは FreeBSD 13.1-RELEASE および FreeBSD 12.4-RELEASE のインストールと日常での使い方について記述したものです。 本ハンドブックはさまざまな人々による編集の成果で、現在も改編作業中です。 いま存在するセクションの中には情報が古くなってしまっているものがあります。 もし、この文書を新しくしたり、 新しい情報の追加に協力したいとお考えなら、 FreeBSD documentation project メーリングリスト まで電子メールを (英語で) 送ってください。

このハンドブックの最新バージョンは FreeBSD ウェブサイト から入手できます。 以前のバージョンは https://docs.FreeBSD.org/doc/ から入手できます。 この文書の他の文書形式や圧縮形式は FreeBSD ダウンロードサーバミラーサイト からダウンロードできます。 ハンドブックやその他の文書は、検索ページ で検索できます。


前書き

想定している読者

最初の部分は FreeBSD を使い始めた人向けで、FreeBSD のインストールの過程を手引きし、UNIX® の基礎となっている概念や慣習を丁寧に紹介します。 この部分に取り組むために必要なのは、探究心と、紹介された新たな概念を理解する能力だけです。

その次の、ハンドブックのはるかに大きな部分では、FreeBSD システム管理者が興味を抱くあらゆる種類の話題が分かりやすく言及されています。 一部の章は、その章の前に読んでおくべきことが推奨されており、各章の始めの概要で述べられています。

さらなる情報源の一覧は、参考図書 をご覧ください。

第 3 版からの変更

オンライン版のハンドブックは、FreeBSD ドキュメンテーションプロジェクトの献身的なメンバーによる 10 年以上に渡る作業の頂点に立つものです。 2004 年に出版された 2 巻組の第 3 版からの主な変更は、次のようなものです。

  • Windows® アプリケーションを FreeBSD 上で実行するための WINE に関する情報が追加されました。

  • 強力なパフォーマンス解析ツール DTrace に関する情報が追加されました。

  • ファイルシステム対応の章が追加されました。 Sun™ の ZFS のような FreeBSD ネイティブではないファイルシステムへの対応について説明しています。

  • セキュリティ監査の章が追加されました。 FreeBSD における新しい監査のケイパビリティおよびその使用方法について説明しています。

  • 仮想化の章が追加されました。os; を仮想化ソフトへインストールする方法などを取り上げています。

  • 新しいインストールユーティリティの bsdinstall を用いた FreeBSD のインストール方法を説明する FreeBSD のインストール という章が追加されました。

第 2 版 (2004) からの変更

第 3 版は、FreeBSD ドキュメンテーションプロジェクトの献身的なメンバーによる 2 年以上に渡る作業の頂点に立つものです。 サイズが大きくなったため、印刷版は、2 巻での出版となりました。 この新たな版における主な変更は、次のようなものです。

  • 設定とチューニング に、ACPI 電源管理、cron システムユーティリティ、 およびカーネルチューニングオプションに関するより多くの情報が追加されました。

  • セキュリティ に、 Virtual Private Network (VPN)、 ファイルシステムアクセスコントロールリスト (ACL)、 およびセキュリティ勧告に関する情報が追加されました。

  • Mandatory Access Control (MAC) の章がこの版で追加されました。 MAC がどのようなもので、 このメカニズムがどのように FreeBSD システムを安全にするかについて説明しています。

  • ストレージ に、 USB ストレージデバイス、ファイルシステムスナップショット、 ファイルシステムクォータ、 ファイルおよびネットワークベースのファイルシステム、 暗号化されたディスクパーティションに関する情報が追加されました。

  • PPP と SLIP に、 トラブルシューティングの節が追加されました。

  • 電子メール, に、 他のメール転送エージェント、SMTP 認証、UUCP, fetchmail, procmail や他の高度な話題についての情報が追加されました。

  • ネットワークサービスの章が、この版で新しく追加されました。 この章では、Apache HTTP サーバ、 fptd および Samba を用いて Microsoft® Windows® クライアント用にサーバを設定する方法などを取り上げています。 再構成によりいくつかの節が、高度なネットワーク から移動してきました。

  • 高度なネットワーク に、 FreeBSD での Bluetooth® デバイスの使用、 ワイヤレスネットワークの設定、 Asynchronous Transfer Mode (ATM) ネットワークに関する情報が追加されました。

  • 本書で使われている専門用語の定義をまとめた用語集が追加されました。

  • 本書を通じて表および図の表現において数多くの改良がおこなわれました。

第 1 版 (2001) からの変更

第 2 版は、FreeBSD ドキュメンテーションプロジェクトの献身的なメンバーによる 2 年以上に渡る作業の頂点に立つものでした。 この新たな版における主な変更は、次のようなものでした。

  • 完備した索引が追加されました。

  • ASCII キャラクタによる図はすべて画像に置き換えられました (訳注: 日本語版は作業中です)。

  • 各章に、章に記載されている内容と、 読者に期待される予備知識がすぐに分かるように、 一定の内容の概要が付け加えられました。

  • 内容は、"始めに"、"システム管理"、 "付録" の 3 つの論理的な部分に再構成されました。

  • UNIX の基礎知識 には、プロセス、デーモン、 シグナルに関する情報が追加されました。

  • アプリケーションのインストール - packages と ports には、バイナリパッケージの管理に関する情報が追加されました。

  • X Window System は、 XFree86™ 4.X 上で KDE や GNOME のような近代的なデスクトップテクノロジーを利用することに力点をおいて、 完全に書き直されました。

  • FreeBSD の起動のプロセス が拡張されました。

  • ストレージ は、 "ディスク" と "バックアップ" の 2 つの章に分かれていたものをまとめて書き直されました。私たちは、 この話題は 1 つの章にまとめて示した方が分かりやすいと感じています。 RAID (ハードウェアとソフトウェアの両方) に関する節も追加されました。

  • シリアル通信 は FreeBSD 4.X/5.X 向けに一から再構成されました。

  • PPP と SLIP は大幅に更新されました。

  • 高度なネットワーク に、多くの新しい節が追加されました。

  • 電子メール に、sendmail の設定についてより多くの情報が加えられました。

  • Linux® バイナリ互換機能 には、Oracle® や Mathematica® のインストール情報が加えられました (訳注: 日本語版は作業中です)。

  • この第 2 版では、以下の新たな話題が扱われています。

この文書の構成

この文書は 5 部構成になっています。 第 1 部 導入 では、FreeBSD のインストールと基本的な使い方を扱います。 各章は順に読むことを想定していますが、馴染み深い話題を扱った章は飛ばしてもよいでしょう。 第 2 部 日々の生活 では、FreeBSD で良く使われる機能について説明します。 この章とそれに続く章は、順不同に読むことができます。 各章の始めにはその章が何を扱っていて、読者にどんな予備知識が期待されるかを簡潔に述べた概要がおかれています。 第 3 部 システム管理 は、システム管理に関する話題を扱っています。 第 4 部 ネットワーク通信 では、ネットワークおよびサーバに関する話題を扱っています。 第 5 部は参考情報からなる 付録 です。

はじめに

新規ユーザに FreeBSD を紹介します。ここでは、FreeBSD プロジェクトの歴史、目標と開発モデルについて述べています。

FreeBSD のインストール

bsdinstall を用いた FreeBSD 9.x 以降のシステムのインストール過程を一通りユーザに案内しています。

UNIX の基礎知識

FreeBSD オペレーティングシステムの基本的なコマンドや機能を扱っています。 Linux® やその他の UNIX® 風のものに馴染んでいたら、 この章を飛ばしても構わないでしょう。

アプリケーションのインストール - packages と ports

FreeBSD の革新的な "Ports Collection" および標準的なバイナリパッケージによるサードパーティアプリケーションのインストールについて説明しています。

X Window System

X Window System 全般と、特に FreeBSD 上での X11 の利用について述べています。 また、KDE や GNOME のような一般的なデスクトップ環境にも触れています。

デスクトップアプリケーション

Web ブラウザや生産性向上ツールのような一般的なデスクトップアプリケーションをいくつか挙げ、 FreeBSD におけるインストール方法を説明しています。

マルチメディア

システムを音声やビデオ再生に対応させるためにどう設定するかを説明します。 また、音声やビデオアプリケーションも例示しています。

FreeBSD カーネルのコンフィグレーション

どのような場合に新たにカーネルを構成する必要があるかを説明し、 カスタムカーネルのコンフィグレーション、構築、 インストールについて詳しく説明しています。

プリンタの利用

FreeBSD におけるプリンタの取り扱いを説明しています。たとえば、 バナーページ、プリンターの課金、初期設定といったことです。

Linux® バイナリ互換機能

FreeBSD の Linux® バイナリ互換機能を説明しています。また、 Oracle®, Mathematica® といった人気の高い Linux® アプリケーションのインストールを詳しく説明しています。

設定とチューニング

システム管理者が FreeBSD システムを調整して最適な性能を引き出すのに利用できるパラメータについて述べています。 また、FreeBSD で利用されている様な設定ファイルとそのありかも解説しています。

FreeBSD の起動のプロセス

FreeBSD の起動プロセスを解説し、 このプロセスを設定オプションで制御する方法を説明しています。

セキュリティ

FreeBSD システムを安全に保つために役立つ Kerberos, IPsec および OpenSSH といった利用可能なさまざまなツールについて説明しています。

ストレージ

FreeBSD でストレージメディアやファイルシステムをどう扱うかを説明しています。 対象は、物理ディスク、RAID アレイ、 光学およびテープメディア、メモリベースのディスク、 ネットワークファイルシステムなどです。

地域化 (localization) - i18n/L10n の利用と設定

FreeBSD を英語以外の言語で使う方法を説明しています。 システムとアプリケーション両方のレベルの地域化を扱っています。

FreeBSD のアップデートとアップグレード

FreeBSD-STABLE, FreeBSD-CURRENT と FreeBSD のリリースの違いを説明します。 どんなユーザにとって開発システムを追随するのが有用かを述べ、 その方法の概要をまとめています。 システムを最新のセキュリティリリースへアップデートする方法についても説明しています。

シリアル通信

FreeBSD システムに端末やモデムを、 ダイヤルインまたはダイヤルアウト用に接続する方法を説明しています。

PPP と SLIP

FreeBSD で、PPP を使ってリモートシステムに接続する方法を説明しています。

電子メール

電子メールサーバの構成要素をそれぞれ説明し、 最もよく使われているメールサーバソフトウェアである sendmail について、 単純な設定をとりあげています。

高度なネットワーク

LAN 上の他のコンピュータとインターネット接続の共有、 高度なルーティングに関するトピックス、ワイヤレスネットワーク、 Bluetooth®, ATM, IPv6 等々、 ネットワークに関するさまざまな話題を取り扱っています。

FreeBSD の入手方法

FreeBSD を収録した CDROM や DVD の様々な入手先や、FreeBSD をダウンロードしてインストールできるインターネット上のサイトを挙げています。

参考図書

この文書は、 もっと詳しい説明が欲しくなるかもしれないさまざまな題目について触れています。 参考図書には、このハンドブックで参照している、 多くの素晴らしい本が挙げられています。

インターネット上のリソース

FreeBSD ユーザが FreeBSD について質問したり、 技術的な議論に参加できる、 多くの公開された場について説明しています。

PGP 公開鍵

多くの FreeBSD 開発者の PGP fingerprint を載せています。

この文書で用いられている表記法

一貫して読みやすい文章を提供するために、 この文書全体では以下の表記法が用いられています。

書体による表記

イタリック体

イタリック体 のフォントは、ファイル名、URL, 強調表現、技術用語の最初の使用を表すのに使われています。

等幅

等幅フォントは、エラーメッセージ、 コマンド、環境変数、ports の名称、ホスト名、ユーザ名、 グループ名、デバイスの名称、変数、 コードの断片を表すのに使われています。

太字

太字のフォントは、アプリケーション、コマンド、キーを表すのに使われています。

ユーザー入力

文章の他の部分と区別するため、キーは太字で示されています。 同時に押すことを意図したキーの組み合わせは、キーの間に + を入れて表されます。 たとえば

Ctrl+Alt+Del

は、ユーザーが Ctrl, Alt それから Del キーを同時に押すことを意図しています。

順に押すことを意図したキーは、カンマで区切って表されます。 たとえば

Ctrl+X, Ctrl+S

は、ユーザーが Ctrl キーと X キーを同時に押してから、 Ctrl キーと S キーを同時に押すことを意図しています。

C:\> で始まる例は、MS-DOS® コマンドを表しています。 特に注釈がなければ、それらのコマンドは最近の Microsoft® Windows® の "コマンドプロンプト" 環境でも実行できます。

C:\> tools\fdimage floppies\kern.flp A:

\# で始まる例は、FreeBSD 上でスーパーユーザ権限で実行しなければならないコマンドを示しています。 そのコマンドを入力するには、root としてログインするか、通常のアカウントでログインして、スーパーユーザ権限を取得するために su(1) を使います。

# dd if=kern.flp of=/dev/fd0

% で始まる例は、通常のユーザアカウントで実行するべきコマンドを示しています。 特に断りのない限り、環境変数の設定やその他のシェルコマンドには C シェルの文法が使われています。

% top

謝辞

あなたが手にしている文書は、世界中の何百人もの人々の努力の賜物です。 誤字脱字の修正を送ったのか、文章を丸々投稿したのかによらず、すべての貢献が役に立ちました。

多くの会社が、著者らを雇用してフルタイムでこの文書に取り掛かれるようにしたり、出版費用を出したりして、この文書を作り上げるのを援助してくれました。 特に、BSDi (その後 Wind River Systems に買収されました) は、フルタイムでこの文書の改善作業をするように FreeBSD ドキュメンテーションプロジェクトのメンバーを雇用し、それが 2000 年 3 月の最初の出版 (ISBN 1-57176-241-8) につながりました。 その後、Wind River Systems は、印刷出力の仕組みを整備し、章を追加するために著者を何名か追加で雇用してくれました。 この作業は、2001 年 11 月の第 2 版の出版 (ISBN 1-57176-303-1) に結実しました。 2003-2004 年には、ハンドブック第 3 版の出版準備のために FreeBSD Mall, Inc が貢献者を雇用してくれました。 第 3 版は 2 巻組となりました。 各巻は、The FreeBSD Handbook 3rd Edition Volume 1: User Guide (ISBN 1-57176-327-9) および The FreeBSD Handbook 3rd Edition Volume 2: Administrators Guide (ISBN 1-57176-328-7) として出版されています。

Part I: 導入

ハンドブックの第 1 部はユーザと FreeBSD が初めての管理者向けです。各章の内容は以下のとおりです。

  • FreeBSD の紹介

  • インストールの手順の解説

  • UNIX® の基礎

  • FreeBSD で利用できる豊富なサードパーティ製のアプリケーションのインストール方法

  • UNIX® におけるウィンドウシステムの X、 およびプロダクティブなデスクトップ環境の設定の詳細の紹介

頻繁にページを飛すことなく各章を前から後へとスムーズに読み進めるように、 後方への参照を極力抑えるようにしています。

Chapter 1. はじめに

1.1. この章では

FreeBSD に興味を持っていただきありがとうございます! この章では FreeBSD の歴史、目標、開発モデルなど、 FreeBSD プロジェクトに関するさまざまな事柄を扱います。

この章に書かれている話題は、次のようなものです。

  • FreeBSD とその他のオペレーティングシステムとの違い

  • FreeBSD プロジェクトの歴史

  • FreeBSD プロジェクトの目標

  • FreeBSD オープンソース開発モデルの基本的な考え方

  • そして、"FreeBSD" という名前の由来について

1.2. FreeBSD へようこそ!

FreeBSD は、標準に準拠した Unix-like なオープンソースのオペレーティングシステムで、 x86 (32 および 64 ビットの両方), ARM®, AArch64, RISC-V®, MIPS®, POWER®, PowerPC® および Sun UltraSPARC® コンピュータに対応しています。 FreeBSD は、プリエンプティブなマルチタスク、 メモリ保護、仮想メモリ、マルチユーザシステム、SMP 対応、 さまざまな言語やフレームワーク用のすべてのオープンソースの開発ツール、 X ウィンドウシステム、KDE や GNOME を中心としたデスクトップ機能といった、 今日では標準となっている機能をすべて提供しています。 注目すべき機能は以下の通りです。

  • 自由なオープンソースライセンス。 ソースコードを自由に変更し、配布することができます。 潜在的なライセンスの互換性の問題を避け、 コピーレフトライセンスに典型的な制限を課すことなく、 オープンソースプロジェクトおよびクローズな製品の両方に組み込むことが可能です。

  • 堅固な TCP/IP ネットワーク - FreeBSD は、 かってないほどの性能とスケーラビリティを兼ね備えた業界標準プロトコルを実装しています。 サーバおよびルータ/ファイアウォールルールの両方と相性が良く、 実際に多くの会社やベンダがまさにこの目的で採用しています。

  • 完全に統合された OpenZFS への対応。 これには root-on-ZFS, ZFS ブート環境、障害管理、 委任管理、jails への対応、FreeBSD 固有の文書、 そしてシステムのインストーラによる対応が含まれます。

  • Capsicum ケーパビリティおよびサンドボックスメカニズムに対する強制アクセスコントロールフレームワークによる 拡張されたセキュリティ機能

  • 対応しているすべてのアーキテクチャで利用可能な 3 万を超えるコンパイル済みの packages。 そして、あなた自身のカスタマイズされたソフトウェアの構築を容易にする Ports Collection。

  • ドキュメント - システム管理からカーネル内部にまで渡る内容に関する、 さまざまな著者によるハンドブックやブックに加え、 man(1) ページが用意されています。 ユーザ空間のデーモン、 ユーティリティおよびコンフィグレーションファイルだけではなく、 カーネルドライバの API (セクション 9) および個々のドライバ (セクション 4) も用意されています。

  • 分かりやすく首尾一貫したリポジトリ構造とビルドシステム - FreeBSD は、カーネルおよびユーザ空間の両方について、 すべての構成要素をひとつのリポジトリで管理しています。 統一されカスタマイズが容易なビルドシステムおよび綿密に考えられた開発プロセスが、 あなた自身の製品のビルドインフラストラクチャに FreeBSD を統合することを容易にします。

  • Unix の哲学に忠実であり続けます。 ハードコードされたモノリシックな "オールインワン" デーモンより、 要素から構成することを好みます。

  • Linux との バイナリ互換。 仮想化の必要なしに多くの Linux バイナリを実行できます。

FreeBSD はカリフォルニア大学バークレイ校の Computer Systems Research Group (CSRG) による 4.4BSD-Lite リリースを基にしており、 BSD システムの開発の優れた伝統を守り続けています。 CSRG による素晴らしい活動に加えて、 FreeBSD プロジェクトは何千時間もの時間を注ぎ込んで、 実際の使用の場において最大の性能と信頼性を発揮するためにシステムのチューニングをおこなっています。 FreeBSD は、商用のオペレーティングシステムと同等の性能、信頼性を、 他では実現されていない数多くの最新の機能と共に提供しています。

1.2.1. FreeBSD で何ができるの?

あなたの思いつく限りのアプリケーションは、何でも FreeBSD で実行できます。ソフトウェア開発からファクトリオートメーション、 在庫制御から遠く離れた人工衛星のアンテナの方向調整まで; 商用 UNIX® 製品でできることは、FreeBSD でも十分にできるのです! また、FreeBSD は世界中の研究センターや大学によって開発される文字通り何千もの高品質で、 たいていはほとんど無料で利用できるアプリケーションによる恩恵を得ることができます。

FreeBSD のソースコードは自由に提供されているので、 システムも特別なアプリケーションやプロジェクトに合わせて、 いくらでもカスタマイズすることができます。 これは有名な商業ベンダから出ているほとんどのオペレーティング システムでは不可能なことです。以下に現在 FreeBSD を 使っている人々のアプリケーションの例をいくつか上げます:

  • インターネットサービス: FreeBSD に組み込まれている 頑強な TCP/IP ネットワーキング機能は次のようなさまざまな インターネットサービスの理想的なプラットフォームになります:

    • ウェブサーバ

    • IPv4 および IPv6 ルーティング

    • ファイアウォールと NAT ("IP マスカレード") ゲートウェイ

    • FTP サーバ

    • メールサーバ

    • さらにいろいろ…​

  • 教育: あなたは、計算機科学または関連分野の工学を専攻する学生さんですか? オペレーティングシステムやコンピュータアーキテクチャ、 ネットワークについて学習するなら、 実際に FreeBSD のソースコードを読んで、 それがどのように動作するのかを学ぶのが一番よい方法です。 また、無料で利用できる CAD や数学、 グラフィックデザインのパッケージがいくつもあるので、 コンピュータに関わる主要な目的が、 のことをすることにある方にも、 大いに役立ちます。

  • 研究: システム全体のソースコードが利用できるため、 FreeBSD はオペレーティングシステムの研究だけでなく、 計算機科学の他の部門においても優れたプラットフォームです。 自由に利用できる FreeBSD の特長は、オープンフォーラムで 議論される特別なライセンスの同意や制限について心配することなく、 離れたグループでもアイディアや開発の共有による共同研究を可能にします。

  • ネットワーキング: 新しいルータが必要? ネームサーバ (DNS) は? 内部のネットワークを人々から守るファイアウォールは? FreeBSD はすみに眠っている使われていない PC を簡単に 洗練されたパケットフィルタリング機能を持つ高級なルータに 変えることができます。

  • 組み込み: FreeBSD は、 組み込みシステムを構築する優れたプラットフォームとなります。 ARM®, MIPS® および PowerPC® プラットフォームへのサポートとともに、強固なネットワークスタック、最新の機能および 寛容なBSD ライセンス により、FreeBSD は、組み込みルータ、ファイアウォールおよび他のデバイスを構築する優れた基盤となります。

  • デスクトップ: FreeBSD は、自由に利用できる X11 サーバを使うことによって、 安価なデスクトップとなります。 FreeBSD では、標準的な GNOME および KDE グラフィカルユーザインタフェースを含む、 数多くのオープンソースのデスクトップ環境を選択できます。 FreeBSD は、 中央のサーバから"ディスクレス"でもブート可能であり、 個々のワークステーションを安価で、 容易に管理することさえ可能にします。

  • ソフトウェア開発: 基本的な FreeBSD システムには、完全な C/C++ コンパイラやデバッガスイートを含む完全な開発ツールがついてきます。 他の多くの言語へのサポートも ports および package コレクションから利用できます。

FreeBSD は、無料でダウンロードできます。 また、CD-ROM または DVD でも入手可能です。 詳しくは FreeBSD の入手方法 をご覧ください。

1.2.2. FreeBSD はどこに使われていますか?

FreeBSD は、ウェブサービスの能力で知られています。 FreeBSD が利用されている代表的なサイトには Hacker News, Netcraft, NetEase, Netflix, Sina, Sony Japan, Rambler, Yahoo! および Yandex があります。

FreeBSD は、 先進的な機能、高いセキュリティ、および定期的なリリースサイクル、 そして寛容なライセンスにより、 多くの商用およびオープンソースのアプライアンス、 デバイスおよび製品を構築するプラットフォームとして利用されています。 世界最大規模の多くの IT 会社が FreeBSD を使っています。

  • Apache - Apache ソフトウェア財団は、 1.4 百万回を超えるコミットというおそらく世界で最も大規模な SVN リポジトリを含む、数多くの公式のインフラストラクチャで FreeBSD を使っています。

  • Apple - Apple により提供されている最近のオペレーションシステムは、FreeBSD からプロセスモデル、ネットワークスタック、仮想ファイルシステム、ライブラリ、マニュアルページ、そしてコマンドラインユーティリティについてのコードを取り入れています。

  • Cisco - IronPort ネットワークセキュリティおよびアンチスパムアプライアンスは、 改造された FreeBSD カーネルで動いています。

  • Citrix - NetScaler の一連のセキュリティアプライアンスは、 FreeBSD シェルとともに 4-7 レイヤのロードバランス、 コンテントキャシュ、アプリケーションファイアウォール、 セキュリティ VPN およびモバイルクライド・ネットワークアクセスを提供します。

  • Dell EMC Isilon - Isilon 社のエンタープライズストレージアプライアンスは、FreeBSD ベースです。 寛大な FreeBSD ライセンスのおかげで、Isilon は、 彼らの知的財産物をカーネルに統合することができるため、 オペレーティングシステムではなく、 製品そのものに焦点を当てた開発が可能となっています。

  • Quest KACE - KACE システム管理アプライアンスでは、 FreeBSD が用いられています。信頼性、 スケーラビリティおよび継続的な開発をサポートしているコミュニティが評価され採用されています。

  • iXsystems - 統合ストレージアプライアンスの TrueNAS シリーズは FreeBSD ベースです。

  • Juniper - Juniper のすべてのネットワークギア (ルータ、スイッチ、セキュリティおよびネットワークアプライアンス) を動かしている JunOS オペレーティングシステムは、 FreeBSD ベースです。 Juniper は、FreeBSD プロジェクトと商用製品を提供しているベンダとの間で協力関係が成功している数多くのベンダのひとつです。 将来 FreeBSD の新しい機能を JunOS へと統合する際の複雑さを減らすため、 Juniper で作成された改良点は、FreeBSD に取り込まれています。

  • McAfee - Sidewinder などの McAfee エンタープライズファイアウォール製品のベースである SecurOS は FreeBSD ベースです。

  • NetApp - ストレージアプライアンスの Data ONTAP GX シリーズは、FreeBSD ベースです。 NetApp は、新しい BSD ライセンスのハイパーバイザである bhyve などの数多くの機能を FreeBSD プロジェクトに還元しています。

  • Netflix - Netflix が顧客へのストリームムービーに使用している OpenConnect アプライアンスは、FreeBSD ベースです。 Netflix は、コードベースに対し多大な貢献を行っており、 FreeBSD のメインラインからの差分がゼロになるように作業を行っています。 Netflix OpenConnect アプライアンスは、 北米の全インターネットトラフィックの 32% の配送を受け持っています。

  • Sandvine - Sandvine は、 ハイパフォーマンスでリアルタイムのネットワークプロセッシングプラットフォームのベースに FreeBSD を使用しています。このプラットフォームは、 彼らのインテリジェントネットワークポリシーコントロール製品を構成しています。

  • Sony - PlayStation Vita, PlayStation 4 および PlayStation 5 のゲームコンソールは、 FreeBSD の改良版が動いています。

  • Sophos - Sophos Email アプライアンス製品は、強化された FreeBSD がベースです。 インバウンドメールに対してスパムやウィルススキャンを行う一方で、 アウトバウンドメールがマルウェアではないか、また、 機密情報がアクシデントで漏洩してしまわないようにモニタします。

  • Spectra Logic - アーカイブグレードストレージアプライアンスの nTier シリーズは、FreeBSD および OpenZFS が動いています。

  • Stormshield - Stormshield ネットワークセキュリティアプライアンスは、 強化された FreeBSD がベースです。 BSD ライセンスが、彼らの知的財産のシステムへの統合を可能にする一方で、 コミュニティに非常に多くの興味深い開発結果をもたらしてくれます。

  • The Weather Channel - 各ローカルケーブルプロバイダのヘッドエンドにインストールされていて、 ローカルの天気予報をケーブル TV ネットワークプログラムに送る IntelliStar アプライアンスでは FreeBSD が動いています。

  • Verisign - Verisign は .com および .net ルートドメインレジストリおよび関連する DNS インフラストラクチャの運用に責任を持っています。 彼らのインフラストラクチャに一般的な障害点がないように、FreeBSD を含むさまざまなネットワークオペレーティングシステムに信頼を寄せています。

  • Voxer - Voxer のモバイルボイスメッセージのプラットフォームでは、 ZFS が FreeBSD 上で動いています。 Voxer は、Solaris から派生したオペレーティングシステムから、 FreeBSD へと移行しました。優れた文書、 幅広く活動的なコミュニティ、 そして開発者にとって好意的な環境がその理由です。 ZFS および DTrace といった決定的な機能に加え、 FreeBSD では、 ZFS が TRIM に対応しています。

  • Fudo セキュリティ - FUDO セキュリティアプライアンスは、 エンタープライズおよびシステムの管理者に対し、 モニタ、コントロール、レコードおよび audit コントラクタを提供します。 ZFS, GELI, Capsicum, HAST および auditdistd といった FreeBSD の最良なセキュリティ機能がベースとなっています。

また、FreeBSD は関連したオープンソースプロジェクトを数多く生み出しています。

  • BSD Router - 広く使われているエンタープライズルータの置き換えとなるような FreeBSD ベースのルータで、標準的な PC ハードウェアで動作するように設計されています。

  • TrueNAS は、ネットワークアタッチトストレージ (NAS) ソフトウェアです。 データの共有およびランサムウェアやマルウェアといった現代の脅威からデータを保護します。 TrueNAS を使うことで、ユーザおよびクライアントデバイスは、仮想化および共有プロトコルを通して共有データに容易にアクセスできます。

  • GhostBSD は、FreeBSD から派生しており、GTK 環境を使用して美しい見た目や使い勝手の良さを現代の BSD プラットフォームに実現し、自然でネイティブな UNIX® 環境を提供します。

  • mfsBSD - メモリから完全に実行可能な FreeBSD システムのイメージを構築するためのツールキットです。

  • XigmaNAS - PHP によるウェブインタフェースを搭載した FreeBSD ベースのファイルサーバのディストリビューションです。

  • OPNSense は、オープンソースの使いやすく構築が簡単な FreeBSD ベースのファイアウォールおよびルータのプラットフォームです。 OPNsense は、 高価な商用のファイアウォールや標準で利用可能なほとんどの機能を持っています。 オープンで検証可能なソースと共に、 商品が提供している豊富な機能のセットを提供します。

  • MidnightBSD は、BSD から派生したオペレーティングシステムで、デスクトップユーザを念頭において開発されています。 このオペレーティングシステムには、メール、ウェブブラウザ、ワードプロセッサ、ゲームといった、日々の生活で必要と思われるすべてのソフトウェアが含まれています。

  • NomadBSD は、FreeBSD ベースの USB フラッシュドライブのための永続的な live システムです。 ハードウェアを自動的に認識してセットアップを行い、すぐにデスクトップシステムとして使えるように設定します。 データリカバリ、教育および FreeBSD のハードウェア互換性の試験にも使用できます。

  • pfSense - 数多くの機能および拡張 IPv6 サポートを持つ FreeBSD ベースのファイアウォールディストリビューションです。

  • ZRouter - FreeBSD ベースの組み込みデバイス用のオープンソースのファームウェアです。 いつでも購入できるようなルータ上のプロプリエタリのファームウェアの置き換えとなるように設計されています。

FreeBSD Foundation のウェブサイトでは、FreeBSD を製品やサービスのベースに利用している会社の声 が紹介されています。 Wikipedia にも FreeBSD ベースの製品のリスト がまとめられています。

1.3. FreeBSD プロジェクトについて

以下の節では簡単な歴史やプロジェクトの目標、 開発モデルなど、普段は表にでない話題を提供しています。

1.3.1. FreeBSD 小史

FreeBSD プロジェクトは 1993 年の始めに Unofficial 386BSD Patchkit の最後の 3 人のまとめ役によって、部分的に patchkit から派生する形で開始されました。ここでの 3 人のまとめ役というのは、Nate Williams, Rod Grimes と、 Jordan Hubbard です。

このプロジェクトのもともとの目標は、patchkit という仕組みではもう十分に解決できなくなってしまった 386BSD の数多くの問題を修正するための、386BSD の暫定的なスナップショットを作成することでした。 こういった経緯を経ているので、 このプロジェクトの初期の頃の名前は 386BSD 0.5 や 386BSD 暫定版 (Interim) でした。

386BSD は、Bill Jolitz が (訳注: バークレイ Net/2 テープを基に) 作成したオペレーティングシステムです。当時の 386BSD は、ほぼ一年にわたって放っておかれていた (訳注: 作者がバグの報告を受けても何もしなかった) というひどい状況に苦しんでいました。 作者の代わりに問題を修正し続けていた patchkit は日を追うごとに不快なまでに膨張してしまっていました。 このような状況に対して、彼らは暫定的な "クリーンアップ" スナップショットを作成することで Bill を手助けしようと決めました。しかし、 この計画は唐突に終了してしまいました。Bill Jolitz が、 このプロジェクトに対する受け入れ支持を取り下げることを突然決意し、 なおかつこのプロジェクトの代わりに何をするのかを一切言明しなかったのです。

たとえ Bill が支持してくれないとしても、 彼ら 3 人の目標には依然としてやる価値があると考えていたため、 David Greenman が考案した名称 "FreeBSD" をプロジェクトの名前に採用し、新たなスタートを切りました。 この時点でのプロジェクトの初期目標は、すでにこのシステム (訳注: 386BSD + Patchkit) を使っていた利用者たちと相談して決められました。 プロジェクトが実現に向けて軌道に乗ってきたことが明確になった時点で、 Jordan は Walnut Creek CDROM 社に連絡してみました。CD-ROM を使って FreeBSD を配布することによって、 インターネットに容易に接続できない多くの人々が FreeBSD を簡単に入手できるようになると考えたからです。Walnut Creek CDROM 社は FreeBSD を CD で配布するというアイデアを採用してくれたばかりか、 作業するためのマシンと高速なインターネット回線をプロジェクトに提供してくれました。 当時は海のものとも山のものともわからなかったこのプロジェクトに対して、Walnut Creek CDROM 社が信じられないほどの信頼を寄せてくれたおかげで、 FreeBSD は短期間のうちにここまで大きく成長したのです。

CD-ROM による最初の配布 (そしてネットでの、 ベータ版ではない最初の一般向け配布) は FreeBSD 1.0 で、1993 年 12 月に公開されました。これはカリフォルニア大学バークレイ校の 4.3BSD-Lite ("Net/2") を基とし、386BSD や Free Software Foundation からも多くの部分を取り入れたものです。 これは初めて公開したものとしては十分に成功しました。続けて 1994 年 5 月に FreeBSD 1.1 を公開し、 非常に大きな成功を収めました。

この時期、 あまり予想していなかった嵐が遠くから接近してきていました。 バークレイ Net/2 テープの法的な位置づけについて、Novell 社とカリフォルニア大学バークレイ校との間の長期にわたる 法廷論争において和解が成立したのです。和解の内容は、Net/2 のかなりの部分が "権利つき (encumbered)" コードであり、それは Novell 社の所有物である、 というバークレイ校側が譲歩したものでした。なお、Novell 社はこれらの権利を裁判が始まる少し前に AT&T 社から買収していました。 和解における譲歩の見返りにバークレイ校が得たのは、 4.4BSD-Lite が最終的に発表された時点で、 4.4BSD-Lite は権利つきではないと公式に宣言されること、 そしてすべての既存の Net/2 の利用者が 4.4BSD-Lite の利用へと移行することが強く奨励されること、という Novell 社からの "ありがたき天からの恵み" でした (訳注: 4.4BSD-Lite はその後 Novell 社のチェックを受けてから公開された)。FreeBSD も Net/2 を利用していましたから、1994 年の 7 月の終わりまでに Net/2 ベースの FreeBSD の出荷を停止するように言われました。ただし、 このときの合意によって、 私たちは締め切りまでに一回だけ最後の公開をすることを許されました。 そしてそれは FreeBSD 1.1.5.1 となりました。

それから FreeBSD プロジェクトは、まっさらでかなり不完全な 4.4BSD-Lite を基に、文字どおり一から再度作り直すという、 難しくて大変な作業の準備を始めました。"Lite" バージョンは、部分的には本当に軽くて、中身がなかったのです。 起動し、 動作できるシステムを実際に作り上げるために必要となるプログラムコードのかなりの部分がバークレイ校の CSRG (訳注: BSDを作っているグループ) によって (いろいろな法的要求のせいで) 削除されてしまっていたということと、4.4BSD の Intel アーキテクチャ対応が元々かなり不完全であったということがその理由です。 この移行作業は結局 1994 年の 11 月までかかりました。 そして 12 月に FreeBSD 2.0 として公開されました。これは、 かなり粗削りなところが残っていたにもかかわらず、 かなりの成功を収めました。そしてその後に、より信頼性が高く、 そしてインストールが簡単になった FreeBSD 2.0.5 が 1995 年の 6 月に公開されました。

これ以降、FreeBSD の安定性、速さや機能は改善され、 リリースが行われてきました。

長期的な開発プロジェクトは 15.0-CURRENT 開発ブランチ (main) で続けられ、 15.0 のスナップショットリリースは、開発の進行状況に応じて スナップショットサーバ より継続して入手できます。

1.3.2. FreeBSD プロジェクトの目標

FreeBSD プロジェクトの目的は、いかなる用途にも使用でき、 何ら制限のないソフトウェアを供給することです。 私たちの多くは、 コード (そしてプロジェクト) に対してかなりの投資をしてきており、 これからも多少の無駄はあっても投資を続けて行くつもりです。ただ、 他の人達にも同じような負担をするように主張しているわけではありません。 FreeBSD に興味を持っている一人の残らず全ての人々に、 目的を限定しないでコードを提供すること。これが、 私たちの最初のそして最大の "任務" であると信じています。そうすれば、コードは可能な限り広く使われ、 最大の恩恵をもたらすことができるでしょう。これが、 私たちが熱烈に支持しているフリーソフトウェアの最も基本的な目的であると、 私は信じています。

私たちのソースツリーに含まれるソースのうち、 GNU 一般公有使用許諾 (GPL) または GNU ライブラリ一般公有使用許諾 (LGPL) に従っているものについては、多少制限が課せられています。ただし、 ソースコードへのアクセスの保証という、 一般の制限とはいわば逆の制限 (訳注1) です。 GPL ソフトウェアの商利用には、そのライセンスにある 複雑な側面が影響してくることがあります。 ですから私たちは、そうすることが合理的であると判断されたときには、 より制限の少ない、BSD ライセンスを採用しているソフトウェアを選択するようにしています。

(訳注1) GPL では、「ソースコードを実際に受け取るか、 あるいは、希望しさえすればそれを入手することが可能であること」 を求めています。

1.3.3. FreeBSD の開発モデル

FreeBSD は 非常に開かれた、柔軟性のあるプロセス により開発されています。 貢献者リスト を見ていただければわかるとおり、FreeBSD は文字通り世界中の何千という人々の努力によって開発されています。 FreeBSD の開発環境は、この何千という開発者がインターネット経由で共同作業できるようになっているのです。 新しいボランティアはいつでも大歓迎です。 また、より密接に関わりたいと考える方は FreeBSD への貢献 という文書をご覧ください。

あと、FreeBSD プロジェクトとその開発プロセスについて、 どなたにも知っていていただきたいのは以下のようなことです。

Git リポジトリ

長年にわたり FreeBSD のソースツリーは、 ソースコード管理用のフリーソフトウェアである CVS (Concurrent Versions System) によってメンテナンスされてきました。 2008 年 6 月、プロジェクトはソースコード管理のシステムを SVN (Subversion) に移行しました。 ソースツリーの急速な増加や、これまでに蓄積された膨大な量の履歴によって、CVS の持つ技術的な限界が明かになってきたためです。 ドキュメンテーションプロジェクトと Ports Collection リポジトリも、それぞれ 2012 年 5 月と 7 月に CVS から SVN へと移行しました。 そして 2020年 12 月、プロジェクトは ソースおよびドキュメンテーションのリポジトリGit へ移行し、2021 年 4 月に Ports を移行しました。 FreeBSD src/ リポジトリを取得するための情報は ソースコードの入手 の章を、 FreeBSD Ports Collection を取得するための詳細については Ports Collection の利用 の章をご覧ください。

ソースツリー管理者

コミッター (committers) は Git リポジトリへの push 権限 を持っている人、FreeBSD のソースに変更を加えることができる人です (リポジトリに変更を加えるには、ソースをコントロールする commit というコマンドを使うので、これらの人々は英語では "committers" と呼ばれます)。 もしバグを見つけたのであれば、障害報告データベース に提出してください。 FreeBSD メーリングリスト、IRC チャネルまたはフォーラムは、その問題がバグかどうかを確認する助けとなりますので、障害報告を提出する前に、これらを使って確認してください。

FreeBSD コアチーム

FreeBSD コアチーム は FreeBSD プロジェクトが会社だとすると取締役会にあたるものです。 コアチームとして一番重要な役割は FreeBSD プロジェクトが全体としてよい方向に向かっていることを確認することです。 責任感あふれる開発者を上記のソースツリー管理者として招くこと、 また仕事上の都合などでコアチームをやめた人たちの後任を見つけることもコアチームの役割です。 現在のコアチームは FreeBSD 開発者 (committer) の中から 2022 年 5 月に選挙によって選出されました。 コアチームを選出するための選挙は、2 年ごとに行なわれています。

忘れてほしくないのは、多くの開発者同様に、 コアチームのほとんどは FreeBSD に対してボランティアの立場であり、 FreeBSD プロジェクトからは何ら金銭的な支援を受けていない、 ということです。ですから、 ここでの"責任"は "保証されたサポート"ではありません。 そういう意味で、上記の"取締役会" という例えはあまりよくないかもしれません。むしろ、FreeBSD のために人生を棒に振ってしまった人の集まりといった方が正しいかも…​。

The FreeBSD Foundation

The FreeBSD Foundation は、FreeBSD プロジェクトおよびコミュニティを全世界的にサポートしたり促進することを目的としたアメリカ合衆国における 501(c)(3) に認定された非営利団体です。 この Foundation は、ソフトウェア開発に対するプロジェクトの助成を通じて資金を提供したり、緊急の事態に対する迅速な対応や新しい特徴や機能の実装に対して、スタッフを提供します。 FreeBSD のインフラストラクチャの改善および維持する目的でハードウェアを購入したり、テストカバレッジ、継続的インテグレーションおよび自動化の改善のためにスタッフを雇用しています。 世界中で開催されている技術的な会議やイベントにおいて、FreeBSD をプロモーションすることで FreeBSD を宣伝しています。 また、ワークショップ、教育的な教材やプレゼンテーションを提供して、より多くのユーザや FreeBSD の貢献者をリクルートしています。 さらに、契約の締結、ライセンス契約、およびその他の法的主体必要となる協定において FreeBSD プロジェクトを代表しています。

その他のコントリビュータ

最後になりますが、 もっとも重要で多数をしめる開発者はフィードバックやバグフィクスをどんどん送ってくれるユーザ自身です。 FreeBSD のベースシステムの開発に関わっていきたいという人は、 議論の場である FreeBSD technical discussions メーリングリスト に参加するとよいでしょう。 サードパーティ製のアプリケーションの移植に関わる議論は、 FreeBSD ports メーリングリスト で行われています。 FreeBSD のメーリングリストに関する詳細は、 インターネット上のリソース をご覧ください。

FreeBSD への貢献者リスト は日に日に長くなっています。 あなたも今日、FreeBSD へ何か送ることからはじめてみませんか? もちろん、コードを書くほかにもいろいろな方法があります!

ひとことで言うと、FreeBSD の開発組織はゆるやかな同心円状になっています。 ともすると中央集権的に見えがちなこの組織は、 FreeBSD の ユーザ がきちんと管理されたコードベースを 容易に追いかけられるようにデザインされているもので、 貢献したいという人を締め出す意図は全くありません! 私たちの目標は安定したオペレーティングシステムと 簡単にインストールして使うことのできる アプリケーションを提供することです。 この方法は、それを達成するために非常にうまくはたらきます。

これから FreeBSD の開発にたずさわろうという人に、 私たちが望むことはただ一つです。 FreeBSD の成功を継続的なものにするために、 現在の開発者と同じような情熱を持って接してください!

1.3.4. サードパーティ製プログラム

FreeBSD では基本配布セットに加え、 移植されたソフトウェア集として数千の人気の高いプログラムを提供しています。 ports には HTTP サーバから、ゲーム、言語、 エディタまでありとあらゆるものが含まれています。 36000 以上の ports (移植ソフトウェア) が存在します。 Ports Collection 全体でも 3 GB 程度にしかなりません。 ports をコンパイルするには、 インストールしたいと思っているプログラムのディレクトリに移動し、 make install とすると、 あとはすべてシステムがやってくれます。 どの ports もオリジナルの配布セットを動的に取ってくるので、 ディスクは構築したいと思っている ports の分だけを準備しておけば十分です。 ほとんどの ports は、すでにコンパイルされた状態で "package" として提供されており、ソースコードからコンパイルしたくない場合、これを使うと (pkg install というコマンドで) 簡単にインストールできます。 package と ports に関する詳細は、 アプリケーションのインストール - packages と ports をご覧ください。

1.3.5. ドキュメント

サポートが行われているすべての FreeBSD では、システムのセットアップ時にインストーラを使って、ドキュメントを /usr/local/share/doc/freebsd 以下にインストールできます。 システムをインストールした後は、package を使ってドキュメントをインストールできます。

# pkg install en-freebsd-doc

各言語に翻訳されたドキュメントをインストールするには、"en" の部分を使用する言語のコードに置き換えてください。 翻訳されたドキュメントの中には、古い情報のままの文書があり、現在では正確でなかったり関係ない内容が含まれている可能性があることに注意してください。 ローカルにインストールされたドキュメントは、HTML ブラウザを使って以下の URL から参照できます。

FreeBSD ハンドブック (英文オリジナル)

/usr/local/share/doc/freebsd/en/books/handbook/book.html

FreeBSD に関する FAQ (英文オリジナル)

/usr/local/share/doc/freebsd/en/books/faq/book.html

最新版の文書は常に https://docs.FreeBSD.org/ にありますので、こちらも参照してください。

Chapter 2. FreeBSD のインストール

2.1. この章では

FreeBSD は、amd64, ARM®, RISC-V®, および PowerPC® 等のさまざまなアーキテクチャに対応しています。

インストールまたは直接 FreeBSD を実行するためのイメージは、アーキテクチャおよびプラットフォームごとに ダウンロード できます。

利用できるイメージのタイプは以下の通りです。

  • qcow2, vmdk, vhd および raw デバイスイメージといった仮想マシンのディスクイメージ。これらはインストール用のイメージではなく、FreeBSD がすでにインストールされたインスタンスで、すぐに起動して、インストール後の作業を行うことができます。仮想マシンのイメージは、クラウド環境でも使われます。

  • Raspberry Pi のような組み込みシステム用の SD カードイメージ。これらのファイルをダウンロードしたら、展開し、ボードが起動するように raw イメージとして SD カードに書き込んでください。

  • ISO または USB デバイスから起動して、FreeBSD を通常のデスクトップ、ラップトップ、サーバシステムのドライブ上にインストールするためのインストールイメージ。

この章では、3 番目のケースについて、bsdinstall と呼ばれるテキストベースのインストールプログラムを用いた FreeBSD のインストール方法について説明します。

この章では、以下について説明します。

  • FreeBSD イメージの入手方法および FreeBSD インストールメディアの作り方。

  • bsdinstall の起動方法。

  • bsdinstall が聞いてくる質問がどのような意味であり、 またどのように答えれば良いか。

  • インストールに失敗した時の問題の解決方法。

  • インストールを確定する前に、 FreeBSD の live 版へアクセスする方法。

2.2. 最小ハードウェア要件

FreeBSD をインストールするために必要なハードウェア要件は、アーキテクチャおよびバージョンごとに異なります。 FreeBSD の各リリースが対応しているハードウェアアーキテクチャおよびデバイスの一覧は、 FreeBSD リリース情報 のページにまとめられています。 アーキテクチャごとに推奨される適切なイメージの選択に関しては、 FreeBSD ダウンロードページ でも説明されています。

2.3. インストール前に行う作業

システムが FreeBSD のインストールのための最小ハードウェア要件を満たしていることを確認したら、インストールファイルをダウンロードして、インストール用のメディアを用意してください。 その前に、以下のチェックリストを確認して、システムをインストールする準備ができていることを確認してください。

  1. 重要なデータのバックアップ

    オペレーティングシステムをインストールする前に、 常に 価値のあるすべてのデータを最初にバックアップしてください。 インストールしようとしているシステムにはバックアップを保存しないでください。 そのかわり、USB ドライブ、ネットワーク上の他のシステム、もしくはオンラインのバックアップサービスといったリムーバルディスクにデータを保存してください。 インストールを始める前に、バックアップを調べて、必要なすべてのファイルがバックアップに含まれていることを確認してください。 インストーラがシステムのディスクをフォーマットしてしまうと、ディスクに保存されていたすべてのデータは失われます。

  2. FreeBSD をインストールする場所の決定

    インストールするオペレーティングシステムが FreeBSD のみであれば、 このステップは飛ばすことができます。 しかし、ディスクに FreeBSD と 他のオペレーティングシステムを共存させる必要がある場合には、FreeBSD が利用するディスクおよびパーティションを決める必要があります。

    i386 および amd64 アーキテクチャでは、 二つのパーティションスキームのどちらかを使って、 ハードディスクを複数の塊に分割することができます。 伝統的な Master Boot Record (MBR) では、ディスク 1 台あたり最大 4 つの プライマリパーティション をパーティションテーブルに持つことができます。 歴史的な理由により、FreeBSD では、これらのパーティションのことを スライス と呼びます。 プライマリパーティションの 1 つに、複数の 論理パーティション を含む 拡張パーティション を作成できます。 GUID Partition Table (GPT) は、ディスクをパーティションに分ける簡単で新しい方法です。 一般的な GPT の実装では、1 つのディスクに 128 個までのパーティションの作成が可能であり、論理パーティションは必要ありません。

    FreeBSD のブートローダは、プライマリまたは GPT パーティションのどちらかを必要とします。 ディスク上のプライマリ、もしくは GPT パーティションがすべて使われているのであれば、 そのひとつを FreeBSD のために開放してください。 ディスクにあるデータを消去せずにパーティションを作成するには、 パーティションサイズを変更するツールを使って今あるパーティションのサイズを小さくし、 空いたスペースに新しいパーティションを作成してください。

    パーティションサイズを変更するためのフリーまたは商用のツールは、 List of disk partitioning software wikipedia entry にまとめられています。 GParted Live は、GParted パーティションエディタを含むフリーのライブ CD です。

    ディスクパーティションを縮小するユーティリティは、 適切に用いるとパーティション用の空き容量を新しく安全に作成できます。 すでにあるパーティションを間違って選択してしまう可能性があるので、 ディスクのパーティションを変更する前に、 必ず重要なデータのバックアップをとり、 バックアップが正しくとれていることを検証してください。

    ディスクパーティションごとに異なるオペレーティングシステムをインストールすることで、 一つのコンピュータに複数のオペレーティングシステムをインストールできます。仮想化技術 を用いると、ディスクパーティションを変更することなく、複数のオペレーティングシステムを同時に起動できます。

  3. ネットワーク情報の収集

    FreeBSD のインストール方法によっては、ネットワークに接続し、 インストールファイルをダウンロードする必要があります。 インストールする方法に関わらず、インストール後に、 インストーラはシステムのネットワークインタフェースの設定をする機会を提供します。

    ネットワークに DHCP サーバがあると、 自動的にネットワークの設定情報を取得できます。 DHCP を利用できない環境では、 システムの以下のネットワーク情報について、 システム管理者かプロバイダにネットワーク情報を問い合わせる必要があります。

    1. IP アドレス

    2. サブネットマスク

    3. デフォルトゲートウェイの IP アドレス

    4. ネットワークのドメイン名

    5. ネットワークの DNS サーバの IP アドレス

  4. FreeBSD Errata の確認

    FreeBSD プロジェクトでは FreeBSD の各リリースができる限り安定するよう努力していますが、 時々バグが発生してしまうことがあります。 極まれに、発生したバグがインストールプロセスに影響を与えることがあります。 これらの問題は発見され解決されると、FreeBSD の各バージョンごとに Errata ページに記載されます。 インストールに影響するような既知の問題が無いことを、インストールする前に Errata で確認してください。

    すべてのリリースに関する情報や Errata は、 リリース情報 のページで確認できます。

2.3.1. インストールメディアの準備

FreeBSD のインストーラは、 他のオペレーティングシステムで実行できるようなプログラムではありません。 そのかわり、FreeBSD インストールファイルをダウンロードしたら、 ファイルタイプやサイズに合わせてメディア (CD, DVD または USB) に焼いてください。そして、挿入したメディアからインストールするように、 システムを起動してください。

FreeBSD のインストールファイルは FreeBSD ダウンロードページ から入手できます。 各インストールファイルの名前は、FreeBSD のリリースバージョンおよびアーキテクチャ、ファイルタイプから構成されます。

インストールファイルは、さまざまな形式で、xz(1) により圧縮されたファイルまたは圧縮されていないファイルが用意されています。 用意されているフォーマットは、 コンピュータのアーキテクチャやメディアのタイプによって異なります。

インストールファイルの形式

  • -bootonly.iso: インストーラのみを含む最小のインストールファイルです。 インストールを行う間、インストーラは FreeBSD をインストールするために必要なファイルをダウンロードするため、ネットワーク接続が必要です。 このファイルは、光学メディアに書き込む必要があります。

  • -disc1.iso: FreeBSD のインストールに必要となる、ソースおよび Ports Collection といったすべてのファイルが含まれています。 このファイルは、光学メディアに書き込む必要があります。

  • -dvd1.iso: FreeBSD のインストールに必要となる、ソースおよび Ports Collection といったすべてのファイルが含まれています。 インターネットに接続することなく、メディアのみでシステムのインストールを完了できるように、良く使われるウィンドウマネージャおよびアプリケーションをインストールするためのバイナリ package も含まれています。 このファイルは、光学メディアに書き込む必要があります。

  • -memstick.img: FreeBSD のインストールに必要となる、ソースおよび Ports Collection といったすべてのファイルが含まれています。 イメージファイルを USB に書き込む で説明されている手順に従って、このファイルを USB スティックに書き込んでください。

  • -mini-memstick.img: -bootonly.iso と同じく、インストールファイルは含まれていないため、必要に応じてダウンロードする必要があります。 インストールを行う間、ネットワーク接続が必要です。 イメージファイルを USB に書き込む の説明に従って、USB スティックに書き込んでください。

イメージファイルをダウンロードしたら、同じディレクトリから少なくとも一つの チェックサム ファイルをダウンロードしてください。 2 つの チェックサム ファイルが利用可能です。 これのファイル名にはリリース番号とアーキテクチャ名がついています。 たとえば CHECKSUM.SHA256-FreeBSD-13.1-RELEASE-amd64 および CHECKSUM.SHA512-FreeBSD-13.1-RELEASE-amd64 という名前がつけられます。

どちらかの (もしくは両方の) ファイルをダウンロードしたら、イメージファイルの チェックサム を計算し、 チェックサム ファイルに示されている値と比較してください。 計算した チェックサム は、2 つの異なるアルゴリズム (SHA256 および SHA512) に対応する適切なファイルと比較してください。 FreeBSD では、チェックサム のために sha256(1) および sha512(1) を提供しています。 他のオペレーティングシステムでも同じようなプログラムを利用できます。

FreeBSD での チェックサム の検証は、以下のように sha256sum(1) (または sha512sum(1)) を使用して自動的に行うことができます。

% sha256sum -c CHECKSUM.SHA256-FreeBSD-13.1-RELEASE-amd64 FreeBSD-13.1-RELEASE-amd64-dvd1.iso
FreeBSD-13.1-RELEASE-amd64-dvd1.iso: OK

チェックサムは完全に一致している必要があります。 もしチェックサムが一致しなければ、 イメージファイルが壊れている可能性があるので、もう一度ダウンロードしてください。

2.3.1.1. イメージファイルを USB に書き込む

*memstick.img ファイルは、完全なメモリスティックの内容の イメージ です。 これは、通常のファイルのように対象のデバイスにコピーすることは できません。 USB スティックへ *.img を書き込むためのアプリケーションは複数あります。 この節ではこのうちの二つのユーティリティについて説明します。

先に進む前に、USB スティックに存在する重要なデータをバックアップしてください。 以下の手順を実行すると、 スティックに存在するデータは削除されます。

Procedure. dd を使ってイメージを書き込む

この例では、イメージの書き込み先のターゲットデバイスとして、/dev/da0 が使われています。 ここで使われるコマンドは、 指定したターゲットデバイスに存在しているデータを破壊してしまうので、 正しいデバイスが指定されていることに 細心の注意を払ってください

  1. dd(1) コマンドユーティリティは、 BSD, Linux®, および Mac OS® システムで利用できます。 dd を使ってイメージを焼くには、 USB スティックを挿入して、 デバイス名を確定してください。 その後、ダウンロードしたインストールファイルおよび、 USB スティックのデバイス名を指定してください。 この例では、amd64 インストールイメージを FreeBSD システムの最初の USB デバイスに書き込みます。

    # dd if=FreeBSD-13.0-RELEASE-amd64-memstick.img of=/dev/da0 bs=1M conv=sync

    もし上記のコマンドに失敗するようでしたら、USB スティックがマウントされているかどうか、デバイス名が (パーティションではなく) ディスクに対して指定されていることを確認してください。

    オペレーティングシステムによっては、このコマンドを sudo(8) で実行することが求められる場合があります。 dd(1) の書式は、プラットフォームによって少し変わります。 たとえば Mac OS® では、小文字の bs=1m を使う必要があります。 Linux® のようなシステムでは、書き込みをバッファします。 すべての書き込みを完了させるには、sync(8) を使用してください。

Procedure. Windows® を使ってイメージを書き込む

適切なドライブレターを出力先に設定していることを十分に確認してください。 さもなければ、現在あるデータは上書きされ、 破壊されてしまうでしょう。

  1. Image Writer for Windows® を入手する

    Image Writer for Windows® は、 イメージファイルをメモリスティックに正しく書き込むことのできるフリーのアプリケーションです。 win32diskimager ホームページ からダウンロードして、フォルダに展開してください。

  2. イメージライタを使ってイメージを書き込む

    Win32DiskImager アイコンをダブルクリックして、プログラムを起動してください。 Device の下に表示されるデバイスレターが、 メモリスティックのドライブであることを確認してください。 フォルダのアイコンをクリックして、 メモリスティックに書き込むイメージファイルを選択します。 Save をクリックして、 イメージファイルの名前を確定してください。 すべてが正しく行われたかどうか、また、 他のウィンドウでメモリスティックのフォルダが開かれていないことを確認してください。 準備ができたら、Write をクリックして、 メモリスティックにイメージファイルを書き込んでください。

2.4. インストールの開始

デフォルトでは、次のメッセージが表示されるまで インストーラはディスクに何の変更も加えません。

Your changes will now be written to disk. If you
have chosen to overwrite existing data, it will
be PERMANENTLY ERASED. Are you sure you want to
commit your changes?

この警告の前であれば、いつでもインストールを中断できます。 もし、何かを間違って設定してしまったことが心配ならば、 最後の警告の前に単にコンピュータをオフにしてください。 システムのハードディスクを変更せずに済みます。

この章では、インストールメディアの準備 で説明されている手順によって準備されたインストールメディアから、システムを起動する方法について説明します。 起動可能な USB スティックを使用する場合には、コンピュータを立ち上げる前に、USB スティックを挿入してください。 CD もしくは DVD から起動する場合には、コンピュータを立ち上げ、すぐにメディアを挿入してください。 挿入したメディアからシステムを起動するように設定する方法は、アーキテクチャ毎に異なります。

2.4.1. FreeBSD ブートメニュー

インストールメディアからシステムが起動すると、 以下のようなメニューが表示されます。

FreeBSD ブートローダメニュー
図 1. FreeBSD ブートローダメニュー

デフォルトでは、メニューは、FreeBSD インストーラが起動するまで (FreeBSD がインストールされているシステムでは、FreeBSD が起動するまで)、 ユーザからの入力を 10 秒間受け付けます。 タイマーを停止してオプションを確認には、 Space を押してください。オプションを選択するには、 ハイライトされている番号、文字、もしくはキーを押してください。 以下のオプションが利用可能です。

  • Boot Multi User: FreeBSD の起動プロセスを続けます。 ブートタイマが停止しているのであれば 1、 大文字もしくは小文字の B または、 Enter を押してください。

  • Boot Single User: このモードは、すでにインストールされている FreeBSD を修復するために利用できます。 シングルユーザモードについては、 「シングルユーザモード」 で説明されています。 2 もしくは、小文字もしくは、大文字の S を押すとこのモードに入ることができます。

  • Escape to loader prompt: 制限された低レベルのコマンドのみが利用可能な修復用プロンプトでシステムを起動します。 このプロンプトについては、 「起動ステージ 3」 で説明されています。 3 または Esc を押すとこのプロンプトで起動します。

  • Reboot: システムを再起動します。

  • Cons: video, serial, Dual (serial primary) または Dual (Video primary) でインストールを続けます。

  • Kernel: 別のカーネルを読み込みます。

  • Boot Options: FreeBSD ブートオプションメニュー で示されるメニューを開きます。

サポートされているブートオプションのメニュー
図 2. FreeBSD ブートオプションメニュー

この起動オプションメニューは、 2 つのセクションから構成されています。 最初のセクションは、メインのブートメニューに戻ったり、 オプションをデフォルト値に戻すために利用できます。

次のセクションでは、変更可能なオプションついて、 選択されている番号や文字を、OnOff に変更できます。 システムは、これらのオプションが変更されない限り、 常に変更されたオプションで起動します。 このメニューで変更可能なオプションは以下の通りです。

  • ACPI Support: 起動中にシステムが固まるようでしたら、このオプションを Off にしてください。

  • Safe Mode: 上記のオプションの対応を行ってもシステムが起動時に固まるようでしたら、 ACPI SupportOff にし、このオプションを On に設定してください。

  • Single User: シングルユーザモードでインストールされている FreeBSD を修復には、 On にしてください。 シングルユーザモードについては、 「シングルユーザモード」 で説明されています。 問題が修正された後は、Off に戻してください。

  • Verbose: 起動プロセスの表示をより詳細に表示したい場合には、 このオプションを On にしてください。 ハードウェアの問題を解決する際には有効です。

設定が終わったら、 1 または Backspace を押してメインブートメニューに戻り、 Enter を押して FreeBSD の起動を続けてください。 FreeBSD がハードウェアの検出を行い、 インストールプログラムをロードしている間、 ブートメッセージが表示されます。 起動後、ウェルカムメニュー が表示されます。

FreeBSD インストーラのウェルカムメニュー
図 3. ウェルカムメニュー

Enter を押して、デフォルトの Install を選択すると、インストール作業が始まります。 この章の残りの部分では、このインストーラの使い方について説明します。 メニュー項目を選択するには、左右の矢印キーを使ったり、色付けされた文字を使ってください。 Shell を選択すると、インストールの前に、FreeBSD シェルからコマンドラインユーティリティでディスクを準備できます。 Live CD オプションを選択すると、 インストール前に FreeBSD を試すことができます。 live 版については、Live CD を使う で説明されています。

ハードウェアの検出などのブートメッセージを見るには 大文字または小文字の S を押してください。 その後、Enter を押して、 シェルにアクセスしてください。 シェルプロンプトから、more /var/run/dmesg.boot を入力してください。 メッセージのスクロールには、スペースバーを使ってってください。 終わったら、exit を押して、 ウェルカムメニューに戻ってください。

2.5. bsdinstall の使用

この章では、 bsdinstall メニューの順番と、 システムがインストールされる前に、 尋ねられる情報の形式について紹介します。 メニューオプションの選択には、矢印キーを使い、 メニューの項目の選択や解除する場合には、Space キーを使ってください。 設定が終わったら、Enter を押して設定を保存し、次の画面へ移動してください。

2.5.1. キー配列メニューの選択

このプロセスが始まると、 bsdinstall は キーマップの読み込み のようにキーマップファイルを読み込みます。

キーマップの読み込み
図 4. キーマップの読み込み

キーマップが読み込まれると、bsdinstall は キーマップ選択メニュー を表示します。 上下の矢印キーを使って、システムのキーボードに最も近いキーマップを選択してください。 選択を保存するには、Enter キーを押してください。

キーマップ選択メニュー。対応しているすべてのキーボードが表示されます。
図 5. キーマップ選択メニュー

Esc を押すと、メニューは終了し、 デフォルトのキーボードマップを使うようになります。 どのキーボードマップを選べばよいかわからない場合は、 United States of America ISO-8859-1 を選ぶとよいでしょう。

デフォルトとは異なるキーマップを選択した場合には、 キーマップテストメニュー でキーマップのテストを行い、 インストールを先に進む前に正しく動くかどうかを確認できます。

キーマップテストメニュー
図 6. キーマップテストメニュー

2.5.2. ホスト名の設定

次の bsdinstall のメニューでは、 新しくインストールするシステムに与えるホスト名を設定します。

ホスト名の設定
図 7. ホスト名の設定

ネットワーク上でユニークなホスト名を入力してください。 入力するホスト名は、machine3.example.com のように完全修飾のホスト名で入力してください。

2.5.3. インストールするコンポーネントの設定

次に、 bsdinstall は、インストールするオプションのコンポーネントの選択に移ります。

base-dbg
図 8. インストールするコンポーネントの設定

どのコンポーネントをインストールするかは、 システムの用途と用意されているディスク容量に依存します。 base system として知られている FreeBSD カーネルとユーザランドは、 常にインストールされます。 アーキテクチャによっては、表示されないコンポーネントもあります。

  • base-dbg - デバッグシンボルを有効にしたベースツール (cat, ls や他の多くのツール)。

  • kernel-dbg - デバッグシンボルを有効にしたカーネルおよびモジュール。

  • lib32-dbg - 32-bit のアプリケーションを 64-bit 版の FreeBSD で実行する際に必要となる互換ライブラリ (デバッグシンボルは有効)。

  • lib32 - 32-bit のアプリケーションを 64-bit 版の FreeBSD で実行する際に必要となる互換ライブラリ。

  • ports - FreeBSD Ports Collection は、 サードパーティ製ソフトウェアパッケージのダウンロード、 コンパイル、 インストールを自動化するように設計されたファイルの集まりです。 Ports Collection の使い方については、 アプリケーションのインストール - packages と ports で説明します。

    インストールプログラムは、システムのディスクに十分な空き容量があるかどうかを確認しないので、ハードディスクに十分な容量があるときだけ、このオプションを選択するしてください。 FreeBSD Ports Collection が必要とする容量は、約 3 GB です。

  • src - FreeBSD のカーネルおよびユーザランド両方の完全なソースコードです。 ほとんどのアプリケーションは必要としませんが、 デバイスドライバやカーネルモジュール、 Ports Collection のアプリケーションによってはコンパイル時に必要となります。 このソースは、FreeBSD そのものの開発に使うこともできます。 すべてのソースツリーをインストールするには 1 GB のディスク容量を必要とします。 また、FreeBSD システム全体のコンパイルには、 さらに 5 GB の容量が必要です。

  • tests - FreeBSD テストスイート。

2.5.4. ネットワークからのインストール

ネットワークからのインストール で示されているメニューは、-bootonly.iso または -mini-memstick.img からインストールする時のみ表示されます。 これらのインストールメディアはインストールファイルを含んでいません。 このメニューは、 ネットワーク経由でインストールファイルをダウンロードする必要があるため、ネットワークインタフェースを最初に設定する必要があることを示しています。 このメニューがインストールのプロセスで表示された場合には、 ネットワークインタフェースの設定 に書かれている手順に従ってください。

インストールするコンポーネントが見つからないため、ネットワークからダウンロードを試みることを示しています。
図 9. ネットワークからのインストール

2.6. ディスク領域の割り当て

次のメニューでは、ディスク領域を割り当てる方法を選択します。

パーティションのオプションを示しています。例: マニュアル、シェルなど
図 10. パーティション分割の選択

bsdinstall では、ディスク領域の割り当てのために 4 つの方法が用意されています。

  • Auto (ZFS) によるパーティションの分割では、root-on-ZFS システムを構築します。GELI 暗号に対応した ブート環境 を構築することもできます。

  • Auto (UFS) によるパーティションの分割では、 UFS ファイルシステムを使ってディスクパーティションを自動的に分割します。

  • Manual によるパーティションの分割は、 高度な知識を持つユーザ向けで、 メニューオプションからカスタマイズしたパーティションを作成できます。

  • Shell では、シェルプロンプトを起動し、 高度な知識を持つユーザが、 gpart(8), fdisk(8), bsdlabel(8) のようなコマンドラインのプログラムを実行して、 カスタマイズしたパーティションを作成できます。

この章では、 ディスクパーティションをレイアウトする際の検討事項を説明します。 その後、各パーティションの作成方法について説明します。

2.6.1. パーティションレイアウトのデザイン

デフォルトのファイルシステムのパーティションレイアウトは、システム全体をひとつのファイルシステムで構成します。 十分なディスク容量または複数のディスクを用いる環境において UFS を用いる場合は、複数のファイルシステムを検討する価値があります。 ファイルシステムのレイアウトを行う際には、 ハードディスクの外周部は内周部よりもデータ転送が速いということを思い出してください。 これに従えば、 小さくて激しくアクセスされるファイルシステムを外周付近に、/usr のようなより大きなパーティションはディスクの内側に配置すべきでしょう。 そのため、パーティションを作成する際には、/、 スワップ、/var, /usr のような順で作ってゆくのがよいでしょう。

/var パーティションのサイズは、あなたが計算機をどのように使おうとしているかを反映します。 このパーティションには主としてメールボックスやログファイル、 プリンタスプールが置かれます。 メールボックスとログファイルは、 システムのユーザ数やログの保持期間に依存して予期し得ぬサイズにまで成長する可能性があります。 概して、ほとんどのユーザは、/var にギガバイト以上の空き容量を必要とはしないでしょう。

時には、たくさんのディスク容量が /var/tmp に必要になるときがあります。 新しいソフトウェアをインストールする際、package のツールは、package の一時的なコピーを /var/tmp 以下に展開します。 /var/tmp 以下に十分なディスク容量が用意されていないと、Firefox や LibreOffice のような、大きなソフトウェア package のインストールが、困難になることがあります。

/usr パーティションには、FreeBSD Ports Collection およびシステムのソースコードを含む、システムをサポートするのに必要な多くのファイル群が置かれます。 このパーティションには、少なくとも 2 ギガバイトの容量を用意することをおすすめします。 また、デフォルトではユーザのホームディレクトリは /usr/home に置かれますが、他のパーティションに置くこともできます。 デフォルトでは、/home/usr/home へのシンボリックリンクです。

パーティションのサイズを考える時、 必要量を念頭に置いてください。 別のパーティションには潤沢にスペースが余っているのに、 あるパーティションでスペースが足らないままというのは、 フラストレーションがたまるものです。

経験からスワップパーティションのサイズは物理メモリ (RAM) の 2 倍というのが一般的です。 RAM の少ないシステムでは、もっとスワップを増した方が性能がよくなります (大きなメモリの設定では少なくて済みます)。 スワップが少なすぎる設定は、あなたが後にメモリを増設したときに問題を起すばかりではなく、VM ページスキャニングコードの能率を落します。

複数の SCSI ディスクや異なるコントローラで操作される複数の IDE ディスクを持つ大規模なシステムでは、それぞれのドライブ (4 台まで) にスワップを設定することを推奨します。 各ドライブのスワップパーティションはほぼ同一サイズであるべきです。 カーネルは任意のサイズを扱うことができますが、内部のデータ構造は最大のスワップパーティションの 4 倍に調節されます。 スワップパーティションをほぼ同一のサイズにしておくことで、カーネルはスワップスペースを最適なかたちでディスクをまたいでストライプさせることができます。 多くのスワップサイズを用意すると、全体のスワップに関するカーネルの警告メッセージがが表示されることがあります。 警告メッセージに示される手順に従って、スワップの割り当てのために許容されるメモリ量を増やすことで、この制限容量を増やすことができます。

あなたが通常スワップをたくさん使わないとしても、 プログラムが暴走しても再起動させられる前に回復することが容易になります。

システムを適切にパーティション化することで、小さいが書き込みの激しいパーティションによって引き起こされるフラグメント化を、読み出し専門のパーティションにまで波及させずにすみます。 また、書き込みの激しいパーティションをディスクの周辺部に配置することで、I/O パフォーマンスを増大させることができます。 大きなパーティション内の I/O パフォーマンスもまた必要とされているでしょうが、ディスク周辺部へ移動させたとしても、/var を周辺部に移動させることによって大きな効果が得られたのとは対照的に、意味のあるパフォーマンスの増加は見込めないでしょう。

2.6.2. UFS を用いた Guided によるパーティションの分割

この方法を選択すると、 メニューには利用可能なディスクが表示されます。 複数のディスクが接続されている場合には、 FreeBSD をインストールするディスクを選択してください。

FreeBSD をインストールすることのできるディスクの一覧が表示されます
図 11. 複数のディスクから選択する

ディスクを選択したら、次のメニューでは、 ディスクのすべてにインストールを行うか、 または空き容量にパーティションを作成してインストールを行うかを設定します。 Entire Disk を選択すると、 一般的なパーティションレイアウトが自動的に作成されます。 Partition を選択すると、 ディスクの使用していない領域にパーティションレイアウトを作成します。

使用するディスク上で利用可能な領域をすべて使うか、もしくはパーティションを作成するかを選択するメニュー
図 12. Entire Disk または Partition の選択

Entire Disk オプションを選択すると、bsdinstall はディスクの内容が消去されることを確認するダイアログを表示します。

ユーザに対しディスク上のすべてのデータが消去されることの確認メニュー
図 13. 確認

次のメニューでは、 利用可能なパーティションスキームタイプの一覧が表示されます。 amd64 コンピュータでは、通常 GPT が最も適切な選択となります。 GPT に対応していないような古いコンピュータでは、MBR を使う必要があります。 他のパーティションスキームは、使うことがまれであったり、古いコンピュータで用いられるものです。 パーティションスキーム に詳細があります。

ユーザに対して選択可能なさまざまなパーティションタイプを示し、そのうちのどれかを選択するためのメニュー
図 14. パーティションスキームの選択

パーティションのレイアウトを作成したら、インストールの条件を満たしているかどうかを深く確認してください。 Revert を選択すると、パーティションをオリジナルの値にリセットします。 また、Auto を選択すると、FreeBSD パーティションを自動的に作成します。 パーティションを手動で作成、変更、削除することもできます。 正しくパーティションを作成出来たら、 Finish を選択し、インストールを進めてください。

作成されたパーティションを表示するメニュー
図 15. 作成されたパーティションの確認

ディスクを一度設定すると、次のメニューは、選択したハードドライブをフォーマットする前に、設定を変更できる最後のチャンスです。 もし変更が必要であれば、 Back を選択してメインのパーティションエディタまで戻ってください。 Revert & Exit を選択すると、ハードドライブへの変更なしにインストールを終了します。 インストールプロセスを開始するには、 Commit を選択してしてください。

ユーザに対してインストールを開始すると、すべての変更がディスクに書き込まれ、ディスクに存在するデータは完全に削除されることを確認するメニュー
図 16. 最後の確認

配布ファイルのダウンロード に進んで、インストールプロセスを続けてください。

2.6.3. Manual によるパーティションの分割

この方法を選択すると、 パーティションエディタが起動します。

パーティションエディタを表示しているメニュー
図 17. Manual によるパーティションの分割

インストール先のドライブ (この例では ada0) を選び、 Create を選択すると、 利用可能なパーティションスキームの一覧が表示されます。

選択可能なパーティションスキームを表示しているメニュー
図 18. 手動でパーティションを作成する

amd64 コンピュータでは、通常 GPT が最も適切な選択となります。 GPT に対応していないような古いコンピュータでは、 MBR を使う必要があります。 他のパーティションスキームは、使うことがまれであったり、 古いコンピュータで用いられるものです。

表 1. パーティションスキーム
省略形説明

APM

PowerPC® で使われている Apple Partition Map

BSD

MBR を用いない BSD ラベル。 BSD 以外のディスクユーティリティは認識しないため、しばしば dangerously dedicated mode と呼ばれます。

GPT

GUID Partition Table

MBR

Master Boot Record

パーティションスキームを選択して作成した後で、 もう一度 Create を選択すると、 パーティションが作成されます。Tab キーを使ってカーソルをフィールド間で移動できます。

追加するパーティションのタイプ、サイズ、マウントポイントおよびラベル情報を入力するためのメニュー
図 19. 手動でパーティションを作成する

標準の FreeBSD GPT のインストールでは、UFS または ZFS を含む少なくとも 3 つのパーティションが使われます。

  • freebsd-boot または efi - FreeBSD ブートコードを含んでいます。

  • freebsd-ufs - FreeBSD UFS ファイルシステム。

  • freebsd-zfs - FreeBSD ZFS ファイルシステム。 詳細については、 The Z File System (ZFS) をご覧ください。

  • freebsd-swap - FreeBSD スワップ空間。

利用可能な GPT パーティションタイプについては、gpart(8) をご覧ください。

複数のファイルシステムのパーティションを作成できます。 人によっては /, /var, /tmp および /usr にパーティションを分割する伝統的なレイアウトが好まれます。

十分なメモリを搭載したシステムでは、メモリベースのファイルシステム (tmpfs(5)) を /tmp として後で追加できます。

Size には、 K (キロバイト)、 M (メガバイト)、 G (ギガバイト) といった通常の省略形を使用出来ます。

セクタを適切に配置することで、 最良のパフォーマンスを得ることができます。 また、パーティションサイズを 4K バイトの偶数倍にすると、 512 バイトまたは 4K バイトのセクタでドライブが配置しやすくなります。 一般的に、 4K の偶数倍の場所からパーティションが開始するように設定する簡単な方法は、 1M または 1G の偶数倍のパーティションサイズを用いることです。 ただし、例外があります。 freebsd-boot パーティションは、 ブートコードの制限により 512K 以下である必要があります。

ファイルシステムを持つパーティションでは、マウントポイント が必要となります。 1 つの UFS パーティションだけを作成したのであれば、マウントポイントは / となります。

Label は作成したパーティションを認識するための名前です。 ドライブ名や番号は、ドライブが別のコントローラやポートに接続されると変わることがありますが、パーティションラベルは変わりません。 /etc/fstab のようなファイルの中で、ドライブ名やパーティション番号ではなく、ラベルを参照することにより、システムがハードウェアの変更に対して、より寛容になります。 GPT ラベルは、ディスクが接続されると /dev/gpt/ に現れます。 他のパーティションスキームでは別のラベルとなり、/dev/ 以下の異なるディレクトリにラベルが現れます。

名前の衝突を避けるため、 各パーティションには、一意的な名前使ってください。 コンピュータ名、使用、位置情報を表す単語をラベルに追加できます。 たとえば、lab という名前のコンピュータの UFS の root パーティションには、 labroot または rootfs-lab といった名前を使ってください。

例 1. 伝統的なファイルシステムのパーティションの作成

伝統的なパーティションレイアウト (/, /var, /tmp および /usr ディレクトリが各パーティションの別のファイルシステム) を作成するには、GPT パーティションスキームを作成し、その後、示されているようにパーティションを作成してください。 示されているパーティションサイズは 20G のディスク用です。 ディスクにより多くの容量があれば、swap または /var パーティションを大きく取ると良いでしょう。 ここで示されているラベルには、example を意味する ex が付けられていますが、実際には上で説明したように、これとは別のユニークなラベルをつけてください。

FreeBSD の gptboot は、 デフォルトでは最初に見つかった UFS パーティションが、 / パーティションであることを前提としています。

パーティションタイプサイズマウントポイントラベル

freebsd-boot

512K

freebsd-ufs

2G

/

exrootfs

freebsd-swap

4G

exswap

freebsd-ufs

2G

/var

exvarfs

freebsd-ufs

1G

/tmp

extmpfs

freebsd-ufs

デフォルト (ディスクの残りのすべての容量)

/usr

exusrfs

カスタムパーティションを作成したら、 Finish を選択して 配布ファイルのダウンロード に進み、インストールを先に進めてください。

2.6.4. Root-on-ZFS を用いた Guided によるパーティションの作成

このパーティションの分割モードは、 ディスクのすべての領域に対して機能するので、 ディスク上にあるすべての内容が消去されます。 メインの ZFS 設定メニューには、 プールの作成をコントロールする数多くのオプションが用意されています。

ZFS プールを設定するためのオプションを表示しているメニュー
図 20. ZFS パーティションメニュー

このメニューのオプションは以下の通りです。

  • Install - 選択したオプションでインストールを進めます。

  • Pool Type/Disks - プールを構成する Pool Type およびディスクについて設定します。 現時点で ZFS の自動インストーラは、ストライプモードを除き、単一のトップレベルの仮想デバイスの作成のみに対応しています。 より複雑なプールを作成するには、 シェルモードによるパーティションの作成 で説明されている方法で作成してください。

  • Rescan Devices - 利用可能なディスクの一覧を再表示します。

  • Disk Info - このメニューを使って各ディスクを調べることができます。 パーティションテーブルやそれ以外のデバイスモデルナンバーおよびシリアルナンバーといった情報も、可能であれば調べることができます。

  • Pool Name - pool の名前を設定します。 デフォルトの名前は zroot です。

  • Force 4K Sectors? - 4K セクタを使用するようにします。 インストーラは、デフォルトで 4K の境界に整列するようにパーティションを自動的に作成し、 ZFS が 4K セクタを使用するようにします。 これは 512 バイトセクタのディスクでも安全で、 512 バイトのディスク上に作成されたプールが将来的に 4K セクタのディスクを追加できるようにしておくことには、 ストレージ容量の追加や壊れたディスクの交換時に恩恵があります。 有効にするか無効にするかを選択して Enter キーを押してください。

  • Encrypt Disks? - GELI を使ってディスクを暗号化できます。ディスクの暗号化の詳細については、 geli によるディスクの暗号化 をご覧ください。 Enter キーを押して、暗号化を有効にするか無効にするかを選択してください。

  • Partition Scheme - パーティションスキームを選択します。 ほとんどの場合において、GPT が推奨されます。 別のスキームを選択する場合には、 Enter キーを押してください。

  • Swap Size - スワップ容量を設定します。

  • Mirror Swap? - スワップ領域をディスク間でミラー化するかどうかを設定します。 スワップ領域をミラー化すると、クラッシュダンプを取得できないので注意してください。 Enter キーを押して有効/無効を設定してください。

  • Encrypt Swap? - スワップ領域の暗号化について設定します。 これはシステムの起動時に一時キーとともにスワップ領域を暗号化し、再起動時にキーは破棄されます。 Enter キーを押して有効/無効を設定してください。 詳細については、 swap 領域の暗号化 を参照してください。

T を選択して、Pool Type およびプールに対応するディスクを選択してください。

stripe
図 21. ZFS プールタイプ

このメニューで選択可能な Pool Type は以下の通りです。

  • stripe - ストライピングでは、 接続されているすべてのデバイスの最大容量を使用できます。 ただし、冗長性はありません。 一つのディスクが壊れるだけでプールにあるデータは失われてしまい、 取り返しがつきません。

  • mirror - ミラーリングは各ディスク上にあるすべてのデータの完全なコピーを保存します。 ミラーリングでは、並列にすべてのディスクからデータを読むため、 読み込みのパフォーマンスが向上します。 書き込みのパフォーマンスは、 データが並列にすべてのディスクに書き込まれるため、遅くなります。 1 つを除くすべてのディスクが壊れることを許容します。 このオプションを選択するには、 少なくとも 2 つのディスクを必要とします。

  • raid10 - ストライピングミラー。 最も効率は良いですが、ストレージ容量は少なくなります。 偶数のディスクが必要で、 少なくとも 4 つのディスクが必要です。

  • raidz1 - シングルパリティの RAID。 1 台のディスクの故障に耐えられます。 少なくとも 3 つのディスクが必要です。

  • raidz2 - ダブルパリティの RAID。 同時に 2 台のディスクの故障に耐えられます。 少なくとも 4 つのディスクが必要です。

  • raidz3 - トリプルパリティの RAID。 同時に 3 台のディスクの故障に耐えられます。 少なくとも 5 つのディスクが必要です。

Pool Type を選択したら、 利用可能なディスクの一覧が表示されます。 その後、プールを構成するディスクを、1 つまたは複数選択してください。 十分なディスクが選択されているかどうかについて検証が行われます。 検証に失敗するようであれば、<Change Selection> を選択して、ディスクの一覧に戻ってください。 もしくは、 <Back> を選択して Pool Type に戻ってください。

プールに追加するディスクを選択するメニュー
図 22. ディスクの選択
十分なディスクが選択されていないことを示しているメニュー
図 23. 無効な選択

この一覧の中に抜けているディスクがある時や、 インストーラが立ち上がった後にディスクを接続した場合に、 最新の利用可能なディスクの一覧を見るには、 - Rescan Devices を選択してください。

デバイスのリスキャン
図 24. デバイスのリスキャン

アクシデントで間違ったディスクを削除してしまわないように、 - Disk Info メニュー選択して、 各ディスクのパーティションテーブル、および、 デバイスモデル番号およびシリアル番号などのさまざまな情報を確認してください。

パーティションの情報を表示しているメニュー
図 25. ディスクの解析

N を選択して、 Pool Name を設定してください。 希望する名前を入力後、 <OK> を選択して確定するか、 <Cancel> を押して、 デフォルト名のままでメインメニューに戻ってください。

プールの名前を入力するメニュー
図 26. Pool Name

S を選択してスワップの容量を設定してください。 必要なスワップ容量を入力し、 <OK> を押して確定するか、 もしくは <Cancel> を押して、 デフォルトの容量のまま、メインメニューに戻ってください。

スワップメモリの容量を入力するメニュー
図 27. Swap 容量

すべてのオプションに希望する値を設定したら、メニューの上部にある >>> Install オプションを選択してください。 インストーラは、最終確認として ZFS プールを作成するために選択したドライブの内容が削除されることをキャンセルできる最後の機会を提供してくれます。

データが削除されることをユーザに確認するメニュー
図 28. 最終確認

GELI ディスク暗号化を有効にしていたら、ディスクを暗号化するために用いるパスフレーズを 2 度求められます。 その後、暗号の初期化が開始します。

デバイスを暗号化するためのパスワードを入力するメニュー
図 29. ディスク暗号化パスワード
暗号の初期化が行われていることを示すメニュー
図 30. 暗号の初期化

その後のインストールの過程は、通常通りに進みます。 インストールを進めるには、 配布ファイルのダウンロード に進んでください。

2.6.5. シェルモードによるパーティションの作成

高度なインストールを行う上で、bsdinstall が提供するパーティション分割のメニューは柔軟性にかけることがあります。 手動でドライブの分割、ファイルシステムの作成、/tmp/bsdinstall_etc/fstab の作成、そして /mnt 以下へのファイルシステムのマウントを行うには、パーティションメニューで Shell オプションを選択してください。 このオプションは高度な技術を持つユーザ向けです。 以上を実行したら、exit を実行して bsdinstall に戻り、インストールを続けてください。

2.7. 配布ファイルのダウンロード

インストールにかかる時間は、どのディストリビューションを選んだか、 どのインストールメディアを使ったか、 そしてコンピュータの速度にも依存します。 進行状況を表すメッセージが逐次表示されます。

まず最初に、インストーラは選択されているディスクをフォーマットし、 パーティションを初期化します。 bootonly media または mini memstick メディアを用いたインストールでは、 選択されたコンポーネントがダウンロードされます。

各コンポ―テントのダウンロード状況を表示しているメニュー
図 31. 配布ファイルのダウンロード

次に、ダウンロードの際にエラーが含まれなかったか、 インストールメディアからの読み取り中に読み間違いが起きなかったかどうか等、 配布ファイルの完全性の検証が行われます。

各コンポーネントの検証状況を表示しているメニュー
図 32. 配布ファイルの検証

最後に、検証された配布ファイルがディスクへ展開されます。

配布ファイルの展開状況を表示しているメニュー
図 33. 配布ファイルの展開

必要な配布ファイルがすべて展開されると、 bsdinstall は、 インストール後の設定画面を表示します。 利用可能なインストール後のオプションについては次の章で説明します。

2.8. ネットワークインターフェース、アカウント、タイムゾーン、 サービスおよびセキュリティオプションの設定

2.8.1. root パスワードの設定

最初に root のパスワードを設定する必要があります。 パスワードを入力している際には、入力している文字は画面に表示されません。 入力ミスを防ぐため、パスワードは 2 回入力する必要があります。

root ユーザのパスワードを入力するメニュー
図 34. root パスワードの設定

2.8.2. ネットワークインタフェースの設定

次に、コンピュータが認識したすべてのネットワークインタフェースが表示されます。 設定するネットワークインタフェースを選んでください。

設定を行うネットワークインタフェースを選択するメニュー
図 35. イーサネットインタフェースの選択

イーサネットインタフェースを選択すると、IPv4 ネットワークの選択 で表示されるメニューが表示されます。 ワイヤレスネットワークを選択すると、システムはワイヤレスアクセスポイントをスキャンします。

ワイヤレスネットワークのスキャンの進捗を表示しているメニュー
図 36. ワイヤレスアクセスポイントのスキャン

ワイヤレスネットワークは Service Set Identifier (SSID) によって識別されます。 SSID は、それぞれのネットワークに与えられる、短く、一意的な名前です。 スキャンで見つかった SSID は、そのネットワークで利用できる暗号化のタイプの説明とともに一覧で表示されます。 もし、期待した SSID が一覧に表示されていなければ、Rescan を選択してもう一度スキャンしてください。 それでもなお期待したネットワークが表示されなければ、接続のためのアンテナに問題がないかを確認したり、コンピュータをアクセスポイントの近くに移動してみてください。 その後もう一度スキャンしてください。

接続できるワイヤレスネットワークが表示されているメニュー
図 37. ワイヤレスネットワークの選択

次に、ワイヤレスネットワークに接続するための暗号情報を入力してください。 WEP のような古い暗号の安全性は低いので、WPA2 暗号が強く推奨されます。 WPA2 を使用してるネットワークでは、Pre-Shared Key (PSK) と呼ばれるパスワードを入力してください。 セキュリティ上の観点から、入力ボックスに入力した文字はアスタリスクで表示されます。

ワイヤレスネットワークのパスワードを入力するメニュー
図 38. WPA2 のセットアップ

次に、イーサネットもしくはワイヤレスインタフェースに対して、IPv4 を設定するかどうかを選択します。

選択したネットワークインターフェースに対して IPv4 の設定を行うかどうかを確認するメニュー
図 39. IPv4 ネットワークの選択

IPv4 の設定方法は 2 通りあります。 DHCP はネットワークインタフェースを自動的に適切に設定する方法で、DHCP サーバのあるネットワークでは使用すべきです。 DHCP を利用できない環境では、静的な設定として、ネットワークのアドレス情報を手動で入力する必要があります。

適当なネットワーク情報を入力しても動かないので、DHCP サーバが利用できなのであれば、ネットワーク管理者またはサービスプロバイダから 必要となるネットワーク情報 に示されている情報を入手してください。

DHCP サーバを利用できるのであれば、次のメニューで Yes を選択して、ネットワークインタフェースの設定を自動的に行ってください。 DHCP サーバを検索し、システムに対するアドレス情報を入手する間、インストーラは少しの間停止しているように表示されます。

選択したインターフェースに対して DHCP で設定を行うかを選択するメニュー
図 40. IPv4 DHCP 設定の選択

DHCP サーバを利用できない環境では、No を選択し、新しく表示されるメニューにおいて以下のようなアドレス情報を入力してください。

IPv4 ネットワークを設定するメニュー
図 41. 静的な IPv4 の設定
  • IP Address - コンピュータに与える IPv4 アドレスです。 このアドレスは一意的である必要があるため、ローカルネットワーク上の他のデバイスですでに使われているアドレスは使えません。

  • Subnet Mask - ネットワークのサブネットマスクです。

  • Default Router - このネットワークのデフォルトゲートウェイの IP アドレスです。

次の画面では、インタフェースを IPv6 で設定すべきかを選択します。 IPv6 が利用でき、希望するのであれば、 Yes を選択してください。

選択したネットワークインターフェースに対して IPv6 の設定を行うかどうかを確認するメニュー
図 42. IPv6 ネットワークの選択

IPv6 の設定に関しても 2 つの方法があります。 StateLess Address AutoConfiguration (SLAAC) は、ローカルルータから適切なネットワーク設定情報を入手するように、自動的にリクエストします。 詳細については rfc4862 を参照してください。 静的な設定では、ネットワーク情報を手動で入力する必要があります。

IPv6 ルータを利用できるのであれば、次のメニューで Yes を選択し、ネットワークインタフェースの設定を自動的に行ってください。 インストーラはルータを見つけ出し、システムに対するアドレス情報を入手するため、 少しの間停止しているように表示されます。

選択したネットワークインターフェースに対して SLAAC の設定を行うかどうかを確認するメニュー]
図 43. IPv6 SLAAC 設定の選択

IPv6 ルータが利用できない環境では、No を選択して、表示されるメニューで以下のアドレス情報を入力する必要があります。

IPv6 ネットワークを設定するメニュー
図 44. IPv6 の静的な設定
  • IPv6 Address - このコンピュータに割り当てられた IPv6 アドレスです。このアドレスは一意的である必要があるため、ローカルネットワーク上の他のデバイスですでに使われているアドレスは使えません。

  • Default Router - このネットワークのデフォルトゲートウェイの IPv6 アドレスです。

最後のネットワークメニューでは、ホスト名とネットワークアドレスを変換する Domain Name System (DNS) リゾルバを設定します。 すでに DHCP または SLAAC を使って自動的にネットワークインタフェースを設定したのであれば、Resolver Configuration には値がすでに入っているでしょう。 そうでなければ、Search フィールドにローカルネットワークのドメイン名を入力してください。 DNS #1 および DNS #2 は、ローカル DNS サーバの IPv4 または IPv6 アドレスです。 少なくとも、1 つの DNS サーバは必要です。

ネットワークの DNS を設定するメニュー
図 45. DNS の設定

ネットワーク接続の設定が終わったら、FreeBSD をインストールするコンピュータと同じ地域のミラーサイトを選んでください。 ターゲットコンピュータの近くのミラーサイトを選択できれば、ファイルのダウンロードは早く終わるので、インストールの時間は短くなります。

ftp://ftp.freebsd.org (Main Site)` を選択すると、最も近いミラーに自動的にルーティングします。

ミラーサイトを選択するメニュー
図 46. ミラーサイトの選択

2.8.3. タイムゾーンの設定

次のメニューでは、地域、国、タイムゾーンを指定します。 使用しているシステムのタイムゾーンを設定することで、 夏時間などの地域による時刻の違いが自動的に調整され、 タイムゾーンに関連した機能が適切に取り扱われます。

ここでの例は、 欧州スペインのメインランドタイムゾーンにあるコンピュータに対するものです。 実際の地理的位置に対応するタイムゾーンを設定してください。

地域を選択するメニュー
図 47. 地域の選択

矢印キーを使って、適切な地域を選択し、 Enter を押してください。

国名を選択するメニュー
図 48. 国名の選択

矢印キーを使って、適切に国名を選び、 Enter を押してください。

タイムゾーンを選択するメニュー
図 49. タイムゾーンの選択

矢印キーを使って適切なタイムゾーンを選択し、 Enter を押してください。

タイムゾーンを確定するメニュー
図 50. タイムゾーンの確定

タイムゾーンの省略形が正しいかどうかを確認してください。

システムの日付を設定するメニュー
図 51. 日付の設定

矢印キーを使って適切な日付を選択したら、 Set Date を押してください。 Skip を押すと日付の設定をスキップできます。

システムの時刻を設定するメニュー
図 52. 時刻の設定

矢印キーを使って適切な時刻に設定したら、 Set Time を押してください。 Skip を押すと時刻の設定をスキップできます。

2.8.4. サービスを有効にする

次のメニューでは、システムが起動した時に、 起動するシステムサービスを設定します。 これらのサービスはすべてオプションです。 システムの機能として必要なサービスだけを起動するようにしてください。

利用可能なサービスを表示しているメニュー
図 53. 追加で有効にするサービスの選択

このメニューで有効にできるサービスは以下の通りです。

  • local_unbound - DNS のローカル unbound を有効にします。この設定は、ローカルキャッシュフォワードリゾルバとしての利用のみを想定しています。ネットワーク全体のリゾルバを設定したいのであれば、 dns/unbound をインストールしてください。

  • sshd - セキュアシェル (SSH) デーモンは、 暗号化された接続上でリモートアクセスするために使われます。 システムがリモートログインを必要とする場合のみ、 このサービスを有効にしてください。

  • moused - システムのコンソールで、 マウスを利用する時に、このサービスを有効にしてください。

  • ntpdate - 起動時の自動時刻同期を有効にします。 この機能は、現在 ntpd(8) デーモンでも利用できます。 ntpdate(8) ユーティリティは近々その役目を終える予定です。

  • ntpd - 自動時刻同期のための The Network Time Protocol (NTP) デーモンを有効にします。リモートタイムサーバまたはプールとシステムの時刻を同期する場合は、このサービスを有効にしてください。

  • powerd - 電源の管理およびエネルギーを節約するための電源コントロールユーティリティ

  • dumpdev - システムのデバッグを行う上で、クラッシュダンプは有用なので、可能であれば有効にすると良いでしょう。

2.8.5. セキュリティを強化するオプションを有効にする

次のメニューでは、 有効にするセキュリティオプションを設定します。 すべてはオプションですが、有効にすることが推奨されます。

セキュリティを強化するオプションを表示しているメニュー
図 54. セキュリティを強化するオプションの設定

このメニューで有効にできるのは、以下のオプションです。

  • hide_uids - 他のユーザが実行しているプロセス (UID) を隠します。 特権のないユーザが、他のユーザにより実行されているプロセスを見れないようにします。

  • hide_gids - 他のグループが実行しているプロセスを隠します。 特権のないユーザが、他のグループ (GID) により実行されているプロセスを見れないようにします。

  • hide_jail - jail で実行中のプロセスを隠します。 特権のないユーザが、jail の中で実行されているプロセスを見れないようにします。

  • read_msgbuf - 権限のないユーザが、カーネルメッセージバッファを読めなくします。 権限のないユーザが、dmesg(8) を使ってカーネルログバッファのメッセージを見れないようにします。

  • proc_debug - 権限のないユーザ対するプロセスデバッキング機能を無効にします。 ptrace() および ktrace() といった procfs 機能を含む、権限のないプロセス間のデバッキングサービスを無効にします。 このオプションによって、PHP などのスクリプト言語に対する組み込みのデバッキング機能と同様に、lldb(1), truss(1) および procstat(1) などの権限のないユーザによるデバッキングツールも無効になります。

  • random_pid - プロセスの PID をランダム化します。

  • clear_tmp - システムの起動時に /tmp を空にします。

  • disable_syslogd - syslogd ネットワークソケットを閉じます。 デフォルトでは、FreeBSD は syslogd を -s を使った安全な方法で実行します。 これは、外からのポート 514 に対する UDP リクエストを待機しません。 このオプションを有効にすると、syslogd を -ss 付きで実行します。 これにより、syslogd は空いているどのポートからも受け付けません。 詳細は、syslogd(8) をご覧ください。

  • disable_sendmail - sendmail MTA を無効にします。

  • secure_console - シングルユーザモードに入る際に、コマンドプロンプトに対して root パスワードが必要となります。

  • disable_ddtrace - DTrace は、 実行中のカーネルに影響を及ぼすモードで実行できます。 破壊的なアクションは、明示的に有効にしない限りは利用できません。 このオプションを有効にするには、DTrace を実行する際に -w を使ってください。 詳細については dtrace(1) をご覧ください。

  • enable_aslr - アドレス空間配置のランダム化を有効にします。アドレス空間配置のランダム化の詳細については Wikipedia article をご覧ください。

2.8.6. ユーザの追加

次のメニューでは、少なくとも一人のユーザを追加してください。 システムには root ではなく、ユーザアカウントでログインすることが推奨されています。 root 権限でログインすると、実行に対して制限がなく、また、保護されません。 通常のユーザでログインすることにより、 安全でセキュリティ的に危険が少なくなります。

Yes を選択し、 新しいユーザを追加してください。

システムにユーザを作成するか選択するメニュー
図 55. 新しいユーザのアカウントの作成

プロンプトに従い、 ユーザアカウントの作成で必要となる情報を入力してください。 ユーザ情報の入力 で示されている例では、asample ユーザアカウントを作成します。

追加するユーザの情報を入力しているメニュー
図 56. ユーザ情報の入力

以下は、入力情報のまとめです。

  • Username - ログイン時のユーザ名を入力します。一般的な慣習では、 ファーストネームの最初の文字とラストネームを、 ユーザ名がシステムで一意的になる長さで組み合わせます。 ユーザ名は、大文字と小文字を区別し、 空白を含んではいけません。

  • Full name - ユーザのフルネーム。 空白を含むことは可能です。 また、この情報はユーザアカウントの説明の記述に使われます。

  • Uid - ユーザ ID 番号。 通常は、システムが自動的に割り当てるように、 空欄のままにします。

  • Login group - 新しいユーザのログイングループ。 空欄のままにすると、デフォルトに割り当てられます

  • Invite user into other groups? - ユーザを別のグループのメンバーとして追加するかどうか。 ユーザが管理者としてのアクセス必要であれば、 ここで wheel を入力してください。

  • Login class - 空欄にするとデフォルトの設定になります。

  • Shell - 一覧の中から、ユーザのシェルを入力してください。 シェルに関する詳細については シェル をご覧ください。

  • Home directory - ユーザのホームディレクトリ。 通常は、デフォルトの場所が適切です。

  • Home directory permissions - ユーザのホームディレクトリの権限。 通常は、デフォルトが適切です。

  • Use password-based authentication? - 通常は、ユーザがログイン時にパスワードの入力が要求されるように yes と入力してください。

  • Use an empty password? - 空のパスワードは安全ではないので、通常は no です。

  • Use a random password? - 通常は、次のプロンプトでユーザ自身のパスワードを入力できるように、 no です。

  • Enter password - ユーザのパスワードです。入力している文字は画面に表示されません。

  • Enter password again - 確認のため、パスワードをもう一度入力します。

  • Lock out the account after creation? - 通常は、ユーザがログインできるようにするため、 no です。

すべての詳細を入力したら、サマリが表示され、 正しいかどうかの確認を求められます。 入力した情報に間違いがあれば、 no を入力して修正してください。 すべてが正しく入力されていれば、 yes を入力して新しいユーザを作成してください。

追加するユーザの情報が正しかを確認しているメニュー
図 57. ユーザおよびグループの管理を終了する

さらにユーザを追加するのであれば、 Add another user? の質問に対し、 yes を入力してください。 no を入力すると、ユーザの追加が終わり、次に進みます。

ユーザの追加や、ユーザ管理の詳細については、 ユーザと基本的なアカウント管理 を参照してください。

2.8.7. 最後の設定

すべてをインストールし、設定が終わった後に、 最後に設定を修正する機会が与えられます。

インストールを終わる前に、ユーザを追加したり、タイムゾーンなどを設定するためのメニュー

インストールを完了する前に、このメニューを使って変更、または、追加の設定を行なってください。

最終の設定オプション

設定が完了したら、Exit を選んでください。

インストールが終わり、追加でシェルを開いて手動で変更を行うかどうかを確認しているメニュー
図 58. Manual Configuration

新しいシステムを再起動する前に、 bsdinstall は追加の設定が必要かどうかを尋ねてきます。 Yes を選択して新しいシステムのシェルに入るか、または No を選択して、インストールの最後のステップに進んでください。

インストールが終了し、システムを再起動するか、Live CD にアクセスするかを選択するメニュー
図 59. インストールの終了

追加の設定や、特別なセットアップが必要であれば、 Live CD を選んでインストールメディアを Live CD で起動してください。

インストールが終わったら、 Reboot を選んで、 コンピュータを再起動し、新しい FreeBSD システムで起動してください。 再起動する前には、忘れずに FreeBSD インストールメディアを外してください。 さもないと、もう一度インストールメディアから起動してしまいます。

FreeBSD の起動時には、多くのメッセージが画面に表示されます。 システムの起動後には、ログインプロンプトが表示されます。 login: プロンプトで、インストール時に追加したユーザ名を入力してください。 root でのログインは避けてください。 管理者の権限が必要となった時に、スーパユーザになる方法については、スーパーユーザアカウント を参照してください。

起動時に表示されていたメッセージは、 Scroll-Lock を押し、scroll-back buffer で見ることができます。 PgUp, PgDn そして矢印キーでメッセージをスクロールバックできます。 メッセージの確認が終わったら、Scroll-Lock をもう一度押すと、ディスプレイのロックを外し、 コンソールに戻ることができます。 何度かシステムを起動した後で、これらのメッセージを見るには、コマンドプロンプトから less /var/run/dmesg.boot と入力してください。 確認後に q を押すと、 コマンドラインに戻ります。

追加で有効にするサービスの選択 で sshd を有効に設定した場合には、最初の起動時にシステムが SSH ホストキーを生成するため、少々時間がかかるかもしれません。 その後の起動はより速くなるでしょう。 鍵のフィンガープリントは、以下の例のように表示されます。

Generating public/private rsa1 key pair.
Your identification has been saved in /etc/ssh/ssh_host_key.
Your public key has been saved in /etc/ssh/ssh_host_key.pub.
The key fingerprint is:
10:a0:f5:af:93:ae:a3:1a:b2:bb:3c:35:d9:5a:b3:f3 root@machine3.example.com
The key's randomart image is:
+--[RSA1 1024]----+
|    o..          |
|   o . .         |
|  .   o          |
|       o         |
|    o   S        |
|   + + o         |
|o . + *          |
|o+ ..+ .         |
|==o..o+E         |
+-----------------+
Generating public/private dsa key pair.
Your identification has been saved in /etc/ssh/ssh_host_dsa_key.
Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub.
The key fingerprint is:
7e:1c:ce:dc:8a:3a:18:13:5b:34:b5:cf:d9:d1:47:b2 root@machine3.example.com
The key's randomart image is:
+--[ DSA 1024]----+
|       ..     . .|
|      o  .   . + |
|     . ..   . E .|
|    . .  o o . . |
|     +  S = .    |
|    +  . = o     |
|     +  . * .    |
|    . .  o .     |
|      .o. .      |
+-----------------+
Starting sshd.

フィンガープリントおよび SSH についての詳細については、OpenSSH をご覧ください。

FreeBSD はデフォルトでは、グラフィカルな環境をインストールしません。 グラフィカルなウィンドウマネージャのインストール、 および設定に関するより多くの情報については、 X Window System をご覧ください。

適切に FreeBSD をシャットダウンすることは、 ハードウェアをダメージから守ったり、データの保護につながります。 システムを適切にシャットダウンする前に、 電源を落すということはしないでください!wheel グループのメンバとなっているユーザは、 コマンドラインから su と入力し、 root のパスワードを入力してスーパユーザとなってください。 その後、shutdown -p now と入力すると、システムは正しくシャットダウンし、 ハードウェアが対応していれば、電源が落ちます。

2.9. トラブルシューティング

この章では、インストールの際の、 これまで報告された共通の問題に対する解決のための情報が書いてあります。

FreeBSD リリース情報 ページにあるインストールする FreeBSD のバージョンのハードウェアノートを調べて、 使用しているハードウェアに対応しているかどうかを確認してください。

いくつかのインストール上の問題は、さまざまなハードウェア装置、 特にマザーボードのファームウェアのアップデートで回避または緩和することができます。 マザーボードのファームウェアは、通常 BIOS と呼ばれます。 多くのマザーボードまたはコンピュータ製造メーカーは、 アップデートやアップグレード情報を載せているウェブサイトを用意しています。

通常、製造メーカーは、 重要な更新のようなそれなりの理由がない限り、マザーボードの BIOS のアップグレードは行わないよう推奨しています。 アップデートの過程で失敗する可能性があり、 その場合 BIOS が不完全な状態になり、 コンピュータが動作しない原因となり得るからです。

システムの起動時に、ハードウェアの検出中にシステムが固まったり、インストールプロセスでおかしな振る舞いをする場合には、ACPI が原因の可能性があります。 i386 および amd64 プラットフォームにおいて、 FreeBSD はシステムの設定を手助けするシステム ACPI サービスを、 起動時に検出された場合に広く使います。 残念ながら、まだいくつかの不具合が、 ACPI ドライバとシステムのマザーボードおよび BIOS ファームウェア両方に存在しています。 起動ステージ 3 において、ヒント情報 hint.acpi.0.disabled を以下のように設定すると ACPI を無効にできます。

set hint.acpi.0.disabled="1"

この設定はシステムが起動するたびにリセットされるので、/boot/loader.conf ファイルに hint.acpi.0.disabled="1" を追加する必要があります。 ブートローダのより詳しい情報については FreeBSD の起動のプロセス で説明します。

2.10. Live CD を使う

ウェルカムメニュー で示されている bsdinstall のウェルカムメニューは、 Live CD オプションを提供します。 これは、 オペレーティングシステムに FreeBSD を使うべきかどうか迷っていて、 インストール前に機能を試して見たいと思っている方に有用です。

Live CD を使う際は、以下のことに気をつけてください。

  • システムにアクセスする際には、認証を求められます。 ユーザ名は root、 パスワードは空欄としてください。

  • システムはインストールメディアから直接起動するので、 ハードディスクにインストールされたシステムに比べ、 パフォーマンスはかなり遅い可能性があります。

  • このオプションのユーザインタフェースは、 コマンドプロンプトのみです。 グラフィカルなユーザインタフェースではありません。

Chapter 3. FreeBSD の基礎知識

3.1. この章では

この章では FreeBSD オペレーティングシステムの基本的なコマンドと機能について記述しています。 ここに書かれてあることのほとんどは、どんな UNIX® -like なオペレーティングシステムにもあてはまります。 FreeBSD の初心者であれば、この章を読んでおいた方がきっといいはずです。

この章を読んで分かることは、次のようなことです。

  • 仮想コンソールの使い方と設定方法

  • FreeBSD システム上でユーザやグループを作成し管理する方法

  • UNIX® のファイルの許可属性の仕組みと FreeBSD のファイルフラグについて

  • FreeBSD のファイルシステムの構成

  • FreeBSD のディスク構成

  • ファイルシステムをマウント、アンマウントする方法

  • プロセス、デーモンとシグナルとはなにか

  • シェルとはなにか。 また、デフォルトのログイン環境を変える方法

  • テキストエディタの基本的な使い方

  • デバイスおよびデバイスノードとはなにか

  • さらに詳しい情報を得るためのマニュアルページの読み方

3.2. 仮想コンソールと端末

起動時に自動的にグラフィカルな環境が起動するように FreeBSD を設定していなければ、システムが起動すると、以下のようなコマンドラインのログインプロンプトが表示されます。

FreeBSD/amd64 (pc3.example.org) (ttyv0)

login:

最初の行はシステムの情報です。 amd64 は、このシステム上で 64 ビット版の FreeBSD が動作していることを示しています。 ホスト名は pc3.example.orgttyv0 は "システムコンソール" であることを示しています。 次の行はログインプロンプトです。

FreeBSD はマルチユーザシステムなので、ユーザを区別する何がしかの手段が必要です。 システム上のプログラムを実行できるようになるには、すべてのユーザに対してシステムにログインすることが義務付けられています。 すべてのユーザは、一意な "ユーザ名" と "パスワード" を持っています。

システムコンソールにログインするには、システムのインストール時に ユーザの追加 で追加したユーザ名を入力して、Enter を押してください。 次にそのユーザのパスワードを入力して、Enter を押してください。 セキュリティの観点から、パスワードは 表示されません

パスワードを正確に入力したら、日々のメッセージ (MOTD) が表示され、 コマンドプロンプトが表示されます。 ユーザ作成時に選択したシェルに依存しますが、このプロンプトは #, $ または % といった記号です。 プロンプトはユーザが FreeBSD のシステムコンソールへログインし、利用可能なコマンドを実行する準備ができていることを示しています。

3.2.1. 仮想コンソール

システムコンソールからシステムに対話的にコマンドを実行できますが、FreeBSD システム上でキーボードによりコマンドラインから利用しているユーザは、通常代わりに仮想コンソールにログインします。 デフォルトではシステムからのメッセージはシステムコンソールに出力され、これらのメッセージが、ユーザが作業しているコマンドまたはファイル上に表示されるため、ユーザが現在の作業に集中できなくなるためです。

デフォルトでは FreeBSD は、複数の仮想コンソールを表示してコマンドを入力できるように設定されています。 各仮想コンソールは、個別のログインプロンプトおよびシェルを持っており、簡単に仮想コンソール間の切り替えができます。 これにより、グラフィカルな環境において同時に複数のウィンドウを開いてコマンドラインの環境を提供できます。

FreeBSD では Alt+F1 から Alt+F8 までのキーの組み合わせが、仮想コンソール間の切り替えに予約されています。 システムコンソール (ttyv0) に切り替えるには、Alt+F1 を使ってください。 最初の仮想コンソール (ttyv1) にアクセスするには Alt+F2、2 番目の仮想コンソール (ttyv2) にアクセスするには Alt+F3、といったように使ってください。 Xorg をグラフィカルなコンソールとして使用しているときには、Ctrl+Alt+F1 の組み合わせを使用すると、テキストベースの仮想コンソールへ戻ります。

あるコンソールから他に切り替えるのに応じて、FreeBSD は画面への出力を管理します。 結果として、FreeBSD で動かすコマンドを入力するのに使える複数の画面とキーボードを仮想的に実現できるのです。 ある仮想コンソールで実行したプログラムは、ユーザが別の仮想コンソールに切り替えても実行を停止しません。

FreeBSD のコンソールおよびキーボードドライバに関するさらなる技術的な説明については、kbdcontrol(1), vidcontrol(1), atkbd(4), syscons(4) および vt(4) を参照してください。

FreeBSD では以下の /etc/ttys のセクションのように複数の利用可能な仮想コンソールが設定されています。

# name    getty                         type  status comments
#
ttyv0   "/usr/libexec/getty Pc"         xterm   on  secure
# Virtual terminals
ttyv1   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv2   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv3   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv4   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv5   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv6   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv7   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv8   "/usr/X11R6/bin/xdm -nodaemon"  xterm   off secure

仮想コンソールを無効にするには、無効にしたい仮想コンソールの行をコメント記号 (#) から始まるように設定してください。 たとえば、利用可能な仮想コンソールを 8 つから 4 つに減らす場合には、ttyv5 から ttyv8 までの仮想コンソールを表す最後の 4 行の先頭に # を挿入してください。 システムコンソールを表す ttyv0 から始まる行はコメントアウト しないでください。 最後の仮想コンソール (ttyv8) は、 X Window System で説明されているように Xrog がインストールされて設定されている場合に、グラフィカル環境にアクセスするために使用されます。

このファイルのそれぞれのカラムと仮想コンソールに設定可能なオプションの詳しい説明は、ttys(5) のマニュアルを参照してください。

3.2.2. シングルユーザモード

FreeBSD のブートメニューでは、"シングルユーザモード" と表示されているオプションが提供されています。 このオプションを選択すると、システムは "シングルユーザモード" と呼ばれる特別なモードで起動します。 このモードは、システムが起動しない場合に修正のため、または root のパスワードが分からなくなってしまいリセットするときなど、特別な状況で利用されます。 シングルユーザモードで動かしている場合は、ネットワークや他の仮想コンソールは利用できません。 しかし、システムへの完全な root 権限を利用でき、デフォルトの設定では root のパスワードは必要ありません。 このような理由のため、このモードで起動する場合には物理的なキーボードへのアクセスが必要であり、FreeBSD システムの安全性の観点からキーボードに物理的にアクセスできる人を決めておく事が必要です。 シングルユーザモードを管理する設定は、/etc/ttys ファイルの以下のセクションにあります。

# name  getty                           type  status  comments
#
# If console is marked "insecure", then init will ask for the root password
# when going to single-user mode.
console none                            unknown  off  secure

デフォルトでは、status は secure に設定されています。 これは、キーボードへアクセスできるかユーザが誰であるかが重要ではない、もしくはアクセスできるユーザについては物理的なセキュリティポリシーでコントロールされていることが前提となっています。 この設定を insecure に変更するケースとしては、システムは安全ではなく、誰でもキーボードにアクセスできる環境が想定されます。 この行を insecure に変更すると、FreeBSD がシングルユーザモードで起動した場合に root のパスワードが要求されます。

insecure に変更する場合は十分注意してください! root のパスワードを忘れてしまうと、シングルユーザモードで起動することはできますが、FreeBSD の起動のプロセスに詳しくない人が起動できるようにするのは難しいかも知れません。

3.2.3. コンソールのビデオモードの変更

FreeBSD のデフォルトのビデオモードは 1024x768 や 1280x1024 など、グラフィックチップおよびディスプレイが対応しているサイズに調整されます。 別のビデオモードを使うには、VESA モジュールをロードしてください。

# kldload vesa

その後、ハードウェアが対応しているビデオモードを vidcontrol(1) を使って確認してください。 以下を実行すると、対応しているビデオモードを調べることができます。

# vidcontrol -i mode

このコマンドは、使用しているハードウェアが対応しているビデオモードの一覧を表示します。 その後、vidcontrol(1)root ユーザで実行して、新しく使用するビデオモードを選択してください。

# vidcontrol MODE_279

このビデオモードで良ければ、起動時に自動的に設定されるように /etc/rc.conf に以下のように追加してください。

allscreens_flags="MODE_279"

3.3. ユーザと基本的なアカウント管理

FreeBSD は、複数のユーザが同時にコンピュータを使えるようにします。 スクリーンとキーボードの前に一度に座れるのはその中の一人だけですが ユーザは何人でもネットワークを通してログインできます。 システムを使うためには、 どのユーザもアカウントがなければなりません。

この章では、以下のことを説明します。

  • FreeBSD システムにおけるさまざまな種類のユーザアカウントについて

  • ユーザアカウントを追加、削除および変更する方法

  • ユーザやグループが利用できるリソースの上限を制御する方法

  • グループの作成、 およびグループにユーザをメンバとして追加する方法

3.3.1. アカウントの種類

FreeBSD システムへアクセスするには、 かならずアカウントが使われ、 また、プロセスもすべてユーザによって実行されるので、 ユーザとアカウントの管理は、重要なものです。

アカウントには大きく分けて三種類あります。 システムアカウント (system accounts)、ユーザアカウント (user accounts)、 そしてスーパーユーザ (superuser) です。

3.3.1.1. システムアカウント

システムアカウントは、DNS、メール、 ウェブサーバといった各種サービスを運用するために使われます。 この目的は、セキュリティを確保するためです。 もしすべてのサービスがスーパーユーザで実行されていると、 それらのサービスはどんな動作でも可能となり、 適切な制限を適用することができません。

システムアカウントの具体例は、 daemon, operator, bind, news および www といったものです。

nobody は通常の特権を持たないシステムアカウントです。 しかし、nobody を利用するサービスが増えれば増えるほど、 それに所属するファイルやプロセスも増え、 その特権も大きくなるということを忘れないようにしてください。

3.3.1.2. ユーザアカウント

ユーザアカウントは、 主に現実のユーザがシステムにアクセスする手段として用いられるものです。 システムにアクセスするすべてのユーザは、 それぞれ唯一のユーザアカウントを持つべきです。 こうすることで管理者は誰が何を行なっているかがわかりますし、 他の人の設定を壊してしまうようなことを避けることができます。

それぞれのユーザは快適にシステムを利用するため、 シェル、エディタ、キー設定、言語など、 各自の環境をセットアップすることができます。

FreeBSD システム上のどのアカウントにも、 以下のような情報がなにかしら結び付けられています。

ユーザ名

login: プロンプトに対して入力するユーザの名前です。 各ユーザは一意なユーザ名を持つ必要があります。 有効なユーザ名を作成するには passwd(5) に記載されているいくつもの規則があります。 アプリケーションの上位互換性を保つために、8 文字以下の小文字からなるユーザ名を使うことが推奨されています。

パスワード

各アカウントにはパスワードがあります。

ユーザ ID (UID)

ユーザ ID (UID) は、 FreeBSD システムがユーザを一意に識別するための数値です。 ユーザ名を指定できるコマンドは、 ユーザ名を UID に変換してから扱っています。 65535 より大きな UID は、ソフトウェアによっては互換性の問題を引き起こす可能性があるので、65535 以下の UID を使用することが推奨されています。

グループ ID (GID)

グループ ID (GID) は、 ユーザが属する第一グループを一意に識別するための数値です。 グループは、UID ではなく、 ユーザの GID に基づいて資源へのアクセスを制御する仕組みです。 これは、ある種の設定ファイルのサイズを大幅に小さくします。 ユーザは、複数のグループに所属できます。 65535 より大きな GID は、ソフトウェアに問題を引き起こす可能性があるので、 65535 以下の GID を使うことを推奨します。

ログインクラス

ログインクラスはグループの仕組みを拡張したもので、 別々のユーザに対してシステムを調整する時に、 さらなる柔軟性を提供します。ログインクラスの詳細については、 [users-limiting] で説明します。

パスワードの有効期限

デフォルトでは、パスワードに有効期限は設定されていません。 しかしながら、パスワードの有効期限をユーザごとに設定し、一部またはすべてのユーザに、一定の時間がたったらパスワードを強制的に変更させることができます。

アカウント失効時間

デフォルトでは、FreeBSD はアカウントを失効させません。 たとえば学校で生徒のアカウントがある場合など、 限られた期間だけのアカウントを作成するなら、 そのアカウントがいつ失効するか pw(8) を使って指定できます。 有効期間が経過したら、 そのアカウントのディレクトリやファイルは残っていますが、 システムへのログインはできなくなります。

ユーザの氏名

FreeBSD ではユーザ名でアカウントを一意に識別しますが、 必ずしもユーザの本名を反映したものではありません。 この情報をアカウントに関連付けることもできます。 この情報は、コメントのように、空白、大文字、および 8 字以上で記載できます。

ホームディレクトリ

ホームディレクトリは、システム中のディレクトリへのフルパスです。 これはユーザがログインした時に作業を開始するディレクトリです。 一般的な慣習は、すべてのユーザのホームディレクトリを /home/username/usr/home/username の下に置くことです。 各ユーザは、個人のファイルやサブディレクトリを、ユーザのホームディレクトリに保存します。

ユーザシェル

シェルは、 ユーザがシステムと対話するデフォルトの環境を提供します。 いろいろな種類のシェルがあり、 経験を積んだユーザはそれぞれ好みがあり、 それをアカウントの設定に反映できます。

3.3.1.3. スーパーユーザアカウント

スーパーユーザアカウントは通常 root と呼ばれ、 システム管理を行なうために使われ、権限に制限がありません。 そのため、このアカウントはメールのやりとり、システムの調査、 プログラミングといった日常的な作業を行なうために使われるべきものではありません。

その理由は、スーパーユーザが通常のユーザアカウントと異なり、 操作にまったく制限を受けないことによります。 そのためスーパーユーザアカウントで操作を間違えると、 システムに重大な影響を与えてしまう恐れがあるのです。 ユーザアカウントでは、 仮に操作を間違えてもシステムを壊してしまうようなことはできないようになっています。 そのため、ユーザアカウントでログインし、 高い権限が必要なコマンドを実行するときだけスーパーユーザになることが推奨されています。

スーパーユーザで実行するコマンドはいつでも、 二回、三回と確認してください。 なぜならスペースが多かったり、文字が欠けていたりするだけで、 取り返しのつかないデータの破壊につながる可能性があるからです。

スーパーユーザの権限を得るには、さまざまな方法があります。 root ユーザとしてログインする方法もありますが、 これはまったくお勧めできません。

スーパーユーザの権限を手に入れるには、かわりに su(1) を使って下さい。 - オプションをつけて実行すると、 実行したユーザに root ユーザの環境が設定されます。 このコマンドは wheel グループに入ってるユーザのみが実行でき、他のユーザは実行出来ません。 また、実行時には root ユーザのパスワードを必要とします。

以下の例では、make install を行うときにスーパーユーザの権限が必要なので、 このコマンドを実行する時だけユーザはスーパーユーザになります。 コマンドを実行したら、ユーザは exit を実行してスーパーユーザからログアウトし、 通常のユーザアカウントの権限に戻ります。

例 2. スーパーユーザ権限でプログラムをインストールする
% configure
% make
% su -
Password:
# make install
# exit
%

1 人の管理者が一台のマシン、 もしくは小規模なネットワークを管理する場合には、 su(1) のフレームワークはうまく機能するでしょう。 この代わりとなるのは、 security/sudo package または port です。これはログ機能や、 スーパーユーザの権限で実行できるユーザやコマンドを設定できます。

3.3.2. アカウント情報の管理

FreeBSD は、ユーザアカウントを操作するためにさまざまなコマンドを用意しています。 もっとも一般的なコマンドが ユーザアカウントを管理するためのユーティティ にまとめられています。 その後で、各コマンドについて詳しい使用例を示します。 各ユーティリティの詳細や使用例についてはマニュアルページを参照してください。

表 2. ユーザアカウントを管理するためのユーティティ

コマンド

要約

adduser(8)

コマンドラインからユーザを追加するための推奨アプリケーション

rmuser(8)

コマンドラインからユーザを削除するための推奨アプリケーション

chpass(1)

ユーザデータベースの情報を変更するための柔軟なツール

passwd(1)

ユーザのパスワードを変更するコマンドラインツール

pw(8)

ユーザアカウントのあらゆる箇所を変更する強力で柔軟なツール

bsdconfig(8)

システムの設定のためのユーティリティ。アカウント管理に対応しています。

3.3.2.1. ユーザの追加

新しいユーザの登録に推奨されるプログラムは adduser(8) です。 ユーザを追加すると、このプログラムは、/etc/passwd/etc/group を自動的に更新します。 また、新規ユーザのホームディレクトリを作成し、/usr/share/skel から、デフォルトで使用される設定ファイルをコピーします。 また、新しく作成されたユーザに対して、ウェルカムメッセージをメールで送信することも可能です。 このユーティリティは、スーパーユーザ権限で実行する必要があります。

adduser(8) は、新しいユーザアカウントを対話的に段階的に作成するユーティリティです。 FreeBSD におけるユーザの追加 で示されているように、必要な情報を入力するか、括弧内に示されているデフォルトの値を Return を押して承認してください。 この例では、ユーザは su(1) によってスーパユーザ権限を取得することが可能となる wheel グループに所属します。 操作が終了すると、ユーティリティは別のユーザを追加するか、終了するかを尋ねてきます。

例 3. FreeBSD におけるユーザの追加
# adduser
Username: jru
Full name: J. Random User
Uid (Leave empty for default):
Login group [jru]:
Login group is jru. Invite jru into other groups? []: wheel
Login class [default]:
Shell (sh csh tcsh zsh nologin) [sh]: zsh
Home directory [/home/jru]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password:
Enter password again:
Lock out the account after creation? [no]:
Username   : jru
Password   : ****
Full Name  : J. Random User
Uid        : 1001
Class      :
Groups     : jru wheel
Home       : /home/jru
Shell      : /usr/local/bin/zsh
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (jru) to the user database.
Add another user? (yes/no): no
Goodbye!

入力したパスワードは画面に表示されませんので、 ユーザアカウントを作成する際には、 パスワードを間違えて入力してしまわないように注意してください。

3.3.2.2. ユーザの削除

システムから完全にユーザを削除するには、スーパーユーザ権限で rmuser(8) を実行してください。 このコマンドは、次の手順を実行します。

  1. 指定されたユーザの crontab(1) エントリが存在する場合には削除。

  2. 指定されたユーザの at(1) ジョブをすべて削除。

  3. 指定されたユーザが所有するすべてのプロセスに対して SIGKILL シグナルを送信。

  4. ローカルパスワードファイルから、 指定されたユーザのエントリを削除。

  5. 指定されたユーザのホームディレクトリを削除 (ディレクトリの所有者が指定されたユーザのものだった場合)。実際のホームディレクトリへのシンボリックリンクの削除も含まれます。

  6. /var/mail から、指定されたユーザの到着メールファイルを削除。

  7. /tmp, /var/tmp, および /var/tmp/vi.recover から、指定されたユーザの所有するファイルを削除。

  8. /etc/group にある すべてのグループから、指定されたユーザを削除します (指定されたユーザと同じ名前のグループで、そのユーザが削除されると空のグループとなる場合は、そのグループ自体が削除されます。 これは adduser(8) によってユーザごとに作成される、ユニークなグループに対応するものです)。

  9. 指定されたユーザが所有するすべてのメッセージキュー、共通メモリセグメントおよびセマフォを削除

スーパユーザアカウントの削除に rmuser(8) を利用することはできません。 スーパユーザアカウントの削除はほとんどすべての場合、 大規模なシステムの破壊を意味するからです。

デフォルトでは、以下の例のような対話モードが使われます。

例 4. rmuser による対話的なアカウントの削除
# rmuser jru
Matching password entry:
jru:*:1001:1001::0:0:J. Random User:/home/jru:/usr/local/bin/zsh
Is this the entry you wish to remove? y
Remove user's home directory (/home/jru)? y
Removing user (jru): mailspool home passwd.
3.3.2.3. ユーザ情報の変更

すべてのユーザは、chpass(1) を用いてデフォルトシェルやユーザアカウントに関連した個人情報を変更できます。 スーパユーザ権限に限り、このユーティリティを用いて他のユーザのアカウント情報も変更できます。

ユーザ名の他にオプションを指定しないと、 chpass(1) はユーザ情報を編集するエディタを表示します。 ユーザがエディタを終了すると、 ユーザデータベースが新しい情報に更新されます。

スーパユーザ権限以外でこのユーティリティを実行した場合は、 エディタを抜けた後にユーザのパスワードを聞かれます。

スーパユーザによる chpass の使用 では、スーパーユーザは chpass jru と入力し、このユーザに対して変更可能なフィールドが表示されています。 jru がこのコマンドを実行すると、最後の 6 フィールドのみが表示され編集が可能です。 この場合については、通常のユーザによる chpass の使用 で示されています。

例 5. スーパユーザによる chpass の使用
#Changing user database information for jru.
Login: jru
Password: *
Uid [#]: 1001
Gid [# or name]: 1001
Change [month day year]:
Expire [month day year]:
Class:
Home directory: /home/jru
Shell: /usr/local/bin/zsh
Full Name: J. Random User
Office Location:
Office Phone:
Home Phone:
Other information:
例 6. 通常のユーザによる chpass の使用
#Changing user database information for jru.
Shell: /usr/local/bin/zsh
Full Name: J. Random User
Office Location:
Office Phone:
Home Phone:
Other information:

chfn(1) および chsh(1) コマンドはいずれも、chpass(1) へのリンクです。 また、ypchpass(1), ypchfn(1) および ypchsh(1) も同様です。 NIS のサポートは自動的に行なわれますの、 コマンドの先頭に yp をつける必要はありません。 NIS の設定については、ネットワークサーバの章で説明されています。

3.3.2.4. ユーザのパスワードの変更

いかなるユーザも passwd(1) を使って簡単に自身のパスワードを変更できます。 誤って、または不正なパスワードの変更を避けるため、新しいパスワードを設定する前に、もとのパスワードの入力が求められます。

例 7. 自分のパスワードの変更
% passwd
Changing local password for jru.
Old password:
New password:
Retype new password:
passwd: updating the database...
passwd: done

スーパーユーザは、passwd(1) をユーザ名を指定して実行することにより、いかなるユーザのパスワードを変更できます。 スーパーユーザの権限でこのユーティリティを実行する際には、もとのパスワードを入力する必要はありません。 そのため、ユーザが元のパスワードを忘れてしまっても、パスワードを変更できます。

例 8. スーパーユーザ権限での他のユーザのパスワード変更
# passwd jru
Changing local password for jru.
New password:
Retype new password:
passwd: updating the database...
passwd: done

chpass(1) 同様、yppasswd(1) は、 passwd(1) へのリンクになっていますので、 NIS はどちらのコマンドでも動作します。

3.3.2.5. システムユーザおよびグループの作成、削除、変更および表示

pw(8) は、ユーザやグループの作成、削除、変更および表示を行なうコマンドラインのユーティリティです。 これは、システムユーザファイルやシステムグループファイルのフロントエンドとして働きます。 pw(8) はとても強力な一連のコマンドラインオプションを有しており、シェルスクリプトで使うのに向いていますが、新しいユーザは、この章で紹介されている他のコマンドに比べて難しいと感じるかもしれません。

3.3.3. グループの管理

グループとは、ユーザを羅列したものです。 グループは、グループ名と GID で識別されます。 FreeBSD では、 あるプロセスが何かするのを許可するかどうかをカーネルが判断する際に、 プロセスの UID とそのユーザが所属するグループの一覧を利用します。 ほとんどの場合、ユーザもしくはプロセスの GID は一覧の最初のグループを指しています。

グループ名から GID への写像は /etc/group にあります。 これは、コロンで区切られた 4 項目からなるテキストファイルです。 1 番目の項目はグループ名、2 番目は暗号化されたパスワード、3 番目が GID、4 番目がカンマで区切られたメンバの一覧です。 文法についての完全な説明は、group(5) をご覧ください。

スーパーユーザは、/etc/group をテキストエディタで編集できます。 ただし、よくある間違いを見つけてくれる vigr(8) を用いてグループファイルを編集することが好ましいです。 もしくは、pw(8) を使ってグループの追加や編集をできます。 たとえば、teamtwo というグループを追加して、その存在を確認するには、次のように使います。

operator グループを使う時には、意図しないスーパーユーザへのアクセス権を与える可能性があるため注意が必要です。 シャットダウン、リブートおよびこのグループが所有する /dev のすべてにアクセスできるといったことが可能になってしまいます。

例 9. pw(8) によるグループの追加
# pw groupadd teamtwo
# pw groupshow teamtwo
teamtwo:*:1100:

この例では、1100 という番号は、 teamtwo の GID です。 この時点では、teamtwo にメンバはいません。 以下のコマンドは、 jruteamtwo のメンバに追加します。

例 10. pw(8) により新しいグループにメンバを追加する
# pw groupmod teamtwo -M jru
# pw groupshow teamtwo
teamtwo:*:1100:jru

-M の引数は、カンマで区切られた新しい (空の) グループに追加するもしくは存在するグループのメンバを置き換えるユーザの一覧です。 ユーザにとっては、このグループのメンバーシップはパスワードファイルに記載されているプライマリのグループとは異なります。 pw(8)groupshow コマンドを使った時は、そのユーザはグループの一員として表示されませんが、id(1) などのツールを使って情報を問い合わせれば、その情報を引き出せます。 ユーザをグループに追加をする際に、pw(8)/etc/group しか扱わず、 /etc/passwd から追加のデータを読んだりはしません。

例 11. pw(8) によるグループへのユーザ追加
# pw groupmod teamtwo -m db
# pw groupshow teamtwo
teamtwo:*:1100:jru,db

この例では、-m の引数は、 カンマで区切られたグループに追加するユーザの一覧です。 前の例と異なり、これらのユーザはグループに追加され、既存のグループのユーザを置き換えることはありません。

例 12. グループに所属しているユーザを調べるための id(1) の使い方
% id jru
uid=1001(jru) gid=1001(jru) groups=1001(jru), 1100(teamtwo)

この例では、jrujru グループと teamtwo グループのメンバです。

このコマンドや /etc/group のフォーマットの詳細については、 pw(8) および group(5) をご覧ください。

3.4. 許可属性

FreeBSD では、すべてのファイルおよびディレクトリは一組の許可属性を持っています。 これらの許可属性は、ユーティリティを使って確認したり変更できます。 許可属性がどのように機能するかを知ることで、ユーザが必要とするファイルにアクセスできるかどうか、オペレーティングシステムが使用しているファイルや他のユーザが所有するファイルにアクセスできないことを理解できるようになります。

この節では、FreeBSD で使用される伝統的な UNIX® の許可属性について説明します。 より細かいファイルシステムのアクセス制御に関しては、アクセス制御リスト をご覧ください。

UNIX® では、基本の許可属性は 3 つのアクセスタイプ (読み・書き・実行) を使って割り当てられます。 これらのアクセスタイプを使って、ファイルの所有者 (owner)、グループ (group) その他 (others) に対するファイルアクセスを設定します。 読み、書き、実行に関する許可属性は、それぞれ r, w, および x 文字で表されます。 これらの許可属性を表す際に、オンかオフ (0) による 2 進数表記も使われます。 数字で表現する場合には、 r4w2 そして x1 の値を持つよう、rwx の順番で表されます。

以下は、許可属性を表す際に用いられる数字およびアルファベットをまとめた表です。 "ディレクトリの表示" カラムでは、- は許可属性がオフに設定されていることを表します。

表 3. UNIX® 許可属性
許可属性ディレクトリの表示

0

読み込み不可、書き込み不可、実行不可

---

1

読み込み不可、書き込み不可、実行可能

--x

2

読み込み不可、書き込み可能、実行不可

-w-

3

読み込み不可、書き込み可能、実行可能

-wx

4

読み込み可能、書き込み不可、実行不可

r--

5

読み込み可能、書き込み不可、実行可能

r-x

6

読み込み可能、書き込み可能、実行不可

rw-

7

読み込み可能、書き込み可能、実行可能

rwx

コマンドライン引数 -l とともに ls(1) を使うと、詳細なディレクトリリストを見ることができ、ファイルの所有者、グループ、その他への許可属性を示す欄があるのがわかります。 例えば、ls -l を実行して、 適当なディレクトリを表示させると以下のようになります。

% ls -l
total 530
-rw-r--r--  1 root  wheel     512 Sep  5 12:31 myfile
-rw-r--r--  1 root  wheel     512 Sep  5 12:31 otherfile
-rw-r--r--  1 root  wheel    7680 Sep  5 12:31 email.txt

myfile が含まれている行の一番目の列の最初の (一番左の) 文字は、そのファイルが普通のファイルなのか、ディレクトリなのか、キャラクタ型のデバイス特殊ファイルなのか、ソケットなのか、その他の特殊な疑似ファイルデバイスなのかといった種類を示す特別な文字です。 この例において、- という文字は、普通のファイルであることを示します。 その次に来る rw- と書かれた 3 文字は、そのファイルの所有者に許可を与えるものです。 その次の r-- の 3 文字は、そのファイルが所属しているグループに許可を与えます。 最後の r-- の 3 文字は、 システムに存在するその他のユーザに許可を与えます。 "-" は許可が与えられていないことを示します。 この例では、ファイルの所有者はこのファイルを読み書きでき、ファイルの所属しているグループに属するユーザはファイルを読むことだけでき、そのどちらでもないユーザは、 このファイルを読むだけできるように許可属性が与えられています。 上の表によれば、このファイルに与えられた許可属性は 644 となります。 ここで各数字は、このファイルの許可属性の 3 つの部分を表しています。

デバイスの場合の許可属性はどのようにコントロールされているのでしょうか? FreeBSD は、大部分のハードウェアをファイルとして取り扱います。 そのため、プログラムからは普通のファイルとまったく同じようにオープンし、 データの読み書きができるようになっています。 これらのデバイス特殊ファイルは /dev/ に収められています。

ディレクトリもまた、ファイルと同様に扱われます。 それは読み込み/書き込み/実行の許可属性を持ちます。 ディレクトリの実行ビットはファイルのそれとは少し違った意味を持ちます。 ディレクトリが実行可能になっているとき、cd(1) を使ってそのディレクトリに移動することができます。 これは、そのディレクトリにあるファイルにアクセスできることを意味しています (ファイル自体の許可属性によります)。

ディレクトリの中の一覧を表示するには、そのディレクトリに読み込み属性が設定されていなければなりません。 名前が分かっているファイルを削除するには、そのファイルが含まれているディレクトリに 書き込み属性 実行属性 の両方が必要です。

この他にも許可属性ビットはありますが、いずれも setuid バイナリや sticky ディレクトリなどといった特殊な状況で使われます。 ファイルの許可属性そのものについて、また、それらの設定方法に関する詳しい情報は、 chmod(1) マニュアルページを参照してください。

3.4.1. シンボリック表記

シンボリック表記と呼ばれる許可属性を表す方法では、ファイルやディレクトリの許可属性を、8 進数ではなく記号を用いて設定します。 シンボリック表記による許可属性を表す方法では、(who), (action), (permissions) という書式が用いられます。 利用できる値は以下の通りです。

オプション文字意味

(who)

u

ユーザ

(who)

g

ファイルを所持しているグループ

(who)

o

その他

(who)

a

すべて ("world")

(action)

+

許可属性を与える

(action)

-

許可属性を取り除く

(action)

=

許可属性を指定したものにする

(permissions)

r

読み込み

(permissions)

w

書き込み

(permissions)

x

実行

(permissions)

t

Sticky ビット

(permissions)

s

UID または GID を設定する

これらの値は、これまでと同様に chmod(1) で用いますが、数字ではなく文字で指定します。 たとえば、FILE に対して FILE のグループメンバーおよび自分以外のすべてのユーザからアクセスを一切受け付けたくない、というときには以下のコマンドを実行してください。

% chmod go= FILE

カンマ区切りで設定することで、ファイルの属性を一度に 2 つ以上変更できます。 以下の例では、FILE に対して自分以外のユーザから書き込みの権限を取り上げ、かわりにすべてのユーザが FILE を実行できるようにします。

% chmod go-w,a+x FILE

3.4.2. FreeBSD のファイルフラグ

ファイルの許可属性に加え、FreeBSD では "ファイルフラグ" を使えます。 これはファイルにセキュリティや管理上の属性を追加するものですが、ディレクトリには追加しません。 ファイルフラグにより、root ユーザでさえ誤ってファイルを消去、変更してしまうことを防ぐことができます。

ファイルフラグは、chflags(1) を使って、簡単なインタフェースで設定できます。 例えば、file1 というファイルにシステムレベルで消去不可のフラグを設定するには、以下のコマンドを実行してください。

# chflags sunlink file1

消去不可のフラグを削除するには、以下のように sunlink の前に "no" をつけて実行してください。

# chflags nosunlink file1

ファイルに設定されているフラグを確認するには、-lo と一緒に ls(1) を実行してください。

# ls -lo file1
-rw-r--r--  1 trhodes  trhodes  sunlnk 0 Mar  1 05:54 file1

いくつかのファイルフラグの追加、削除は root ユーザしかできません。 他のフラグは、ファイルの所有者が変更できます。 chflags(1)chflags(2) から、より詳細な情報を得ることをおすすめします。

3.4.3. setuid, setgid および sticky 許可属性

これまでに説明した許可属性のほかに、 すべての管理者が知っておくべき特別な設定が 3 つあります。 それは setuid, setgid および sticky 許可属性です。

これらの設定は、通常のユーザには許可されていない機能を提供するので、UNIX® の操作において重要となることがあります。 これらの許可属性を理解するためには、実ユーザ ID と実効ユーザ ID の違いに注意してください。

実ユーザ ID は、所有したりプロセスを開始する UID です。 実効 UID は、プロセスを実行するユーザ ID です。 たとえば、ユーザがパスワードを変更するときに利用する passwd(1) は、実ユーザ ID で起動します。 しかしながら、パスワードデータベースのアップデートの際は、実効 ID の root ユーザの権限で実行されます。 この仕組みにより、Permission Denied エラーが表示されることなく、ユーザはパスワードを変更できます。

setuid 許可属性は、以下の例で示されているように、ユーザに対して s の許可属性をつけることで設定できます。

# chmod u+s suidexample.sh

setuid 許可属性は、以下の例で示されているように、指定する許可属性に数字の 4 をつけることでも設定できます。

# chmod 4755 suidexample.sh

これで suidexample.sh の許可属性は以下のように設定されます。

-rwsr-xr-x   1 trhodes  trhodes    63 Aug 29 06:36 suidexample.sh

s は、許可属性のファイル所有者の実行可能ビットに置き換わって反映されます。 この設定により、passwd(1) といったユーティリティが権限を昇格することができます。

nosuid mount(8) オプションを使うと、このようなバイナリがユーザへの警告なしに権限を昇格できないように設定できます。 ただし nosuid ラッパにより回避できるため、このオプションを完全には信頼できません。

リアルタイムに確認するために、2 つのターミナルを開いてください。 1 つのターミナル上で、通常のユーザ権限で passwd と入力してください。 パスワードの入力を待つ間に、もう一つのターミナル上で、プロセステーブルおよび passwd(1) のユーザ情報を確認してください。

ターミナル A:

Changing local password for trhodes
Old Password:

ターミナル B:

# ps aux | grep passwd
trhodes  5232  0.0  0.2  3420  1608   0  R+    2:10AM   0:00.00 grep passwd
root     5211  0.0  0.2  3620  1724   2  I+    2:09AM   0:00.01 passwd

通常のユーザ権限で passwd(1) を実行したにもかかわらず、実効 UID の root が使われています。

setgid 許可属性は setuid 許可属性と同様の機能を提供しますが、この許可属性はグループの設定を変更します。 この設定を行った上でアプリケーションまたはユーティリティを実行すると、プロセスを開始するユーザではなく、ファイルを所有するグループに対してこの許可属性を与えます。

記号を用いてファイルに setgid 許可属性を設定するには、chmod(1) で設定するグループに s の許可属性をつけて実行してください。

# chmod g+s sgidexample.sh

または、chmod(1) で設定する許可属性の先頭に 2 をつけて実行してください。

# chmod 2755 sgidexample.sh

以下に示されるように、s がグループの許可属性に指定されています。

-rwxr-sr-x   1 trhodes  trhodes    44 Aug 31 01:49 sgidexample.sh

上記の例において、対象としているシェルスクリプトが実行可能なファイルであっても、シェルスクリプトは setuid(2) システムコールにアクセスできないため、実効ユーザ ID では実行されません。

setuid および setgid 許可属性ビットは、権限の昇格を許可するので、システムのセキュリティレベルを下げます。 一方 3 番目の特殊な許可属性 sticky bit は、システムのセキュリティを強化します。

ディレクトリに sticky bit を設定すると、ファイルの所有者のみがファイルを削除できるようになります。 /tmp といった共有のディレクトリにおいて、ファイルの所有者以外のユーザがファイルを削除できなくなるので有用です。 この許可属性を有効にするには、ファイルに対して t モードを追加してください。

# chmod +t /tmp

または、許可属性に 1 をつけて設定してください。

# chmod 1777 /tmp

sticky bit が設定されていると、許可属性の最後に t が表示されます。

# ls -al / | grep tmp
drwxrwxrwt  10 root  wheel         512 Aug 31 01:49 tmp

3.5. ディレクトリ構造

FreeBSD のディレクトリ構造は、システム全体を理解するに当たって重要です。 最も重要なディレクトリは、ルートまたは "/" です。 このディレクトリは起動時に一番最初にマウントされ、オペレーティングシステムをマルチユーザで動作させるために必要なベースシステムが含まれています。 また、ルートディレクトリには、マルチユーザへの移行中に他のファイルシステムをマウントするためのマウントポイントも含まれます。

マウントポイントとは、追加するファイルシステムを接続する先の親のファイルシステム (普通はルートファイルシステム) のディレクトリのことです。 より詳細な説明は ディスク構成 の節にあります。 標準的なマウントポイントには /usr/, /var/, /tmp/, /mnt/ および /cdrom/ があります。 通常これらのディレクトリについては、/etc/fstab というファイル中のエントリが参照されます。 このファイルは、さまざまなファイルシステムとマウントポイントの表であり、システムが参照します。 /etc/fstab に書かれたファイルシステムは noauto オプションが指定されていなければ、起動時に rc(8) スクリプトによって自動的にマウントされます。 詳細は fstab ファイル の節をご覧ください。

ファイルシステム構造を網羅した説明は hier(7) に書かれています。 以下の表は、もっともよく使われるディレクトリの簡単な概要です。

ディレクトリ

説明

/

ファイルシステムのルートディレクトリ

/bin/

シングルユーザ環境とマルチユーザ環境の両方で重要な ユーザユーティリティ

/boot/

オペレーティングシステムの起動時に使われるプログラムと設定ファイル

/boot/defaults/

デフォルトの起動設定ファイル; loader.conf(5) 参照

/dev/

devfs(4) により管理されるデバイスファイル

/etc/

システム設定ファイルとスクリプト

/etc/defaults/

デフォルトのシステム設定ファイル; 詳細については rc(8) 参照

/etc/periodic/

cron(8) 経由で毎日・毎週・毎月実行されるスクリプト; 詳細については periodic(8) 参照

/lib/

/bin および /sbin にあるバイナリで必要とされる重要なシステムライブラリ

/libexec/

重要なシステムファイル

/media/

CD, USB ドライブおよびフロッピーディスクなどのリムーバブルメディアのマウントポイントとして使用されるサブディレクトリを含むディレクトリ

/mnt/

システム管理者が一時的なマウントポイントとしてよく使う空のディレクトリ

/net/

自動マウント NFS 共有。auto_master(5) を参照

/proc/

プロセスファイルシステム; 詳細については procfs(5)mount_procfs(8) 参照

/rescue/

rescue(8) で説明されている緊急時のために静的にリンクされているプログラム

/root/

root アカウントのホームディレクトリ

/sbin/

シングルユーザ環境とマルチユーザ環境の両方で重要なシステムプログラムと管理ユーティリティ

/tmp/

システムの再起動では通常保存 されない 一時的なファイル。 メモリファイルシステムはよく /tmp にマウントされます。 これは rc.conf(5) の tmpmfs 関係の変数を使うか、/etc/fstab に設定項目を記入することで自動化できます。 詳しくは mdmfs(8) を参照して下さい。

/usr/

大部分のユーザユーティリティとアプリケーション

/usr/bin/

よく使うユーティリティとプログラミングツールとアプリケーション

/usr/include/

C の標準ヘッダファイル

/usr/lib/

ライブラリ

/usr/libdata/

いろいろなユーティリティのデータファイル

/usr/libexec/

他のプログラムから実行されるシステムデーモンとシステムユーティリティ

/usr/local/

ローカルのプログラムやライブラリなど。 FreeBSD ports フレームワークのデフォルトインストール先としても使われます。 /usr/local 内では、 hier(7) に書かれている /usr のための一般構造が使われます。 例外は man ディレクトリで、/usr/local/share の下ではなく /usr/local の下に直接置かれ、ports 関係文書は share/doc/port に置かれます。

/usr/ports/

FreeBSD Ports Collection (オプション)。

/usr/sbin/

ユーザにより実行されるシステムデーモンおよびシステムユーティリティ

/usr/share/

アーキテクチャに依存しないファイル

/usr/src/

BSD のソースファイルまたはローカルのソースファイル、あるいは両方

/var/

さまざまな用途のログ・一時的なファイル・スプールファイル。

/var/log/

いろいろなシステムログファイル

/var/tmp/

一時的なファイル。通常の設定では、ここにあるファイルはシステムが再起動しても失われません。

3.6. ディスク構成

ファイルを見つけるために FreeBSD が使用する構成の一番小さな単位はファイル名です。 ファイル名は、大文字と小文字を区別します。 このことは readme.txt および README.TXT が異なる二つのファイルであることを意味します。 FreeBSD はそのファイルがプログラム、または文書、あるいはその他の形式かどうかを決定するために拡張子を使用しません。

ファイルはディレクトリ内に格納されます。 ディレクトリはファイルを一つも含んでいないかもしれせんし、または数百のファイルを含んでいるかもしれません。 ディレクトリはまた別のディレクトリを含むことができるので、 データを体系づけるディレクトリの階層構造を構築できます。

ファイルおよびディレクトリは、必要な他のディレクトリ名とスラッシュ (/) を後に続けてファイル名またはディレクトリ名を与えることによって参照されます。 たとえば、foo ディレクトリがあって、その中に bar ディレクトリがあるとします。 そして、その中に readme.txt があるとすると、ファイルへのフルネーム、または パスfoo/bar/readme.txt となります。 ファイルとディレクトリ名を分けるために \ を使う Windows® とは違うことに注意してください。 FreeBSD は、パスの中にドライブレターまたは他のドライブ名を使いません。 たとえば、FreeBSD では c:\foo\bar\readme.txt とは書きません。

3.6.1. ファイルシステム

ディレクトリおよびファイルはファイルシステム内に格納されます。 どのファイルシステムも、そのファイルシステムのための ルートディレクトリ とよばれる、まさに頂点の位置にちょうど一つのディレクトリを含んでいます。 このルートディレクトリは他のディレクトリを含むことができます。 一つのファイルシステムは ルートファイルシステム または / として設計されています。 すべてのファイルシステムは、ルートファイルシステム以下に マウント されます。 FreeBSD システムでどんなに多くのディスクを使用しても、すべてのディレクトリは、同じディスクの一部であるように見えるので問題ありません。

A, B および C と呼ばれる三つのファイルシステムがあるケースを考えます。 それぞれのファイルファイルシステムには一つのルートディレクトリがあり、A1, A2 と呼ばれている二つの他のディレクトリを含んでいます (同様に B1, B2 および C1, C2 があります)。

A をルートファイルシステムとします。 このディレクトリになにが含まれているか見るために ls(1) コマンドを使うと、A1 および A2 の二つのサブディレクトリが表示されるでしょう。 ディレクトリツリーは以下のようになります。

ルートディレクトリおよび 2 つのサブツリーを持つディレクトリツリー

ファイルシステムはマウント先のファイルシステム内のディレクトリにマウントしなければいけません。 それでは、A1 ディレクトリに B ファイルシステムをマウントすると仮定します。 B のルートディレクトリは A1 に置き換えられ、そして B 内のディレクトリがそれに応じて現れます。

ルートディレクトリおよび 2 つのサブツリーを持つディレクトリツリー。さらに B1 および B2 サブディレクトリが  A1 にぶら下がっています

B1 または B2 内にあるどんなファイルも、必要なときに /A1/B1 または /A1/B2 で到達できます。 /A1 にあったすべてのファイルは一時的に隠されました。 それらは BA から アンマウント されたら再び現れるでしょう。

もし BA2 にマウントされていたら、この図のようになります。

ルートディレクトリおよび 2 つのサブツリーを持つディレクトリツリー。さらに B1 および B2 サブディレクトリが  A2 にぶら下がっています

そして、パスはそれぞれ /A2/B1 および /A2/B2 となるでしょう。

ファイルシステムは互いのファイルシステム上にもマウントできます。 上記の最後の例に続けて、C ファイルシステム は B ファイルシステム内の B1 ディレクトリ上にマウントできます。 次の図のようになります。

複雑なディレクトリツリー。さまざまなサブディレクトリがルート以下にぶら下がっています。

または CA ファイルシステムの A1 ディレクトリの下に直接マウントできます。

複雑なディレクトリツリー。さまざまなサブディレクトリがルート以下にぶら下がっています。

一つの大きなルートファイルシステムを用意し、他のファイルシステムを作成する必要としないことはまったくもって可能です。 この方法にはいくつかの短所と一つの利点があります。

マルチファイルシステムの利点
  • 異なったファイルシステムは異なった マウントオプション を使用できます。 たとえば、ルートファイルシステムを読みだし専用でマウントして、不注意によってユーザが重大なファイルを削除、または編集できないようにすることができます。 また、/home のようなユーザが書き込み可能なファイルシステムを他のファイルシステムと分けることによって、 nosuid でマウントすることが可能になります。 このオプションは、ファイルシステムに記録されている suid/guid の実行可能ビットを有効にしないので、安全性を高めることができるでしょう。

  • FreeBSD はファイルシステムがどのように使われているかによって、自動的にファイルシステム上のファイルの配置を最適化します。 したがって、連続的に書き込まれた多くの小さなファイルが含まれているファイルシステムは、より大きく少ないファイルが含まれているファイルシステムと異なる最適化をするでしょう。 一つの大きなファイルシステムを作成すると、この最適化は成り立たなくなります。

  • FreeBSD のファイルシステムはトラブルが起きても強固です。 しかしながら臨界点でのトラブルは、ファイルシステムの構造にまだ損害を与えるかもしれません。 マルチファイルシステムへデータを分割しておくことで、 必要なときにバックアップからレストアすることをより容易にして、まだシステムが回復するかもしれません。

シングルファイルシステムの利点
  • ファイルシステムは固定サイズです。 FreeBSD をインストールするときにファイルシステムを作成して、 固定サイズを割りあてたなら、 後になってそのパーティションをより大きくする必要があると気づくかもしれません。 パーティションのサイズを変更するには、 バックアップ、新しいサイズを指定したファイルシステムの再作成、 バックアップしたデータをリストアする作業が必要となるでしょう。

    FreeBSD には、 growfs(8) コマンドがあります。 このコマンドは、この制限を取り除いて、ファイルシステムのファイルを直ちに増加させることを可能にします。 ファイルシステムは、そのファイルシステムのあるパーティションの空いている領域に対してのみ拡張できます。 パーティションを分割した後、空いている領域があれば、gpart(8) を用いてパーティションを拡張できます。 仮想ディスクの最後のパーティションであれば、ディスクを大きくすると、パーティションを拡張できます。

3.6.2. ディスクパーティション

ファイルシステムは パーティション 内に含まれています。 ディスクは 1 つのパーティションスキーム (Manual によるパーティションの分割) を用いてパーティションに分割されます。 新しいスキームは GPT で、古い BIOS-ベースのコンピュータは MBR を使用します。 GPT は、サイズ、オフセットおよびタイプによるディスクのパーティション分割に対応しています。 多くのパーティションおよびパーティションタイプに対応しているため、GPT が利用できる場合はこのパーティションスキームを使用することが推奨されます。 GPT パーティションは、接尾語 p1 が最初のパーティション、接尾語 p2 が 2 番目のパーティションといったような接尾語を使います。 一方 MBR パーティションは少ない数のパーティションにのみ対応しています。 MBR パーティションは、FreeBSD では スライス として知られています。 スライスは他のオペレーティングシステムでも使うことができます。 FreeBSD のスライスはさらに、BSD ラベル (bsdlabel(8) 参照) を用いてパーディションに分割できます。

スライス番号は 1 から始まり s を前につけられて、デバイス名の後に続きます。 したがって、"da0s1" は一番目の SCSI ドライブ上の一番目のスライスです。 ディスク上に存在できる物理スライスは、4 つまでですが、適切な種類の物理スライス内に論理スライスを作成できます。 これらの拡張されたスライス番号は 5 から始まります。 したがって、 "ada0s5" は、一番目の SATA ディスク上の一番目の拡張スライスです。 これらのデバイスは、スライスを占有することを予期するファイルシステムによって使用されます。

GPT または BSD の各パーティションは、一つのファイルシステムだけを含むことができます。 このことは、ファイルシステムがファイルシステムの階層上の典型的なマウントポイント、または含まれているパーティション名によって記述されることを意味します。

FreeBSD は スワップ領域 にもまたディスク領域を使用します。 スワップ領域は FreeBSD に 仮想メモリ を提供します。 これはあなたのコンピュータが、 実際に搭載している以上のメモリがあるかのように振舞います。 FreeBSD がメモリを使い果たしたときに、現在使用されていないデータのいくつかをスワップ領域に移動し、そのデータが必要となったときに (その他のデータをスワップ領域に移動させてから) メモリ内に移動しなおします。 これは ページング と呼ばれます。

いくつかの BSD パーティションはある慣習と関係づけられています。

パーティション

慣習

a

通常、ルートパーティションを含みます。

b

通常、スワップ領域を含みます。

c

通常、スライス全体と同じサイズです。 これは、スライス全体にアクセス必要のあるユーティリティ (たとえば、ひどいブロックスキャナ) が、 c パーティションにアクセスすることを可能にします。 通常、このパーティション内にファイルシステムは作成されません。

d

d パーティションは、 それに関連づけられた特別な意味を持っていましたが、 今は無いので、普通のパーティションとして動作するでしょう。

スライスおよび "危険な専用" の物理ドライブ、 そして他のドライブは a から h までの文字として表される BSD パーティションを含んでいます。 この文字はデバイス名に追加されます。 したがって、 "da0a" は一番目の "危険な専用" da ドライブ上の a パーティションです。 "ada1s3e" は、 二番目の SATA ディスク上の 三番目のスライス内にある五番目のパーティションです。

最後に、システム上のそれぞれのディスクは識別されます。 ディスク名はどの種類のディスクであるかを示す記号ではじまり、どのディスクかを示す数字が続きます。 パーティションやスライスとは異なり、ディスクの番号づけは 0 から始まります。 共通の記号は ディスクデバイス名 に示されます。

スライスにあるパーティションを参照するときには、ディスク名、s、スライス番号、そしてパーティション文字を含めてください。 ディスク名、スライス名、パーティション名のサンプル に例があります。 GPT パーディションはディスク名、p そしてパーティション番号が含まれます。

ディスクの概念的構成 は、MBR スライスを用いたディスク構成の概念のモデルを示します。

FreeBSD をインストールする際には、MBR を使用する場合にはディスクスライスを設定し、次に FreeBSD に用いるスライス内のパーティションを作成します。 GPT を使用する場合には、各ファイルシステムにパーティションを設定します。 どちらのケースでも、それぞれのパーティション内にファイルシステムまたはスワップ領域を作成し、ファイルシステムがどこにマウントされるか決定してください。 パーティションの操作についての詳細は gpart(8) をご覧ください。

表 4. ディスクデバイス名
ドライブタイプドライブデバイス名

SATA および IDE ハードドライブ

ada

SCSI ハードドライブおよび USB ストレージデバイス

da

NVMe ストレージ

nvd または nda

SATA および IDE CD-ROM ドライブ

cd

SCSI CD-ROM ドライブ

cd

フロッピードライブ

fd

SCSI テープドライブ

sa

RAID ドライバ

aacd (Adaptec® AdvancedRAID), mlxd および mlyd (Mylex®), amrd (AMI MegaRAID®), idad (Compaq Smart RAID), twed (3ware® RAID) など

表 5. ディスク名、スライス名、パーティション名のサンプル
名前意味

ada0s1a

一番目の SATA ディスク (ada0) 上の一番目のスライス (s1) 内の一番目のパーティション (a)。

da1s2e

二番目の SCSI ディスク (da1) 上の二番目のスライス (s2) 内の五番目のパーティション (e)。

例 13. ディスクの概念的構成

これはシステムに接続された一番目の SATA ディスクの FreeBSD から見た図を示します。 ディスクサイズは 250 GB と仮定し、80 GB のスライス (MS-DOS® でいうパーティション) および 170 GB のスライスがあるとします。 一番目のスライスは Windows® NTFS ファイルシステム C: を含んでいます。 そして、二番目のスライスは FreeBSD のディスクを含んでいます。 これは FreeBSD インストーラが四つのデータパーティションと一つのスワップパーティションを作成した例です。

四つのパーティションはそれぞれファイルシステムを含んでいます。 パティション a はルートファイルシステム、d/var, e/usr、そして f/usr に使用されています。 パーティション c はスライス全体を示しており、通常のパーティションとは異なる使われ方をします。

Windows と FreeBSD を 1 つのドライブに共存させたレイアウト

3.7. ファイルシステムのマウントとアンマウント

ファイルシステムは / をルート (根) とする木構造として考えると視覚的に理解しやすいでしょう。 ルートディレクトリにある /dev/usr、その他のディレクトリは枝に相当し、それらには、/usr/local などのように、さらに枝分かれすることができます。

さまざまな理由がありますが、 ディレクトリをいくつかの異なるファイルシステム上に構築するのが良いでしょう。 たとえば /var には、 log/spool/ など、さまざまな種類の一時ファイルを置くディレクトリがあるため、あふれてしまう可能性があります。 ルートファイルシステムをあふれさせるのは得策ではありませんので、普通は /var/ から分離します。

また、次のような場合も、ディレクトリツリーを別のファイルシステムに置く理由として良くあげられます。 それは、たとえば物理的に別のディスクにディレクトリツリーを置く場合、 「ネットワークファイルシステム (NFS)」 で説明されているようにネットワークファイルシステムをマウントしたり、CDROM ドライブのような別の仮想ディスクに置くという場合です。

3.7.1. fstab ファイル

/etc/fstab に書かれているファイルシステムは、noauto オプション指定されているエントリを除いて 起動プロセス の途中で自動的にマウントされます。 このファイルは、 次のような書式で書かれたエントリを含んでいます。

device       /mount-point fstype     options      dumpfreq     passno
device

デバイス名。「デバイス名」 に説明があります。

mount-point

ファイルシステムがマウントするディレクトリ。

fstype

mount(8) に渡されるファイルシステムタイプ。 FreeBSD ファイルシステムのデフォルトは ufs です。

options

読み書きするファイルシステムには rw、読み込み専用のファイルシステムには ro を、必要な他のオプションの前に指定します。 よく使われるオプションは noauto で、 起動時にはマウントされないファイルシステムに使います。 その他のオプションは mount(8) マニュアルページに載っています。

dumpfreq

これは dump(8) が使うもので、 どのファイルシステムにダンプが必要なのかを決めます。 この項目がなければ、0 であるものとみなされます。

passno

これは再起動後に fsck(8) がチェックする UFS ファイルシステムの順番を決めます。 ファイルシステムチェックを飛ばしたいファイルシステムには、passno を 0 に設定してください。 ルートファイルシステムはどれよりも先にチェックする必要があり、passno は 1 に設定してください。 他のファイルシステムの passno は 1 以上に設定してください。 同じ passno のファイルシステムがあった場合、 fsck(8) は可能であれば並行してファイルシステムのチェック を行なおうとします。

/etc/fstab の書式やオプションに関しての詳細は、 fstab(5) をご覧ください。

3.7.2. mount(8) の使い方

ファイルシステムは mount(8) を用いてマウントされます。 基本な構文は以下のようになります。

# mount device mountpoint

/etc/fstab に記載されているファイルシステムについても、マウントポイントを指定することでマウントできます。

mount(8) で説明されているように、このコマンドはたくさんのオプションを提供します。 最もよく使われるのは次のものです。

マウントオプション
-a

/etc/fstab にある全てのファイルシステムをマウントします。 例外は "noauto" の印がついているものと、 -t フラグで除外されたものと、 すでにマウントされているファイルシステムです。

-d

実際にマウントシステムコールする以外のすべてのことをします。 このオプションは -v フラグと組み合わせて使い、 mount(8) が実際なにをしようとしているのか調べるのに便利です。

-f

クリーンでないファイルシステムを強制的にマウントします (危険です)。もしくは、ファイルシステムのマウント状態を 読み書き可能から読み込みのみに変更するとき、 書き込みアクセスを強制的に取り消します。

-r

ファイルシステムを読み込み専用でマウントします。 -o ro を使うのと同じです。

-t fstype

指定のファイルシステムタイプでマウントします。 または、-a を使った場合、 指定したタイプのファイルシステムのみマウントします。 デフォルトのファイルシステムタイプは "ufs" です。

-u

ファイルシステムのマウントオプションを更新します。

-v

詳細な出力にします。

-w

ファイルシステムを読み書き可能にマウントします。

-o には、 次のようなオプションを複数カンマで区切って指定できます。

nosuid

そのファイルシステム上の setuid や setgid フラグを解釈しません。 これもセキュリティのために有用なオプションです。

3.7.3. umount(8) の使い方

ファイルシステムをアンマウントするには、umount(8) を使ってください。 このコマンドは、パラメータとしてマウントポイントの一つ、 デバイス名、もしくは -a-A といったオプションを取ります。

いずれの形式でも -f で強制的なアンマウントを行ない、 -v で詳細な出力を出します。 ただしほとんどの場合、-f は使わないほうがよいでしょう。 計算機がクラッシュしたりファイルシステム上部のデータが破壊されたりする恐れがあります。

マウントされているファイルシステムすべてをアンマウントするには、-a-A を使ってください。 -t にファイルシステムタイプを指定すると、指定されたものだけがアンマウントされます。 -A を使うとルートファイルシステムはアンマウントしません。

3.8. プロセスおよびデーモン

FreeBSD はマルチタスクのオペレーティングシステムです。 動作中のプログラムはそれぞれ プロセス と呼ばれます。 すべてのコマンドは実行すると、最低でも 1 つの新しいプロセスを開始します。 FreeBSD により実行されているシステムプロセスもたくさんあります。

各プロセスは プロセス ID (PID) と呼ばれる数字でただ一つに識別されます。 ファイルのように各プロセスには所有者とグループがあり、 所有者とグループの許可属性は、そのプロセスが開けるファイルやデバイスを決定するために使われます。 多くのプロセスには親プロセスもあります。 親プロセスとは、そのプロセスをスタートさせたプロセスのことです。 例えば、シェルがプロセスで、シェルから起動されるコマンドは、シェルを親プロセスとするプロセスとなります。 例外は init(8) という特別なプロセスです。 init は FreeBSD がスタートするときに起動される最初のプロセスで、PID は常に 1 です。

ユーザから始終入力があるように設計されていないプログラムがあり、そういったプログラムは最初から端末と切り離されています。 例えば、ウェブサーバはユーザからの入力ではなくウェブのリクエストを処理します。 メールサーバも、 こういった種類のアプリケーションの一例です。 このような種類のプログラムは、 デーモン と呼ばれます。 デーモンはギリシャ神話から来ており、目に見えないように役立つことをしてくれる善でも悪でもない実体を表します。 このため、BSD のマスコットはスニーカーをはいてフォークを携えたかわいらしい姿のデーモンなのです。

通常デーモンとして動作するプログラムには末尾に "d" を持った名前をつける慣習があります。 例えば、BIND は Berkeley Internet Name Domain ですが、 実際実行されるプログラムは named です。 また、Apache ウェブサーバのプログラムは httpd、ラインプリンタスプーリングデーモンは lpd です。 これは単なる命名に関する慣習です。 例えば、Sendmail アプリケーションの主なメールデーモンは sendmail で、maild ではありません。

3.8.1. プロセスを確認する

システム上で実行中のプロセスを確認するには、ps(1) または top(1) を使ってください。 現在動作中のプロセスのリスト、プロセスの PID やプロセスが使っているメモリの量、どういうコマンドラインで起動されたのかなどを表示させるには、ps(1) を使ってください。 top(1) を使用すると、動作中の全てのプロセスを表示できます。 数秒ごとに表示を更新するので、計算機が何をしているのかインタラクティブに知ることができます。

デフォルトでは、ps(1) はユーザにより動作中かつ所有のコマンドのみを表示します。 例えば:

% ps
 PID TT  STAT    TIME COMMAND
8203  0  Ss   0:00.59 /bin/csh
8895  0  R+   0:00.00 ps

ps(1) の出力はいくつかの列に整形されています。 PID の列はプロセス ID を表示します。 PID は 1 から順に 99999 まで割り当てられ、その後足りなくなると最初に戻って使い回されます。ただし、使用中の PID には割り当てられません。 TT の列はプログラムが動いている tty を示し、STAT はプログラムの状態を示します。 TIME はプログラムがその CPU 上で動いている時間の長さです。 通常はプログラムをスタートさせたときからの経過時間ではありません。 多くのプログラムは、CPU 上で時間を使う必要があるまでかなりの時間を費すためです。 最後に、COMMAND はそのプログラムを起動するのに使われたコマンドとなります。

表示する情報を変更するオプションが用意されています。 いちばん便利なのは auxww でしょう。 a はすべてのユーザの動作中のプロセス全部についての情報を表示します。 u はプロセスの所有者のユーザ名とメモリ使用量を表示します。 x はデーモンプロセスについての情報を表示し、ww で、スクリーンに入りきらないほど長くなったコマンドラインでも省略せず、ps(1) に各プロセスの全コマンドラインを表示させます。

top(1) の出力も同様です。

% top
last pid:  9609;  load averages:  0.56,  0.45,  0.36              up 0+00:20:03  10:21:46
107 processes: 2 running, 104 sleeping, 1 zombie
CPU:  6.2% user,  0.1% nice,  8.2% system,  0.4% interrupt, 85.1% idle
Mem: 541M Active, 450M Inact, 1333M Wired, 4064K Cache, 1498M Free
ARC: 992M Total, 377M MFU, 589M MRU, 250K Anon, 5280K Header, 21M Other
Swap: 2048M Total, 2048M Free

  PID USERNAME    THR PRI NICE   SIZE    RES STATE   C   TIME   WCPU COMMAND
  557 root          1 -21  r31   136M 42296K select  0   2:20  9.96% Xorg
 8198 dru           2  52    0   449M 82736K select  3   0:08  5.96% kdeinit4
 8311 dru          27  30    0  1150M   187M uwait   1   1:37  0.98% firefox
  431 root          1  20    0 14268K  1728K select  0   0:06  0.98% moused
 9551 dru           1  21    0 16600K  2660K CPU3    3   0:01  0.98% top
 2357 dru           4  37    0   718M   141M select  0   0:21  0.00% kdeinit4
 8705 dru           4  35    0   480M    98M select  2   0:20  0.00% kdeinit4
 8076 dru           6  20    0   552M   113M uwait   0   0:12  0.00% soffice.bin
 2623 root          1  30   10 12088K  1636K select  3   0:09  0.00% powerd
 2338 dru           1  20    0   440M 84532K select  1   0:06  0.00% kwin
 1427 dru           5  22    0   605M 86412K select  1   0:05  0.00% kdeinit4

出力は2つのセクションに分かれています。 ヘッダ (最初の 5 または 6 行) は動作している最新のプロセスの PID、システムの平均負荷 (システムがどれくらい忙しいかの指標)、システムの稼働時間 (最後の再起動からの時間) と現在の時刻を示します。 ヘッダの中の他の数字は動作中のプロセスの数、使われているメモリとスワップ領域の量、そしてシステムが異なる CPU 状態に消費した時間と関係します。 ZFS ファイルシステムのモジュールをロードしている場合には、ARC 行にはディスクではなくメモリキャッシュから読み込んだデータ量が表示されます。

ヘッダの下には、PID、ユーザ名、消費 CPU 時間とプロセスを起動したコマンドといった ps(1) の出力と同じような情報を持った行が続きます。 top(1) を使うとデフォルトでプロセスが使っているメモリ容量を表示します。 メモリ使用量の欄は 2 項目に分かれており、 一方は合計使用量、 そしてもう一方は実使用量です。 合計使用量はアプリケーションが必要としているメモリ量で、実使用量はその時点で実際に使われているメモリ量です。

top(1) は自動的に 2 秒ごとに画面を更新します。 -s 使うと更新間隔を変更することができます。

3.8.2. プロセスの終了

動作中のプロセスもしくはデーモンと通信する一つの方法は、kill(1) を用いて シグナル を送信する方法です。 送信可能なシグナルはたくさんあります。 特別な意味があるものもあれば、アプリケーションの文章に説明されているものもあります。 ユーザは自分が所有者となっているプロセスにのみシグナルを送ることができます。 他人のプロセスにシグナルを送ると、permission denied というエラーになるでしょう。 この例外は root ユーザで、 ルートユーザは誰のプロセスに対してもシグナルを送ることができます。

オペレーティングシステムもプロセスにシグナルを送ることができます。 アプリケーションを下手に書いてしまい、予想外のメモリにアクセスしようとすると、FreeBSD はプロセスに "セグメンテーション違反" シグナル (SIGSEGV) を送ります。 ある程度の時間が経ったら alarm(3) システムコールを使って警告してもらうように書かれているアプリケーションには、"警告" シグナル (SIGALRM) が送信されます。

プロセスを止めるためには2つのシグナル、SIGTERMSIGKILL を使います。 SIGTERM は穏かにプロセスを終了させる方法です。 プロセスはシグナルを受け取ることができ、開いているすべてのログファイルを閉じ、終了前にしていたことを終えるように試みることができます。 中断できない処理の途中だと、SIGTERM をプロセスが無視することもあるかもしれません。

プロセスは SIGKILL を無視することができません。 プロセスに SIGKILL を送ると、プロセスは通常その時点で止まります。

他に良く使われるシグナルには、SIGHUPSIGUSR1SIGUSR2 があります。 これらは一般的な用途のシグナルなので、このシグナルが送信されたときの応答は、アプリケーション毎に異なります。

例として、ウェブサーバの設定ファイルを変更後、ウェブサーバに設定を再読み込みさせる必要があります。 httpd を再起動するとウェブサーバは一瞬ながら停止してしまいます。 その代わりに SIGHUP シグナルを送りましょう。 デーモンごとに行動が違うので、SIGHUP が期待する結果となるように、そのデーモンの文書を読んで確認してください。

システム上のランダムプロセスを終了させるのはよくありません。 特に、PID が 1 の init(8) は特別です。 /bin/kill -s KILL 1 は推奨されていませんが、実行するといとも簡単にシステムをシャットダウンさせることができます。 Return を押す kill(1) を実行する引数を二重にチェックする をつけてください。

3.9. シェル

シェル は、オペレーティングシステムを利用するためのコマンドラインインタフェースを提供します。 シェルは入力チャンネルからコマンドを受け取り、それらを実行します。 大部分のシェルは、日々の作業、ファイル管理やファイル名の展開、コマンドライン編集、コマンドマクロ、環境変数といった組み込みの機能を持ってます。 FreeBSD には Bourne Shell (sh(1)) や 高機能 C-shell (tcsh(1)) が含まれています。 また、これ以外にも zshbash などのシェルが FreeBSD Ports Collection から利用可能です。

どのシェルを使うかは、まったく趣味の問題です。 あなたが C のプログラマだったとすれば、tcsh(1) のような C 風のシェルの方が落ち着くかもしれません。 Linux® ユーザであれば、bash を好まれるでしょう。 それぞれのシェルは、 ユーザの好みの作業環境で利用できる (もしくはできない) 独自の機能を持っているということ、そして、どのシェルを使うことにするかを決めるのはユーザ自身ということです。

シェルの一般的な機能の一つに、ファイル名の補完があります。 コマンドやファイル名の最初の数文字を入力して Tab を押すと、シェルにコマンドやファイル名の残りの部分を補完させることができます。 例として、foobar および footbar という二つのファイルがあるとします。 foobar を削除するために rm foo と入力し、Tab を押してファイル名を補完しようとします。

しかしシェルは rm foo とだけ出力します。 foobar および football のファイル名は、両方とも foo から始まるため、ファイル名の補完を完全には行なえませんでした。 一つ以上のファイル名にマッチした場合、ビープ音をらすシェルもあれば、選択できるすべてのファイル名を表示するシェルもあります。 この場合、希望するファイル名を同定するために、ユーザはさらに文字を入力する必要があります。 t を入力してもう一度 Tab を押すと、シェルはファイル名を確定でき、ファイル名の残りの部分が補完されます。

もう一つあげられるシェルの特徴として、環境変数があります。 環境変数とは、シェルの環境変数におけるキーと値とのペアです。 この環境変数は、そのシェルから起動されたプログラムから参照でき、それを利用してプログラムの設定を保存するのに利用されます。 一般的な環境変数 は、一般的な環境変数とその意味の一覧です。 環境変数の名前は常に大文字です。

表 6. 一般的な環境変数

変数名

意味

USER

現在のログインユーザのユーザ名。

PATH

コロンで区切られた実行ファイル探索のための ディレクトリのリスト。

DISPLAY

接続する Xorg ディスプレイのネットワーク名 (存在する場合のみ)。

SHELL

現在のシェル。

TERM

ユーザの端末種名。 端末のケーパビリティを決定するのに使われる。

TERMCAP

種々の端末の機能を実現する端末のエスケープコードの データベースのエントリ。

OSTYPE

オペレーティングシステムの種別。

MACHTYPE

システムの CPU アーキテクチャ。

EDITOR

ユーザの選んだテキストエディタ。

PAGER

ユーザの選んだ画面上でテキストを見るためのユーティリティ。

MANPATH

コロンで区切られたマニュアルページ探索のための ディレクトリのリスト。

環境変数を設定する方法は、シェルごとに多少異なります。 tcsh(1)csh(1) では setenv を使います。 sh(1)bash 等の Bourne シェルでは、export を使って現在の環境変数を設定します。 以下の例では、tcsh シェルでデフォルトの EDITOR/usr/local/bin/emacs に設定します。

% setenv EDITOR /usr/local/bin/emacs

bash では次のようになります。

% export EDITOR="/usr/local/bin/emacs"

現在の設定を確認するために、コマンドライン中の変数名の前に $ 文字を置くことで、環境変数を展開させることができます。 たとえば、echo $TERM$TERM が セットされている内容を表示します。

シェルは特殊文字を、特別なデータを表すものとして扱います。 その特殊文字はメタキャラクタと呼ばれます。 もっとも一般的なメタキャラクタは * で、これはファイル名に含まれる、あらゆる文字を表します。 メタキャラクタはファイル名の展開に使われます。 たとえば、echo * と入力すると ls と入力したのとほとんど同じ結果を得られます。 これはシェルが * とマッチするすべてのファイルを受け取って echo はコマンドラインでそれらを表示するからです。

特殊文字をシェルに解釈させないようにするため、特殊文字の前にバックスラッシュ文字 (\) を置いてエスケープしてください。 例えば echo $TERM は端末の設定を表示し、echo \$TERM$TERM とそのまま表示します。

3.9.1. シェルの変更

デフォルトのシェルを変更する一番簡単な方法は chsh を使うことです。 このコマンドを実行すると、環境変数 EDITOR で示されたエディタ (デフォルトでは vi(1) が設定されている) が立ち上がります。 Shell: の行を変更するシェルの絶対パスに変更してください。

代わりに chsh -s を使うと、エディタを起動せずにシェルを変更できます。 たとえば、シェルを bash に変えたいなら、次のようにしてください。

% chsh -s /usr/local/bin/bash

プロンプトに対してパスワードを入力し、Return を押すと、シェルが変更されます。 新しいシェルを使うには、一度ログオフしてから再ログインしてください。

使おうと思っているシェルは必ず /etc/shells 中に書かれていなければなりません。 シェルを アプリケーションのインストール - packages と ports で説明されている FreeBSD の Ports Collection からインストールしたのであれば、自動的にこのファイルに追加されています。 もし書かれていなければ、以下のコマンドで、パスをシェルのパスに置き換えて使って追加してください。

# echo /usr/local/bin/bash >> /etc/shells

その後 chsh(1) を実行してください。

3.9.2. 高度なシェルの機能

UNIX® のシェルは単なるコマンドインタプリタではなく、ユーザが実行したコマンドの出力をリダイレクトしたり、入力をリダイレクトすることによりコマンドをお互いに繋げることで、最終的なコマンドの出力結果を改良できます。 この機能をビルトインコマンドとともに用いることで、ユーザは最大化された効率の環境を入手できます。

シェルのリダイレクト機能を使うことで、コマンドの出力や入力を別のコマンドに送ったり、ファイルに送ることができます。 たとえば、 ls(1) コマンドの出力をキャプチャするには、 出力をファイルにリダイレクトしてください。 以下はその例です。

% ls > directory_listing.txt

実行すると、現在の作業ディレクトリにあるファイルの一覧が directory_listing.txt に出力されます。 sort(1) のようなコマンドは、入力を読み込むことができます。 先ほど得たファイルの一覧をソートするには、入力元をファイルにリダイレクトしてください。

% sort < directory_listing.txt

入力された内容はソートされ画面に出力されます。 この出力を他のファイルにリダイレクトするには、リダイレクトの向きを混ぜるように sort(1) の出力をリダイレクトしてください。

% sort < directory_listing.txt > sorted.txt

これまでの例では、ファイルディスクリプタを用いてコマンドに対しリダイレクトを行っています。 すべての UNIX® システムは標準入力 (stdin)、標準出力 (stdout) および標準エラー (stderr) といったファイルディスクリプタを持っています。 それぞれに対象があり、 入力はキーボードまたはマウスなどの入力を提供するものが対象、出力はスクリーンであったりプリンタ用紙が対象です。 また、エラーは診断やエラーメッセージに用いられるものが対象です。 これらは、I/O ベースのファイルディスクリプタ、時にはストリームと考えられます。

これらのディスクリプタを使用することで、シェルは出力と入力についてさまざまなコマンドを経由させ、また、ファイルに対して出力し、もしくはファイルから読み込むようにリダイレクトできます。 リダイレクトの他の方法は、パイプの機能です。

UNIX® のパイプ記号 "|" は、コマンドの出力を他のプログラムに直接渡します。 基本的には、パイプはコマンドの標準出力を他のコマンドの標準出力に渡します。 以下はその例です。

% cat directory_listing.txt | sort | less

この例では、directory_listing.txt の内容がソートされ、その結果が less(1) に渡されます。 このコマンドを実行すると、出力がスクロールして画面から見えなくなることをさけることができて、ユーザは出力を自分のペースでスクロールできます。

3.10. テキストエディタ

FreeBSD の設定の多くは、テキストファイルの編集で行われます。 そのため、テキストエディタの扱いに慣れると良いでしょう。 FreeBSD には、基本システムの一部として二、三提供されるものと、Ports Collection から利用できる、たくさんのテキストエディタが用意されています。

学習が簡単なエディタは、 easy editor の略で ee(1) と呼ばれるものです。 このエディタを立ち上げるには、ee filename と入力してください。 ここで filename は、 編集しようとしているファイルの名前です。 一旦このコマンドの中に入れば、 エディタの機能を操作するコマンドはすべてディスプレイの上部に表示されています。 キャレット (^) は Ctrl を意味するので、^eCtrl+e を押すという意味になります。 ee(1) を終了するには Esc を押し、そしてメインメニューから "leave editor" オプションを選択してください。 ファイルが更新されていたときは、エディタは変更をセーブするかどうかプロンプトを出します。

FreeBSD には、ベースシステムの一部として vi(1) といったより強力なテキストエディタが用意されています。 editors/emacs および editors/vim といった他のエディタは Ports Collection の一部として用意されています。 これらのエディタはやや学習が複雑ですが、より高い機能性を提供します。 しかし、あなたが多量のテキストを編集することを考えているなら、 vim や Emacs といった強力なエディタを習得することは、 より多くの時間を節約することでしょう。

ファイルを編集したり、文字入力を必要とするようなアプリケーションの多くは、自動的にテキストエディタを起動します。 シェル の節で説明したように、デフォルトのエディタを変更するには EDITOR 環境変数に希望するエディタを設定してください。

3.11. デバイスとデバイスノード

デバイスとはシステム上のハードウェアに関するものに対してよく使われる用語で、ディスクやプリンタ、グラフィックカードやキーボードが含まれます。 FreeBSD が起動するとき、ブートメッセージの大部分は検出されたデバイスについてのものです。 ブートメッセージは /var/run/dmesg.boot に保存されています。

各デバイスはデバイス名と番号を持ちます。 例えば、ada0 は最初の SATA CD-ROM ドライブで、kbd0 はキーボードを表します。

FreeBSD におけるほとんどのデバイス、デバイスノードと呼ばれる /dev にあるスペシャルファイルを通してアクセスしなければなりません。

3.12. マニュアルページ

FreeBSD についてのもっとも包括的な文書は、 マニュアルページの形式になっているものです。 FreeBSD システム上のほとんどすべてのプログラムには、基本的な操作方法と利用可能な引数を説明しているリファレンスマニュアルが添付されています。 これらのマニュアルは man を使って見ることができます。

% man コマンド名

ここで コマンド名 のところには、知りたいコマンドの名前を入れます。 たとえば ls(1) について知りたい場合には、次のように入力します。

% man ls

マニュアルは、トピックごとにセクション番号で分類されています。 FreeBSD では、以下のセクションがあります。

  1. ユーザコマンド

  2. システムコールとエラー番号

  3. C のライブラリ関数

  4. デバイスドライバ

  5. ファイル形式

  6. ゲームや娯楽

  7. さまざまな情報

  8. システムの管理と操作のためのコマンド

  9. システムカーネルインタフェース

時折、 同じトピックがオンラインマニュアルの複数のセクションに記載されている場合があります。 たとえば、chmod ユーザコマンドと chmod() システムコールの場合がそれに該当します。 man(1) にセクション番号を与えることで、 表示したいセクションを指定できます。

% man 1 chmod

上のようにすれば、ユーザコマンド chmod(1) のマニュアルページが表示されます。 オンラインマニュアルの特定セクションへの参照は、慣習的に書かれている文書で括弧の中に示されます。 すなわち、chmod(1) はユーザコマンドを、chmod(2) はシステムコールの方を示しています。

マニュアルページの名前を知らない場合には、man -k を使ってマニュアルページの解説 (description) からキーワードを検索してください。

% man -k mail

このコマンドは、"mail" というキーワードをコマンド解説に含むコマンドの一覧を表示します。 これは apropos(1) と同等の機能です。

/usr/sbin にあるすべてのコマンドの説明を読むには、以下のように実行してください。

% cd /usr/sbin
% man -f * | more

または、以下を実行してください。

% cd /usr/sbin
% whatis * |more

3.12.1. GNU の Info ファイル

FreeBSD には Free Software Foundation (FSF) によるアプリケーションやユーティリティが含まれています。 これらのプログラムには、マニュアルページに加えて info ファイルと呼ばれるハイパーテキスト形式の文書が付属しています。 この文書は info(1)、あるいは editors/emacs をインストールしているなら emacs の info モードで読むことができます。

info(1) を使うには、次のように入力してください。

% info

h と入力すると、 簡単な手引きを読むことができます。 クイックコマンドリファレンスは ? を入力してください。

Chapter 4. アプリケーションのインストール - packages と ports

4.1. この章では

FreeBSD の基本システムには数多くのシステムツールが含まれています。 FreeBSD は、サードパーティ製のソフトウェアの導入を支援するために、 ソースコードをコンパイルしてインストールする Ports Collection と、 コンパイル済みのバイナリをインストールする packages という相補的な 2 つの技術を提供しています。 どちらのシステムを用いても、 ローカルメディアやネットワーク上からソフトウェアをインストールできます。

この章を読むと、以下のことがわかります。

  • packages と ports の違い

  • FreeBSD に移植されたサードパーティ製のソフトウェアの探し方

  • pkg を用いてバイナリ package を管理する方法

  • Ports Collection を用いてサードパーティ製のソフトウェアをソースコードから構築する方法

  • インストール後の設定のために、 アプリケーションとともにインストールされたファイルを探す方法

  • ソフトウェアのインストールに失敗した場合に、どうしたらよいか

4.2. ソフトウェアのインストール

UNIX® システムでは、 サードパーティ製ソフトウェアの典型的なインストール手順は以下のようになります。

  1. ソースコード、 またはバイナリ形式で配布されているソフトウェアを探し出し、 ダウンロードする。

  2. 配布時のフォーマットからソフトウェアを取り出す。 一般的には compress(1), gzip(1), bzip2(1) または、xz(1) といったプログラムで圧縮された tarball です。

  3. INSTALL または README ファイル、あるいは doc/ サブディレクトのファイルからドキュメントを探しだし、 ソフトウェアのインストール方法を調べる。

  4. ソース形式でソフトウェアが配布されている場合はコンパイルを行う。 ここでは、Makefile の編集、 または、configure スクリプトの実行を伴うことがあります。

  5. ソフトウェアの動作を確認し、インストールする。

FreeBSD port は、 アプリケーションをソースコードからコンパイルする際の処理を自動化するように設計されたファイルの集まりです。 port を構成するファイルは、 自動的にアプリケーションをダウンロードし、展開、パッチ作業、 コンパイル、そしてインストールを行うために必要な情報を含んでいます。

ソフトウェアが、すでに FreeBSD に移植され、 FreeBSD 上で試験されていなければ、 適切にインストールが行われ、動作するように、 編集する必要があるかもしれません。

しかしながら、36000 を越えるサードパーティ製アプリケーションが FreeBSD に移植されています。 可能な場合は、これらのアプリケーションをコンパイル済みの packages としてダウンロードできます。

package は、package 管理コマンドで扱うことができます。

packages と ports は依存関係を理解します。 package または port を用いてアプリケーションをインストールすると、 依存するライブラリがまだインストールされていない場合には、 最初にライブラリが自動的にインストールされます。

FreeBSD の package は、コンパイル済みのアプリケーションの全コマンド、 各種設定ファイルやドキュメントを含んでいます。 pkg コマンドでは、pkg install といったコマンドで、 package を扱うことができます。

2 つの技術は類似していますが、 packages と ports にはそれぞれ独自の特徴があります。 それぞれのアプリケーションのインストールに対する必要要件に応じてどちらかを選択してください。

package の利点
  • 一般的に、あるアプリケーションの package の tarball は、 ソースコードを含む tarball より小さなサイズとなります。

  • packages はコンパイルの時間を必要としません。 このことは、遅いシステム上で Mozilla, KDE, または GNOME といった大きなアプリケーションを扱う場合に重要となります。

  • packages を用いれば、 ソフトウェアのコンパイルに関する知識は必要ありません。

port の利点
  • packages は、通常最も多くのシステムで実行できるように、 非常に保守的な設定で構築されています。 port からコンパイルすることで、 コンパイルオプションを指定できます。

  • アプリケーションのなかには、 どの機能をインストールするかをコンパイル時に設定するものがあります。 たとえば、Apache は多種多様な ビルトインオプションを設定できます。

    設定を区別するために、同じアプリケーションに対して 複数の packages が存在することがあります。 たとえば、Ghostscript は Xorg がインストールされているかどうかにより、 ghostscript package と ghostscript-nox11 package が選択可能となっています。 アプリケーションのコンパイルオプションが 1 つもしくは 2 つ以上になると、 複数の packages を用意することは困難になります。

  • ライセンス条項で、 バイナリでの配布を禁止しているソフトウェアがあります。 このようなソフトウェアはソースコードで配布される必要があり、 エンドユーザがコンパイルしなくてはなりません。

  • バイナリ配布を信用していない人や、 潜在的な問題点を見つけ出すためにソースコードを読むことを好む人がいます。

  • カスタマイズしたパッチを適用するためには、 ソースコードが必要になります。

ports の更新状況を把握するために、 FreeBSD ports メーリングリストFreeBSD ports bugs メーリングリスト を購読するとよいでしょう。

アプリケーションをインストールする前に、 そのアプリケーションに関連したセキュリティ上の問題がないことを https://vuxml.freebsd.org/ で確認するか、pkg audit -F と入力して、 インストールされているアプリケーションに既知の脆弱性がないことを確認してください。

この章では、packages と ports を用いた FreeBSD 上での サードパーティ製ソフトウェアのインストール方法や管理方法について説明します。

4.3. ソフトウェアの探し方

FreeBSD 上で利用可能なアプリケーションのリストは常に増えています。 インストールするソフトウェアを探す方法はたくさん用意されています。

  • FreeBSD ウェブサイトは、 利用可能なすべてのアプリケーションの最新の一覧を、検索できる形で https://www.FreeBSD.org/ja/ports/ において公開しています。 ports はアプリケーションの名前や、ソフトウェアのカテゴリで検索出来ます。

  • Dan Langille は、包括的な検索ユーティリティや Ports Collection にあるアプリケーションの変更点を追跡する FreshPorts.org を公開しています。 登録したユーザは、監視している ports がアップデートされた時に、 そのことを自動的にメールで知らせてくれるような、 カスタマイズ可能な監視リストを使うことができます。

  • アプリケーションを見つけることが難しい場合には、SourceForge.net または GitHub.com のようなサイトで探してみてください。 その後、そのアプリケーションが ports で利用可能かどうかを FreeBSD サイト で調べて下さい。

  • バイナリ package リポジトリでアプリケーションを探すには、 以下のように実行してください。

    # pkg search subversion
    git-subversion-1.9.2
    java-subversion-1.8.8_2
    p5-subversion-1.8.8_2
    py27-hgsubversion-1.6
    py27-subversion-1.8.8_2
    ruby-subversion-1.8.8_2
    subversion-1.8.8_2
    subversion-book-4515
    subversion-static-1.8.8_2
    subversion16-1.6.23_4
    subversion17-1.7.16_2

    package 名にはバージョン番号が含まれます。 また、python ベースの ports では、 共に構築された python のバージョン番号も含まれます。 ports によっては、複数のバージョンを利用できるものがあります。 subversion では、 複数のバージョンを利用できますが、 異なるコンパイルオプションで構築されたものも利用できます。 インストールする package を指定する際には、 アプリケーションに、port ツリーのパスである、 port のオリジンを指定すると良いでしょう。 pkg search-o オプションを付けて、実行してください。 各 package のオリジンの一覧が表示されます。

    # pkg search -o subversion
    devel/git-subversion
    java/java-subversion
    devel/p5-subversion
    devel/py-hgsubversion
    devel/py-subversion
    devel/ruby-subversion
    devel/subversion16
    devel/subversion17
    devel/subversion
    devel/subversion-book
    devel/subversion-static

    pkg search は、 リポジトリデータベースの説明やその他のフィールドにおいて、 シェルグロブ、正規表現、完全一致にも対応しています。 詳細については、ports-mgmt/pkg または ports-mgmt/pkg-devel のインストール後、 pkg-search(8) をご覧ください。

  • Ports Collection がすでにインストールされていれば、 ports ツリーのローカルバージョンを調べることができます。 port がどのカテゴリに分類されているのかを知りたければ、 whereis(1) コマンドで調べることができます。 whereis ファイル と入力してください。ファイル の部分にはインストールを考えているプログラム名を入れます。

    # whereis lsof
    lsof: /usr/ports/sysutils/lsof

    さらに、以下の例のように echo(1) を使って調べることもできます。

    # echo /usr/ports/*/*lsof*
    /usr/ports/sysutils/lsof

    この方法では /usr/ports/distfiles 以下にダウンロードされたファイル名にもマッチします。

  • また、Ports Collection に備わっている検索機能を利用して port を検索する方法もあります。 この検索機能を利用するには、 cd コマンドを用いて /usr/ports ディレクトリに移動し、make search name=プログラム名 と入力してください。 プログラム名 の部分には検索したいソフトウェアの名前を入れてください。 たとえば、lsof を探すには次のようにします。

    # cd /usr/ports
    # make search name=lsof
    Port:   lsof-4.88.d,8
    Path:   /usr/ports/sysutils/lsof
    Info:   Lists information about open files (similar to fstat(1))
    Maint:  ler@lerctr.org
    Index:  sysutils
    B-deps:
    R-deps:

    Ports Collection に用意されている検索のメカニズムでは、 インデックスファイルを利用して検索を行います。 もし INDEX が必要であるというメッセージが表示されたら、 make fetchindex を実行して、 最新のインデックスファイルをダウンロードしてください。 INDEX が用意されれば、 make search で検索を実行できるでしょう。

    "Path:" という行は、 port がどこにあるかを示しています。

    より絞られた情報を得るには、 quicksearch と呼ばれる機能を使ってください。

    # cd /usr/ports
    # make quicksearch name=lsof
    Port:   lsof-4.88.d,8
    Path:   /usr/ports/sysutils/lsof
    Info:   Lists information about open files (similar to fstat(1))

    もっと詳しく検索するには、 make search key=string または make quicksearch key=string と入力してください。 string の部分には検索したいテキストを入れます。 プログラムの名前がわからない場合でも、 ある目的に関連した ports の検索に利用できるよう、 テキストの部分には、コメント、 説明文および依存情報を入れることができます。

    search および quicksearch を使う場合には、 検索文字列中の大文字と小文字を区別せずに検索が行われるので、 "LSOF" を検索した結果は、 "lsof" と同じ検索結果になります。

4.4. pkg によるバイナリ package の管理

pkg は、FreeBSD における伝統的な package 管理ツールの置き換えとなる次世代の管理ツールで、 バイナリ packages をより早く、 より簡単に管理できるようにする数多くの機能を提供します。

FreeBSD のミラーサイトが提供する事前に構築されたバイナリ package のみを使いたいと考えているサイトでは、 pkg を使って package を管理するとよいでしょう。

しかしながら、 ソースまたは自分自身で用意したリポジトリから構築したサイトでは、port 管理ツール が別に必要となります。

pkg はバイナリ package のみを扱うので、 そのような管理ツールの置き換えとはなりません。 これらのツールは、ソフトウェアをバイナリ packages と Ports Collection の両形式からインストールできますが、 pkg はバイナリ packages のみをインストールします。

4.4.1. pkg 入門

FreeBSD には、 pkg およびマニュアルページをインストールするブートストラップユーティリティが用意されています。 このユーティリティは、FreeBSD 10.X 以降で動作するように設計されています。

このブートストラッププロセスは、すべての FreeBSD バージョンおよびアーキテクチャに対応しているわけではありません。 現在対応している一覧は、 https://pkg.freebsd.org/ で確認することができます。 対応していない場合には、 Ports Collection またはバイナリ package から pkg をインストールする必要があります。

システムをブートストラップするには、 以下を実行してください。

# /usr/sbin/pkg

ブートストラッププロセスに成功するには、 インターネットへの接続が必要です。

port をインストールするには以下を実行してください。

# cd /usr/ports/ports-mgmt/pkg
# make
# make install clean

古い pkg_* ツールを用いたシステムをアップグレードする際には、 新しいツールがすでにインストールされている package を認識するよう、 データベースを新しいフォーマットへと変換する必要があります。 pkg をインストールしたら、 以下のコマンドを実行して、package データベースをこれまでの伝統的なフォーマットから新しいフォーマットへと変換してください。

# pkg2ng

このステップは、 サードパーティ製ソフトウェアがまだインストールされていないような、 新しくインストールされた直後のシステムでは必要ありません。

このステップは非可逆です。 一度 package データベースを pkg フォーマットへと変換したら、伝統的な pkg_* ツールを使うべきではありません。

package データベースを変換する際には、 新しいバージョンへのデータ変換に伴ったエラーが出力されることがあります。 通常、これらのエラーは無視して構いませんが、 pkg2ng 終了後、 変換に失敗したソフトウェアの一覧が表示されます。 これらのソフトウェアを手動で再インストールする必要があります。

FreeBSD のバージョンが 10.X より前であれば、 以下の行を /etc/make.conf に追加して、 Ports Collection がソフトウェアの登録に、伝統的な package のデータベースではなく、pkg を用いるように設定してください。

WITH_PKGNG=	yes

デフォルトでは、pkg は FreeBSD の package ミラー (リポジトリ) のバイナリ package を用います。 カスタム package リポジトリの構築については、 Poudriere を用いた package の構築 をご覧ください。

その他の pkg の設定オプションは、pkg.conf(5) に記述されています。

pkg の利用情報は、 pkg(8) マニュアルページや、 pkg を引数なしに実行すると表示されます。

各 pkg コマンドの引数は、 コマンドに固有なマニュアルページに記述されています。 たとえば、pkg install のマニュアルページを読むには、 以下のコマンドのどちらかを実行してください。

# pkg help install
# man pkg-install

以下の節では、pkg を用いた通常のバイナリ package の管理について説明します。 各コマンドでは、カスタマイズのために、 多くのオプションが使われています。 詳細や、他の例については、 コマンドのヘルプやマニュアルページを参照してください。

4.4.2. Quarterly および Latest Ports ブランチ

Quarterly ブランチを使うと、 ユーザは、port および package のインストールおよびアップグレードを、 より予測可能で安定して行うことができます。 基本的には、このブランチでは機能のアップデートは行われません。 Quarterly ブランチの目的は、セキュリティに関連する修正 (バージョンアップデートやコミットのバックポートなど)、 バグの修正および ports のコンプライアンスおよびフレームワークの変更の入手です。 Quarterly ブランチは、毎年の毎四半期 (1 月、4 月、7 月および 10 月) のはじめに HEAD から作成されます。 ブランチには、作成された年 (YYYY) をよび四半期 (Q1-4) により名前がつけられます。 たとえば、2016 年 1 月に作成された quarterly ブランチの名前は 2016Q1 となります。 Latest ブランチは、 最新バージョンの package をユーザに提供します。

quarterly から latest ブランチに移行するには、 以下のコマンドを実行してください。

# cp /etc/pkg/FreeBSD.conf /usr/local/etc/pkg/repos/FreeBSD.conf

/usr/local/etc/pkg/repos/FreeBSD.conf ファイルを編集して、url: 行の quarterly 文字列を latest に変更してください。

編集後は、以下のようになります。

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

最後に、以下のコマンドを実行して (latest) リポジトリのメタデータからアップデートしてください。

# pkg update -f

4.4.3. インストールされている package の情報を入手する

オプションを使用しないで pkg info を実行すると、 システムにインストールされているすべての package もしくは、 ある特定の package の情報が得られます。

たとえば、インストールされている pkg の情報を調べるには、 以下のように実行してください。

# pkg info pkg
pkg-1.1.4_1

4.4.4. package のインストールと削除

バイナリ package をインストールするには、 以下のコマンドを使ってください。 ここで packagename は、インストールする package の名前です。

# pkg install packagename

このコマンドは、リポジトリデータを使用して、 インストールすべきソフトウェアのバージョン、および、 インストールされていない依存ソフトウェアがあるかどうかを調べます。 たとえば、curl をインストールするには以下を実行してください。

# pkg install curl
Updating repository catalogue
/usr/local/tmp/All/curl-7.31.0_1.txz          100% of 1181 kB 1380 kBps 00m01s

/usr/local/tmp/All/ca_root_nss-3.15.1_1.txz   100% of  288 kB 1700 kBps 00m00s

Updating repository catalogue
The following 2 packages will be installed:

        Installing ca_root_nss: 3.15.1_1
        Installing curl: 7.31.0_1

The installation will require 3 MB more space

0 B to be downloaded

Proceed with installing packages [y/N]: y
Checking integrity... done
[1/2] Installing ca_root_nss-3.15.1_1... done
[2/2] Installing curl-7.31.0_1... done
Cleaning up cache files...Done

新しい package と依存関係から追加された package は、 インストール済み package 一覧に表示されます。

# pkg info
ca_root_nss-3.15.1_1	The root certificate bundle from the Mozilla Project
curl-7.31.0_1	Non-interactive tool to get files from FTP, GOPHER, HTTP(S) servers
pkg-1.1.4_6	New generation package manager

必要のなくなった packages は、 pkg delete を使って削除できます。 たとえば、以下のようにして削除できます。

# pkg delete curl
The following packages will be deleted:

	curl-7.31.0_1

The deletion will free 3 MB

Proceed with deleting packages [y/N]: y
[1/1] Deleting curl-7.31.0_1... done

4.4.5. インストールされている package のアップグレード

以下のコマンドを実行すると、 インストールされている packages が最新のバージョンにアップグレードされます。

# pkg upgrade

このコマンドは、インストールされているソフトウェアのバージョンと、 リポジトリのカタログから利用できるバージョンとを比較し、 リポジトリからアップグレードします。

4.4.6. インストールされている package の検証

サードウェア製アプリケーションに対する脆弱性は、 定期的に見つかります。脆弱性を調べるために、 pkg は、検証機能を持っています。 システムにインストールされているソフトウェアに既知の脆弱性がないかどうかを調べるには、 以下のように実行してください。

# pkg audit -F

4.4.7. 使われていない package の自動削除

package を削除すると、不必要な依存 package が残されることがあります。 依存のためにインストールされたが、 現在は不必要になった package (リーフ package) は、 以下のコマンドで自動的に検出され、削除されます。

# pkg autoremove
Packages to be autoremoved:
	ca_root_nss-3.15.1_1

The autoremoval will free 723 kB

Proceed with autoremoval of packages [y/N]: y
Deinstalling ca_root_nss-3.15.1_1... done

依存によりインストールされた packages は、 automatic package と呼ばれます。 非 automatic packages、 すなわち他の package からの依存ではなく、 明示的にインストールした package の一覧は以下のようにして出力できます。

# pkg prime-list
nginx
openvpn
sudo

pkg prime-list は、 /usr/local/etc/pkg.conf で設定されているエイリアスコマンドです。 他にもシステムの package データベースの問い合わせに用いることができる多くのコマンドが用意されています。 たとえば、pkg prime-origins コマンドを使うと、 上記で得られた port 一覧のオリジナルの port ディレクトリを知ることができます。

# pkg prime-origins
www/nginx
security/openvpn
security/sudo

この一覧と ports-mgmt/poudriere または ports-mgmt/synth といったツールを使うと、 システムにインストールされているすべての package を再構築できます。

インストールされた package に automatic のマーク付けをするには、 以下のように実行してください。

# pkg set -A 1 devel/cmake

リーフ package や automatic としてマークされた package は、 pkg autoremove で選択されます。

インストールされた package を automatic とマークするには、以下のように実行してください。

# pkg set -A 0 devel/cmake

4.4.8. package データベースのリストア

伝統的な package 管理システムとは異なり、 pkg には package データベースをバックアップするメカニズムがあります。 この機能はデフォルトで有効に設定されています。

スクリプトによる定期的な package データベースのバックアップを無効にするには、 periodic.conf(5) の中で、 daily_backup_pkgdb_enable="NO" と設定してください。

過去にバックアップした package データベースの中身をリストアするには、 以下のコマンドを実行してください。 以下のコマンドの /path/to/pkg.sql については、バックアップのある場所に置き換えて実行してください。

# pkg backup -r /path/to/pkg.sql

システムの定期的なスクリプトによって取得されたバックアップをリストアする場合には、 リストアの前に展開しておく必要があります。

手動で pkg データベースをバックアップするには、以下のコマンドを実行してください。 以下のコマンドの /path/to/pkg.sql については、適切なファイル名と場所に置き換えて下さい。

# pkg backup -d /path/to/pkg.sql

4.4.9. 古くなった package の削除

デフォルトでは、pkg は、pkg.conf(5)PKG_CACHEDIR 変数で定義されるキャッシュディレクトリにバイナリ packages を保存します。 インストールされている package の最新のコピーのみが保存されます。 古いバージョンの pkg では、 過去にインストールされたすべての package が保存されていました。 これらの古くなったバイナリ package を削除するには、 以下を実行してください。

# pkg clean

キャッシュ全体を削除するには以下を実行してください。

# pkg clean -a

4.4.10. package メタデータの変更

FreeBSD Ports Collection では、メジャーバージョン番号が変更になることがあります。 これに対応するために、pkg には、 package の情報をアップデートするコマンドが組み込まれています。 たとえば、lang/php5 が、 バージョン 5.4 を表すようになり、 lang/php5lang/php53 と名前を変更する必要があるような場合に、有用です。

上記の例の package の情報を変更するには、 以下のように実行してください。

# pkg set -o lang/php5:lang/php53

別の例として、lang/ruby18lang/ruby19 にアップデートするには、 以下のようにしてください。

# pkg set -o lang/ruby18:lang/ruby19

最後の例として、 libglut 共有ライブラリの情報を graphics/libglut から graphics/freeglut へと変更するには、 以下のように実行してください。

# pkg set -o graphics/libglut:graphics/freeglut

package の情報を変更したら、 情報が変更された package に依存している packages を再インストールすることが重要となります。 依存 packages を再インストールするには、 以下のように実行してください。

# pkg install -Rf graphics/freeglut

4.5. Ports Collection の利用

Ports Collection は、Makefile, 修正パッチ、 説明文などの一連のファイルのことです。 これらのファイルの各セットは、 個々のアプリケーションをコンパイルして FreeBSD にインストールするために用いられ、port と呼ばれています。

デフォルトでは、Ports Collection は、/usr/ports 以下のサブディレクトリに置かれます。

Ports Collection をインストールして使用する前に、一般的には、 ソフトウェアのインストールに、pkg でダウンロードしたバイナリパッケージと Ports Collection を組み合わせて使うことはあまり良いことではないことを知っておいてください。 pkg は、デフォルトでは ports ツリーの (HEAD ではなく) quarterly ブランチリリースを追いかけます。 HEAD の port と対応する quarterly ブランチの port の依存関係は異なる可能性があり、そのため pkg でインストールされた依存関係と Ports Collection の依存関係の間で競合が起きることがあります。 もし、Ports Collection と pkg を組み合わせて使用しなければならないのであれば、Ports Collection と pkg が同じ ports ツリーのブランチを使用していることを必ず確認してください。

Ports Collection は、ソフトウェアのカテゴリを表すディレクトリを持ちます。 各カテゴリには、各アプリケーションのサブディレクトリがあります。 各アプリケーションのサブディレクトリには、プログラムを FreeBSD 上で正しくコンパイルしてインストールする方法を提供する、 ports スケルトン と呼ばれるファイルのセットが含まれています。 それぞれの port スケルトンには、次のファイルおよびディレクトリが含まれています。

  • Makefile: このファイルにはアプリケーションのコンパイル方法やシステムのどこにインストールするかを指定する命令文が含まれています。

  • distinfo: このファイルには、その port を構築するためにダウンロードする必要があるファイルのファイル名と、チェックサム情報が含まれています。

  • files: このディレクトリには FreeBSD 上でプログラムをコンパイルし、インストールするための修正パッチが含まれています。このディレクトリには、その port の構築に必要なその他のファイルが入る場合もあります。

  • pkg-descr: このファイルにはプログラムに関する、より詳しい説明文が含まれます。

  • pkg-plist: これは、その port によってインストールされる全ファイルのリストです。これにはプログラムを削除する際に、どのファイルを削除すれば良いのかを ports システムに伝える役割もあります。

これらの他に pkg-message や特殊な状況に対応するためのファイルを含む ports もあります。 これらのファイルについての詳細および ports の一般的な説明については、port 作成者のためのハンドブック をご覧下さい。

port は実際のソースコード (distfile とも呼ばれます) を含んではいません。 port の構築の展開部で、ダウンロードされたソースは自動的に /usr/ports/distfiles に保存されます。

4.5.1. Ports Collection のインストール

port を用いてアプリケーションをコンパイルできるようにするには、 まず最初に Ports Collection をインストールする必要があります。 FreeBSD のインストール時に Ports Collection をインストールしていない場合には、 以下の方法のどれかを用いてインストールしてください。

Procedure: Git を用いる方法

ports ツリーの管理が必要な場合や、 ローカルで変更点をメンテナンスする必要がある場合、 および FreeBSD-CURRENT を使用している場合には、 Git を使って Ports Collection を取得する方法があります。 Git のより詳細な説明については、Git Primer を参照してください。

  1. Git を使って ports ツリーをチェックアウトする前に、Git をインストールしておく必要があります。 ports ツリーがすでにインストールされていれば、 以下のようにして Git をインストールできます。

    # cd /usr/ports/devel/git
    # make install clean

    ports ツリーが利用できない場合や、 package の管理に pkg を使っているのであれば、package から Git をインストールできます。

    # pkg install git
  2. HEAD ブランチの ports ツリーをチェックアウトしてください。

    # git clone https://git.FreeBSD.org/ports.git /usr/ports
  3. または、quarterly ブランチをチェックアウトしてください。

    # git clone https://git.FreeBSD.org/ports.git -b 2020Q3 /usr/ports
  4. Git で最初のチェックアウトをした後は、必要に応じて /usr/ports をアップデートしてください。

    # git -C /usr/ports pull
  5. 必要に応じて /usr/ports を別の quarterly ブランチにスイッチしてください。

    # git -C /usr/ports switch 2020Q4

4.5.2. ports のインストール

この節では、Ports Collection を利用してプログラムをインストールしたり、 システムから削除したりする基本的な手順について説明します。 利用可能な make のターゲットや環境変数についての詳細は ports(7) をご覧ください。

いかなる port でも、構築する前には、 前節に書かれているように、Ports Collection をアップデートしてください。 サードパーティ製のソフトウェアをインストールすると、 セキュリティの脆弱性を引き起こす可能性があります。 その port に関連したセキュリティ上の問題がないことを、まずは https://vuxml.freebsd.org/ で確認してください。または、 新しい port をインストールする前に、 pkg audit -F を実行してください。 毎日のシステムのセキュリティ確認時に、 自動的にセキュリティの検査およびデータベースの更新を行うようにこのコマンドを設定できます。 詳しくは、pkg-audit(8) および periodic(8) を参照してください。

Ports Collection は、ネットワークに接続できることを想定しています。 また、superuser の権限も必要となります。

port をコンパイルしてインストールするには、 インストールしたい port のディレクトリに移動してください。 その後、プロンプトから make install と入力してください。 すると、次のような出力が現われるはずです。

# cd /usr/ports/sysutils/lsof
# make install
>> lsof_4.88D.freebsd.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
>> Attempting to fetch from ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/.
===>  Extracting for lsof-4.88
...
[extraction output snipped]
...
>> Checksum OK for lsof_4.88D.freebsd.tar.gz.
===>  Patching for lsof-4.88.d,8
===>  Applying FreeBSD patches for lsof-4.88.d,8
===>  Configuring for lsof-4.88.d,8
...
[configure output snipped]
...
===>  Building for lsof-4.88.d,8
...
[compilation output snipped]
...
===>  Installing for lsof-4.88.d,8

===>  Installing for lsof-4.88.d,8
...
[installation output snipped]
...
===>   Generating temporary packing list
===>   Compressing manual pages for lsof-4.88.d,8
===>   Registering installation for lsof-4.88.d,8
===>  SECURITY NOTE:
      This port has installed the following binaries which execute with
      increased privileges.
/usr/local/sbin/lsof
#

lsof は高い権限で動作するプログラムなので、 インストールする時にセキュリティに関する警告が表示されます。 インストールが終わったら、プロンプトが戻ります。

シェルによってはコマンドの実行ファイルを探す時間を短縮するために、 環境変数 PATH に登録されている ディレクトリのコマンド一覧をキャッシュするものがあります。 tcsh シェルを使っているのであれば、 フルパスを指定することなく新しくインストールしたコマンドを利用できるように、 rehash を実行してください。 sh シェルを使っているのであれば かわりに hash -r を実行してください。 詳細については、 あなたの使っているシェルのドキュメントをご覧ください。

インストールの間に、作業用ディレクトリが作成されます。 このディレクトリにはコンパイル時に使用されるすべての一時ファイルが含まれています。 このディレクトリを削除することで、ディスク容量を節約でき、また port を新しいバージョンへアップデートする際に問題が起こる可能性を小さくします。

# make clean
===>  Cleaning for lsof-88.d,8
#

port を構築する際に、 make install clean と実行することで、 これらの余分な手順を省くことができます。

4.5.2.1. ports のインストールのカスタマイズ

ports の中にはビルドオプションを指定できるものがあります。 このオプションを指定することで、 アプリケーションの機能の一部を有効もしくは無効にできます。 また、セキュリティオプションを設定したり、 その他のカスタマイズを行うことができます。 このようなアプリケーションには www/firefox, security/gpgmemail/sylpheed-claws などがあります。 port が他のカスタマイズ可能なオプションを持つ ports に依存する場合には、デフォルトでは、ユーザに port のオプションをメニューから選択させる設定のため、 何度もユーザとの対話が起こり待たされることがあります。 これを避けるには、まず最初に port スケルトンで make config-recursive を実行して設定を一括で行い、その後 make install [clean] を実行して port を構築してインストールしてください。

config-recursive を実行する際、 all-depends-list を実行すると、設定すべき ports の一覧を得ることができます。 多くの場合は、すべての依存 ports のオプションが定義され、 ports オプションの画面が表示されなくなり、 すべてのオプションが設定されたことを確認できるまで make config-recursive を実行すると良いでしょう。

port の構築後、 再びこのメニューを表示させてオプションの追加や削除、 設定の変更を行う方法はたくさんあります。 一つ目は port のディレクトリに cd で移動し、 make config と入力する方法です。 別の方法は make showconfig を使う方法です。 他の方法は make rmconfig の実行です。 このコマンドを実行すると選択されているすべてのオプションが削除され、 設定をもう一度やり直すことができます。 これらの方法や他の方法についての詳細は、 ports(7) マニュアルで説明されています。

ports は、いくつかの環境変数を参照する fetch(1) を用いてソースファイルをダウンロードします。 FreeBSD システムがファイアウォールの内側であったり、 FTP/HTTP プロキシを使う場合には、 FTP_PASSIVE_MODE, FTP_PROXY, FTP_PASSWORD の環境変数を設定することなります。 対応している環境変数の一覧については fetch(3) をご覧ください。

インターネットに常時接続できないユーザのために make fetch コマンドが用意されています。 このコマンドを /usr/ports で実行してすべての distfiles をダウンロードするか、 /usr/ports/net といったカテゴリや、あるスケルトンにおいても実行できます。 ある port がライブラリやその他の ports に依存している場合には、 別のカテゴリの ports の distfiles はダウンロードされないことに注意してください。 port が依存しているすべての distfiles をダウンロードしたければ、 make fetch-recursive を使ってください。

めったにないことかもしれませんが、 ローカルに distfiles のリポジトリがあるような場合に、 MASTER_SITES 変数を変更することで Makefile で指定されているダウンロードの場所を 変更することができます。 設定する場合には、変更先を以下のようにして指定してください。

# cd /usr/ports/directory
# make MASTER_SITE_OVERRIDE= \
ftp://ftp.organization.org/pub/FreeBSD/ports/distfiles/ fetch

WRKDIRPREFIX 変数と PREFIX 変数を変更することで、 作業ディレクトリやターゲットディレクトリをデフォルトのものから変更できます。

# make WRKDIRPREFIX=/usr/home/example/ports install

とすると、ports は /usr/home/example/ports でコンパイルされ、すべて /usr/local 以下にインストールされます。

# make PREFIX=/usr/home/example/local install

この場合、port のコンパイルは /usr/ports でおこない、/usr/home/example/local にインストールします。そして

# make WRKDIRPREFIX=../ports PREFIX=../local install

とすれば両者を組み合わせることが可能です。

これらを環境変数に設定する方法もあります。 どのように環境変数を設定するかについては、 あなたの使っているシェルのマニュアルページを参照してください。

4.5.3. インストールした ports の削除

インストールされた ports は、 pkg delete コマンドで削除できます。 このコマンドの使用例は、pkg-delete(8) マニュアルページにあります。

あるいは、port のディレクトリにて make deinstall を実行することでも削除できます。

# cd /usr/ports/sysutils/lsof
# make deinstall
===>  Deinstalling for sysutils/lsof
===>   Deinstalling
Deinstallation has been requested for the following 1 packages:

	lsof-4.88.d,8

The deinstallation will free 229 kB
[1/1] Deleting lsof-4.88.d,8... done

port が削除されるときに表示されるメッセージを読むことをお勧めします。 もし削除した port に依存するアプリケーションがあった場合には、 その情報が表示されますが、port の削除は行われます。 そのようなケースでは、依存を直すためにアプリケーションを再インストールするとよいでしょう。

4.5.4. ports のアップグレード

ports のインストール後、時間が経過すると、Ports Collection で新しいバージョンのソフトウェアを利用できるようになります。 この章では、 どのようにしてアップグレードする必要のあるソフトウェアを判断するか、 そしてアップグレードの方法について説明します。

インストールされている ports の新しいバージョンを利用できるかどうかを知るには、まず、 最新の ports ツリーがインストールされていることを確認してください。 これには、「Git を用いる方法」 で書かれているアップデートのコマンドを使ってください。 FreeBSD 10 以降のシステム、または、pkg に変換されたシステムでは、 以下のコマンドを実行すると、現在利用可能なバージョンよりも古い ports の一覧が表示されます。

# pkg version -l "<"

FreeBSD 9.X より前のシステムでは、 現在利用可能なバージョンよりも古い ports の一覧を表示されるには、以下のコマンドを実行してください。

# pkg_version -l "<"

アップグレードする前に /usr/ports/UPDATING を、ファイルの頭から、ports を最後にアップデートした日、 もしくはシステムをインストールをした日に最も近い日まで目を通してください このファイルには port をアップグレードする際にユーザが遭遇するであろう問題や、 追加で必要な作業などが記述されています。 例えば、ファイル形式の変更や設定ファイルの場所の変更、 前のバージョンと互換性がなくなったことなどが書かれています。 アップグレードする必要のある ports に関連した手順に注意し、 アップグレードする際にはこれらの手順に従ってください。

4.5.4.1. ports のアップグレードおよび管理ツール

Ports Collection には、 実際にアップグレードを行うためのユーティリティがいくつか用意されています。 それぞれのユーティリティは長所と短所を持っています。

歴史的に、最もインストールされ使われているのは、 Portmaster または Portupgrade です。 Synth は新しいユーティリティです。

特定のシステムにおいて、 どのツールを選択するとベストかについては、 システム管理者によります。 これらのどのツールでも、使う前には、 データのバックアップをとることが推奨されます。

4.5.4.2. portmaster を用いた ports のアップグレード

ports-mgmt/portmaster は、 インストールされている ports のアップグレードをおこなう、 とても小さなユーティリティです。 FreeBSD のベースシステムとしてインストールされているツールだけを使い、 他の ports やデータベースに依存しないように設計されています。 port からこのユーティリティをインストールするには以下のようにしてください。

# cd /usr/ports/ports-mgmt/portmaster
# make install clean

Portmaster は、 ports を 4 つのカテゴリに分類します。

  • Root ports: 他の port に依存せず、 他の port からも依存されない ports。

  • Trunk ports: 他の port には依存しないが、 他の port から依存されている ports。

  • Branch ports: 他の port に依存し、 他の port からも依存されている ports。

  • Leaf ports: 他の port に依存するが、 他の port からは依存されない ports。

これらのカテゴリの一覧や、アップデート可能な port の一覧を表示するには以下のようにしてください。

# portmaster -L
===>>> Root ports (No dependencies, not depended on)
===>>> ispell-3.2.06_18
===>>> screen-4.0.3
        ===>>> New version available: screen-4.0.3_1
===>>> tcpflow-0.21_1
===>>> 7 root ports
...
===>>> Branch ports (Have dependencies, are depended on)
===>>> apache22-2.2.3
        ===>>> New version available: apache22-2.2.8
...
===>>> Leaf ports (Have dependencies, not depended on)
===>>> automake-1.9.6_2
===>>> bash-3.1.17
        ===>>> New version available: bash-3.2.33
...
===>>> 32 leaf ports

===>>> 137 total installed ports
        ===>>> 83 have new versions available

以下のコマンドを使うと、 古くなった ports をすべてアップデートします。

# portmaster -a

Portmaster のデフォルトの設定では、 インストールされている port を削除する前に、 バックアップ用の package が作成されます。 このバックアップは、 新しいバージョンのインストールに成功すると削除されます。 -b を使うと、 Portmaster の自動的なバックアップの削除は行いません。 -i を追加すると、 Portmaster をインタラクティブモードで使用できます。 このモードでは、各 port をアップグレードするかどうかの選択を対話的に行うことがでます。 多くのオプションが利用可能です。 portmaster(8) マニュアルページから、 それらの使用方法に関する詳細な説明を読んでください。

アップグレードの過程でエラーに遭遇した場合には、 -f を使ってすべての ports のアップグレードや再構築を行なってください。

# portmaster -af

Portmaster を使ってシステムに新しい ports をインストールしたり、 新しい port のコンパイルやインストール前に依存するすべての port をアップグレードできます。この機能を使う時には、 Ports Collection の場所を指定してください。

# portmaster shells/bash

ports-mgmt/portmaster に関するより多くの情報は、pkg-descr にあります。

4.5.4.3. Portupgrade を用いた ports のアップグレード

ports-mgmt/portupgrade は、 インストールした ports のアップグレードを行なうためのもう一つのユーティリティです。 このユーティリティは ports を管理するために用いられるアプリケーションのセットをインストールします。 Ruby に依存します。 port をインストールするには、以下を実行してください。

# cd /usr/ports/ports-mgmt/portupgrade
# make install clean

このユーティリティを使ってアップグレードを行う前に、 pkgdb -F を使って、 インストールされている ports の一覧を調べてください。 矛盾が検出された場合には修復してください。

システムにインストールされている port の中で古くなったものをすべてアップデートするには portupgrade -a を実行してください。 もし、すべての ports に対して個別にアップグレードするかどうかを確認したいのであれば、 -i を追加してください。

# portupgrade -ai

ports で利用可能なすべてのアプリケーションではなく、 ある特定のアプリケーションだけを更新したいのであれば、 portupgrade pkgname を実行してください。 アップグレードするアプリケーションが依存しているすべての ports をまず先に更新したい場合には、 -R を使ってください。

# portupgrade -R firefox

-P オプションを使うと、 portupgrade は PKG_PATH に登録されているローカルディレクトリから、 利用可能な package を探します。 ローカルに利用可能な packages が見つからなければ、 リモートサイトから package のダウンロードを試みます。 packages をローカルに見つけることができず、 リモートサイトからもダウンロードできない場合には、 portupgrade は ports からインストールを行ないます。 ports を使用したくなければ、-PP オプションを指定してください。 この最後のオプションを設定すると、 もし package が利用できなければ Portupgrade は終了します。

# portupgrade -PP gnome3

また、ビルドやインストールを行なわず、 distfiles または packages だけをダウンロードしたければ、 -F オプションを指定してください。 利用可能なすべてのオプションについては、 portupgrade(1) のマニュアルを参照してください。

ports-mgmt/portupgrade に関するより多くの情報は、pkg-descr にあります。

4.5.5. ports とディスク容量

Ports Collection を使い続けていると、 そのうちディスクを食いつぶしてしまうでしょう。 ports をビルドしてインストールした後、 ports スケルトンで make clean を実行すると、作業用の work ディレクトリを削除します。 Portmaster を使って port をインストールする場合には、-K を使わなければこのディレクトリは自動的に削除されます。 Portupgrade がインストールされている場合には、 以下のコマンドはローカルの Ports Collection に見つかったすべての work ディレクトリを削除します。

# portsclean -C

さらに、時間が経つにつれ /usr/ports/distfiles には、古くなったソースファイルがたまっていきます。 Portupgrade を使って、どの ports からも使われていないすべての distfiles を削除するには次のように実行してください。

# portsclean -D

Portupgrade を使って、システムにインストールされている port から使われていない distfiles をすべて削除することができます。

# portsclean -DD

もし Portmaster がインストールされているのであれば、以下を実行してください。

# portmaster --clean-distfiles

デフォルトでは、このコマンドはインタラクティブに設定されているため、 ユーザに対して distfile を削除すべきかどうかを確認するプロンプトが表示されます。

これらのコマンドに加え、ports-mgmt/pkg_cutleaves は、 必要なくなった ports を削除する作業を自動化します。

4.6. Poudriere を用いた package の構築

poudriere は、FreeBSD package を作成したり、試験に用いられる BSD ライセンスのユーティリティです。 このユーティリティは、FreeBSD jails を用いて、 独立したコンパイル環境を構築します。 これらの jail を使って、 インストールされている FreeBSD のバージョンとは異なるバージョンの package を作成したり、ホストが amd64 のシステムでは、 i386 用の package を構築することもできます。 構築された package のレイアウトは公式のミラーと同じです。 これらの package は、pkg(8) や他の package 管理ツールで利用できます。

ports-mgmt/poudriere package または port から poudriere をインストールしてください。 アプリケーションをインストールすると、サンプルの設定ファイルである /usr/local/etc/poudriere.conf.sample もインストールされます。 このファイルを /usr/local/etc/poudriere.conf にコピーして、 ローカルの環境に合わせて編集してください。

poudriere を実行するシステムで、 必ずしも ZFS を使う必要はありませんが、 有用です。ZFS を使う際には、 /usr/local/etc/poudriere.conf の中で ZPOOL を指定する必要があります。 そして、FREEBSD_HOST を最も近いミラーに設定してください。 CCACHE_DIR を定義することで、 devel/ccache を使ったコンパイルのキャッシュが可能となり、 コンパイルで頻繁に使われるコードの構築時間を短縮できます。 poudriere データセットを /poudriere にマウントされた独立したツリーに置くと良いでしょう。 他の値はデフォルトの値で十分です。

同時に走らせるコンパイル数の定義には、 認識されたコアプロセッサの数が用いられます。 RAM もしくはスワップ空間のどちらかの仮想メモリを十分用意してください。 もし、仮想メモリを使い切ってしまったら、jail の構築は中断し、 異常なメッセージが表示されることでしょう。

4.6.1. Jails および Port ツリーの初期化

設定が終わったら、poudriere を初期化して、必要とする FreeBSD ツリーおよび jail、 そして ports ツリーをインストールしてください。 jail の名前を -j、 FreeBSD のバージョンを -v で指定してください。 FreeBSD/amd64 システムでは、 -a を使ってアーキテクチャに i386 または amd64 を設定できます。 デフォルトでは、uname で表示されるアーキテクチャに設定されます。

# poudriere jail -c -j 13amd64 -v 13.1-RELEASE
[00:00:00] Creating 13amd64 fs at /poudriere/jails/13amd64... done
[00:00:00] Using pre-distributed MANIFEST for FreeBSD 13.1-RELEASE amd64
[00:00:00] Fetching base for FreeBSD 13.1-RELEASE amd64
/poudriere/jails/13amd64/fromftp/base.txz              125 MB 4110 kBps    31s
[00:00:33] Extracting base... done
[00:00:54] Fetching src for FreeBSD 13.1-RELEASE amd64
/poudriere/jails/13amd64/fromftp/src.txz               154 MB 4178 kBps    38s
[00:01:33] Extracting src... done
[00:02:31] Fetching lib32 for FreeBSD 13.1-RELEASE amd64
/poudriere/jails/13amd64/fromftp/lib32.txz              24 MB 3969 kBps    06s
[00:02:38] Extracting lib32... done
[00:02:42] Cleaning up... done
[00:02:42] Recording filesystem state for clean... done
[00:02:42] Upgrading using ftp
/etc/resolv.conf -> /poudriere/jails/13amd64/etc/resolv.conf
Looking up update.FreeBSD.org mirrors... 3 mirrors found.
Fetching public key from update4.freebsd.org... done.
Fetching metadata signature for 13.1-RELEASE from update4.freebsd.org... done.
Fetching metadata index... done.
Fetching 2 metadata files... done.
Inspecting system... done.
Preparing to download files... done.
Fetching 124 patches.....10....20....30....40....50....60....70....80....90....100....110....120.. done.
Applying patches... done.
Fetching 6 files... done.
The following files will be added as part of updating to
13.1-RELEASE-p1:
/usr/src/contrib/unbound/.github
/usr/src/contrib/unbound/.github/FUNDING.yml
/usr/src/contrib/unbound/contrib/drop2rpz
/usr/src/contrib/unbound/contrib/unbound_portable.service.in
/usr/src/contrib/unbound/services/rpz.c
/usr/src/contrib/unbound/services/rpz.h
/usr/src/lib/libc/tests/gen/spawnp_enoexec.sh
The following files will be updated as part of updating to
13.1-RELEASE-p1:
[…]
Installing updates...Scanning //usr/share/certs/blacklisted for certificates...
Scanning //usr/share/certs/trusted for certificates...
 done.
13.1-RELEASE-p1:
[00:04:06] Recording filesystem state for clean... done
[00:04:07] Jail 13amd64 13.1-RELEASE-p1 amd64 is ready to be used
# poudriere ports -c -p local -m git+https
[00:00:00] Creating local fs at /poudriere/ports/local... done
[00:00:00] Checking out the ports tree... done

一つのコンピュータ上で、 複数の設定、複数の jails、異なる port ツリーから poudriere は port をビルドできます。 これらのコンビネーションのカスタム設定は セット と呼ばれます。 詳細については、ports-mgmt/poudriere もしくは ports-mgmt/poudriere-devel をインストール後、 poudriere(8) の CUSTOMIZATION の章をご覧下さい。

ここで示される基本設定では、jail, ports そしてセット固有の make.conf/usr/local/etc/poudriere.d に置いてください。 この例でのファイル名 13amd64-local-workstation-make.conf は、jail 名、port 名そして、セット名の組み合わせで付けられています。 システムの make.conf と、この新しいファイルは、ビルド時に結合され、構築した jail で用いられる make.conf を作成します。

ビルドする package を 13amd64-local-workstation-pkglist に記載してください。

editors/emacs
devel/git
ports-mgmt/pkg
...

特定の ports に対し、 オプションや依存を設定してください。

# poudriere options -j 13amd64 -p local -z workstation -f 13amd64-local-workstation-pkglist

最後に packages を構築し、 package リポジトリを生成してください。

# poudriere bulk -j 13amd64 -p local -z workstation -f 13amd64-local-workstation-pkglist

このコマンドの実行中に Ctrl+t を押すと、現在のビルド状況が表示されます。 Poudriere は /poudriere/logs/bulk/jailname にあるファイルも構築します。 このファイルをウェブサーバと共に使うことで、 ビルド情報を表示できます。

これが終わると、poudriere リポジトリを package のインストールに利用できるようになります。

poudriere を利用する上でのより多くの情報については、 poudriere(8) およびメインのウェブサイトである https://github.com/freebsd/poudriere/wiki を参照してください。

4.6.2. Poudriere リポジトリを使うための pkg クライアントの設定

カスタムリポジトリと公式のリポジトリの両方を並行して使用することは可能ですが、 公式リポジトリを無効にすると有用な場合があります。 このように設定するには、設定ファイルを作成し、 設定ファイルの中で公式リポジトリを無効にしてください。 /usr/local/etc/pkg/repos/FreeBSD.conf を作成して、以下を含めてください。

FreeBSD: {
	enabled: no
}

通常は、HTTP 経由で poudriere リポジトリをクライアントコンピュータに公開すると簡単です。 package ディレクトリ (たとえば、 /usr/local/poudriere/data/packages/13amd64 ) を公開するようにウェブサーバを設定してください。 この例で 13amd64 は構築名です。

もし、package リポジトリの URL が http://pkg.example.com/13amd64 であれば、 リポジトリの設定ファイルである /usr/local/etc/pkg/repos/custom.conf は、 以下のようになります。

custom: {
	url: "http://pkg.example.com/13amd64",
	enabled: yes,
}

4.7. インストール後の作業

バイナリ package もしくは port のどちらを用いてソフトウェアをインストールするかに関わらず、 サードパーティ製のアプリケーションの多くは、 インストール後にある程度の設定を必要とします。 以下のコマンドや場所の情報は、 アプリケーションとともに何がインストールされたかを知るための助けとなるでしょう。

  • 多くのアプリケーションでは、 デフォルトの設定ファイルが、少なくとも一つは /usr/local/etc にインストールされます。 数多くの設定ファイルを持つようなアプリケーションでは、 それらのファイルを格納するためにサブディレクトリを作成するものもあります。 サンプルの設定ファイルは、しばしば .sample といった拡張子がついた名前でインストールされます。 設定ファイルを確認し、 必要に応じてシステムの要求に合うように編集してください。 最初にサンプルファイルを .sample を外した名前のファイルにコピーしてから、編集してください。

  • ドキュメントが付属しているアプリケーションは、ドキュメントを /usr/local/share/doc にインストールします。 また、多くのアプリケーションは、マニュアルページもインストールします。 これらのドキュメントは、アプリケーションを使い続ける前に見ておくべきものです。

  • ある種のアプリケーションでは、 サービスを実行するためには、 アプリケーションの起動前に、 /etc/rc.conf に追加する必要があります。 これらのアプリケーションでは、通常、 スタートアップスクリプトが /usr/local/etc/rc.d にインストールされます。詳細は、 サービスの起動 をご覧ください。

    設計上、インストールの際に、アプリケーションは、 スタートアップスクリプトを実行しませんし、 アンインストールやアップグレードの際には、 停止のためのスクリプトは実行されません。 起動や停止の決定は、各システム管理者に任されています。

  • csh(1) のユーザは、 rehash を実行して、 シェルの PATH のバイナリリストを再構築してください。

  • pkg info を使って、アプリケーションと共にインストールされたファイル、 マニュアルページ、およびバイナリを調べることができます。

4.8. うまく動作しない ports に遭遇した場合には

port をうまくコンパイルできなかったりインストールできない場合には、 以下を試してください。

  1. その port に対する修正案が提出されていないかどうかを 障害報告 (Problem Report) データベース で調べてください。 もし提案されていれば、 その提案されている修正によって問題を解決できるかもしれません。

  2. port の保守担当者に対応してもらいましょう。 port スケルトンで make maintainer と入力するか、port の Makefile を読み、保守担当者の電子メールアドレスを調べてください。 保守担当者にメールを送る際には、エラーが出力されるまでの出力ログを忘れずに添付してください。

    特定の保守担当者が存在せず、かわりに メーリングリスト によるグループの管理者が保守している ports があります。 そのような場合には、メールアドレスは freebsd-listname@FreeBSD.org のようになります。 メールを送る際には、このことに気をつけてください。

    特に ports@FreeBSD.org が保守している ports には、保守担当者がいません。 そのかわり、 そのメーリングリストを購読する人々からなるコミュニティが、 修正や対応をおこなっています。 もっとボランティアが必要です!

    メールに対して返信がなければ、FreeBSD 障害報告の書き方 に書かれている手順にしたがい、 Bugzilla を使ってバグレポートを提出してください。

  3. 自分で直しましょう! ports システムに関する詳細な情報は port 作成者のためのハンドブック にあります。 このセクションを読むと、壊れてしまった port を直したり、 自分で作った port を提出したりできるようになります!

  4. pkg によるバイナリ package の管理 に書かれている手順にしたがって、 package をインストールしてください。

Chapter 5. X Window System

5.1. この章では

bsdinstall を用いた FreeBSD のインストールでは、 グラフィカルユーザインタフェースは自動的にはインストールされません。 この章では、グラフィカル環境で使われるオープンソースの X Window System を提供する Xorg のインストールおよび設定方法について説明します。 その後、 デスクトップ環境およびウィンドウマネージャの探し方およびインストール方法について説明します。

Xorg を自動的に設定するインストール方法を希望するユーザは、GhostBSD, MidnightBSD または NomadBSD を参照してください。

Xorg が対応するビデオハードウェアについてのより多くの情報は、 x.org のウェブサイトをご覧ください。

この章を読めば以下のことがわかります。

  • X Window System のさまざまなコンポーネントと、 それらが互いにどのように連携しているか。

  • Xorg のインストールおよび設定方法

  • さまざまなウィンドウマネージャおよびデスクトップ環境のインストールおよび設定方法

  • Xorg での TrueType® フォントの使い方

  • GUI ログイン (XDM) の設定方法

この章を読み始める前に以下のことを理解しておく必要があります。

5.2. 用語の説明

X Window System のさまざまなコンポーネントについての詳細や、 それらがどのようにやり取りするかについてすべて理解する必要はありませんが、 これらのコンポーネントについて基本的なことを知っていると、 強力な武器になるでしょう。

X サーバ

X は最初からネットワークを意識してデザインされており、 "クライアント - サーバ" モデルを採用しています。 このモデルでは、"X サーバ" はキーボードやモニタ、 マウスが接続されたコンピュータ上で動きます。 このサーバはディスプレイの表示を管理したり、キーボード、 マウスからの入力を処理したり、 タブレットやビデオプロジェクタ等の他の装置からの入出力を処理します。 これは、ある人々を混乱させることがあります。 X での用語は彼らが想定するものとは正反対だからです。 彼らは "X サーバ" は地下にある大きなパワフルなマシンであり、 "X クライアント" が自分たちのデスク上にあると想像するのです。

X クライアント

XTerm や Firefox などの各 X アプリケーションは、 "クライアント" になります。 クライアントは "この座標にウィンドウを描いてください" といったメッセージをサーバへ送り、サーバは "ユーザが OK ボタンを押しました" といったメッセージを送り返します。

家庭や小さなオフィスのような環境では、X サーバと X クライアントは通常同じコンピュータ上で動いています。 X サーバを非力なコンピュータで動かし、 X アプリケーションをより高性能なマシンで動かすことも可能です。 この場合、 X のクライアントとサーバの通信はネットワーク越しに行なわれます。

ウィンドウマネージャ

X はスクリーン上でウィンドウがどのように見えるべきか、 マウスでそれらをどうやって動かすか、 ウィンドウ間を移動するのにどういうキーストロークを使うべきか、 各ウィンドウのタイトルバーはどのように見えるべきか、 クローズボタンを持つべきかどうか、 といったことは規定しません。そのかわりに、X ではそういったことを "ウィンドウマネージャ" と呼ばれるアプリケーションに任せます。ウィンドウマネージャはたくさん あります。 これらのウィンドウマネージャの見た目や使い勝手はそれぞれ異なっています。 バーチャルデスクトップをサポートしているものもありますし、 デスクトップを操作するキーストロークをカスタマイズできたり、 "スタート" ボタンやそれに類するものを持っているものもあります。 テーマに対応しており、 デスクトップの見た目や使い勝手を完全に変えられるものもあります。 ウィンドウマネージャは Ports Collection の x11-wm カテゴリに用意されています。

それぞれのウィンドウマネージャは異なる設定機構を備えています。 手で設定ファイルを編集しなければならないものや、 設定作業のほとんどを GUI ツールで行うことができるものもあります。

デスクトップ環境

KDE や GNOME は、デスクトップ環境です。 これらは、共通のデスクトップのタスクを実行するための完全なアプリケーションスイートを含んでいます。 オフィススイート、ウェブブラウザやゲームを含んでいるものもあります。

フォーカスポリシ

ウィンドウマネージャは、 マウスのフォーカスポリシに責任を持ちます。 このポリシは、どのウィンドウがアクティブにキーストロークを 受け付けるようにするための方法を提供し、 そして、どのウィンドウがアクティブなのかを示します。

よく知られているフォーカスポリシは "click-to-focus" と呼ばれるものです。 このポリシは、 あるウィンドウ内でマウスをクリックすればそのウィンドウがアクティブになる、 というものです。 "focus-follows-mouse" ポリシでは、 マウスポインタの下にいるウィンドウがフォーカスされるというものです。 フォーカスを変えるには他のウィンドウにマウスポインタを動かすだけです。 マウスがルートウィンドウに移動した時には、 このウィンドウがフォーカスされます。 "sloppy-focus" モデルでは、 マウスがルートウィンドウに移動した時には、 直前に使われていたウィンドウがフォーカスされています。 sloppy-focus では、 ポインタが別のウィンドウに移った時のみフォーカスが変わり、 現在のウィンドウから出ただけでは変わりません。 "click-to-focus" ポリシでは、 マウスクリックによりアクティブなウィンドウが選択されます。 ウィンドウは前面に表示され、他のすべてのウィンドウの前にきます。 ポインタが別のウィンドウ上に移動した時でも、 すべてのキーストロークがこのウィンドウに届きます。

それぞれのウィンドウマネージャは、 それぞれのフォーカスポリシに対応しています。 すべてのものは click-to-focus をサポートしていますし、 多くのものは他の方法もサポートしています。 どのフォーカスモデルを利用可能かどうかについては、 ウィンドウマネージャのドキュメントをご覧ください。

ウィジェット

ウィジェットはクリック可能であったり、 他の方法で操作可能なすべてのユーザインタフェース用アイテムを指す用語です。 ボタンやチェックボックス、ラジオボタン、アイコン、リスト、などがそうです。 ウィジェットツールキットはグラフィカルアプリケーションを作成するために使われます。 KDE で使われている Qt や GNOME プロジェクトで使われている GTK+ といった有名なウィジェットセットがあります。 そのため、アプリケーションのルックアンドフィールは、 アプリケーションを作成するのに使われたウィジェットツールキットに依存し、 異なります。

5.3. Xorg のインストール

FreeBSD では、Xorg を package または port からインストールできます。

バイナリ package を使うと早くインストールできますが、 カスタマイズのためのオプションは少なくなります。

# pkg install xorg

Ports Collection からビルドしてインストールするには、 以下のように実行してください。

# cd /usr/ports/x11/xorg
# make install clean

どちらの方法でも、完全な Xorg システムがインストールされます。 バイナリ package を用いる方法が、 ほとんどのユーザにとってはベストな選択となります。

経験のあるユーザ向けの最小の X システムは、x11/xorg-minimal です。 ほとんどのドキュメント、 ライブラリおよびアプリケーションはインストールされません。 アプリケーションによってはこれらの追加の要素が機能する上で必要となります。

5.4. Xorg の設定

5.4.1. クィックスタート

Xorg は、 標準的なほとんどのビデオカード、 キーボード、ポインティングデバイスに対応しています。

ビデオカード、キーボード、入力デバイスは、 自動的に検出されるので、手動の設定は必要ありません。 自動認識に失敗したとき以外は、xorg.conf を作成したり、-configure プロセスの実行は行わないでください。

  1. もし、使用しているコンピュータですでに Xorg が使われているのであれば、 コンフィグレーションファイルを移動するか、削除してください。

    # mv /etc/X11/xorg.conf ~/xorg.conf.etc
    # mv /usr/local/etc/X11/xorg.conf ~/xorg.conf.localetc
  2. 3D アクセラレータを利用できるシステムでは、 Xorg を実行するユーザを video または wheel グループに追加して、使用できるようにしてください。 ユーザ jru をどちらのグループでも利用できるようにするには以下のように実行してください。

    # pw groupmod video -m jru || pw groupmod wheel -m jru
  3. デフォルトでは twm ウィンドウマネージャがインストールされています。 Xorg が起動すると、 このウィンドウマネージャが立ち上がります。

    % startx
  4. 古いバージョンの FreeBSD では、 テキストコンソールに戻れるようにするために、 システムコンソールは vt(4) に設定する必要があります。 Kernel Mode Setting (KMS) を参照してください。

5.4.2. Accelerated Video のためのユーザグループ

ビデオカードの 3D アクセラレータを有効にするには、 /dev/dri へのアクセスが必要となります。 通常は、X を実行するユーザを video または wheel グループに追加するするだけです。 ここでは、pw(8) を使ってユーザ slurmsvideo グループ、または video グループが存在しない時に、 wheel グループに追加しています。

# pw groupmod video -m slurms || pw groupmod wheel -m slurms

5.4.3. Kernel Mode Setting (KMS)

コンピュータが、コンソールの表示から、 X 用の高解像度の表示へと切り替える時には、 ビデオの出力 mode が設定されている必要があります。 最近の Xorg では、 カーネル内部のシステムを使って効率的にこれらのモードの変換をしています。 古いバージョンの FreeBSD では、 KMS システムを用いない sc(4) が使用されています。 X を閉じた後、システムコンソールは動作をしていても、 表示に黒になります。 新しい vt(4) コンソールではこの問題は起こりません。

以下の行を /boot/loader.conf に追加して vt(4) を有効にしてください。

kern.vty=vt

5.4.4. コンフィグレーションファイル

通常、この節で説明する手動の設定は必要ありません。 自動認識に失敗したとき以外は、 手動で設定ファイルを作成しないでください。

5.4.4.1. ディレクトリ

Xorg は、 複数のディレクトリから設定ファイルを探します。 FreeBSD において、設定ファイルのディレクトリは、 /usr/local/etc/X11/ が推奨されます。 このディレクトリを使うことで、 アプリケーションのファイルをオペレーティングシステムとは区別する事になります。

昔のコンフィグレーションファイルの置き場である /etc/X11/ も機能します。 しかしながら、この場所に置くと、アプリケーションファイルと FreeBSD システムのファイルが混ざってしまうため、推奨されません。

5.4.4.2. 単一または複数ファイル

複数のファイルを用いて、 各ファイルが特定の部分を設定するようにすると、 古い単一の xorg.conf を用いるよりも設定が簡単になります。 これらのファイルは、 メインのコンフィグレーションファイルのディレクトリの xorg.conf.d/ サブディレクトリに置かれます。 フルパスは、一般的に /usr/local/etc/X11/xorg.conf.d/ となります。

これらのファイルの例は、この節の後半で説明します。

古い単一の xorg.conf も機能しますが、 xorg.conf.d/ サブディレクトリに複数のファイルで設定する形式に比べると、 柔軟ではなく、わかりにくいものとなります。

5.4.5. ビデオカード

Ports のフレームワークは、X11 が最近のハードウェア上で動作するために必要となる drm グラフィックドライバを提供します。 そのようなドライバとしては、graphics/drm-kmod で提供されるドライバがあります。 これらのドライバは、通常プライベートなカーネルのインタフェースを使用するため、PORTS_MODULES 変数を利用して ports システムのドライバを構築することが強く推奨されています。 PORTS_MODULES に設定されたカーネルモジュールを含む port は、カーネルを構築するたびに、アップデートされたソースに対応するよう再構築されます。 これにより、カーネルモジュールはカーネルと同期することが保証されます。 カーネルと ports ツリーは最大限に互換性を持つように共にアップデートされる必要があります。 /etc/make.conf ファイルで PORTS_MODULES を設定することで、カーネルを構築する際に、設定されたモジュールも再構築されるようになります。 上級のユーザの中には、カーネルコンフィグレーションファイルに makeoptions ディレクティブで追加するユーザもいます。 GENERIC を走らせていて、freebsd-update を使用している場合には、freebsd-update install 実行後に graphics/drm-kmod または x11/nvidia-driver port を構築してください。

/etc/make.conf

SYSDIR=path/to/src/sys
PORTS_MODULES=graphics/drm-kmod x11/nvidia-driver

この設定はすべてを再構築します。 使用している GPU /グラフィックカードに応じて、ひとつだけ選択したり、別のドライバを選択できます。

Intel KMS driver

Intel® が提供しているほとんどの Intel KMS driver グラフィックカードは、2D および 3D アクセラレーションに対応しています。

ドライバ名: i915kms

AMD® が提供している古い Radeon KMS driver グラフィックカードのほとんどは、2D および 3D アクセラレーションに対応しています。

ドライバ名: radeonkms

AMD® が提供している新しい Radeon KMS driver グラフィックカードのほとんどは、2D および 3D アクセラレーションに対応しています。

ドライバ名: amdgpu

Intel®

Iron Lake (HD Graphics) および Sandy Bridge (HD Graphics 2000) を含む Ivy Bridge (HD Graphics 2500, 4000, および P4000) までのほとんどの Intel® グラフィックスは、3D acceleration に対応しています。

ドライバ名: intel

参考情報については https://en.wikipedia.org/wiki/List_of_Intel_graphics_processing_units をご覧ください。

AMD® Radeon

ATI/Radeon: 2D および 3D acceleration は、 HD6000 シリーズまでのほとんどの Radeon カードで対応しています。

ドライバ名: radeon

参考情報については https://en.wikipedia.org/wiki/List_of_AMD_graphics_processing_units をご覧ください。

NVIDIA

NVIDIA: いくつかの NVIDIA ドライバが Ports Collection の x11 カテゴリから利用できます。 ビデオカードのモデルに対応するドライバをインストールしてください。

参考情報については https://en.wikipedia.org/wiki/List_of_Nvidia_graphics_processing_units をご覧ください。

NVIDIA カードに対応しているカーネルは x11/nvidia-driver port または x11/nvidia-driver-xxx port にあります。 最新のカードは、前者の port を使います。 古いカードは、-xxx ports を使うことになります。 ここで xxx はドライバのバージョンを表す 304, 340 または 390 のどれかです。 これらのドライバを使うには、 対応している NVIDIA GPU プロトコル ページを参照して、-xxx の部分を埋めてください。 このページには、ドライバの各バージョンが対応しているデバイスの一覧があります。 昔のドライバは i386 および amd64 で動作します。 現在のドライバは amd64 のみに対応しています。 詳細については、 NVIDIAドライバのインストールおよび設定 を参照してください。 ドライバが最大限に安全に動作するように、カーネルを再構築すたびにドライバを再構築することが推奨されていますが、このドライバはプライベートのカーネルインタフェースをほとんど使わないため、通常はカーネルがアップデートしても安全に使用できます。

ハイブリッドグラフィックス

ノートブックコンピュータによっては、 チップセットまたはプロセッサに組み込まれているグラフィックプロセッサユニットの他に、 追加でそれらを持つものがあります。 Optimus は、 Intel® と NVIDIA ハードウェアを組み合わせています。 Switchable Graphics または、 Hybrid Graphics は、 Intel® または AMD® プロセッサと AMD® Radeon GPU を組み合わせています。

これらのハイブリッドなグラフィックシステムの実装は、 システムごとに異なるので、 FreeBSD の Xorg は、 これらのすべてのバージョンについて対応しているわけではありません。

コンピュータによっては、 片方のグラフィックアダプタを無効にしたり、 標準のビデオカードドライバの一つとともに使われる discrete モードを選択できるような BIOS オプションを提供しています。 たとえば、Optimus システムでは、NVIDIA GPU を無効にできるものがあります。 その後、Intel® ビデオカードは、 Intel® ドライバで利用できます。

BIOS の設定は、 コンピュータのモデルに依存します。 システムによっては、両方の GPU を有効にできますが、 そのようなシステムの機能を利用するには、 Device セッションにおいて、 メインの GPU のみを使用するようなコンフィグレーションファイルを作成ことで十分です。

他のビデオカード

Ports Collection の x11-drivers ディレクトリには、 あまり使用されないようなドライバも用意されています。

特定のドライバによりサポートされていないようなカードでも、 x11-drivers/xf86-video-vesa で使用できるかもしれません。 このドライバは、x11/xorg によりインストールされます。 手動でインストールするには、 x11-drivers/xf86-video-vesa としてインストールしてください。 ビデオカードに対して、特定のドライバが見つからない場合には、 Xorg はこのドライバを使うことを試みます。

x11-drivers/xf86-video-scfb も同様に、多くの UEFI および ARM® コンピュータで動くような、 使用するカードを特定していないビデオドライバです。

ファイルでビデオドライバを設定する。

コンフィグレーションファイルにおいて Intel® ドライバを設定するには、以下のようにしてください。

例 14. ファイルにおいて Intel® ビデオドライバを選択する。

/usr/local/etc/X11/xorg.conf.d/driver-intel.conf

Section "Device"
	Identifier "Card0"
	Driver     "intel"
	# BusID    "PCI:1:0:0"
EndSection

1つ以上のビデオカードが存在する場合には、 BusID 行のコメントを外し、 希望するカードを選択するように設定できます。 ビデオカードバス ID は、 pciconf -lv | grep -B3 display で表示できます。

コンフィグレーションファイルで、Radeon ドライバを設定するには以下のようにしてください。

例 15. ファイルにおいて Radeon ビデオドライバを設定する。

/usr/local/etc/X11/xorg.conf.d/driver-radeon.conf

Section "Device"
	Identifier "Card0"
	Driver     "radeon"
EndSection

コンフィグレーションファイルで VESA ドライバを設定するには、以下のようにしてください。

例 16. ファイルで VESA ビデオドライバを設定する。

/usr/local/etc/X11/xorg.conf.d/driver-vesa.conf

Section "Device"
	Identifier "Card0"
	Driver     "vesa"
EndSection

UEFI または ARM® コンピュータを使うために scfb ドライバを設定するには、以下のように設定してください。

例 17. ファイルの中で scfb ビデオドライバを選択する。

/usr/local/etc/X11/xorg.conf.d/driver-scfb.conf

Section "Device"
	Identifier "Card0"
	Driver     "scfb"
EndSection

5.4.6. モニタ

ほとんどすべてのモニタは、Extended Display Identification Data standard (EDID) に対応しています。 Xorg は EDID を使ってモニタと通信し、 対応している解像度とリフレッシュレートを検出します。 そのため、モニタを使用するのに最も適切な設定が選択されます。

モニタにより対応している他の解像度は、 コンフィグレーションファイルに希望する解像度を設定する、 または X サーバを起動後、xrandr(1) により選択が可能となります。

xrandr(1) の使用

パラメータを与えずに xrandr(1) を実行すると、 ビデオ出力と検出されているモニタのモードを確認できます。

% xrandr
Screen 0: minimum 320 x 200, current 3000 x 1920, maximum 8192 x 8192
DVI-0 connected primary 1920x1200+1080+0 (normal left inverted right x axis y axis) 495mm x 310mm
   1920x1200     59.95*+
   1600x1200     60.00
   1280x1024     85.02    75.02    60.02
   1280x960      60.00
   1152x864      75.00
   1024x768      85.00    75.08    70.07    60.00
   832x624       74.55
   800x600       75.00    60.32
   640x480       75.00    60.00
   720x400       70.08
DisplayPort-0 disconnected (normal left inverted right x axis y axis)
HDMI-0 disconnected (normal left inverted right x axis y axis)

この出力からは、リフレッシュレート約 60 Hz で、 スクリーン解像度 1920x1200 ピクセルの表示に DVI-0 出力が使用されていることが分かります。 また、DisplayPort-0 および HDMI-0 インタフェースには、 モニタは接続されていません。

xrandr(1) を使用して、 他のディスプレイモードを選択できます。 たとえば、60 Hz で、1280x1024 の表示に変更するには、 以下のように実行してください。

% xrandr --output DVI-0 --mode 1280x1024 --rate 60

ノートブックコンピュータの外部出力を使用して、 ビデオプロジェクタに接続することがよく行われます。

出力端子のタイプおよび番号は、デバイスごとに異なります。 また、各端子の名前もドライバごとに異なります。 あるドライバが HDMI-1 と呼ぶ出力が、 別のドライバでは HDMI1 と呼ばれることもあります。 そのため、最初に xrandr(1) を実行して、 利用可能な出力のすべての一覧を表示してください。

% xrandr
Screen 0: minimum 320 x 200, current 1366 x 768, maximum 8192 x 8192
LVDS1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 344mm x 193mm
   1366x768      60.04*+
   1024x768      60.00
   800x600       60.32    56.25
   640x480       59.94
VGA1 connected (normal left inverted right x axis y axis)
   1280x1024     60.02 +  75.02
   1280x960      60.00
   1152x864      75.00
   1024x768      75.08    70.07    60.00
   832x624       74.55
   800x600       72.19    75.00    60.32    56.25
   640x480       75.00    72.81    66.67    60.00
   720x400       70.08
HDMI1 disconnected (normal left inverted right x axis y axis)
DP1 disconnected (normal left inverted right x axis y axis)

この出力からは、組み込みパネルの LVDS1, 外部出力の VGA1, HDMI1, そして DP1 端子の 4 つの出力を確認できます。

プロジェクタは VGA1 出力に接続されています。 情報を得られたので、xrandr(1) を使ってプロジェクタの標準の解像度に設定し、 デスクトップの右側にスペースを追加できます。

% xrandr --output VGA1 --auto --right-of LVDS1

この設定において、--auto は、 EDID により検出された解像度とリフレッシュレートを選択します。 解像度を正しく検出できていない場合には、 --auto のかわりに、 --mode を使うことで、 解像度を固定値を与えることにより設定できます。 たとえば、ほとんどのプロジェクタでは 1024x768 の解像度で使用できるので、 この場合には、--mode 1024x768 のように設定できます。

xrandr(1) は、X を起動する際に、 適切なモードを設定するように、しばしば .xinitrc から実行されます。

モニタ解像度をファイルで設定する。

コンフィグレーションファイルでスクリーンの解像度を 1024x768 と設定するには以下のようにしてください。

例 18. スクリーンの解像度をファイルで設定する。

/usr/local/etc/X11/xorg.conf.d/screen-resolution.conf

Section "Screen"
	Identifier "Screen0"
	Device     "Card0"
	SubSection "Display"
	Modes      "1024x768"
	EndSubSection
EndSection

EDID を持っていないモニタもあります。その場合には、 モニタが対応している周波数の範囲を、 HorizSync および VertRefresh で、指定することで設定できます。

例 19. 手動でモニタの周波数を設定する。

/usr/local/etc/X11/xorg.conf.d/monitor0-freq.conf

Section "Monitor"
	Identifier   "Monitor0"
	HorizSync    30-83   # kHz
	VertRefresh  50-76   # Hz
EndSection

5.4.7. 入力デバイス

5.4.7.1. キーボード
キーボードレイアウト

キーボード上の標準化されたキーの位置を レイアウト と呼びます。 レイアウトと他の調整可能なパラメータについては、 xkeyboard-config(7) にまとめられています。

アメリカ合衆国のレイアウトがデフォルトです。 他のレイアウトを選択するには、 InputClass で、 XkbLayout および XkbVariant オプションを設定してください。 クラスに対応するすべての入力デバイスに適用できます。

以下の例では、 フランス語のキーボードレイアウトを選択しています。

例 20. キーボードレイアウトを選択する。

/usr/local/etc/X11/xorg.conf.d/keyboard-fr.conf

Section	"InputClass"
	Identifier	"KeyboardDefaults"
	MatchIsKeyboard	"on"
	Option		"XkbLayout" "fr"
EndSection
例 21. 複数のキーボードレイアウトを選択する。

アメリカ合衆国、スペイン、 ウクライナのキーボードレイアウトを、 Alt+Shift によって切り替えるようにするには以下のように設定します。 レイアウトスイッチングコントロールや現在のレイアウトインディケータを改良するには、 x11/xxkb または、 x11/sbxkb を使ってください。

/usr/local/etc/X11/xorg.conf.d/kbd-layout-multi.conf

Section	"InputClass"
	Identifier	"All Keyboards"
	MatchIsKeyboard	"yes"
	Option		"XkbLayout" "us, es, ua"
EndSection
キーボードから Xorg を終了する。

X をキーの組み合わせで終了できるように設定できます。 デフォルトでは、幾つかのアプリケーションで、 キーボードコマンドと衝突してしまう可能性があるため、 このキーの組み合わせは設定されていません。 このオプションを有効にするには、 キーボードの InputDevice セクションを変更してください。

例 22. キーボードからの X の終了を有効にする。

/usr/local/etc/X11/xorg.conf.d/keyboard-zap.conf

Section	"InputClass"
	Identifier	"KeyboardDefaults"
	MatchIsKeyboard	"on"
	Option		"XkbOptions" "terminate:ctrl_alt_bksp"
EndSection
5.4.7.2. マウスおよびポインティングデバイス

もし FreeBSD 12.1 において、 moused(8) を使わず、 xorg-server 1.20.8 以降を使用しているのであれば、 /etc/sysctl.conf に、 kern.evdev.rcpt_mask=12 を追加してください。

コンフィグレーションオプションにより、 多くのマウスパラメータを調整できます。 すべての一覧については、mousedrv(4) をご覧ください。

マウスボタン

xorg.conf のマウス InputDevice セクションで、 マウスのボタンの数を設定できます。 ボタンの数を 7 に設定するには、 以下のように設定してください。

例 23. マウスボタンの数を設定する。

/usr/local/etc/X11/xorg.conf.d/mouse0-buttons.conf

Section "InputDevice"
	Identifier  "Mouse0"
	Option      "Buttons" "7"
EndSection

5.4.8. 手動による設定

ハードウェアによっては、Xorg の自動設定で適切な設定が行われなかったり、 自動設定とは別の設定にしたいときがあります。 そのような場合のため、 カスタムコンフィグレーションファイルを作成できます。

自動認識に失敗したとき以外は、 手動で設定ファイルを作成しないでください。 不必要な手動の設定を行った結果、 適切に動作しなくなるということがあります。

検出されたハードウェアをベースとした、 Xorg のコンフィグレーションファイルを作成できます。 このファイルは、 カスタムコンフィグレーションファイルの最初の出発点として有用です。

以下のようにすると xorg.conf が生成されます。

# Xorg -configure

このコンフィグレーションファイルは、 /root/xorg.conf.new として保存されます。 必要となる変更を行った後、このファイルを (バックグラウンドが表示されるように -retro を使って) テストしてください。

# Xorg -retro -config /root/xorg.conf.new

新しい設定を調整してテストしたら、 ファイルに分割して、標準の場所である、 /usr/local/etc/X11/xorg.conf.d/ に置いてください。

5.5. Xorg でのフォントの使用

5.5.1. Type1 フォント

Xorg に付いてくるデフォルトのフォントは、 通常のデスクトップパブリッシングアプリケーションにとっては理想的とは言えない程度のものです。 文字を大きくするとジャギーになりプロフェッショナルとは言えないようなものになりますし、 小さなフォントは頭が悪そうに見えます。 しかし、世の中には質の高い Type1 (PostScript®) フォントがいくつかあり、 Xorg ではそれらを簡単に利用することができます。 例えば、URW フォントコレクション (x11-fonts/urwfonts) には高品質の Type1 フォント (Times Roman™, Helvetica™, Palatino™ など) が含まれています。freefont コレクション (x11-fonts/freefonts) にはもっとたくさんのフォントが含まれていますが、 それらは Gimp のようなグラフィックソフトウェアで使用するためのものであり、 スクリーンフォントとしては十分ではありません。 さらに、Xorg は簡単に TrueType® フォントを使うように設定することも可能です。 詳しくは、X(7) のマニュアルページか TrueType® フォント を参照してください。

上記の Type1 フォントコレクションをバイナリ package からインストールする場合には、次のコマンドを実行してください。

# pkg install urwfonts

あるいは、Ports Collection から構築してインストールするには次のコマンドを実行してください。

# cd /usr/ports/x11-fonts/urwfonts
# make install clean

freefont や他のコレクションでも同じようにします。 X サーバがこれらのフォントを検出できるようにするには X サーバ設定ファイル (/etc/X11/xorg.conf) の適切な場所に次のような行を加えます。

FontPath "/usr/local/share/fonts/urwfonts/"

別の方法としては、 X のセッション中に次のようなコマンドラインを実行します。

% xset fp+ /usr/local/share/fonts/urwfonts
% xset fp rehash

これは動くのですが、X のセッションが終了すると消えてしまいます。 消えないようにするには X の起動時に読み込まれるファイル (通常の startx セッションの場合は ~/.xinitrc, XDM のようなグラフィカルなログインマネージャを通してログインする時は ~/.xsession) に加えておきます。 三番目の方法は新しい /usr/local/etc/fonts/local.conf ファイルを使うことです。 これに関しては フォントのアンチエイリアス をご覧ください。

5.5.2. TrueType® フォント

Xorg には、 TrueType® フォントのレンダリング機能が組み込まれています。 この機能を実現するために 2 つの異なるモジュールがあります。 ここでは、freetype の方が他のフォントレンダリングバックエンドと整合性が高いので、 このモジュールを使うことにします。 freetype モジュールを使うためには /etc/X11/xorg.conf ファイルの "Module" セクションに以下の行を追加するだけです。

Load  "freetype"

さて、まずは TrueType® フォント用のディレクトリ (例えば /usr/local/share/fonts/TrueType) を作り、そこに TrueType® フォントをすべて放り込みましょう。 Apple® Mac® の TrueType® フォントは、そのままでは使うことができませんので注意してください。 Xorg で使うには UNIX®/MS-DOS®/Windows® 用のフォーマットでなければなりません。 ファイルを置いたら mkfontscale を使って fonts.dir ファイルを作り、 X のフォントレンダラが新しいファイルがイントールされたことを分かるようにしてください。 mkfontscale は package からインストールできます。

# pkg install mkfontscale

その後、ディレクトリに X フォントファイルのインデックスを作成してください。

# cd /usr/local/share/fonts/TrueType
# mkfontscale

次に TrueType® フォントのディレクトリをフォントパスに追加します。 Type1 フォント の場合と同じように、

% xset fp+ /usr/local/share/fonts/TrueType
% xset fp rehash

とするか、もしくは xorg.conf ファイルに FontPath 行を追加します。

これで Gimp や LibreOffice といったすべての X アプリケーションから TrueType® フォントを使うことができます。 (高解像度なディスプレイで見るウェブページ上のテキストみたいな) とても小さなフォントや (LibreOffice にあるような) 非常に大きなフォントもかなり綺麗に見えるようになることでしょう。

5.5.3. フォントのアンチエイリアス

/usr/local/share/fonts/~/.fonts/ にあるすべての Xorg のフォントが、Xft に対応しているアプリケーションで自動的にアンチエイリアス表示できるようになりました。 KDE, GNOME および Firefox のような最新のアプリケーションは、Xft に対応しています。

どのフォントがアンチエイリアスされるかを制御するため、 もしくはアンチエイリアスの特性を設定するために、 /usr/local/etc/fonts/local.conf ファイルを作成 (すでに存在しているのなら編集) します。 多くの Xft フォントシステムの高度な機能をこのファイルを使って調整できます。 この節ではいくつか簡単なところだけを紹介します。 詳しくは、fonts-conf(5) をご覧ください。

このファイルは XML 形式でなければなりません。 大文字小文字の区別に注意を払い、 すべてのタグが正しく閉じられているか確認してください。 ファイルは一般的な XML ヘッダで始まり、DOCTYPE 定義と <fontconfig> タグがその後にきます。

<?xml version="1.0"?>
        <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
        <fontconfig>

すでに説明したように、 /usr/local/share/fonts/~/.fonts/ にあるすべてのフォントは Xft 対応のアプリケーションで利用できます。 これら 2 つのディレクトリ以外に別のディレクトリを追加したいなら、 /usr/local/etc/fonts/local.conf に以下のような行を追加してください。

<dir>/path/to/my/fonts</dir>

新しいフォント、 特に新しいフォントディレクトリを追加したら、 フォントキャッシュを再構築してください。

# fc-cache -f

アンチエイリアスをかけることによって境界が少しぼやけ、 そのためにとても小さなテキストはさらに読みやすくなり、 大きなフォントでは "ギザギザ" が消えるのです。 しかし、普通のテキストにかけた場合には目が疲れてしまうこともあります。 14 ポイント以下のサイズのフォントについて、 アンチエイリアスをかけないようにするには次の行を加えます。

        <match target="font">
            <test name="size" compare="less">
                <double>14</double>
            </test>
            <edit name="antialias" mode="assign">
                <bool>false</bool>
            </edit>
        </match>
        <match target="font">
            <test name="pixelsize" compare="less" qual="any">
                <double>14</double>
            </test>
            <edit mode="assign" name="antialias">
                <bool>false</bool>
            </edit>
        </match>

いくつかの等幅フォントは、 アンチエイリアスをかけるとスペーシングがうまくいかなくなる場合があります。 特に KDE でその傾向があるようです。 解決策の一つとして、そういったフォントのスペーシングを 100 に設定する方法があります。 そうするためには次の行を加えてください。

	<match target="pattern" name="family">
            <test qual="any" name="family">
                <string>fixed</string>
            </test>
            <edit name="family" mode="assign">
                <string>mono</string>
            </edit>
        </match>
        <match target="pattern" name="family">
            <test qual="any" name="family">
                <string>console</string>
            </test>
            <edit name="family" mode="assign">
                <string>mono</string>
            </edit>
        </match>

(これは固定サイズのフォントに "mono" という一般的な別名をつけます) そして以下を追加します。

        <match target="pattern" name="family">
            <test qual="any" name="family">
                <string>mono</string>
            </test>
            <edit name="spacing" mode="assign">
                <int>100</int>
            </edit>
        </match>

Helvetica の様なある種のフォントは、 アンチエイリアスすると問題が起こるでしょう。 たいてい、フォントが縦に半分に切られて表示されます。 最悪の場合、アプリケーションがクラッシュします。 これを回避するには、以下を local.conf に追加します。

        <match target="pattern" name="family">
            <test qual="any" name="family">
                <string>Helvetica</string>
            </test>
            <edit name="family" mode="assign">
                <string>sans-serif</string>
            </edit>
        </match>

local.conf の編集を終えたら、 ファイルの末尾が </fontconfig> タグで終わるようにしてください。 これを行わなければ、変更は無視されるでしょう。

ユーザは自分だけの設定を各自の ~/.config/fontconfig/fonts.conf に追加できます。 このファイルもこれまでの説明と同じく XML 形式を使います。

最後に一つ。LCD スクリーンではサブピクセルサンプリングが必要な場合があります。 これは、基本的には (水平方向に分かれている) 赤、緑、 青の各コンポーネントを別々に扱うことによって水平方向の解像度を良くするというもので、 劇的な結果が得られます。 これを有効にするには local.conf ファイルに次の行を加えます。

	 <match target="font">
            <test qual="all" name="rgba">
                <const>unknown</const>
            </test>
            <edit name="rgba" mode="assign">
                <const>rgb</const>
            </edit>
        </match>

ディスプレイの種類にもよりますが、 rgb ではなく bgrvrgb、もしくは vbgr の場合もあるので、 試してみて最も良いものを使ってください。

5.6. X ディスプレイマネージャ

Xorg は、 ログインセッションの管理に用いることのできる X ディスプレイマネージャ XDM を提供しています。XDM はどのディスプレイサーバに接続するかを選択でき、 ログイン名とパスワードの組み合わせなど認証情報を入力できるグラフィカルなインタフェースを提供しています。

この章では、FreeBSD 上での X ディスプレイマネージャの設定方法について説明します。 デスクトップ環境によっては、 各環境独自のグラフィカルログインマネージャを提供しています。 GNOME ディスプレイマネージャの設定方法については、GNOME を参照してください。 また、KDE ディスプレイマネージャの設定方法については、KDE を参照してください。

5.6.1. XDM の設定

XDM をインストールするには、 x11/xdm package または port を使ってください。 インストール後、コンピュータの起動時に、XDM を起動するように設定するには、/etc/rc.conf に以下の行を追加してください。

xdm_enable="YES"

デフォルトでは、XDM は 9 番目の仮想端末で起動します。

XDM の設定用ディレクトリは /usr/local/etc/X11/xdm です。 このディレクトリには XDM の振る舞いや見た目を変更するために用いられるファイルや、XDM の動作中にデスクトップを設定するためのスクリプトやプログラムがあります。 XDM 設定ファイル には、これらのフィアルの機能についてまとめられています。 これらのファイルの正確な文法や使用方法については、xdm(8) に記述されています。

表 7. XDM 設定ファイル
ファイル説明

Xaccess

XDM に接続するためのプロトコルは X Display Manager Connection Protocol (XDMCP) と呼ばれます。 このファイルにはリモートのマシンからの XDMCP 接続をコントロールするためのルールセットが書かれます。 デフォルトでは、どのクライアントからの接続も拒否します。

Xresources

このファイルは、XDM ディスプレイの chooser およびログインスクリーンを設定します。 デフォルトの設定は、シンプルな長方形のログインウィンドウで、 コンピュータのホスト名がログインウィンドウの上部に大きなフォントで表示され、 その下に "Login:" および "Password:" のプロンプトが表示されます。 このファイルのフォーマットは Xorg のドキュメントで記述されている app-defaults ファイルのものと同じです。

Xservers

これは、chooser がログインの選択肢として提供するローカルおよびリモートのディスプレイの一覧です。

Xsession

ユーザのログイン時に XDM により実行されるデフォルトのセッションスクリプトです。 ~/.xsession に置かれているカスタマイズされたセッションスクリプトが優先されます。

Xsetup_*

これらは chooser やログインインタフェースが表示される前に自動的に実行されるアプリケーションです。 それぞれのディスプレイに対して、Xsetup_* (* はローカルのディスプレイ番号) という名前のついたスクリプトがあります。 典型的な使い方は xconsole のようなバックグラウンドで動かすプログラムを一つか二つ起動することです。

xdm-config

このマシンで動いているすべてのディスプレイのグローバルな設定

xdm-errors

このファイルにはサーバプログラムからのエラーが書き出されます。 XDM が起動しようとしているディスプレイがなんらかの理由でハングした場合、 このファイルのエラーメッセージを見てください。 これらのメッセージは各ユーザの ~/.xsession-errors ファイルにもセッション毎に書き出されます。

xdm-pid

現在動いている XDM のプロセス ID。

5.6.2. リモートアクセスの設定

デフォルトでは、XDM を使ってログインできるのは、同じシステムのユーザのみです。 あるディスプレイサーバに他のシステムのユーザが接続できるようにするためには、 アクセスコントロールのルールを編集し、 コネクションリスナを有効にする必要があります。

XDM が他のリモートコネクションを待ち受けるようにするためには、 /usr/local/etc/X11/xdm/xdm-configDisplayManager.requestPort 行を、行頭に ! を置くことでコメントアウトしてください。

! SECURITY: do not listen for XDMCP or Chooser requests
! Comment out this line if you want to manage X terminals with xdm
DisplayManager.requestPort:     0

変更点を保存して、XDM を再起動してください。 リモートアクセスを制限するには、/usr/local/etc/X11/xdm/Xaccess にある例を参考にしたり、詳細について xdm(8) を参照してください。

5.7. デスクトップ環境

この節では、良く使われている 3 つのデスクトップ環境を FreeBSD 上でにインストールする方法について解説します。 デスクトップ環境とは、 単なるウィンドウマネージャから完全なデスクトップアプリケーションスイートまでカバーします。 Ports Collection の x11-wm カテゴリには、 100 を超えるデスクトップ環境が用意されています。

5.7.1. GNOME

GNOME はユーザフレンドリなデスクトップ環境です。 アプリケーションを起動したりステータスを表示するパネル、 デスクトップ、ツールおよびアプリケーション群、 そしてアプリケーションが互いにうまくやり取りできるような仕組みが含まれています。 FreeBSD 上の GNOME に関するもっと詳しい情報は、https://www.FreeBSD.org/gnome で見ることができます。 このウェブサイトには、FreeBSD での GNOME のインストール、設定、管理に関する多くの情報があります。

このデスクトップ環境は、package からインストールできます。

# pkg install gnome

ports から GNOME を構築するには、以下のコマンドを実行してください。 GNOME は大きなアプリケーションなので、 コンパイルには高速のコンピュータでも時間がかかります。

# cd /usr/ports/x11/gnome
# make install clean

GNOME を使用するには、 /proc ファイルシステムをマウントする必要があります。 以下を /etc/fstab に追加して、 システムの起動中にこのファイルシステムをマウントするように設定してください。

proc           /proc       procfs  rw  0   0

GNOME は、メッセージバスおよびハードウェアアブストラクションに D-Bus を使います。 これらのアプリケーションは、GNOME の依存として自動的にインストールされます。 /etc/rc.conf の中で、システムの起動時にスタートするように有効にしてください。

dbus_enable="YES"

インストール後、 GNOME を起動するように Xorg を設定してください。 最も簡単な方法は、GNOME ディスプレイマネージャ GDM を使うことです。 GDM は、 GNOME package または port の一部としてインストールされます。 有効にするには、以下の行を /etc/rc.conf に追加してください。

gdm_enable="YES"

GNOME のすべてのサービスを、 起動するようにしておくと良いでしょう。 このように設定するには、以下の行を /etc/rc.conf に追加してください。

gnome_enable="YES"

システムを再起動すると、GDM が自動的に起動します。

GNOME を起動するもう一つの方法は、 .xinitrc を適切に設定した後で、 コマンドラインから startx と入力する方法です。 .xinitrc が既にある場合には、 ウィンドウマネージャを起動する行を /usr/local/bin/gnome-session を起動するように変更してください。 このファイルが存在しなければ、 次のコマンドで作成してください。

% echo "exec /usr/local/bin/gnome-session" > ~/.xinitrc

3 つめの方法は、XDM をディスプレイマネージャとして使う方法です。 この場合は、実行可能な .xsession というファイルを作成してください。

% echo "exec /usr/local/bin/gnome-session" > ~/.xsession

5.7.2. KDE

KDE はもう一つの使いやすいデスクトップ環境です。 このデスクトップは、統一されたルックアンドフィール、 標準化されたメニューおよびツールバー、 キーバインディング、カラースキーム、国際化、 一元化されたダイアログベースのデスクトップ設定とともに、 アプリケーションのスイートを提供します。 KDE の詳細については http://www.kde.org/ をご覧ください。 KDE に関する FreeBSD 特有の情報については、http://freebsd.kde.org をご覧ください。

KDE package をインストールするには以下のように実行してください。

# pkg install x11/kde5

KDE port を構築するには、以下のコマンドを使ってください。 port のインストールでは、 インストールするアプリケーションを選択するためのメニューが表示されます。 KDE は大きなアプリケーションなので、 高速のコンピュータでもコンパイルには時間がかかります。

# cd /usr/ports/x11/kde5
# make install clean

KDE では、 /proc ファイルシステムをマウントする必要があります。 以下の行を /etc/fstab に追加して、 システム起動時にこのファイルシステムが自動的にマウントされるように設定してください。

proc           /proc       procfs  rw  0   0

KDE は、 メッセージバスおよびハードウェアアブストラクションに D-Bus を使います。 これらのアプリケーションは、KDE の依存として自動的にインストールされます。 /etc/rc.conf の中で、システムの起動時にスタートするように有効にしてください。

dbus_enable="YES"

KDE Plasma 5 から KDE のディスプレイマネージャ KDM の開発は終了しました。 かわりに推奨されているのが SDDM です。 インストールするには、以下を実行してください。

# pkg install x11/sddm

その後、以下の行を /etc/rc.conf に追加してください。

sddm_enable="YES"

KDE Plasma を起動するもう一つの方法は、 コマンドラインから startx を実行する方法です。 このコマンドを実行するには、~/.xinitrc に以下の行を追加してください。

exec ck-launch-session startplasma-x11

KDE Plasma を起動する 3 つめの方法は、 XDM を利用する方法です。 この方法を使うには、以下のようにして実行可能な ~/.xsession を作成してください。

% echo "exec ck-launch-session startplasma-x11" > ~/.xsession

KDE Plasma を起動した後は、 ビルトインヘルプシステムから、 さまざまなメニューおよびアプリケーションの使用方法などのより詳しい情報を参照できます。

5.7.3. Xfce

Xfce は GNOME で使われている GTK+ ツールキットをベースにしたデスクトップ環境ですが、より軽量、 シンプルでかつ効率的でありながら使いやすいデスクトップ環境です。 すべての設定が可能で、メニュー、 アプレットおよびアプリケーションランチャを含むメインパネル、 ファイルマネージャ、サウンドマネージャを提供し、 テーマに対応しています。 速くて軽く、効率的なため、古いマシンや遅いマシン、 メモリの限られたマシンに向いています。 Xfce に関する詳しい情報は http://www.xfce.org で得られます。

Xfce package をインストールするには、次のように実行してください。

# pkg install xfce

また、port を構築するには以下のようにしてください。

# cd /usr/ports/x11-wm/xfce4
# make install clean

Xfce は、 メッセージバスに D-Bus を使います。 これらのアプリケーションは Xfce の依存として自動的にインストールされます。 /etc/rc.conf において、 システム起動時に起動するように有効にしてください。

dbus_enable="YES"

GNOME や KDE とは異なり、 Xfce は、 ログインマネージャを提供していません。 コマンドラインから startx を実行して Xfce を起動するには、 以下のコマンドを使って、 ~/.xinitrc を作成してください。

% echo ". /usr/local/etc/xdg/xfce4/xinitrc" > ~/.xinitrc

もう一つの方法は XDM を用いる方法です。この方法を使うには、 実行可能な .xsession を作成してください。

% echo ". /usr/local/etc/xdg/xfce4/xinitrc" > ~/.xsession

5.8. Compiz Fusion のインストール

魅力的な 3D 効果を使うと、 デスクトップコンピュータを使う楽しさがさらに増えることでしょう。

Compiz Fusion のインストールは簡単ですが、設定の際には、port の文書には記載されていないような作業が必要となることがあります。

5.8.1. FreeBSD nVidia ドライバの設定

デスクトップ効果は、 グラフィックカードに極めて高い負荷をかけることがあります。 nVidia ベースのグラフィックカードにおいて、 良いパフォーマンスを出すには、 プロプリエタリなドライバが必要となります。 他のグラフィックカードを使っているユーザは、この節を飛ばし、 xorg.conf の設定に進んでください。

必要となる nVidia ドライバについては、 この問題に関する FAQ を参照して決めてください。

使用しているカードに対する適切なドライバが決まれば、 インストール作業は他の package をインストールするのと同じように簡単です。

たとえば、 最新のドライバをインストールするには以下のように実行してください。

# pkg install x11/nvidia-driver

このドライバはカーネルモジュールを作成するので、このモジュールをシステムの起動時に読み込むように設定する必要があります。 sysrc(8) を使用して起動時にモジュールを読み込むようにしてください。

# sysrc kld_list+="nvidia"

または、以下の行を /boot/loader.conf に追加してください。

nvidia_load="YES"

動作しているカーネルに、 カーネルモジュールを今すぐ読み込ませるには、 kldload nvidia のようなコマンドを実行してください。 しかしながら、Xorg のバージョンによっては、 起動時にドライバが読み込まれていないと正しく動かないもありますので、 注意してください。/boot/loader.conf を編集後は、再起動してください。 /boot/loader.conf を間違って設定してしまうと、システムは適切に起動しない可能性があります。

読み込まれたカーネルモジュールを使うには、 通常は、xorg.conf ファイルの一つの行をプロプリエタリなドライバを使うように変更するだけです。

/etc/X11/xorg.conf において、 以下の行を探し出してください。

Driver      "nv"

この行を以下のように変更してください。

Driver      "nvidia"

いつものように GUI を起動すると、nVidia のスプラッシュが表示されます。 すべてはこれまで通りに動作するはずです。

5.8.2. デスクトップ効果のための xorg.conf の設定

Compiz Fusion を有効にするには /etc/X11/xorg.conf を変更する必要があります。

コンポジット効果を有効にするには、 以下のセクションを追加してください。

Section "Extensions"
    Option         "Composite" "Enable"
EndSection

以下のような "Screen" セクションの場所を見つけてください。

Section "Screen"
    Identifier     "Screen0"
    Device         "Card0"
    Monitor        "Monitor0"
    ...

("Monitor" の後に) 次の二つの行を追加してください。

DefaultDepth    24
Option         "AddARGBGLXVisuals" "True"

あなたが使用したいと考えているスクリーン解像度に対応する "Subsection" を探してください。 たとえば、1280x1024 を使用する予定であれば、 次のようなセクションを探してください。 もし希望の解像度の subsection がなければ、 手動でそのエントリを追加してください。

SubSection     "Display"
    Viewport    0 0
    Modes      "1280x1024"
EndSubSection

デスクトップコンポジットで 24 ビットのカラーが必要であれば、上述の subsection を以下のように変更してください。

SubSection     "Display"
    Viewport    0 0
    Depth       24
    Modes      "1280x1024"
EndSubSection

最後に、"Module" セクションに "glx" および "extmod" モジュールが読み込まれるように設定されていることを確認してください。

Section "Module"
    Load           "extmod"
    Load           "glx"
    ...

前述の設定は、 x11/nvidia-xconfig を (root 権限で) 実行することで自動的に設定できます。

# nvidia-xconfig --add-argb-glx-visuals
# nvidia-xconfig --composite
# nvidia-xconfig --depth=24

5.8.3. Compiz Fusion のインストールおよび設定

Compiz Fusion のインストールは、 他の package と同様に簡単です。

# pkg install x11-wm/compiz-fusion

インストールが終了したら、グラフィックデスクトップを起動して、 端末から以下のコマンドを通常のユーザで実行してください。

% compiz --replace --sm-disable --ignore-desktop-hints ccp &
% emerald --replace &

使っているウィンドウマネージャ (GNOME では、Metacity) が、 Compiz Fusion に置き換えられるため、 画面は数秒間ちらつきます。 Emerald がウィンドウデコレーション (たとえば、閉じる、最小化、最大化ボタンタイトルバーなど) を取り扱います。

このコマンドをスクリプトに変換して、 (たとえば GNOME デスクトップの "Sessions" に追加して) 起動時に自動的に実行されるようにすることもできます。

#! /bin/sh
compiz --replace --sm-disable --ignore-desktop-hints ccp &
emerald --replace &

これを、たとえば start-compiz という名前でホームディレクトリに保存して、 以下のように実行可能にしてください。

% chmod +x ~/start-compiz

GUI を使って、このスクリプトを (GNOME デスクトップの System, Preferences, Sessions にある) Startup Programs に追加してください。

すべての希望する効果と設定を選択するには、 (もう一度通常のユーザで) Compiz Config Settings Manager を実行してください。

% ccsm

GNOME では、 System, Preferences メニューから選択することも出来ます。

ビルドの際に "gconf support" を選択していたのであれば、 gconf-editor を使って apps/compiz 以下を見ることで、 これらの設定を確認することも出来ます。

5.9. トラブルシューティング

もしマウスが動作しなければ、 先へ進む前にマウスの設定を行う必要があります。 最近の Xorg では、デバイスの自動認識のため、 xorg.confInputDevice セクションは無視されます。 古い設定の記述を利用するには、 このファイルの ServerLayout もしくは、 ServerFlags セクションに以下の行を追加してください。

Option "AutoAddDevices" "false"

これで、以前のバージョンのように、入力デバイスを (キーボードレイアウトの変更のように) 必要なオプションを用いて設定できるようになります。

この章には部分的に古くなった情報が含まれています。 FreeBSD のデスクトップ設定に HAL デーモン (hald) はもう使われません。

すでに説明したように、デフォルトで hald デーモンがキーボードを自動的に認識します。 キーボードレイアウトやモデルを正しく認識しない場合でも、 GNOME, KDE もしくは Xfce のようなデスクトップ環境が、 キーボードの設定ツールを提供しています。 しかしながら、 setxkbmap(1) ユーティリティや hald の設定ルールを利用することで、 キーボードのプロパティを直接設定できます。

たとえば、フランス語のレイアウトの PC 102 キーボードを使いたい場合には、 hald のキーボード設定ファイル x11-input.fdi を作成し、 /usr/local/etc/hal/fdi/policy ディレクトリに保存してください。 このファイルは以下を含んでいる必要があります。

<?xml version="1.0" encoding="utf-8"?>
<deviceinfo version="0.2">
  <device>
    <match key="info.capabilities" contains="input.keyboard">
	  <merge key="input.x11_options.XkbModel" type="string">pc102</merge>
	  <merge key="input.x11_options.XkbLayout" type="string">fr</merge>
    </match>
  </device>
</deviceinfo>

このファイルがすでに存在する場合には、 キーボードの設定に関する部分をただ単にコピーし、 ファイルに追加してください。

hald がこのファイルを読み込むように、 コンピュータを再起動してください。

X 端末やスクリプトから以下のコマンドラインを実行することでも、 同様に設定できます。

% setxkbmap -model pc102 -layout fr

/usr/local/share/X11/xkb/rules/base.lst には、利用可能なキーボード、 レイアウトおよびオプションの一覧があります。

xorg.conf.new 設定ファイルを好みに合うように調整できます。 emacs(1)ee(1) のようなテキストエディタでファイルを開いてください。 古いモニタや、通常とは異なるモデルで、 同期周波数の自動認識に対応していない場合には、 以下のような設定を xorg.conf.new"Monitor" セクションの下に加えてください。

Section "Monitor"
        Identifier   "Monitor0"
        VendorName   "Monitor Vendor"
        ModelName    "Monitor Model"
        HorizSync    30-107
        VertRefresh  48-120
EndSection

ほとんどのモニタは同期周波数の自動認識に対応しているので、 これらの値を手動で入力する必要はありません。 自動認識に対応していないモニタでは、 ダメージの可能性を避けるため、 メーカーが提供している値のみを入力してください。

X はモニタが対応していれば DPMS (Energy Star) 機能を使うことができます。 xset(1) プログラムでタイムアウトをコントロールしたり、 強制的にスタンバイ、サスペンドや電源オフにすることができます。 モニタの DPMS 機能を有効にしたい場合は、 "Monitor" セクションに次の行を加えてください。

Option       "DPMS"

xorg.conf.new 設定ファイルはエディタで開いたままにしておき、 デフォルトの解像度と色数を好みで選んでください。 "Screen" セクションで定義されます。

Section "Screen"
        Identifier "Screen0"
        Device     "Card0"
        Monitor    "Monitor0"
        DefaultDepth 24
        SubSection "Display"
                Viewport  0 0
                Depth     24
                Modes     "1024x768"
        EndSubSection
EndSection

DefaultDepth というキーワードは 実行時のデフォルトの色数について記述するためのものです。 Xorg(1) のコマンドラインスイッチ -depth が使用された場合はそちらが優先されます。 Modes というキーワードは、 与えられた色数におけるデフォルトの解像度を記述しておくためのものです。 ターゲットのシステムのグラフィックハードウェアによって定義されている、 VESA スタンダードモードのみがサポートされていることに注意してください。 上の例ではデフォルトの色数はピクセルあたり 24 ビットであり、 この色数での解像度は 1024 ピクセル× 768 ピクセルです。

最後に、設定ファイルを保存し、 上の例にあるようにテストしてみてください。

トラブルシューティングの過程で助けとなるツールのひとつに Xorg のログファイルがあります。 これには、Xorg サーバが検知したデバイスそれぞれについての情報があります。 Xorg のログファイル名は /var/log/Xorg.0.log という形式です。実際のログファイル名は Xorg.0.log から Xorg.8.log のように変わります。

すべてうまくいったなら、設定ファイルを Xorg(1) が見つけることができる共通の場所に置きます。 これは、通常は /etc/X11/xorg.conf/usr/local/etc/X11/xorg.conf です。

# cp xorg.conf.new /etc/X11/xorg.conf

これで Xorg の設定は完了です。 startx(1) ユーティリティで Xorg を起動できます。 xdm(8) を使って Xorg サーバを起動することもできます。

5.9.1. Intel® i810 グラフィックチップセットの設定

Intel® i810 統合チップセットを設定するには、 Xorg にカードを制御させるために AGP プログラミングインタフェースである agpgart が必要になります。 詳しくは、agp(4) ドライバのマニュアルページをご覧ください。

このドライバを用いることで、 他のグラフィックボードと同様に設定を行うことができるようになります。 カーネルに agp(4) ドライバが組み込まれていないシステムでは、 このモジュールを kldload(8) を使って読み込もうとしても動作しないことに注意してください。 このドライバは、 起動時にカーネル内に存在するようにカーネル内部に組み込むか、 /boot/loader.conf を使わなければなりません。

5.9.2. ワイドスクリーンフラットパネルの追加

この節では、設定に関する幾分高度な知識を必要とします。 これまでに述べた標準ツールを使って設定に失敗する場合は、 ログファイルを参照してください。 ログファイルには、 設定のために有用な情報が十分含まれています。 テキストエディタを使用する必要があるでしょう。

現在のワイドスクリーン (WSXGA, WSXGA+, WUXGA, WXGA, WXGA+ など) は、 16:10 や 10:9 形式、または (問題を含む可能性のある) 他のアスペクト比に対応しています。 以下は、16:10 アスペクト比のスクリーン解像度の例です。

  • 2560x1600

  • 1920x1200

  • 1680x1050

  • 1440x900

  • 1280x800

これらの解像度のひとつを以下のように "Screen" セクション の 可能な Mode に追加してください。

Section "Screen"
Identifier "Screen0"
Device     "Card0"
Monitor    "Monitor0"
DefaultDepth 24
SubSection "Display"
	Viewport  0 0
	Depth     24
	Modes     "1680x1050"
EndSubSection
EndSection

Xorg は、I2C/DDC 情報を通してワイドスクリーンの解像度に関する情報を取得できるので、 モニタの周波数や解像度の範囲を把握しています。

もし、これらの ModeLines がドライバに存在しないのであれば、 Xorg にヒントを与えなけれならないでしょう。 ModeLine を手動で設定するのに十分な情報を /var/log/Xorg.0.log から得ることができます。 以下のような情報を探してください。

(II) MGA(0): Supported additional Video Mode:
(II) MGA(0): clock: 146.2 MHz   Image Size:  433 x 271 mm
(II) MGA(0): h_active: 1680  h_sync: 1784  h_sync_end 1960 h_blank_end 2240 h_border: 0
(II) MGA(0): v_active: 1050  v_sync: 1053  v_sync_end 1059 v_blanking: 1089 v_border: 0
(II) MGA(0): Ranges: V min: 48  V max: 85 Hz, H min: 30  H max: 94 kHz, PixClock max 170 MHz

これは EDID と呼ばれる情報です。 この情報を用いて ModeLine を作成するには、 正しい順番に数字を入力するだけです。

 ModeLine <name> <clock> <4 horiz. timings> <4 vert. timings>

この例では Monitor セクションModeLine は以下のようになります。

Section "Monitor"
Identifier      "Monitor1"
VendorName      "Bigname"
ModelName       "BestModel"
ModeLine        "1680x1050" 146.2 1680 1784 1960 2240 1050 1053 1059 1089
Option          "DPMS"
EndSection

以上の簡単な編集作業が終わったら、 新しいワイドスクリーンモニタ上で X が動作するでしょう。

5.9.3. Compiz Fusion 使用時のトラブルシューティング

5.9.3.1. Compiz Fusion をインストールし、説明されたようにコマンドを実行すると、 ウィンドウのタイトルバーやボタンが表示されません。 何が問題でしょうか?

おそらく /etc/X11/xorg.conf の設定が行われていていないのでしょう。 このファイルを詳細に確認してください。特に DefaultDepth および AddARGBGLXVisuals ディレクティブを確認してください。

5.9.3.2. Compiz Fusion を起動するコマンドを実行すると、X サーバがクラッシュし、 コンソールに戻ります。何が問題でしょうか?

/var/log/Xorg.0.log ファイルを確認すると、 X の起動時のエラーメッセージを探し出すことができます。 多くの場合は、以下のようなものです。

(EE) NVIDIA(0):     Failed to initialize the GLX module; please check in your X
(EE) NVIDIA(0):     log file that the GLX module has been loaded in your X
(EE) NVIDIA(0):     server, and that the module is the NVIDIA GLX module.  If
(EE) NVIDIA(0):     you continue to encounter problems, Please try
(EE) NVIDIA(0):     reinstalling the NVIDIA driver.

これは通常 Xorg をアップグレードした時に起きる現象です。 x11/nvidia-driver package をインストールして glx を再構築してください。

Part II: 日々の生活

第 1 部では基礎的なことがらを説明したので、 ハンドブックの第 2 部では FreeBSD でよく使われる機能について説明します。 各章の内容は以下のとおりです。

  • ブラウザ、生産的なツール、ドキュメントビューアといった、 人気があって便利なデスクトップアプリケーションの紹介

  • FreeBSD で利用可能なマルチメディアツールの紹介

  • 特別な機能を有効にするために、 カスタム FreeBSD カーネルを構築する手順の説明

  • デスクトップおよびネットワーク接続両方のプリンタの設定に関する、 印刷システムの詳細な説明

  • FreeBSD システムで Linux アプリケーションを実行する方法

これらの章では、読み飛ばしを推奨しているものもあります。 これについてはそれぞれの章の始めにある概要に書かれています。

Chapter 6. デスクトップアプリケーション

6.1. この章では

FreeBSD は性能や安定性によりサーバとして人気がある一方で、 日々のデスクトップとしての利用にも適しています。 packages や ports から 36000 を超えるアプリケーションを利用できるので、 さまざまなアプリケーションを動かせるようにカスタマイズしたデスクトップを作り上げることができます。 この章では、ウェブブラウザ、生産的なソフトウェア、ドキュメントビューア、 および財務管理ソフトウェアといった、 数多くのデスクトップアプリケーションのインストール方法について説明します。

一から構築するのではなく、 事前に構築されたデスクトップバージョンの FreeBSD をお望みのユーザは、FuryBSD, GhostBSD および MidnightBSD をご覧ください。

この章の読者は、以下のことを理解しておく必要があります。

マルチメディア環境を整える方法については マルチメディア を参照してください。

この文書は英語で書かれている原文をそのまま邦訳したものです。 必ずしも各アプリケーションで日本語が扱えるとは限らないことに注意してください。 日本語に対応したアプリケーションは、Ports Collection の japanese ディレクトリにあるかもしれません。

6.2. ブラウザ

FreeBSD では Web ブラウザは事前にインストールされていません。 そのかわり、Ports Collection の www カテゴリには数多くの Web ブラウザ が用意されており、 多くのプログラムを packages からインストールしたり、 Ports Collection からコンパイルできます。

KDE や GNOME デスクトップ環境には、 それぞれ HTML ブラウザが用意されています。 これらのデスクトップ環境を設定するための情報については 「デスクトップ環境」 を参照してください。

軽量なブラウザには、 www/dillo2, www/links, および www/w3m といったものがあります。

この節では、広く使われている以下の web ブラウザのインストール方法について説明します。 もし、アプリケーションがリソースを大量に消費したり、 ports からのコンパイルに時間がかかったり、 他の ports に大きく依存する場合には、そのことについても触れます。

アプリケーション名必要なリソースport からのインストール備考

Firefox

FreeBSD, Linux® および地域化されたバージョンを利用できます。

Konqueror

KDE ライブラリを必要とします。

Chromium

Gtk+ を必要とします。

6.2.1. Firefox

Firefox は、 標準に準拠した HTML 表示エンジン、タブブラウジング、ポップアップブロック、 拡張性、高い安全性などが特徴のオープンソースのブラウザです。 Firefox は Mozilla のコードベースから派生したブラウザです。

最新の Firefox の package をインストールするには以下のように入力してください。

# pkg install firefox

Firefox 延長サポート版 (ESR: Extended Support Release) を利用したい場合には、 かわりに以下のように入力してください。

# pkg install firefox-esr

かわりにソースコードから希望の firefox をコンパイルすることもできます。 この例では www/firefox をビルドしますが、 firefox の部分は、 インストールする ESR やローカライズに置き換えることもできます。

# cd /usr/ports/www/firefox
# make install clean

6.2.2. Konqueror

Konqueror はブラウザであると同時に、 ファイルマネージャおよびマルチメディアビューアの役割も果たします。 Konqueror は、KHTML とともに WebKit にも対応しています。WebKit は Chromium など最近のブラウザの多くで採用されているレンダリングエンジンです。

Konqueror は、 以下のように入力して package からインストールできます。

# pkg install konqueror

Ports Collection からインストールするには、 以下のように入力してください。

# cd /usr/ports/x11-fm/konqueror/
# make install clean

6.2.3. Chromium

Chromium は、 オープンソースのブラウザのプロジェクトで、 より安全かつより高速、 より安定したウェブブラウジングを目指しています。 Chromium は、タブブラウジング、 ポップアップブロック、拡張機能などの機能を持っています。 Chromium は、Google Chrome ウェブブラウザがベースとしているオープンソースのプロジェクトです。

Chromium は、 以下のように入力することで package からインストールできます。

# pkg install chromium

または、Ports Collection を用いて ソースから Chromium をコンパイルしてインストールできます。

# cd /usr/ports/www/chromium
# make install clean

Chromium の実行可能ファイルは、 /usr/local/bin/chrome です。 /usr/local/bin/chromium ではありません。

6.3. 生産的なアプリケーション

生産的なアプリケーションということになると、 ユーザはしばしばオフィススイートや、 使いやすい文書作成ソフトウェアを求めるでしょう。 デフォルトの生産的なアプリケーションはありませんが、 KDE のような デスクトップ環境 はオフィススイートを提供しています。 インストールされているウィンドウマネージャにかかわらず、FreeBSD では、 いくつものオフィススイート、 グラフィカルな文書作成ソフトウェアを利用できます。

この節では、 以下の人気のある生産的なソフトウェアのインストール方法について説明します。 もし、アプリケーションがリソースを大量に消費したり、 ports からのコンパイルに時間がかかったり、 もしくは他の ports に大きく依存する場合には、 そのことについても触れます。

アプリケーション名必要なリソースport からのインストール実行に必要となる主な環境

Calligra

KDE

AbiWord

Gtk+ または GNOME

Gimp

Gtk+

Apache OpenOffice

莫大

JDK™ および Mozilla

LibreOffice

やや多

莫大

Gtk+ または KDE/ GNOME または JDK™

6.3.1. Calligra

KDE デスクトップには、 KDE 環境以外でも利用可能なオフィススイートがあります。 Calligra には、他のオフィススイートと同様に、 標準的なアプリケーションが含まれています。 Words は文書作成ソフトウェア、 Sheets は表計算ソフトウェア、 Stage はプレゼンテーションソフトウェア、そして Karbon は図形描画ソフトウェアです。

FreeBSD では package または port から editors/calligra をインストール出来ます。 package からインストールするには次のようにします。

# pkg install calligra

package を入手できない場合は、かわりに Ports Collection を利用してください。

# cd /usr/ports/editors/calligra
# make install clean

6.3.2. AbiWord

AbiWord は、Microsoft® Word のような見た目や操作感を持つフリーの文書作成ソフトウェアです。 速く、多くの機能を持ち、ユーザフレンドリです。

AbiWord は、 Microsoft® .rtf のような独自仕様を含む多くの形式のファイルを読み書きできます。

AbiWord package をインストールするには、以下のようにしてください。

# pkg install abiword

package を入手できない場合は、 Ports Collection からコンパイルしてください。

# cd /usr/ports/editors/abiword
# make install clean

6.3.3. GIMP

画像を描画したり写真を修正することに関して、 GIMP は洗練された編集プログラムです。 単純にお絵かきソフトウェアとして使うこともできますし、 高品質な写真の加工ツールとしても使えます。 多くのプラグインに対応しており、 スクリプトインタフェースを特徴としています。 GIMP はさまざまな形式のファイルを読み書きでき、 スキャナやタブレットとのインタフェースにも対応しています。

package をインストールするには、以下のようにしてください。

# pkg install gimp

もしくは、Ports Collection を利用してください。

# cd /usr/ports/graphics/gimp
# make install clean

Ports Collection の graphics カテゴリ (freebsd.org/ja/ports/) には、GIMP に関連したプラグイン、 ヘルプファイルおよびユーザマニュアルなどがあります。

6.3.4. Apache OpenOffice

Apache OpenOffice は、 Apache Software Foundation のインキュベータプロジェクトとして開発が行われているオープンソースのオフィススイートです。 Apache OpenOffice は、完全なオフィススイートに必須のアプリケーション (文書作成ソフトウェア、表計算ソフトウェア、 プレゼンテーションソフトウェア、そして図形描画ソフトウェア) をひととおり揃えています。 ユーザインタフェースは他のオフィススイートと似ており、 広く用いられているさまざまな形式のファイルを読み書きできます。 多くの言語で利用でき、インタフェース、スペルチェッカ、 辞書は国際化されています。

Apache OpenOffice の文書作成ソフトウェアは、ネイティブの XML ファイル形式を採用することでポータビリティや柔軟性を高めています。 表計算ソフトウェアにはマクロ機能があり、 外部データベースと接続することもできます。 Apache OpenOffice は、 Windows®, Solaris™, Linux®, FreeBSD および Mac OS® X において安定してネイティブに動作しています。 Apache OpenOffice についてのより詳しい情報は、 openoffice.org をご覧ください。 また、porting.openoffice.org/freebsd/ から、FreeBSD 特有の情報を参照してください。

Apache OpenOffice package をインストールするには、以下のように入力してください。

# pkg install apache-openoffice

package をインストールしたら、以下のコマンドを入力して Apache OpenOffice を起動してください。

% openoffice-X.Y.Z

ここで X.Y.Z は、 インストールされている Apache OpenOffice のバージョン番号です。 Apache OpenOffice の初回起動時に、いくつかの質問が行われ、 ユーザのホームディレクトリに .openoffice.org フォルダが作成されます。

希望の Apache OpenOffice の packages を利用できない場合には、port を利用する方法もあります。 しかしながら、コンパイルには大きなディスクスペースと、 本当にかなり長い時間を必要とします。

# cd /usr/ports/editors/openoffice-4
# make install clean

地域化されたバージョンをビルドするには、 上記のコマンドの代わりに以下を実行して下さい。

# make LOCALIZED_LANG=your_language install clean

your_language を正しい言語 ISO コードに置き換えてください。 サポートされている言語コードは、同じ port ディレクトリにある files/Makefile.localized に書かれています。

6.3.5. LibreOffice

LibreOffice は、documentfoundation.org が開発しているフリーソフトウェアのオフィススイートです。 他のメジャーなオフィススイートと互換性があり、 さまざまなプラットフォームで利用できます。 Apache OpenOffice.org からの新しいフォークで、 完全なオフィススイートに必須のアプリケーション (文書作成ソフトウェア、表計算ソフトウェア、 プレゼンテーションソフトウェア、図形描画ソフトウェア、 データベース管理ソフトウェア、数式エディタ) をすべて揃えています。 多くの言語で利用でき、 インタフェース、スペルチェッカ、辞書は国際化されています。

LibreOffice の文書作成ソフトウェアは、 ネイティブのファイル形式に XML を採用することで ポータビリティや柔軟性を高めています。 表計算ソフトウェアにはマクロ機能があり、 外部データベースと接続することもできます。 LibreOffice は、 Windows®, Solaris™, Linux®, FreeBSD, Mac OS® X において安定してネイティブに動作しています。 LibreOffice についての詳しい情報は、libreoffice.org をご覧ください。

英語版の LibreOffice package をインストールするには、以下のように入力してください。

# pkg install libreoffice

Ports Collection の edtors カテゴリ (freebsd.org/ja/ports/) カテゴリには、地域化された LibreOffice が用意されています。 地域化された package をインストールするには、 libreoffice を地域化された package 名に置き換えてください。

package をインストールしたら、以下のコマンドで LibreOffice を起動してください。

% libreoffice

初回起動時には、いくつかの質問が行われ、 ユーザのホームディレクトリに .libreoffice フォルダが作成されます。

希望の LibreOffice の packages を利用できない場合には、port からコンパイルする方法もあります。 しかしながら、コンパイルには大きなディスクスペースと、 本当にかなり長い時間を必要とします。 以下の例では、英語版をコンパイルします。

# cd /usr/ports/editors/libreoffice
# make install clean

地域化されたバージョンをビルドしたいのなら、 希望の言語の port ディレクトリに cd コマンドで移動してください。 対応している言語は、Ports Collection の editors カテゴリ (freebsd.org/ja/ports/) にあります。

6.4. ドキュメントビューア

UNIX® の出現以降、 いくつかの新しい文書形式が広く使われるようになりました。 基本システムには、それらの文書が要求するビューアがないかもしれません。 この節ではそれらのドキュメントビューアのインストール方法について説明します。

アプリケーション名必要なリソースport からのインストール実行に必要になる主な環境

Xpdf

FreeType

gv

Xaw3d

Geeqie

Gtk+ または GNOME

ePDFView

Gtk+ または GNOME

Okular

KDE

6.4.1. Xpdf

FreeBSD 向けの軽い PDF ビューアを使いたいのなら Xpdf を試してみてください。 これは少ないリソースで動作するビューアで、軽くて効率的です。 標準の X フォントを利用し、 他の X ツールキットを必要としません。

Xpdf の package をインストールするには次のコマンドを入力してください。

# pkg install xpdf

package を入手できない場合は、 Ports Collection を利用してください。

# cd /usr/ports/graphics/xpdf
# make install clean

インストールが完了したら xpdf を起動してください。 メニューを表示するにはマウスの右ボタンを押してください。

6.4.2. gv

gv は PostScript® と PDF のビューアです。これは ghostview をベースとしていますが、 Xaw3d ウィジットツールキットによってより良い外観になっています。 gv は向きや用紙のサイズ、 拡大縮小、アンチエイリアスなどたくさんの設定可能な機能を持っています。 ほとんどすべての操作をキーボードかマウスのどちらかだけで行なうことができます。

package から gv をインストールするには次のようにします。

# pkg install gv

package を利用できない場合には、Ports Collection を使ってください。

# cd /usr/ports/print/gv
# make install clean

6.4.3. Geeqie

Geeqie は、 メンテナンスが行われていない GQView プロジェクトからのフォークで、開発を進めることと、 これまでに作成されたパッチを統合することを目指しています。 Geeqie は、 クリックひとつで画像ファイルを開いたり、外部エディタを起動したり、 サムネイル画像を作成できるような画像管理ソフトウェアです。 また、スライドショーや基本的なファイル操作機能も備えており、 画像のコレクションの管理や、 重複したファイルを見つけることが簡単にできます。 Geeqie は全画面表示、 および国際化にも対応しています。

Geeqie package をインストールするには次のコマンドを入力してください。

# pkg install geeqie

package を入手できない場合は、 Ports Collection を利用してください。

# cd /usr/ports/graphics/geeqie
# make install clean

6.4.4. ePDFView

ePDFView は軽量な PDF ドキュメントビューアです。 このビューアは、 Gtk+ および Poppler ライブラリのみを使います。 このソフトウェアは、現在開発中ですが、ほぼすべての PDF ファイル (暗号化されたものを含む) を開くことが可能で、ドキュメントのコピーを保存でき、 CUPS を用いた印刷にも対応しています。

package から ePDFView をインストールするには以下のようにしてください。

# pkg install epdfview

package が利用できないようでしたら、 Ports Collection を使ってインストールしてください。

# cd /usr/ports/graphics/epdfview
# make install clean

6.4.5. Okular

Okular は、 KDE の KPDF をベースとした一般的なドキュメントビューアです。 このビューアは、PDF, PostScript®, DjVu, CHM, XPS, および ePub といった、多くの形式のファイルを開くことができます。

package で Okular をインストールするには、以下のようにしてください。

# pkg install okular

package が利用できないようでしたら、 Ports Collection を使ってインストールしてください。

# cd /usr/ports/graphics/okular
# make install clean

6.5. 財務管理ソフトウェア

FreeBSD のデスクトップで個人的な財務管理ができるように、 強力で簡単に使えるアプリケーションが用意されています。 それらのアプリケーションの中には Quicken や Excel などの広く行き渡った形式のファイルと互換性があるものもあります。

この節では次のアプリケーションについて説明します。

アプリケーション名必要なリソースport からのインストール実行に必要になる主な環境

GnuCash

GNOME

Gnumeric

GNOME

KMyMoney

KDE

6.5.1. GnuCash

GnuCash は、 GNOME の一部で、 使いやすくかつ強力なアプリケーションとしてエンドユーザに提供されています。 GnuCash を使えば、 収入や支出、銀行口座、あるいは株を管理できます。 直観的なインタフェースを特徴としていますが、 高度な機能も提供しています。

GnuCash は洗練された登録機能、 階層構造の勘定システム、多くのキーボードショートカット、 自動補完機能を提供しています。 単一のトランザクションをより小さな要素に分解できます。 GnuCash は、 Quicken の QIF ファイルの読み込みやマージができます。 また、国際的な日付および通貨形式も扱えます。

GnuCash package をインストールするには次のようにしてください。

# pkg install gnucash

package が手に入らなければ、Ports Collection を使ってください。

# cd /usr/ports/finance/gnucash
# make install clean

6.5.2. Gnumeric

Gnumeric は、 GNOME コミュニティによって開発されている表計算ソフトウェアです。 セルの書式に従ってユーザの入力を自動的に推測する便利な機能や、 多くのシーケンスに対する自動補完機能があります。 Excel, Lotus 1-2-3, Quattro Pro といった広く行き渡っている多くの形式のファイルを読みこめます。 多くの関数を内蔵しており、 数値、通貨、日付、時間などのよく使うセルの書式が利用できます。

Gnumeric package をインストールするには次のように入力してください。

# pkg install gnumeric

package が手に入らなければ、Ports Collection を使ってください。

# cd /usr/ports/math/gnumeric
# make install clean

6.5.3. KMyMoney

KMyMoney は、KDE コミュニティが作成している個人用財務管理アプリケーションです。 KMyMoney は、 商用の個人用財務管理ソフトウェアに見られる重要な機能を提供することを目指しています。 また、使いやすい複式簿記機能も特徴です。 KMyMoney は標準の Quicken QIF ファイルをインポート可能で、 投資履歴や複数通貨の取扱い、財政状況のレポートを提供します。

package から KMyMoney をインストールするには次のようにします。

# pkg install kmymoney-kde4

package が手に入らない場合は、 Ports Collection を使ってください。

# cd /usr/ports/finance/kmymoney-kde4
# make install clean

Chapter 7. マルチメディア

7.1. この章では

FreeBSD は数多くの種類のサウンドカードに対応しており、 FreeBSD システムで原音に忠実な出力を楽しむことができます。 これには録音機能と、MPEG Audio Layer 3 (MP3) や Waveform Audio File (WAV), Ogg Vorbis などをはじめとした多くの形式の音楽の再生機能が含まれます。 加えて FreeBSD の Ports Collection には、 録音した音楽を編集したり、音響効果を加えたり、接続された MIDI 機器を制御するためのアプリケーションが用意されています。

FreeBSD ではビデオファイルおよび DVD の再生もできます。 FreeBSD の Ports Collection には、さまざまなビデオメディアをエンコード、 変換、再生するアプリケーションが用意されています。

この章では FreeBSD 上でサウンドカード、ビデオの再生、TV チューナカード、 スキャナを設定する方法について説明します。 また、これらのデバイスを使うためのアプリケーションについても説明します。

この章を読むと、以下のことがわかります。

  • FreeBSD でのサウンドカードの設定方法

  • サウンドの設定に関するトラブルシューティング

  • MP3 およびその他の形式の音声を再生、エンコードする方法

  • FreeBSD システムでのビデオ再生の準備

  • DVD, .mpg および .avi ファイルを再生する方法

  • CD および DVD の情報をファイルに抽出する方法

  • TV カードの設定方法

  • MythTV を FreeBSD にインストールして設定する方法

  • 画像スキャナの設定方法

  • Bluetooth ヘッドホンの設定方法

この章を読む前に、以下のことを理解しておく必要があります。

7.2. サウンドカードの設定

設定をはじめる前に、サウンドカードのモデル、 そのカードが使用しているチップを確認してください。 FreeBSD は サウンドカードに幅広く対応しています。 使用しているカードが対応しているかどうか、 どの FreeBSD ドライバを使うかについて、 ハードウェアノート の対応オーディオデバイスの一覧を確認してください。

サウンドデバイスを使うためには、 デバイスドライバを読み込まなければいけません。 もっとも簡単な方法は kldload(8) を使ってサウンドカードのカーネルモジュールを読み込むことです。 次の例は、Intel 仕様のビルトインオーディオチップセットのドライバを読み込む例です。

# kldload snd_hda

このドライバを起動時に読み込むように設定するためには、 /boot/loader.conf にドライバを追加してください。 このドライバの場合は以下の行になります。

snd_hda_load="YES"

他に利用可能な読み込み可能なサウンドモジュールは /boot/defaults/loader.conf に記載されています。 どのドライバを利用すればいいか確かでなければ、 snd_driver モジュールを読み込んでください。

# kldload snd_driver

snd_driver モジュールは、 一般に使用されるカードに対応したドライバをまとめて一度に読み込むメタドライバです。 このドライバを使用すれば、速やかに正しいドライバを探し出すことができます。 /boot/loader.conf ファイルを使用して、 すべてのサウンドドライバを読み込むこともできます。

snd_driver メタドライバの読み込み後に、 どのドライバがサウンドカードに選択されたのかを知るには、 cat /dev/sndstat と入力してください。

7.2.1. サウンドに対応したカスタムカーネルを設定する

この節は、 サウンドカードのドライバをカーネルへ静的に組み込もうと考えているユーザ向けです。 カーネル再構築の詳細は FreeBSD カーネルのコンフィグレーション を参照してください。

サウンドに対応したカスタムカーネルを使うときには、 オーディオフレームワークドライバをカーネルコンフィグレーションファイルに追加してください。

device sound

次に、サウンドカードに対応したドライバを追加します。 前節の Intel 仕様のビルトインオーディオチップセットの例では、 カスタムカーネルコンフィグレーションファイルに以下の行を追加してください。

device snd_hda

ドライバのマニュアルページを読んで、 ドライバが使用するデバイス名を調べてください。

PnP 非対応の ISA サウンドカードでは、 IRQ および I/O ポートの設定を /boot/device.hints  に指定する必要があるかもしれません。 システムの起動時に、loader(8) はこのファイルを読み、設定情報をカーネルに渡します。 たとえば、PnP 非対応の古い Creative SoundBlaster® 16 (ISA 接続) には snd_sb16 とともに snd_sbc(4) ドライバを使用します。 このカードを使用する場合には、 カーネルコンフィグレーションファイルに以下の行を追加してください。

device snd_sbc
device snd_sb16

もしカードが 0x220 I/O port と IRQ 5 を使用している場合には、 /boot/device.hints に以下の行を追加してください。

hint.sbc.0.at="isa"
hint.sbc.0.port="0x220"
hint.sbc.0.irq="5"
hint.sbc.0.drq="1"
hint.sbc.0.flags="0x15"

/boot/device.hints に用いるべき構文は、sound(4) および、 サウンドカードの各ドライバのマニュアルページに記載されています。

これまでの設定はデフォルトのものです。 カードを使用する状況によっては、 IRQ やその他の設定を変更する必要があるかもしれません。 このカードについての詳細は、 snd_sbc(4) をご覧ください。

7.2.2. サウンドのテスト

必要となるモジュールを読み込むか、カスタムカーネルで再起動すると、 サウンドカードが検出されます。 確認をするには、dmesg | grep pcm と実行してください。 この例は、ビルトイン Conexant CX20590 チップセットを搭載したシステムのものです。

pcm0: <NVIDIA (0x001c) (HDMI/DP 8ch)> at nid 5 on hdaa0
pcm1: <NVIDIA (0x001c) (HDMI/DP 8ch)> at nid 6 on hdaa0
pcm2: <Conexant CX20590 (Analog 2.0+HP/2.0)> at nid 31,25 and 35,27 on hdaa1

サウンドカードの状態は、 以下のコマンドを使用して確認することもできます。

# cat /dev/sndstat
FreeBSD Audio Driver (newpcm: 64bit 2009061500/amd64)
Installed devices:
pcm0: <NVIDIA (0x001c) (HDMI/DP 8ch)> (play)
pcm1: <NVIDIA (0x001c) (HDMI/DP 8ch)> (play)
pcm2: <Conexant CX20590 (Analog 2.0+HP/2.0)> (play/rec) default

この出力は、サウンドカードによって異なります。 pcm デバイスがなければ、 適切なデバイスドライバが読み込まれているか、 カーネルに追加されてコンパイルされているかどうかを確認してください。 次の節では、良くある問題とその解決方法をリストアップしています。

すべてうまくいけば、サウンドカードが FreeBSD で機能するでしょう。 CD または DVD ドライブのオーディオ出力端子がサウンドカードと適切に接続されていれば、 cdcontrol(1) を使ってドライブ内のオーディオ CD を再生できます。

% cdcontrol -f /dev/acd0 play 1

オーディオ CD は特別なエンコーディングが行われているため、 mount(8) を使ってマウントすべきではありません。

audio/workman のように、 よりよいインタフェースを提供するさまざまなアプリケーションがあります。 audio/mpg123 port をインストールして MP3 オーディオファイルを聞くことができます。

手っ取り早くカードをテストするには、 /dev/dsp デバイスにデータを送ってみてください。

% cat filename > /dev/dsp

ここで filename は、どのような形式のファイルでも構いません。 このコマンドラインを実行すると雑音が発生するはずです。 これにより、サウンドカードが動作していることを確認できます。

/dev/dsp* デバイスノードは、 必要に応じて自動的に作成されます。 デバイスノードが使用されていない場合には存在せず、 ls(1) の出力に表示されません。

7.2.3. Bluetooth サウンドデバイスの設定

Bluetooth デバイスへの接続についての説明は、この章の範囲外です。 詳細については Bluetooth をご覧ください。

FreeBSD のサウンドシステムで Bluetooth サウンドシンクを動かすには、最初に audio/virtual_oss をインストールしてください。

# pkg install virtual_oss

audio/virtual_oss を使うには、 カーネルに cuse が読み込まれている必要があります。

# kldload cuse

システムのスタートアップ時に cuse を読み込むには、以下のコマンドを実行してください。

# echo 'cuse_load=yes' >> /boot/loader.conf

audio/virtual_oss でヘッドホンをサウンドシンクとして使うには、 Blueooth オーディオデバイスに接続後、 仮想デバイスを作成する必要があります。

# virtual_oss -C 2 -c 2 -r 48000 -b 16 -s 768 -R /dev/null -P /dev/bluetooth/headphones -d dsp

この例において、 headphones は、 /etc/bluetooth/hosts に記載されているホスト名です。 代わりに BT_ADDR を使えます。

詳細については、virtual_oss(8) をご覧ください。

7.2.4. サウンドカードの問題についてのトラブルシューティング

良くあるエラーメッセージ は、 良くあるエラーメッセージとその解決法の一覧です。

表 8. 良くあるエラーメッセージ
エラー解決方法

sb_dspwr(XX) timed out

使用する I/O ポートが適切に設定されていません。

bad irq XX

使用する IRQ が正しく設定されていません。 サウンドカードの IRQ と設定した IRQ が同じかどうか確かめてください。

xxx: gus pcm not attached, out of memory

デバイスを使用するのに十分なメモリを確保できません。

xxx: can’t open /dev/dsp!

fstat | grep dsp と入力して、 他のアプリケーションがデバイスを使用しているか調べてください。 注目すべきトラブルメーカは esound と KDE のサウンド機能です。

最近のグラフィックカードの中には、 HDMI を利用するため、 グラフィックカード自身がサウンドカードを持つものがあります。 このようなサウンドデバイスには、 時としてサウンドカードより若い番号が付けられることがあります。 そのような場合には、 サウンドカードをデフォルトプレイバックデバイスとして利用できません。 このことが原因かどうかを確認するには、dmesg を実行して pcm を探してください。 以下のような出力を得るかもしれません。

...
hdac0: HDA Driver Revision: 20100226_0142
hdac1: HDA Driver Revision: 20100226_0142
hdac0: HDA Codec #0: NVidia (Unknown)
hdac0: HDA Codec #1: NVidia (Unknown)
hdac0: HDA Codec #2: NVidia (Unknown)
hdac0: HDA Codec #3: NVidia (Unknown)
pcm0: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 0 nid 1 on hdac0
pcm1: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 1 nid 1 on hdac0
pcm2: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 2 nid 1 on hdac0
pcm3: <HDA NVidia (Unknown) PCM #0 DisplayPort> at cad 3 nid 1 on hdac0
hdac1: HDA Codec #2: Realtek ALC889
pcm4: <HDA Realtek ALC889 PCM #0 Analog> at cad 2 nid 1 on hdac1
pcm5: <HDA Realtek ALC889 PCM #1 Analog> at cad 2 nid 1 on hdac1
pcm6: <HDA Realtek ALC889 PCM #2 Digital> at cad 2 nid 1 on hdac1
pcm7: <HDA Realtek ALC889 PCM #3 Digital> at cad 2 nid 1 on hdac1
...

この例では、グラフィックカード (NVidia) には、サウンドカード (Realtek ALC889) より若い番号が付けられています。 サウンドカードをデフォルトのプレイバックデバイスとして利用するには、 hw.snd.default_unit をプレイバックで使用するユニット番号に変更してください。

# sysctl hw.snd.default_unit=n

ここで、n は使用するサウンドデバイスの番号です。 この例では 4 です。 /etc/sysctl.conf に以下の行を入れると、 設定の変更が常に反映されるようになります。

hw.snd.default_unit=4

7.2.5. 複数音源の利用

同時に再生することのできる音源を複数実装していることは、 多くの場合望ましいことです。 FreeBSD では、"仮想サウンドチャネル" を使ってカーネル内でサウンドを合成することにより、 サウンドカードの再生を多重化することができます。

仮想チャネルの数を決めるのに三つの sysctl(8) 変数を設定できます。

# sysctl dev.pcm.0.play.vchans=4
# sysctl dev.pcm.0.rec.vchans=4
# sysctl hw.snd.maxautovchans=4

この例では四つの仮想チャネルを設定しています。 これは通常利用する上で十分実用的な数です。 dev.pcm.0.play.vchans=4dev.pcm.0.rec.vchans=4 は、 デバイスが取り付けられた後で設定できます。 これらは pcm0 が再生や録音のために持っている仮想チャネルの数です。 hw.snd.maxautovchans は、 kldload(8) を用いて認識された新しいデバイスの仮想チャネル数です。 pcm モジュールはハードウェアドライバとは独立して読み込むことができるので、 hw.snd.maxautovchans は、オーディオデバイスが取り付けられた時に、 デバイスに与えられる仮想チャネルの数を表しています。 より詳細な情報については pcm(4) を参照してください。

デバイスを使用しているときに仮想チャンネルの数を変更することはできません。 まず、ミュージックプレーヤやサウンドデーモンといった デバイスを使用しているすべてのプログラムを終了してください。

/dev/dsp0 を必要とするプログラムが意識しなくても、 適切な pcm デバイスが自動的に設定されます。

7.2.6. ミキサチャネルの初期値を設定する

各ミキサチャネルの初期値は pcm(4) ドライバのソースコードにハードコーディングされています。 mixer(8) および他のサードパーティ製のアプリケーションやデーモンによって、 サウンドカードのミキサレベルを変更できますが、 永続的な解決方法ではありません。 そのかわり以下の例のように、 適切な値を /boot/device.hints ファイルに記述することによって、 ドライバレベルでミキサの初期値を設定することができます。

hint.pcm.0.vol="50"

この例では、pcm(4) が読み込まれたと同時に、 ボリュームチャネルの初期値を 50 に設定します。

7.3. MP3 オーディオ

この節では、FreeBSD で利用できる MP3 プレイヤや、オーディオ CD トラックを吸い出す方法、 および MP3 のエンコード、 デコードの方法について説明します。

7.3.1. MP3 プレイヤ

Audacious は 人気のあるグラフィカルな MP3 プレイヤです。 Winamp スキンや追加のプラグインに対応しています。 Audacious のプレイリスト、 グラフィックイコライザ等のインタフェースは直感的です。 Winamp を使いなれている人は簡単に Audacious を使えるでしょう。 FreeBSD では、Audacious は multimedia/audacious の port または package からインストールできます。 Audacious は、XMMS の子孫です。

audio/mpg123 package もしくは port は、 は代替となる コマンドライン上の MP3 プレイヤです。インストールしたら、再生する MP3 ファイルをコマンドラインから指定してください。 もしシステムが、複数のオーディオデバイスを搭載しているのであれば、 サウンドデバイスを同様に指定してください。

# mpg123 -a /dev/dsp1.0 Foobar-GreatesHits.mp3
High Performance MPEG 1.0/2.0/2.5 Audio Player for Layers 1, 2 and 3
        version 1.18.1; written and copyright by Michael Hipp and others
        free software (LGPL) without any warranty but with best wishes

Playing MPEG stream from Foobar-GreatestHits.mp3 ...
MPEG 1.0 layer III, 128 kbit/s, 44100 Hz joint-stereo

他の MP3 プレイヤも Ports Collection から利用できます。

7.3.2. CD オーディオトラックの抽出

CD 全体または CD トラックを MP3 に変換する前に、CD 上のオーディオデータをハードディスク上に抽出する必要があります。 これは raw CD Digital Audio (CDDA) データを WAV ファイルにコピーすることで行われます。

sysutils/cdrtools スイートからインストールされる cdda2wav ツールを用いて、CD からオーディオデータを抽出できます。

CD をドライブにいれて次のコマンドを root 権限で実行すると、 CD 全体をトラックごとに個々の WAV ファイルに抽出できます。

# cdda2wav -D 0,1,0 -B

この例では、-D 0,1,0 は SCSI デバイス 0,1,0 が抽出する CD を表します。 cdrecord -scanbus を使って、 システムの適切なデバイスパラメータを取得してください。

個々のトラックを抽出するには、 次のように -t でトラックを指定してください。

# cdda2wav -D 0,1,0 -t 7

範囲を指定して、 一番目から七番目のトラックまで抽出したい場合、 次のようにします。

# cdda2wav -D 0,1,0 -t 1+7

ATAPI (IDE) CDROM ドライブから抽出するには、 SCSI ユニット番号をデバイス名に置き換えて指定します。 たとえば IDE ドライブから七番目のトラックを抽出するには、 次のようにします。

# cdda2wav -D /dev/acd0 -t 7

または、「オーディオ CD の複製」 で説明されているように、dd を使って ATAPI ドライブ上のオーディオトラックを展開できます。

7.3.3. MP3 のエンコードとデコード

lame は、 ポピュラーな MP3 エンコーダです。 audio/lame port からインストールできます。 特許の問題から、package は利用できません。

次のコマンドを実行すると、抽出した WAV ファイル audio01.wav を使って audio01.mp3 に変換します。

# lame -h -b 128 --tt "曲名" --ta "アーティスト名" --tl "アルバム名" \
--ty "年" --tc "コメント" --tg "ジャンル" audio01.wav audio01.mp3

ここで指定している 128 kbits は、MP3 の標準のビットレートです。 160 kbits または 192 kbits のビットレートは、 さらに高音質を提供します。 ビットレートが高くなるにつれて作成される MP3 ファイルは多くのディスク領域を消費します。 -h オプションを指定すると "低速高品質" モードとなります。 --t ではじまるオプションは ID3 タグを設定します。 このタグにはたいてい曲の情報が含まれており、 MP3 ファイルに格納されます。 Lame のマニュアルを参照すれば、 他のエンコーディングのオプションが見つかるでしょう。

MP3 からオーディオ CD を作成するには、 まず非圧縮のファイル形式に変換しなければなりません。 XMMS は WAV 形式へ変換できますが、 mpg123 は raw Pulse-Code Modulation (PCM) オーディオデータに変換します。

mpg123 を使って audio01.mp3 を変換するには、PCM ファイルを指定してください。

# mpg123 -s audio01.mp3 > audio01.pcm

XMMS を使って MP3 を WAV 形式に変換するには、 以下の手順に従ってください。

Procedure: XMMS を使って WAV 形式に変換する

  1. XMMS を起動します。

  2. 右クリックで XMMS メニューを表示します。

  3. Options から Preferences を選択します。

  4. Output Plugin を "Disk Writer Plugin" に変更します。

  5. Configure を押します。

  6. 非圧縮ファイルを書き出すディレクトリを入力、 または選択します。

  7. 普段通り XMMS へ MP3 ファイルを読み込みます。 音量は 100% でイコライザの設定はオフにします。

  8. Play を押します。 XMMS は MP3 を再生しているかのように表示しますが、 音声はきこえません。 実際には MP3 をファイルに出力しています。

  9. 終了したら、再び MP3 を聴けるように Output Plugin を以前のように元に戻すのを忘れないでください。

WAV と PCM 形式は、 cdrecord で利用できます。 WAV ファイルを使用する場合、 それぞれのトラックの先頭に小さなノイズが入るのに気づくでしょう。 これは WAV ファイルのヘッダ情報です。 audio/sox port または package を使うとヘッダ情報を削除できます。

% sox -t wav -r 44100 -s -w -c 2 track.wav track.raw

FreeBSD での CD 作成の詳しい情報は 「光メディア (CD & DVD) の作成と使用」 を参照してください。

7.4. ビデオ再生

ビデオ再生のための設定をはじめる前に、 ビデオカードのモデルおよびチップセットを確認する必要があります。 Xorg はさまざまなビデオカードに対応していますが、 すべてのカードがビデオ再生に性能を発揮できるとは限りません。 利用しているビデオカードの Xorg サーバが対応している拡張機能のリストを得るには、 Xorg を実行中に xdpyinfo を実行してください。

さまざまなプレイヤやオプションを試すのに、 テストファイルとして小さな MPEG ファイルを用意しておくのはよい考えです。 いくつかの DVD アプリケーションは DVD メディアを /dev/dvd として初期設定しているか、ハードコーディングしているので、 次のように適切なデバイスにシンボリックリンクを張っておくと便利かもしれません。

# ln -sf /dev/cd0 /dev/dvd

devfs(5) の仕様により、 このように手動で作成されたリンクはシステムを再起動すると消えてしまいます。 システムの起動時にこれらのシンボリックリンクを自動的に作成するには、 /etc/devfs.conf に下記の設定を追加してください。

link cd0 dvd

特別な機能を必要とする DVD の抽出には、 DVD デバイスへの書き込み権限が必要です。

Xorg インタフェースの使う共有メモリを拡張するために、 以下の sysctl(8) 変数の値を増やすことが推奨されています。

kern.ipc.shmmax=67108864
kern.ipc.shmall=32768

7.4.1. ビデオ機能の決定

Xorg においてビデオ表示性能を改善する方法はいくつかあり、 正しく動作するかどうかはハードウェアに大きく依存しています。 下記に説明したどの方法でも、 ハードウェアが変わると品質が変わるでしょう。

よく知られたビデオインタフェースは次の通りです。

  1. Xorg: 共有メモリを用いた通常の出力

  2. XVideo: 特別なアクセラレータによって、 drawable オブジェクトに直接ビデオを表示する Xorg インタフェースの拡張機能です。 この拡張を使うことで廉価なコンピュータでも高品質の再生が可能になります。 次の節では、 この拡張が動作していることの確認方法について説明します。

  3. SDL: Simple Directmedia Layer は、 さまざまなオペレーティングシステムの間でサウンドとグラフィックスを効果的に利用したクロスプラットホームアプリケーションを開発することを目的としたレイヤです。 SDL はハードウェアに対する低レベルの抽象的概念を提供し、 時には Xorg インタフェースを使用するよりも効果的なことがあります。 FreeBSD では、SDL は、 devel/sdl20 package または port によりインストールできます。

  4. DGA: Direct Graphics Access は、 プログラムが Xorg サーバを介せず直接フレームバッファを変更することを可能にする Xorg の拡張機能です。 低レベルのメモリマッピングが実行できることを期待しているので、 この機能を使うプログラムは root 権限で実行されなければなりません。 DGA 機能拡張は dga(1) によってテストとベンチマークができます。 dga 実行中はキーボードを押せばいつでもディスプレイ色が変更されます。 中止するには q を押します。

  5. SVGAlib: 低レベルコンソールグラフィックレイヤ

7.4.1.1. XVideo

この拡張機能が動作しているかどうかを調べるには、 xvinfo を使います。

% xvinfo

以下のような結果が得られたならば、カードは XVideo に対応しています。

X-Video Extension version 2.2
  screen #0
  Adaptor #0: "Savage Streams Engine"
    number of ports: 1
    port base: 43
    operations supported: PutImage
    supported visuals:
      depth 16, visualID 0x22
      depth 16, visualID 0x23
    number of attributes: 5
      "XV_COLORKEY" (range 0 to 16777215)
              client settable attribute
              client gettable attribute (current value is 2110)
      "XV_BRIGHTNESS" (range -128 to 127)
              client settable attribute
              client gettable attribute (current value is 0)
      "XV_CONTRAST" (range 0 to 255)
              client settable attribute
              client gettable attribute (current value is 128)
      "XV_SATURATION" (range 0 to 255)
              client settable attribute
              client gettable attribute (current value is 128)
      "XV_HUE" (range -180 to 180)
              client settable attribute
              client gettable attribute (current value is 0)
    maximum XvImage size: 1024 x 1024
    Number of image formats: 7
      id: 0x32595559 (YUY2)
        guid: 59555932-0000-0010-8000-00aa00389b71
        bits per pixel: 16
        number of planes: 1
        type: YUV (packed)
      id: 0x32315659 (YV12)
        guid: 59563132-0000-0010-8000-00aa00389b71
        bits per pixel: 12
        number of planes: 3
        type: YUV (planar)
      id: 0x30323449 (I420)
        guid: 49343230-0000-0010-8000-00aa00389b71
        bits per pixel: 12
        number of planes: 3
        type: YUV (planar)
      id: 0x36315652 (RV16)
        guid: 52563135-0000-0000-0000-000000000000
        bits per pixel: 16
        number of planes: 1
        type: RGB (packed)
        depth: 0
        red, green, blue masks: 0x1f, 0x3e0, 0x7c00
      id: 0x35315652 (RV15)
        guid: 52563136-0000-0000-0000-000000000000
        bits per pixel: 16
        number of planes: 1
        type: RGB (packed)
        depth: 0
        red, green, blue masks: 0x1f, 0x7e0, 0xf800
      id: 0x31313259 (Y211)
        guid: 59323131-0000-0010-8000-00aa00389b71
        bits per pixel: 6
        number of planes: 3
        type: YUV (packed)
      id: 0x0
        guid: 00000000-0000-0000-0000-000000000000
        bits per pixel: 0
        number of planes: 0
        type: RGB (packed)
        depth: 1
        red, green, blue masks: 0x0, 0x0, 0x0

リストにある形式、YUV2, YUV12 などが XVideo のすべての実装で存在するとは限りません。 対応している形式が少ないために、 あるプレイヤでは悪影響が出るかもしれないことにも注意してください。

出力が以下のような場合、

X-Video Extension version 2.2
screen #0
no adaptors present

カードはおそらく XVideo に対応していないのでしょう。 このことはディスプレイでビデオを表示するのに、 ビデオカードおよびプロセッサによっては、 計算上の要求を満たすことがより困難になることを意味します。

7.4.2. ビデオを扱う ports および packages

この節では Ports Collection で利用可能な、 ビデオの再生に使用できるソフトウェアについて紹介します。

7.4.2.1. MPlayer および MEncoder

MPlayer はコマンドラインのビデオプレイヤで、 高速性と柔軟性をもたらすグラフィカルなインタフェースも持っています。 MPlayer の他のグラフィカルなフロントエンドも Ports Collection からインストールできます。

MPlayer は multimedia/mplayer package または port からインストールできます。 いくつかのコンパイル時のオプションを設定することができ、また、 構築の際にさまざまなハードウェアのチェックがおこなわれます。 そのため、package からインストールを行わず、 port から構築することを好むユーザもいます。

port を構築する際に、メニューのオプションは、port にコンパイル時にオプションとしてどの形式に対応するかを決定するため、 見ておく必要があります。 オプションが選択されていなければ、 MPlayer はその形式のビデオ形式を表示することは出来ません。 矢印キーとスペースキーを使って必要な形式を選択してください。 選択が終わったら、Enter を押して、 port の構築とインストールを続けてください。

デフォルトでは、この packege または port は、 mplayer コマンドラインユーティリティと gmplayer グラフィカルユーティリティを構築します。 ビデオをエンコードする必要があれば、 multimedia/mencoder port をコンパイルしてください。 ライセンスの制限のため、 MEncoder の package は利用できません。

MPlayer を初めて起動すると、 各自のホームディレクトリ内に ~/.mplayer が作成されます。このサブディレクトリには、 ユーザ固有の設定ファイルのデフォルトバージョンが含まれています。

この節では、一般的な使用法についてのみ説明します。 数多くのオプションの完全な説明については、 mplayer(1) のマニュアルに記載されています。

testfile.avi というファイルを再生するには、以下の例のように、 -vo とともに、 ビデオインタフェースを指定してください。

% mplayer -vo xv testfile.avi
% mplayer -vo sdl testfile.avi
% mplayer -vo x11 testfile.avi
# mplayer -vo dga testfile.avi
# mplayer -vo 'sdl:dga' testfile.avi

ビデオ再生の相対的性能は多くの要因に依存し、 ハードウェアに応じて著しく変わると思われるので、 これらのオプションをすべて試してみる価値はあるでしょう。

DVD を再生するには、 testfile.avidvd://N -dvd-device DEVICE に置き換えてください。 <N> には再生するタイトル番号を、 DEVICE は DVD のデバイスノードを指定します。 たとえば、/dev/dvd から 2 番目のタイトルを再生するには以下のようにします。

# mplayer -vo xv dvd://3 -dvd-device /dev/dvd

デフォルトの DVD デバイスは、 MPlayer port の構築時に WITH_DVD_DEVICE=/path/to/desired/device を追加することでで定義できます。 デフォルトでは、デバイスは /dev/cd0 です。 詳細はこの port の Makefile.options をご覧ください。

停止、休止、 再生などをするにはキーバインディングを使ってください。 キーバインディングの一覧を見るには、mplayer -h を実行するか、もしくは、mplayer(1) を読んでください。

再生に関する追加のオプションがあります。 全画面モードにする -fs -zoom オプションと、 性能を向上させる -framedrop オプションです。

よく使用するオプションについては、各ユーザの .mplayer/config に以下のように追加してください。

vo=xv
fs=yes
zoom=yes

mplayer を使って、 DVD タイトルを .vob に抽出できます。 DVD から 2 番目のタイトルをダンプするには次のようにします。

# mplayer -dumpstream -dumpfile out.vob dvd://2 -dvd-device /dev/dvd

出力された out.vob ファイルは MPEG 形式です。

UNIX® ビデオについて、 高レベルのノウハウを得たいと考えている方は mplayerhq.hu/DOCS をご覧ください。技術的な情報があります。 このドキュメントは、 バグを報告する前に、読むべきものです。

mencoder を使う前に、mplayerhq.hu/DOCS/HTML/en/mencoder.html を読んでオプションに慣れておくのはよい考えです。 品質向上、低ビットレート、形式変換をする方法が無数にあります。 これらの要素の調節具合で、性能が良かったり悪かったりするなど、 結果に違いが出るかもしれません。 コマンドラインオプションを不適切に組合せると、 mplayer でさえ再生できない出力ファイルを作成してしまいます。

はじめは単純なファイルのコピーです。
% mencoder input.avi -oac copy -ovc copy -o output.avi

したがって、単にファイルを抽出したいときには、 mplayer-dumpfile をつけます。

input.avi を音声に MPEG3 エンコードを使用して MPEG4 コーデックに変換するには、まず最初に audio/lame port をインストールしてください。 ライセンスの制限により、package は利用できません。 インストールしたら、以下のように入力してください。

% mencoder input.avi -oac mp3lame -lameopts br=192 \
	 -ovc lavc -lavcopts vcodec=mpeg4:vhq -o output.avi

これは mplayerxine といったアプリケーションで再生可能な出力ファイルを作成します。

DVD タイトルを直接再エンコードするためには、 上記のコマンドラインの input.avidvd://1 -dvd-device /dev/dvd に置き換えて、 root 権限で実行します。 期待する結果を得るには何度か繰り返すことになるので、 かわりにタイトルをファイルにダンプして、 ファイルに対して作業することをおすすめします。

7.4.2.2. xine ビデオプレイヤ

xine は、 再利用可能な基本ライブラリと、 プラグインで拡張できる実行可能なモジュールを提供するビデオプレイヤです。 multimedia/xine package または port からインストールできます。

実用上、xine を使用するには高速なビデオカードとともに高速な CPU があるか、 またはビデオカードが XVideo 拡張に対応している必要があります。 XVideo インタフェースとともに xine ビデオプレイヤを使うのが最良です。

デフォルトでは、xine プレイヤは GUI 付きで起動するでしょう。 メニューを使用して特定のファイルを開くことができます。

xine は、 再生するファイル名を指定することで、 コマンドラインから実行することもできます。

% xine -g -p mymovie.avi

xine-project.org/faq には、より多くの情報やトラブルシューティングがあります。

7.4.2.3. Transcode ユーティリティ

Transcode は、 ビデオおよびオーディオファイルを再エンコードするためのツール一式です。 Transcode を使えば、stdin/stdout ストリームインタフェースとともにコマンドラインツールを用いることで、 ビデオファイルの統合や、壊れたファイルの修復ができます。

FreeBSD では、Transcode は、 multimedia/transcode package もしくは port からインストールできます。 多くのユーザは port からコンパイルすることを好みます。 port では、 コンパイルで有効にするサポートやコーデックを指定するコンパイルオプションのメニューを利用できるためです。 オプションを選択しないと、Transcode は、その形式をエンコード出来ないでしょう。 矢印キーとスペースバーを使って、 必要とするフォーマットを選択してください。 選択が終わったら、 Enter を押して、port のコンパイルとインストールを続けてください。

この例では、DivX ファイルを PAL MPEG-1 (PAL VCD) に変換する使用例を示します。

% transcode -i input.avi -V --export_prof vcd-pal -o output_vcd
% mplex -f 1 -o output_vcd.mpg output_vcd.m1v output_vcd.mpa

作成された MPEG ファイル、 output_vcd.mpg は、 MPlayer を使って再生できます。 また、multimedia/vcdimager および sysutils/cdrdao といったユーティリティを使って、 ファイルを CD メディアに書き込むことでビデオ CD も作成できます。

transcode のマニュアルページに加え、transcoding.org/cgi-bin/transcode から、更なる情報や使用例を得てください。

7.5. TV カードの設定

TV カードを使用することで、 TV 放送をコンピュータで見ることができます。 これらの多くのカードは RCA または S-video 入力端子を備えており、 FM ラジオチューナを装備したカードもあります。

FreeBSD は、Brooktree Bt848/849/878/879 をビデオキャプチャチップに採用した PCI TV カードに bktr(4) ドライバで対応しています。 このドライバは、ほとんどの Pinnacle PCTV ビデオカードに対応しています。 TV カードを購入する前に、対応しているチューナの一覧について、 bktr(4) を参照してください。

7.5.1. ドライバを読み込む

カードを使用するには、bktr(4) ドライバを読み込む必要があります。 起動時に自動的に読み込むためには、 /boot/loader.conf に以下の行を追加してください。

bktr_load="YES"

あるいは、カスタムカーネルに TV ビデオカードへのサポートを静的に組み込むこともできます。 この場合には、 次の行をカーネルコンフィギュレーションファイルに追加してください。

device	 bktr
device	iicbus
device	iicbb
device	smbus

カードコンポーネントは I2C バス経由で連結されているため、 bktr(4) ドライバに加えてこれらのデバイスが必要になります。 編集したら新しいカーネルを構築し、インストールします。

チューナが適切に検出されたかどうかを確認するため、 システムを再起動してください。 起動時のメッセージに TV カードが以下のように認識されるでしょう。

bktr0: <BrookTree 848A> mem 0xd7000000-0xd7000fff irq 10 at device 10.0 on pci0
iicbb0: <I2C bit-banging driver> on bti2c0
iicbus0: <Philips I2C bus> on iicbb0 master-only
iicbus1: <Philips I2C bus> on iicbb0 master-only
smbus0: <System Management Bus> on bti2c0
bktr0: Pinnacle/Miro TV, Philips SECAM tuner.

これらのメッセージはハードウェアに応じて異なります。 必要であれば、sysctl(8) や、 カーネルコンフィギュレーションファイルオプションで、 検知されたいくつかのパラメータを変更できます。 たとえば、チューナを Philips SECAM チューナとして検知されるようにするには、 カーネルコンフィギュレーションファイルに以下の行を追加します。

options OVERRIDE_TUNER=6

または、直接 sysctl(8) を使用して変更します。

# sysctl hw.bt848.tuner=6

利用可能な sysctl(8) パラメータおよびカーネルオプションについては bktr(4) を参照してください。

7.5.2. 便利なアプリケーション

TV カードを使用するためには、 以下のアプリケーションの一つをインストールする必要があります。

  • multimedia/fxtv はウィンドウ内に TV 映像を映します。 画像/音声/ビデオを取り込むこともできます。

  • multimedia/xawtv も同様の機能を持った TV アプリケーションです。

  • audio/xmradio は TV カードに搭載された FM ラジオチューナを使用するためのアプリケーションです。

他にも多くのアプリケーションが FreeBSD の Ports Collection に収録されています。

7.5.3. トラブルシューティング

TV カードに関する問題が起きたときには、bktr(4) が本当にビデオキャプチャチップおよびチューナに対応しているか、 オプションが正しく設定されているかどうかをまず確認してください。 TV カードに関するサポートや質問に関しては、 FreeBSD multimedia メーリングリスト メーリングリストを参照してください。

7.6. MythTV

MythTV は、広く使われているオープンソースの Personal Video Recorder (PVR) アプリケーションです。 この節では、FreeBSD に MythTV をインストールし、 設定する方法について説明します。 MythTV の使用法に関するより詳細な情報については、mythtv.org/wiki をご覧ください。

MythTV は、フロントエンドおよびバックエンドを必要とします。 これらは、同じシステム上でも、 異なるコンピュータ上でも動かすことが可能です。

フロントエンドについては、 multimedia/mythtv-frontend package または port から FreeBSD にインストールできます。 X Window System で説明されているように、 Xorg をインストールして設定する必要もあります。 このシステムは X-Video Motion Compensation (XvMC) に対応し、 オプションとして、Linux Infrared Remote Control (LIRC)-互換のリモートに対応したビデオカードを持っていることが理想的です。

FreeBSD にバックエンドとフロントエンドの両方をインストールするには、 multimedia/mythtv package または port を使ってください。 MySQL™ データベースサーバも必要となりますが、 自動的に依存でインストールされます。オプションで、 チューナカードと録音したデータを保存するためのストレージが必要です。

7.6.1. ハードウェア

MythTV は、 エンコーダやチューナなどのビデオ入力デバイスへのアクセスに Video for Linux (V4L) を用います。 FreeBSD では、USB DVB-S/C/T カードにおいて最もよく動作します。 なぜならば、このカードは、 V4L ユーザランドアプリケーションを提供する multimedia/webcamd package または port により良くサポートされているためです。 webcamd により対応している Digital Video Broadcasting (DVB) カードは、MythTV で動作するはずです。 動作することが知られているカードの一覧が wiki.freebsd.org/WebcamCompat にあります。 Hauppauge カードのドライバもまた、 multimedia/pvr250 および multimedia/pvrxxx port として利用可能ですが、 標準的ではないドライバのインタフェースを提供しており、 0.23 より後の MythTV では動作しません。 ライセンスの制限により、package は利用できません。 そのため、これらの ports はコンパイルをしなければなりません。

wiki.freebsd.org/HTPC ページは、DVB ドライバのすべての一覧を提供しています。

7.6.2. MythTV バックエンドの設定

バイナリ package を使って MythTV をインストールしてください。

# pkg install mythtv

あるいは、Ports Collection からインストールするには、 以下のように実行してください。

# cd /usr/ports/multimedia/mythtv
# make install

インストールが終わったら、 MythTV データベースを設定してください。

# mysql -uroot -p < /usr/local/share/mythtv/database/mc.sql

その後、バックエンドを設定してください。

# mythtv-setup

最後にバックエンドを起動してください。

# sysrc mythbackend_enable=yes
# service mythbackend start

7.7. 画像スキャナ

FreeBSD では、画像スキャナに対するアクセスは SANE (Scanner Access Now Easy) によって実現されており、 FreeBSD の Ports Collection で提供されています。 SANE はスキャナのハードウェアにアクセスするために FreeBSD デバイスドライバを使用します。

FreeBSD は SCSI 接続および USB 接続のスキャナのどちらにも対応しています。 スキャナのインタフェースに依存して、異なるドライバが必要となります。 設定を始める前に、 SANE がスキャナに対応していることを確認してください。 対応しているスキャナに関してのより詳細な情報については、http://www.sane-project.org/sane-supported-devices.html をご覧ください。

この節では、FreeBSD がどのようにしてスキャナを認識するかについて説明します。 その後、FreeBSD システム上で SANE を設定して使用する方法の概要について説明します。

7.7.1. スキャナの確認

GENERIC カーネルには USB スキャナに対応するためのデバイスドライバが搭載されています。 カスタムカーネルを使用する際には、 以下の行がカーネルコンフィグレーションファイルにあることを確認してください。

device usb
device uhci
device ohci
device ehci
device xhci

USB スキャナが認識されたかを確認するには、 スキャナを接続して、dmesg を利用し、 システムメッセージバッファで、 スキャナが認識されているかどうかを確認してください。 認識されていたら、以下のようなメッセージが表示されます。

ugen0.2: <EPSON> at usbus0

この例では、EPSON Perfection® 1650 USB スキャナが /dev/ugen0.2 上で認識されています。

スキャナのインタフェースが SCSI であれば、 どの SCSI コントローラボードを使用するかを知ることが重要です。 使用する SCSI チップセットによって、 カスタムカーネルコンフィグレーションファイルを調整する必要があります。 GENERIC カーネルは、 一般に使用される SCSI コントローラのほとんどに対応しています。 /usr/src/sys/conf/NOTES ファイルを読んで、 適切な行をカーネルコンフィグレーションファイルに追加してください。 また、SCSI アダプタドライバに加えて、 以下の行をカスタムカーネルコンフィグレーションファイルに記述する必要があります。

device scbus
device pass

デバイスがメッセージバッファに出力されていることを確認してください。

pass2 at aic0 bus 0 target 2 lun 0
pass2: <AGFA SNAPSCAN 600 1.10> Fixed Scanner SCSI-2 device
pass2: 3.300MB/s transfers

システムを起動する際にスキャナの電源を入れてなければ、 camcontrol を使用して SCSI バスをスキャンし、 以下のように手動でデバイスを検出させることもできます。

# camcontrol rescan all
Re-scan of bus 0 was successful
Re-scan of bus 1 was successful
Re-scan of bus 2 was successful
Re-scan of bus 3 was successful

すると、スキャナは SCSI デバイスの一覧に現れるでしょう。

# camcontrol devlist
<IBM DDRS-34560 S97B>              at scbus0 target 5 lun 0 (pass0,da0)
<IBM DDRS-34560 S97B>              at scbus0 target 6 lun 0 (pass1,da1)
<AGFA SNAPSCAN 600 1.10>           at scbus1 target 2 lun 0 (pass3)
<PHILIPS CDD3610 CD-R/RW 1.00>     at scbus2 target 0 lun 0 (pass2,cd0)

FreeBSD における SCSI デバイスについての詳細は、 scsi(4) および camcontrol(8) をご覧ください。

7.7.2. SANE の設定

SANE システムは、 バックエンド (graphics/sane-backends) を経由してスキャナに対するアクセスを提供します。 バックエンドが対応している画像スキャナについては、http://www.sane-project.org/sane-supported-devices.html を参照してください。 グラフィカルなスキャニングインタフェースは、 Kooka (graphics/kooka) または XSane (graphics/xsane) といったサードパーティ製のアプリケーションによって提供されています。 SANE のバックエンドは、 スキャナを試すには十分です。

バイナリ package から、バックエンドをインストールするには、 以下のように実行してください。

# pkg install sane-backends

あるいは、Ports Collection からインストールするには、 以下のように実行してください。

# cd /usr/ports/graphics/sane-backends
# make install clean

graphics/sane-backends port または package をインストールしたら、 sane-find-scanner コマンドを使用して、 SANE システムで検出されているスキャナを確認してください。

# sane-find-scanner -q
found SCSI scanner "AGFA SNAPSCAN 600 1.10" at /dev/pass3

この出力から、 スキャナインタフェースの種類と システムに接続されているスキャナが使用するデバイスノードがわかります。 ベンダ名や製品のモデル名は表示されないかも知れません。

いくつかの USB スキャナではファームウェアを読み込む必要がある場合があります。 詳細については、sane-find-scanner(1) および sane(7) を参照してください。

次に、スキャナがフロントエンドで認識されるか調べてください。 SANE のバックエンドには scanimage が付属します。 このコマンドを使用すると、 デバイスの一覧を表示したり画像を取得することができます。 スキャナデバイスの一覧を表示するには、 -L オプションを使ってください。 以下の最初の例は、SCSI スキャナ用のもので、 次の例は、USB スキャナ用のものです。

# scanimage -L
device `snapscan:/dev/pass3' is a AGFA SNAPSCAN 600 flatbed scanner
# scanimage -L
device 'epson2:libusb:/dev/usb:/dev/ugen0.2' is a Epson GT-8200 flatbed scanner

2 番目の出力において、 epson2 がバックエンド名で、 libusb:000:002/dev/ugen0.2 を意味し、 スキャナが使用するデバイスノードです。

scanimage がスキャナの認識に失敗した場合には、 以下のようなメッセージが表示されます。

# scanimage -L

No scanners were identified. If you were expecting something different,
check that the scanner is plugged in, turned on and detected by the
sane-find-scanner tool (if appropriate). Please read the documentation
which came with this software (README, FAQ, manpages).

このような場合には、/usr/local/etc/sane.d/ にあるバックエンドの設定ファイルを編集して、 使用するスキャナデバイスを設定してください。 例えば、認識されなかったスキャナのモデルが、 EPSON Perfection® 1650 で、epson2 バックエンドを使っているのであれば、 /usr/local/etc/sane.d/epson2.conf を編集してください。 編集作業を行う際には、 使用するインタフェースとデバイスノードを指定する行を追加します。 この例では、以下の行を追加します。

usb /dev/ugen0.2

編集を保存し、 適切なバックエンド名とデバイスノードでスキャナが認識されたかどうかを確認してください。

# scanimage -L
device 'epson2:libusb:000:002' is a Epson GT-8200 flatbed scanner

scanimage -L を実行してスキャナが認識されたことがわかれば、設定は終了です。 スキャナを使用する準備ができました。

scanimage を使用してコマンドラインから画像を取得することができますが、 GUI を使用して画像を取得できることが望ましいでしょう。 Kooka や xsane といったアプリケーションは、 広く使われているスキャニングフロントエンドです。 これらには、さまざまなスキャニングモード、 色補正、バッチスキャンなど先進的な機能があります。 XSane は、GIMP のプラグインとして使用することもできます。

7.7.3. スキャナの許可属性

スキャナにアクセスするには、 ユーザはスキャナが使用するデバイスノードへの読み込み権限と書き込み権限が必要です。 今回の例では、USB スキャナは /dev/ugen0.2 デバイスノードを使用しています。 このデバイスノードは、 /dev/usb/0.2.0 へのシンボリックリンクです シンボリックリンクとデバイスノードは、 それぞれ wheel および operator グループが所有しています。 ユーザをこれらのグループに加えると、 スキャナを使用できるようになりますが、 ユーザを wheel に追加することは、セキュリティの観点からお勧めできません。 良い方法は、 スキャナデバイスにアクセスできるグループを作成することです。

この例では、usb という名前のグループを作成します。

# pw groupadd usb

その後、シンボリックリンク /dev/ugen0.2 および、/dev/usb/0.2.0 デバイスノードに対して、 usb グループが利用できるように書き込みの許可属性 0660 または 0664 を設定してください。 /etc/devfs.rules に次の行を追加すれば設定できます。

[system=5]
add path ugen0.2 mode 0660 group usb
add path usb/0.2.0 mode 0666 group usb

デバイスを追加したり外すことにより、 デバイスノードが変わることがあります。 そのため、すべての USB デバイスにアクセスしたい場合には、 代わりに以下のルールセットを使ってください。

[system=5]
add path 'ugen*' mode 0660 group usb
add path 'usb/*' mode 0666 group usb

このファイルの詳細については、 devfs.rules(5) を参照してください。

つぎに、/etc/rc.conf でルールセットを有効にしてください。

devfs_system_ruleset="system"

そして、devfs(8) システムを再起動してください。

# service devfs restart

最後に、スキャナを利用するユーザを usb グループに追加してスキャナを利用できるようにしてください。

# pw groupmod usb -m joe

詳細については、pw(8) をご覧ください。

Chapter 8. FreeBSD カーネルのコンフィグレーション

8.1. この章では

カーネルは FreeBSD オペレーティングシステムの中核をなすものです。 カーネルは、メモリ管理、セキュリティ制御の強制、ネットワーク、 ディスクアクセスなどを担っています。 FreeBSD の大部分は動的に構成することができるようになっていますが、 まだ、時にはカスタムカーネルを設定してコンパイルする必要があります。

この章では、以下のことを扱っています。

  • いつカスタムカーネルの構築が必要になるか。

  • ハードウェア一覧の作成方法。

  • カーネルコンフィグレーションファイルのカスタマイズの方法。

  • カーネルコンフィグレーションファイルから新しいカーネルを構築する方法。

  • 新しいカーネルのインストール方法。

  • うまく行かないときの問題解決法。

この章で表示されているすべてのコマンドは、root 権限で実行する必要があります。

8.2. なぜカスタムカーネルを作るか?

伝統的に、FreeBSD はモノリシック (monolithic) カーネルを使っていました。 このカーネルは、単一の巨大なプログラムで、 扱えるデバイスは固定されていて、 カーネルの振る舞いを変えたければ構築してコンピュータを再起動し、 新しいカーネルを動かさなれければなりませんでした。

今日では、FreeBSD カーネルのかなりの機能はモジュールに含まれるようになり、 必要に応じて動的にカーネルに組み込んだり外したりできるようになりました。 この移行により、 動作しているカーネルが新しいハードウェアに迅速に対応したり、 カーネルに新たな機能を取り入れられるようになります。 このようなカーネルは、モジュラ (modular) カーネルと呼ばれます。

しかしながら、 いまだにいくらかは静的にカーネルを構成する必要があります。 機能がカーネルとあまりに密接に結びついているため、 動的に組み込むことができない場合があるためです。 環境によっては、セキュリティの観点から、 カーネルモジュールを読み込んだり外すことができず、 必要となる機能を静的にカーネルにコンパイルしなければならない場合もあります。

システムに合わせたカーネルを構築することは、多くの場合、 高度な知識を持つ BSD ユーザが避けて通ることのできない通過儀礼です。 この作業は多くの時間を必要としますが、FreeBSD システムに利益をもたらします。 広範囲のハードウェアをサポートしなければならない GENERIC カーネルとは異なり、カスタムカーネルは、 使用しているコンピュータのハードウェアのみをサポートするように、 必要のない機能を省くことができます。これは、 次にあげるような利益をもたらします。

  • 素早く起動します。 カーネルはシステム上にあるハードウェアしか検出しないので、 システムの起動にかかる時間を短くできます。

  • メモリの消費量を減らすことができます。 システムに合わせたカーネルは、 使用しない機能やデバイスドライバを含まないので、 大抵 GENERIC カーネルより少ないメモリしか消費しません。 カーネルコードは常に物理メモリ上に存在し、 アプリケーションはその容量分のメモリを使用できないので、 これは重要なことです。 したがって、メモリが少ないシステムでは、 カーネルの再構築は重要です。

  • 追加のハードウェアをサポートします。 カスタムカーネルは、GENERIC カーネルに存在しないデバイスのサポートを追加することができます。

カスタムカーネルを構築する前に、再構築する理由を考えてください。 ある特定のハードウェアに対応する必要がある場合に、 そのハードウェアに対応するためのモジュールがすでに用意されていることがあります。

カーネルモジュールは /boot/kernel にあります。 モジュールによっては kldload(8) により、すでに実行中のカーネルに動的に読み込まれています。 ほとんどのカーネルドライバには、読み込み可能なモジュールやマニュアルページが用意されています。 たとえば、ath(4) ワイヤレスネットワークドライバのマニュアルページには以下のような記述があります。

Alternatively, to load the driver as a module at boot time, place the
following line in loader.conf(5):

    if_ath_load="YES"

/boot/loader.confif_ath_load="YES" を追加すると、 起動時にモジュールが読み込まれるようになります。

対応するモジュールが /boot/kernel に存在しないこともあります。 特定のサブシステムでは、ほとんど多くの場合存在しません。

8.3. システムのハードウェアについて知る

カーネルコンフィグレーションファイルの編集を始める前に、 コンピュータのハードウェア一覧を作成すると良いでしょう。 デュアルブートシステムでは、 現在インストールされている別のオペレーティングシステムの設定を調べることで、 一覧を作成できます。 たとえば、Microsoft® の デバイスマネージャ は、インストールされているデバイスに関する情報を持っています。

Microsoft® Windows® のバージョンによっては、 システム アイコンを使って、 デバイスマネージャ にアクセスできます。

インストールされているオペレーティングシステムが FreeBSD だけであれば、dmesg(8) を使い、 起動時に検出されたハードウェアの一覧を調べてください。 FreeBSD のほとんどのデバイスドライバにはマニュアルページが用意され、 対応しているハードウェアの一覧を提供しています。 たとえば、以下の行は、psm(4) ドライバがマウスを検出したことを示しています。

psm0: <PS/2 Mouse> irq 12 on atkbdc0
psm0: [GIANT-LOCKED]
psm0: [ITHREAD]
psm0: model Generic PS/2 mouse, device ID 0

このハードウェアはシステムに存在するので、 カスタムカーネルコンフィグレーションファイルからこのドライバを外さないでください。

dmesg が起動時の検出結果を表示しない場合には、 かわりに /var/run/dmesg.boot で出力を確認してください。

ハードウェアを見つけるためのもうひとつのツールは、 より冗長な出力を行う pciconf(8) です。 たとえば、以下のようになります。

% pciconf -lv
ath0@pci0:3:0:0:        class=0x020000 card=0x058a1014 chip=0x1014168c rev=0x01 hdr=0x00
    vendor     = 'Atheros Communications Inc.'
    device     = 'AR5212 Atheros AR5212 802.11abg wireless'
    class      = network
    subclass   = ethernet

この出力は、ath ドライバがワイヤレスイーサネットデバイスにあることを示しています。

man(1)-k フラグで実行すると、 有用な情報を得ることができます。たとえば、 ある特定のデバイスブランドや名前を含むマニュアルページの一覧を表示するには、 以下のように実行してください。

# man -k Atheros
ath(4)                   - Atheros IEEE 802.11 wireless network driver
ath_hal(4)               - Atheros Hardware Access Layer (HAL)

ハードウェアの一覧を作成したら、 この一覧を利用して、 カスタムカーネルのコンフィグレーションファイルを編集している時に、 インストールされているハードウェアのドライバが削除されていないことを確認してください。

8.4. コンフィグレーションファイル

カスタムカーネルのコンフィグレーションファイルを作成し、 カスタムカーネルを構築するには、 FreeBSD の全ソースツリーがまずインストールされている必要があります。

もし /usr/src/ が存在していなかったり、空であれば、 カーネルのソースはインストールされていません。 「Git の利用」 で説明した Git を使ってソースをインストールしてください。

ソースをインストールしたら、 /usr/src/sys を確認して下さい。 このディレクトリには、いくつものサブディレクトリがあります。 その中には、サポートされている各アーキテクチャ amd64, i386, powerpc および sparc64 のサブディレクトリがあります。 各アーキテクチャのディレクトリ内部にあるファイルはすべてそのアーキテクチャでのみ使用されます。 残りのコードは、アーキテクチャに依存しない、 すべてのプラットフォームで共有されるコードです。 サポートされている各アーキテクチャには、 conf サブディレクトリがあり、 そのアーキテクチャ用の GENERIC カーネルコンフィグレーションファイルが用意されています。

この GENERIC は編集しないでください。 かわりに、このファイルを別名でコピーし、コピーを編集してください。 慣習として、この名前はすべて大文字でつづられます。もし、 いくつかの異なるハードウェアの FreeBSD マシンを扱うなら、 この名前にホスト名を含めるとよいでしょう。ここでは、例として MYKERNEL という名前の amd64 アーキテクチャ用の GENERIC コンフィグレーションファイルのコピーを作成します。

# cd /usr/src/sys/amd64/conf
# cp GENERIC MYKERNEL

これで、MYKERNEL を ASCII テキストエディタで編集できます。 初心者に対してより簡単なエディタである ee も FreeBSD とともにインストールされていますが、 デフォルトのエディタは vi です。

コンフィグレーションファイルのフォーマットはシンプルです。 各行はデバイスやサブシステム、引数、または簡単な説明を含んでいます。 # に続くテキストはすべてコメントとして扱われ、無視されます。 カーネルからデバイスもしくはサブシステムのサポートを外すには、対応する行の最初に # を入れてください。 理解していない行に対しては、# を追加したり削除しないでください。

デバイスやオプションのサポートを外すことは簡単で、 その結果、カーネルを壊すことがあります。 たとえば ata(4) ドライバをカーネルコンフィグレーションファイルから除くと、 ATA ディスクドライバを用いているシステムは起動しません。 確信が持てないものについては、 カーネルにサポートを残したままにしてください。

このファイルで与えられる説明の他に、 そのアーキテクチャの GENERIC と同じディレクトリにある NOTES にも説明があります。 アーキテクチャに依存しないオプションについては、 /usr/src/sys/conf/NOTES をご覧ください。

カーネルコンフィグレーションファイルの編集を終えたら、 ファイルのバックアップを /usr/src 以外の場所に保存してください。

または、カーネルコンフィグレーションファイルは他の場所において、 シンボリックリンクを張る方法もあります。

# cd /usr/src/sys/amd64/conf
# mkdir /root/kernels
# cp GENERIC /root/kernels/MYKERNEL
# ln -s /root/kernels/MYKERNEL

コンフィグレーションファイルでは include ディレクティブを利用できます。 コンフィグレーションファイルに他のファイルを取り込むことができるので、 すでに存在するファイルに対する小さな変更の管理が簡単にできます。 オプションやドライバの追加が少しだけの場合には、 以下の例のように GENERIC からの差分による管理が可能になります。

include GENERIC
ident MYKERNEL

options         IPFIREWALL
options         DUMMYNET
options         IPFIREWALL_DEFAULT_TO_ACCEPT
options         IPDIVERT

この方法では、ローカルのコンフィグレーションファイルには、 ローカルにある GENERIC カーネルとの差分が記述されています。 アップグレードが行われると、 GENERIC に追加された新しい機能は、 (nooptionsnodevice によって外されない限り) ローカルのカーネルにも反映されます。 コンフィグレーションの構成要素に関する包括的な一覧と説明は config(5) にあります。

利用可能なすべてのオプションを含むファイルを構築するには、 以下のコマンドを root 権限で実行してください。

# cd /usr/src/sys/arch/conf && make LINT

8.5. カスタムカーネルの構築とインストール

カスタムコンフィグレーションファイルを編集して保存したら、 カーネルのソースコードを以下の手順でコンパイルしてください。

+==== Procedure: カーネルの構築

+ . 以下のディレクトリに移動してください。

+

# cd /usr/src

+ . カスタムコンフィグレーションファイルの名前を指定して新しいカーネルをコンパイルします。

+

# make buildkernel KERNCONF=MYKERNEL

+ . 指定したカーネルコンフィグレーションファイルでコンパイルされた新しいカーネルをインストールします。 以下のコマンドは、新しいカーネルを /boot/kernel/kernel に、 今までのカーネルを /boot/kernel.old/kernel という名前で保存します。

+

# make installkernel KERNCONF=MYKERNEL

+ . 新しいカーネルを使うために、 システムをシャットダウンして再起動してください。 うまく行かない場合は、カーネルが起動しない を参照してください。

デフォルトでは、カスタムカーネルを構築すると、 すべてのカーネルモジュールが再構築されます。 カーネルのアップデートをより早く行いたい、または、 カスタムモジュールのみを構築したいといった場合は、 カーネルの構築を開始する前に、以下のように /etc/make.conf を編集してください。

例として、以下の変数は、 デフォルトのすべてのモジュールを構築する設定を変更し、 構築するモジュール一覧を指定します。

MODULES_OVERRIDE = linux acpi

また、以下の変数は、構築を行わないモジュールを指定します。

WITHOUT_MODULES = linux acpi sound

他の変数については、make.conf(5) を参照してください。

== 問題が起きた場合には

カスタムカーネルを作る際に起こりうるトラブルは、 次の 4 種類に分けられます。

config コマンドの失敗

config で失敗した時には、 トラブルの起きた行番号が出力されます。 たとえば、次のように出力された場合には、 17 行目が正しく入力されているかどうか、 GENERICNOTES と比較して修正してください。

config: line 17: syntax error
make コマンドの失敗

make が失敗した場合には、 通常、カーネルコンフィグレーションファイルにおいて、 config がとらえられなかったような間違いをしています。 コンフィグレーションファイルを見直してください。 それでも問題を解決することができなければ、 FreeBSD general questions メーリングリスト へカーネルコンフィグレーションファイルを添付して送ってください。

カーネルが起動しない

新しいカーネルが起動しなかったり、 デバイスの認識をしない場合でもあわてないでください! さいわい、FreeBSD には利用できないカーネルから復帰する洗練されたメカニズムがあります。 FreeBSD のブートローダで起動したいカーネルを選択してください。 システムの起動メニューが表示されている時に、 "Escape to a loader prompt" オプションを選択するとアクセスできます。 プロンプトで boot kernel.old か他の正常に起動するカーネルを入力してください。

問題のないカーネルで起動した後、 コンフィグレー ションファイルを調べ、 再び構築を試みてください。 /var/log/messages にはすべての成功した起動時のカーネルメッセージの記録があり、 これは問題を解決するための助けになる情報の一つでしょう。また、 dmesg(8) は現在の起動時のカーネルメッセージを出力します。

カーネルのトラブルシューティングを行う時には、 GENERIC といった正常に起動するカーネルのコピーを保存するようにしてください。 kernel.old は新しいカーネルをインストールする時に、その一つ前にインストールした、うまく動かないかもしれないカーネルで上書きされてしまうため、起動するカーネルを保存しておくことは重要です。 できる限り早く以下のようにして、正しく起動するカーネルを含むディレクトリ名に変更してください。

# mv /boot/kernel /boot/kernel.bad
# mv /boot/kernel.good /boot/kernel
カーネルは動きますが ps(1) は動きません!

システムユーティリティの構築されたバージョンと異るバージョンのカーネルをインストールした場合、 たとえば -CURRENT のソースから構築したカーネルを -RELEASE システム上にインストールするような場合には、 ps(1)vmstat(8) のような多くのシステムステータスコマンドは動かなくなります。 修正するには、カーネルと同じバージョンのソースツリーで world を再構築し、インストール してください。 カーネルとそれ以外で異なるバージョンを組み合わせてオペレーティングシステムを使用することは推奨されていません。

= プリンタの利用 :doctype: book :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :sectnumoffset: 9 :partnums: :source-highlighter: rouge :experimental: :images-path: books/handbook/printing/

== この章では

FreeBSD は古いインパクトプリンタから最新のレーザープリンタまで幅広いプリンタが利用でき、 実行しているアプリケーションから高品質な印刷出力が行えます。

FreeBSD はネットワーク上のプリンタサーバとして動作するように設定することもできます。 この機能は、他の FreeBSD コンピュータや、Windows® や Mac OS® ホストから印刷ジョブを受け取ることができます。 FreeBSD は印刷ジョブを 1 つずつ処理することを保証します。 また、どのユーザやマシンが最も多く印刷しているかの統計を取り、 どの印刷物が誰の物か表示する "バナー" ページの作成などを行うことができます。

この章を読めば以下のことがわかります。

  • FreeBSD プリントスプーラの設定方法。

  • 入力ドキュメントをプリンタが扱える印刷フォーマットへ変換するなどといった、 特別な印刷ジョブを別に取り扱うための印刷フィルタのインストール方法。

  • 印刷物へのヘッダやバナーの適用方法。

  • 他のコンピュータに接続されたプリンタで印刷する方法。

  • ネットワークに直接接続されたプリンタで印刷する方法。

  • 印刷ジョブの上限サイズや特定のユーザからの印刷拒否といった、 プリンタの制限の制御方法。

  • 印刷の統計とプリンタの使用状況の取得方法。

  • 印刷問題のトラブルシューティング方法。

この章を読み始める前に以下を済ませておいてください。

== はじめに

FreeBSD でプリンタを使うために、それらを LPD スプーリングシステム、 または単に LPD としても知られる Berkeley ラインプリンタスプーリングシステムで動作するように設定できます。 これは FreeBSD での標準的なプリンタ制御システムです。 この章では、LPD を紹介し、 その設定方法について説明します。

あなたがすでに LPD やその他のプリンタスプーリングシステムに詳しいのなら、 基本的な設定 まで読み飛ばしてもかまいません。

LPD はホストのプリンタに関するあらゆることを制御します。 ここで言う制御としては、次のことがあげられます。

  • ホストに接続されたプリンタ、 あるいはネットワーク上の他ホストに接続されたプリンタに対するアクセス制御を行ないます。

  • ファイルをプリントする要求に対して許可を与えます。 この要求は特にジョブと呼ばれています。

  • 各々のプリンタのキューを管理することにより、 複数のユーザがあるプリンタに対して同時にアクセスすることを防ぎます。

  • ヘッダページ (バナーまたは バーストページとしても知られています) をプリントすることができます。 これにより、 プリントアウトの山の中から自分がプリントしたジョブを見つけやすくなります。

  • シリアルポートに接続したプリンタ用に通信パラメータを管理します。

  • ネットワーク経由で他のホスト上の LPD スプーラにジョブを送ることができます。

  • 様々なプリンタ言語やプリンタの能力に応じてジョブの形式を整えるため、 特別なフィルタを起動することができます。

  • プリンタの使用に対して課金を行なうことができます。

設定ファイル (/etc/printcap) を通して、専用のフィルタプログラムを用いることにより、 多種多様なプリンタ機器に対して、上述の機能の全部または一部を LPD システムに行なわせることができます。

=== どうしてスプーラを使うべきなのか

あなたのシステムを利用するのがあなた一人だけだとしても、 スプーラは有用ですし、使用すべきです。その理由は以下のとおりです。

  • LPD はジョブをバックグラウンドで処理します。 データがプリンタに送信されるまで待つ必要がなくなります。

  • LPD ではジョブをフィルタを通してプリントすることが簡単にできます。 これにより、印刷物のヘッダに時刻や日付を入れたり、 特別なファイル形式 (TeX の DVI ファイルなど) をプリンタが処理できる形式に変更することができ、 これらの作業を手動で行なう必要がなくなります。

  • プリント処理を行なうフリー、 または商用のプログラムのほとんどは、 システムのスプーラとやりとりするように作られています。 スプーリングシステムをセットアップすることで、 今後加えるかもしれない、あるいは、 すでに持っている別のソフトウェアをより簡単にサポートすることができるでしょう。

== 基本的な設定

LPD スプーリングシステムを用いてプリンタを使用するためには、 プリンタ機器と LPD 用ソフトウェアの両方を準備する必要があります。 本文書では次の二段階のレベルに分けて説明をします。

  • プリンタを接続する方法、 プリンタにどのように通信するかを LPD に指示する方法や、 プレインテキストをプリンタで印字する方法については、 プリンタの簡単な設定をご覧ください。

  • 様々な形式のファイルを印字する方法、 ヘッダページを印字する方法、 ネットワーク経由でプリンタに印字する方法、 プリンタを制御する方法、 プリンタの使用に対する課金を行なう方法についてはプリンタ設定上級編をご覧ください。

=== プリンタ設定導入編

この節では、プリンタ機器やプリンタを使用するための LPD 用ソフトウェアを設定する方法について述べます。 この節の概要は次のとおりです。

  • プリンタ機器の設定では、 プリンタをコンピュータに接続するためのヒントがいくつか書かれています。

  • ソフトウェアの設定では、 LPD のスプーラ設定ファイル (/etc/printcap) の設定方法について書かれています。

データをプリンタに送るのにコンピュータのローカルインタフェースではなく、 ネットワークプロトコルを使用する場合は、 ネットワークにおけるデータストリームインタフェースを持つプリンタをご覧ください。

この節のタイトルは "プリンタ設定導入編" ですが、 実際の設定はかなり複雑です。 プリンタをコンピュータに接続し、 LPD スプーラを起動させることは一番困難な作業です。 ヘッダページを出力させたり課金したりするオプションの設定は、 一度プリンタがうまく動くようになればとても簡単です。

==== プリンタ機器の設定

この節では、プリンタに PC を接続するための様々な方法について説明しています。 ここでは、ポートやケーブルの種類、 FreeBSD がプリンタとの通信に必要なカーネルコンフィグレーションについても言及しています。

もしプリンタが既に接続されていて、 他のオペレーティングシステム上でプリンタからの印字に成功している場合は、 ソフトウェアの設定まで読み飛ばすことが多分できるでしょう。

===== ポートとケーブル

今日 PC 用に売られているプリンタには通常、 次の 3 つのインタフェースのうち、どれか 1 つ以上がついてきます。

  • シリアルインタフェース (RS-232 または COM ポートとも呼ばれます) は、 コンピュータにあるシリアルポートを使ってプリンタにデータを送信します。 シリアルインタフェースはコンピュータ業界で共通して使用されています。 そのケーブルは容易に手に入りますし、簡単に自作することもできます。 シリアルインタフェースの場合は時々、 特別なケーブルや何か複雑な通信方式選択の設定が必要になることがあります。 ほとんどの PC のシリアルポートは通信速度が最大で 115200 bps であり、 大きな画像を印刷するのには実用的ではありません。

  • パラレルインタフェースではプリンタにデータを送信するために、 コンピュータにあるパラレルポートを使用します。 パラレルインタフェースは PC 業界ではよく使われており、 RS-232 シリアルよりも速いです。 ケーブルの入手は容易ですが、 自作するのはシリアルよりも困難です。 パラレルインタフェースには通常、通信方式の選択はなく、 設定は極めて単純です。

    パラレルインタフェースは "セントロニクス" インタフェースとして知られています。 これは、プリンタ用のコネクタタイプとして採用された後に名付けられました。

  • USB インタフェースは、Universal Serial Bus (汎用シリアルバス) の略で、パラレルや RS-232 シリアルよりさらに速く動作します。 ケーブルは単純で安価です。USB は、印刷目的には RS-232 シリアルやパラレルよりも向いていますが、UNIX® システムでは十分対応されていません。 この問題を回避する手としては、多くのプリンタがそうですが、 USB とパラレルの両方のインタフェースを備えたプリンタを購入することが挙げられます。

パラレルインタフェースでは、普通は (コンピュータからプリンタへの) 単方向通信のみを行なうのに対して、 シリアルおよび USB インタフェースは双方向通信を行ないます。 FreeBSD でも IEEE1284 準拠のケーブルを使えば、 最近のパラレルポート (EPP や ECP) とプリンタの多くで双方向通信を行なうことができます。

パラレルポート経由のプリンタとの双方向通信には、 通常 2 つの方法のどちらかが使われます。一つ目の方法は、 プリンタが使用しているプロプライエタリな言語を話す FreeBSD 用に作成されたプリンタドライバを使うものです。 これはインクジェットプリンタではよく使われる方法で、 インクの残量やその他の状態の情報を知らせるのに使えます。 二つ目の方法は、プリンタが PostScript® に対応している時に使われます。

PostScript® ジョブは、実際にはプリンタに送信されるプログラムです。 印字作業を行う必要は必ずしありませんし、 プログラムの結果を直接コンピュータに返してもよいのです。 PostScript® プリンタでは双方向通信を使って PostScript® プログラムのエラーや紙づまりといった問題をコンピュータに報告します。 ユーザはそれらの情報を知りたいと思うかも知れません。 また、PostScript® プリンタで課金作業をもっとも効率よく行なうためには、 双方向通信が必要となります。 この方法ではまず、プリンタの現在のページカウント (起動してから今まで何枚の紙を印字したか) の情報を得ます。 次に、ユーザのジョブを実行し、終了後、再びページカウントを得ます。 この二つの数を差によって、 課金対象となる紙の枚数を知ることができるのです。

===== パラレルポート

プリンタをパラレルインタフェースを使って接続する場合は、 セントロニクスケーブルでプリンタとコンピュータを接続してください。 詳しい説明はプリンタやコンピュータに付属する説明書に書かれているはずです。

その際、 どのパラレルポートを使用したかを覚えておいてください。 FreeBSD では最初のポートは ppc0、 二番目が ppc1 であり、 三番目以降も同様に続きます。 プリンタのデバイス名にも同じ形式が使われており、 最初のパラレルポートに接続されたプリンタは /dev/lpt0 などとなります。

===== シリアルポート

シリアルインタフェースを使ってプリンタを使う場合は、 適切なシリアルケーブルでプリンタとコンピュータを接続してください。 詳しい説明はプリンタ、コンピュータ、あるいは両方に付属する説 明書に書かれているはずです。

"適切なシリアルケーブル" が良くわからないときは、 次のどれかを試してみてください。

  • モデム用ケーブルでは、 それぞれのピンは他方のコネクタの対応するピンと線でつながっています。 このタイプのケーブルは "DTE-DCE" 間ケーブルとしても知られています (訳注: 日本ではストレートケーブルという名前で売られています)。

  • ヌルモデム用ケーブルでは、 あるピンは対応するピンとを接続していますが、 あるピン (たとえば、データ送信用とデータ受信用のピン) が交差して接続したり、 いくつかのピンは内部で短絡していたりします。 このタイプのケーブルは、 "DTE-DTE" 間ケーブルと呼ばれています (訳注: 日本ではクロスケーブルという名前で売られています)。

  • A シリアルプリンタ用ケーブルは、 ある特定のプリンタで必要とされるものです。 ヌルモデムケーブルと似ていますが、 内部で短絡させる代わりに、 ある信号を他方側に送るために使用しています。

この他に、 プリンタ用の通信パラメータを設定する必要があります。 通常、プリンタのフロントパネルや DIP スイッチによって制御します。 コンピュータとプリンタの双方で設定できる最高の通信速度 [bps] (ビット/秒、 ボーレートと示されているときもある) を選んでください。そして、データビット (7 または 8)、 パリティ (偶/奇/なし)、ストップビット (1 または 2) を選んでください。 そして、フローコントロールの有無 (制御なし、または XON/XOFF ("イン・バンド" または "ソフトウェア" フローコントロールとも呼ばれる)) を選びます。 以下に続くソフトウェアの設定のために、 ここでの設定を覚えておいてください。

==== ソフトウェアの設定

本節では FreeBSD の LPD スプーリングシステムで印字をおこなうために 必要となるソフトウェアの設定について説明しています。

本節の概要は次のようになります。

  1. プリンタで使用するポートのために、必要があれば、 カーネルの書き変えをおこないます。「カーネルの変更」で、 このためにしなくてはならないことを説明しています。

  2. パラレルポートを使用している場合は、 パラレルポートのための通信モードを設定します。 詳細は、 「パラレルポートの通信モードを設定する」 で説明しています。

  3. オペレーティングシステムからプリンタにデータが送ら れているかをテストします。「プリンタとの通信状況を調べる」で、 どのようにテストするかの提案をいくつかおこなっています。

  4. ファイル/etc/printcapを変更し、 LPD の設定をおこないます。 この節で、どのように変更するかを説明しています。

===== カーネルの変更

オペレーティングシステムのカーネルの コンパイルをおこなうことによって、 指定されたデバイスが機能するようになります。シリアル、 または、パラレルインタフェースをプリンタで使用する場合、 必要なデバイスがこの指定の中に含まれていなくてはなりません。 したがって、 必要なデバイスがカーネルに組み込まれていない場合、 追加のシリアル、または、パラレルポートをサポートするために、 カーネルの再コンパイルが必要となるかもしれません。

シリアルポートが現在使用しているカーネルで サポートされているかどうかを調べるためには、 次のように入力します。

# grep sioN /var/run/dmesg.boot

ここで、N はシリアルポートの番号を示し、この番号は 0 から始まります。 次のような出力があった場合、 カーネルはそのポートをサポートしています。

sio2 at port 0x3e8-0x3ef irq 5 on isa
 sio2: type 16550A

パラレルポートが現在使用しているカーネルで サポートされているかどうかを調べるためには、 次のように入力します。

# grep ppcN /var/run/dmesg.boot

ここで、N はパラレルポートの番号を示し、この番号は 0 から始まります。 次のような出力があった場合、 カーネルはそのポートをサポートしています。

ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0
ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode
ppc0: FIFO with 16/16/8 bytes threshold

上記の出力が得られない場合、プリンタを使うため、 オペレーティングシステムにパラレル、または、 シリアルポートを認識し、使用できるようにするためには カーネルを変更する必要があります。

シリアルポートをサポートさせるには、「FreeBSD カーネルのコンフィグレーション」の節をご覧く ださい。パラレルポートをサポートさせる場合も、その節と、 あわせて、 この節に続く節もご覧ください。

==== パラレルポートの通信モードを設定する

パラレルインタフェースを使用している場合、FreeBSD では、 割り込み駆動型にするか、 プリンタとの通信の状況をカーネルに監視させるかのいずれかを選択できます。 FreeBSD の汎用プリンタデバイスドライバ (lpt(4)) は ppbus(4) システムを利用しています。 これは ppc(4) ドライバを使ってパラレルポートのチップセットを制御します。

  • GENERIC カーネルでは割り込み駆動方式がデフォルトになっています。 この方式では、 オペレーティングシステムはプリンタがデータを受け付けられるかどうかを調べるために、 IRQ ラインを一つ使用します。

  • 監視方式では、 オペレーティングシステムにプリンタがもっとデータを受け付けられるかどうかを繰り返し尋ねるように指示します。 そして、受け付けるという応答を受けたとき、 カーネルはさらなるデータを送信します。

割り込み駆動方式は一般的にいくらか高速になりますが、貴重な IRQ ラインを一つ消費します。 HP の新しいプリンタの一部には、明らかに何かしらのタイミングの問題 (まだ正確にはわかっていません) で割り込みモードでは正常に動作しないものがあると言われています。 これらのプリンタにはポーリングモードが必要になります。 どちらかうまく機能する方を使ってください。 一部のプリンタはどちらの方式でも動作しますが、 割り込みモードでは苦痛を感じるほど低速です。

通信モードを設定するためには 2 つの方法があります。 1 つはカーネルを変更することで、もう一つは lptcontrol(8) プログラムを使用する方法です。

カーネルを設定することによって、 通信モードを変更する。

  1. カーネルコンフィグレーションファイルを変更します。 ppc0 のエントリを探してください。 2 番目のパラレルポートを設定するときは、代わりに ppc1 を使います。 以下、3 番目のポートは ppc2 となっていきます。

    • 割り込み駆動方式にする場合は、 /boot/device.hints ファイルの以下の行を編集して、 N を適切な IRQ 番号に置き換えてください。

      hint.ppc.0.irq="N"

      カーネルの設定ファイルには ppc(4) ドライバも入れなければなりません。

      device ppc
    • ポーリングモードを使用する場合は、 /boot/device.hints ファイルの以下の行を削除してください。

      hint.ppc.0.irq="N"

      場合によっては、これだけでは FreeBSD でポートをポーリングモードにするには十分ではないことがあります。 多くの場合これは acpi(4) ドライバと併せて動作します。 これはデバイスのプローブとアタッチを行うので、 プリンタポートへのアクセスモードを制御できます。 問題を修正するために acpi(4) の設定を確認してください。

  2. ファイルをセーブし、config プログラムを起動し、 カーネルの構築、インストールをおこないます。そして、 リブートしてください。詳細は、「FreeBSDカーネルのコンフィグレーション」を参照 してください。

lptcontrol(8) で通信モードを設定する場合

  1. lptN をイベント駆動方式に設定する場合は、 次のように入力します。

    # lptcontrol -i -d /dev/lptN
  2. lptN を監視方式に設定する場合は、次のように入力します。

    # lptcontrol -p -d /dev/lptN

これらのコマンドを /etc/rc.local ファイルに追加 しておくと、システムをブートする度に通信モードを設定する ことができます。詳細については、 lptcontrol(8) をご覧ください。

==== プリンタとの通信状況を調べる

スプーリングシステムの設定に進む前に、オペレーティング システムがプリンタにデータを送ることに成功しているかどうか を確かめるべきでしょう。これにより、印字がうまくいかないと き、プリンタとの通信が問題なのか、スプーリングシステムが問 題なのかを分けて調べることがかなり容易になります。

プリンタをテストするためには、 プリンタに何かのテキストを送 信してみます。送信した文字をすぐに印字してくれるプリンタに は、lptest(1) コマンドを使うと有用です。このコマンドは印 字可能な 96 文字の ASCII 文字すべてを 96 行生成します。

PostScript® (または他の言語に対応した) プリンタの場合 は、もっと巧妙なテストが必要になります。次のような、簡単な PostScript® プログラムを使えば十分でしょう。

%!PS
100 100 moveto 300 300 lineto stroke
310 310 moveto
/Helvetica findfont 12 scalefont setfont
(Is this thing working?) show
showpage

上の PostScript® コードはファイルに保存し、 以降の節で例として示されているように利用することができます。

このドキュメントでプリンタ用言語を参照するときは、 PostScript® のような言語を仮定しており、Hewlett Packard の PCL は考慮していません。PCL は非常に機能的なの ですが、 プレインテキストにエスケープシーケンスを混ぜること ができます。PostScript® ではプレインテキストを直接印字 することはできません。 このような種類のプリンタ言語に対しては、 特別な対応をおこなわなければなりません。

===== パラレルポートのプリンタとの接続を調べる

この節では、FreeBSD がパラレルポートに接続されたプリ ンタと通信できているかどうかを調べる方法について説明し ています。

パラレルポートのプリンタをテストするために

  1. su(1) コマンドで root になります。

  2. プリンタにデータを送ります。

    • プリンタがプレインテキストを印字できる場合、 lptest(1) コマンドを使います。 次のように入力してください。

      # lptest > /dev/lptN

      ここで、N はパラレルポートの番号で、番号は 0 から始まります。

    • プリンタが PostScript® か他のプリンタ 言語を使用している場合、そのプリンタに簡単なプロ グラムを送信してください。次のように入力します。

      # cat > /dev/lptN

      そして、一行一行、 プログラムを慎重に入力して 下さい。RETUREN または ENTER キーを入力してしま うと、その行は編集できなくなります。プログラムの 入力が終わったら、CONTROL+D か、あなたが設定して いるファイル終了のキーを押してください。

      もしくは、プログラムを入力したファイルがある 場合は、次のように入力してください。

      # cat file > /dev/lptN

      ここで、file はプログラムが格納されていて、 プリンタに送信するファイルの名前です。

これで何かが印刷されるはずです。 印字されたテキストがおかしくても心配は無用です。 それについては、後で修正します。

===== シリアルポートのプリンタとの接続を調べる

この節では、FreeBSD がシリアルポートに接続されたプリ ンタと通信できているかどうかを調べる方法について述べられ ています。

シリアルポートのプリンタをテストするために

  1. su(1) コマンドで root になります。

  2. /etc/remote ファイルを編集します。次のエントリを加えてください。

    printer:dv=/dev/port:br#bps-rate:pa=parity

    ここで、port シリアルポート (ttyu0ttyu1 など) のデバイスエントリで、 bps-rateは プリンタとの通信の転送速度[bit/秒]、 parityはプリ ンタとの通信で必要とされるパリティ (evenoddnonezeroのいずれか) を表わしていま す。

    次の例は、 プリンタをシリアルケーブルでパリティなし、転送速度 19200 bps で第 3 番目のシリアルポートに接続した場 合です。

    printer:dv=/dev/ttyu2:br#19200:pa=none
  3. tip(1) コマンドでプリンタと接続します。 次のように入力してください。

    # tip printer

    これがうまくいかなかった場合は、 /etc/remoteを編集して、 /dev/ttyuN の代わりに /dev/cuaaN を試してみてください。

  4. プリンタにデータを送ります。

    • プリンタがプレインテキストを印字できる場合、 lptest(1) コマンドを使います。 次のように入力してください。

      % $lptest
    • プリンタが PostScript® か他のプリンタ言語を使用している場合、 そのプリンタに簡単なプログラムを入力します。 一行一行、プログラムを慎重に入力してください。 バックスペースキーや他の編集用のキーは、 プリンタの制御コードに割り当てられているかもしれません。 プログラムが終了したことをプリンタに伝えるための特別なファイル終了キーを 入力する必要があるかもしれません。 PostScript® プリンタの場合、 CONTROL+D を入力します。

      もしくは、プログラムを入力したファイルがある場合は、 次のように入力してください。

      % >file

      ここで、file はプログラムが格納されているファイル名です。 tip(1) コマンドでファイルを送信した後は、 ファイル終了を表わすキーを入力する必要があります。

これで何かがプリントされることでしょう。 印字されたテキ ストがおかしくても心配しなくても構いません。 それについては、後で修正します。

==== スプーラに許可を与える: /etc/printcap ファイル

ここまでで、プリンタはコンピュータに接続され、(必要なら) プリンタと通信できるようにカーネルを変更し、 簡単なデータをプリンタに送信することができているはずです。 これで、LPD にプリンタへのアクセスを 制御させる設定をおこなう準備が整いました。

LPD の設定は /etc/printcap を編集することでおこないます。 LPD スプーリングシステムは スプーラが使われる毎にこのファイルを参照します。 そのため、ファイルを更新するとすぐにその変更が反映されます。

printcap(5) ファイルの書式は簡単です。 /etc/printcap の編集はお好みのテキストエディタをお 使いください。このファイルの書式は、 /usr/shared/misc/termcap/etc/remote といった他のケイパビリティファイルと一致しています。 この書式 についての詳細な情報については cgetent(3) をご覧ください。

スプーラの単純な設定法は、 次のステップでおこないます。

  1. プリンタに名前 (と簡単な別名 2 ~ 3 個) を付け、それを /etc/printcap ファイルに記述します。 これについては、「プリンタに名前を付ける」 を参照してください。

  2. sh の項目を追加することで、 ヘッダページの出力を禁止します (デフォルトは許可)。 これについては、「ヘッダページの印字を禁止する」 を参照してください。

  3. スプール用のディレクトリを作成し、その位置を sd 項目で指定します。これについては、 「スプーリングディレクトリの作成」 を参照してください。

  4. プリンタを使用するために /dev エントリを設定し、/etc/printcaplp 項目でそのエントリを指定します。 これについては、「プリンタデバイスの特定」 を参照してください。 プリンタをシリアルポートに接続した場合は、 ms# の項目を設定する必要があります。こちらについては、 「スプーラのための通信パラメータの設定」 を参照してください。

  5. プレインテキスト用の入力フィルタのインストールをおこないます。 「テキストフィルタのインストール」 を参照してください。

  6. lpr(1) コマンドで何かを印字することで設定のテストをおこないます。 印字してみようトラブルシューティング を参照してください。

PostScript® プリンタのような、 プリンタ言語を使用しているプリンタには、 プレインテキストを直接印字させることができません。 上にアウトラインを示し、 以下の節で説明する簡単な設定方法の説明では、 そのようなプリンタを設置している場合は、 プリンタが認識できるファイルだけを印字の対象としているという 仮定をしています。

多くの場合、 利用者はシステムに設置されているプリンタすべてで プレインテキストが印字できることを期待しています。 印字作業をおこなうために LPD のインタフェースを利用するプログラムでも、 通常、そのような仮定を置きます。 プリンタ言語を使用するプリンタを設置しており、 そのプリンタ言語で記述されたジョブと、 これに加えて、 プレインテキストのジョブも印字できるようにしたいならば、 上で示した簡単な設定方法に加えて、 さらなる設定をおこなうことを強くお勧めします。すなわち、 自動的にプレインテキストから PostScript® (もしくは、 他のプリンタ言語) に変換するプログラムをインストールしてください。「プレインテキストのジョブを PostScript® プリンタで印字する」 で、それをどのようにおこなえばよいのかが説明されています。

日本語を印字したい場合は、プリンタ言語を使用し ていない「日本語プリンタ」についても、 プリンタ固有のエスケープシーケンスを送る必要があります。 また、漢字コードをプリン タが設定しているものに変換したりする必要があり、 各プリンタ毎に、日本語用のフィルタが必要になります。

===== プリンタに名前を付ける

最初の (簡単な) ステップで、プリンタの名前を考えます。 プリンタには別名をいくつか付けることもできるので、 機能的な名前 でも風変わりな名前でもどちらを選んでもまったく 問題はありません。

少なくとも1つのプリンタには、 /etc/printcap の中で、 lp という別名を持たせるべきでしょう。 この名前はデフォルトのプリンタ名になっています。 ユーザが環境変数 PRINTER を設定しておらず、 かつ、LPD コマンドのコマンドラインで プリンタの名前が指定されていない場合、lp がデフォルトのプリンタ名となり、 そのプリンタに出力されます。

それから、これは共通の慣習ですが、 プリンタの最後の別名には、 メーカーやモデル名を含むプリンタの完全な名称をつけることに なっています。

名前と別名のいくつかを決めたら、 /etc/printcap ファイルに設定します。 プリンタ名は一番左のカラムから書き始めます。 別名はそれぞれ縦棒によって区切られ、 最後の別名の後ろにコロンを置きます。

次の例では、2 台のプリンタ (Diablo 630 ラインプリンタと Panasonic KX-P4455 PostScript® レーザライタプリンタ) が定義 されている /etc/printcap のスケルトンを記しています。

#
#  /etc/printcap for host rose
#
rattan|line|diablo|lp|Diablo 630 Line Printer:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:

この例では、最初のプリンタに rattan という名前と別名として、linediablolp そして Diablo 630 Line Printer が付けられています。別名とし て lp があるので、このプリンタはデフォルトのプリンタとなっ ています。2 番目は bamboo と名付けられ、 別名として、psPSSpanasonicPanasonic KX-P4455 PostScript v51.4 が付けられています。

===== ヘッダページの印字を禁止する

LPD スプーリングシステムでは、 デフォルトでジョブ毎に ヘッダページを印字します。 ヘッダページにはジョブを要求したユーザ名、 ジョブが送られたホスト名、そして、ジョブの名前が素晴 らしい大きな文字で印字されています。 残念なことに、この余分なテキストすべてが、 簡単なプリンタ設定法のデバッグの際に紛れ込んできてしまいます。 このため、ヘッダページの出力を禁止しておきます。

ヘッダページの出力を禁止するには、 /etc/printcap にあるプリンタのエントリに sh の項目を追加します。次に、sh を加えた /etc/printcap の例を示します。

#
#  /etc/printcap for host rose - no header pages anywhere
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:

この書式を正しく使うための注意をしておきます。 最初の行は左端のカラムから始めます。 それに続く行は字下げします。最後の行以外のすべての行は、 行末にバックスラッシュを記述します。

===== スプーリングディレクトリの作成

スプーラの簡単な設定の次のステップでは、 スプーリングディレクトリを作成します。 プリンタに送られるジョブは、 その印字が終了するまでこのディレクトリに置かれます。また、 他のたくさんのスプーラもこのディレクトリにファイルを置きます。

様々な事情によりスプーリングディレクトリは、通常、慣例 として /var/spool の下に置きます。 また、スプーリングディレクトリの内容は バックアップをする必要はありません。 mkdir(1) によってディレクトリを 作るだけでスプーリングディレクトリの復旧は完了します。

スプーリングディレクトリの名前は、これも慣例ですが、 次のようにプリンタの名前と同じにします。

# mkdir /var/spool/printer-name

しかしながら、ネットワーク上に使用可能なプリンタがたく さんあるならば、LPD で印字するための専用のディレクトリにスプーリングディレクトリを置きたくなるかもしれません。 例に出てきたプリンタ rattanbamboo について、この方式を採用すると、 次のようになります。

# mkdir /var/spool/lpd
# mkdir /var/spool/lpd/rattan
# mkdir /var/spool/lpd/bamboo

各ユーザが印字するジョブのプライバシを守りた いと考えているならば、スプーリングディレクトリを保護し て、これを誰からでもアクセスできないようにしたいと思う かもしれません。スプーリングディレクトリは、 daemon ユーザと daemon グループに所有され、 読み込み、書き込み、検 索可能であり、他からはアクセスできないようにするべきで す。例題のプリンタに対して、次のようにすることにしましょ う。

# chown daemon:daemon /var/spool/lpd/rattan
# chown daemon:daemon /var/spool/lpd/bamboo
# chmod 770 /var/spool/lpd/rattan
# chmod 770 /var/spool/lpd/bamboo

最後に、/etc/printcap ファイルで、 これらのディレクトリの位置を LPD に伝える必要があります。 スプーリングディレクトリのパス名は sd 項目で指定します。

#
#  /etc/printcap for host rose - added spooling directories
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:

プリンタ名が最初のカラムから始まっており、 そのプリンタに関して記述される他の項目は字下げされていること、 各行がバックスラッシュで終わっていることに注意してください。

sd によりスプーリングディレクトリが指定されていない場合、 スプーリングシステムは /var/spool/lpd をデフォルト値として使用します。

===== プリンタデバイスの特定

プリンタ機器の設定 の節では、FreeBSD でプリンタとの通信に使用されるポートおよび /dev ディレクトリ内のエントリを特定します。 そして、LPD にその情報を伝えます。 印字するジョブを受け取ると、スプーリングシステムは、 (プリンタにデータを渡す義務がある) フィルタプログラムに代わって指定されたデバイスをオープンします。

/etc/printcap ファイルで lp 項目を使って /dev エントリを記入します。

ここでの例では、rattan は 1 番目のパラレルポートに、bamboo は 6 番目のシリアルポートに接続されていることにしましょう。 このとき、/etc/printcap には 次のようになります。

#
#  /etc/printcap for host rose - identified what devices to use
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:\
        :lp=/dev/ttyu5:

/etc/printcap でプリンタの lp 項目が指定されていない場合は、 LPD はデフォルトとして /dev/lp を使用します。/dev/lp は、現在の FreeBSD には存在していません。

設置したプリンタがパラレルポートに 接続されている場合は、 「テキストフィルタのインストール」 まで読み飛ばしてください。 そうでない場合は、次節の説明に続いてください。

===== スプーラのための通信パラメータの設定

シリアルポートにプリンタを接続した場合、 LPD は、プリンタにデータを送信するフィルタプログラムに代わり、 通信速度やパリティ、 その他のシリアル通信パラメータを設定することができます。 このことによる利点は、

  • /etc/printcap を編集するだけで、 様々な通信パラメータを試してみることができます。 フィルタプログラムを再コンパイルする必要はありません。

  • スプーリングシステムで、 シリアル通信の設定が異なっているかもしれない複数のプリンタに 同じフィルタプログラムを使うことが可能になります。

次の /etc/printcap の項目で、 lp で指定された デバイスのシリアル通信パラメータを制御できます。

br#bps-rate

デバイスの通信速度を bps-rate に設定します。 ここで、bps-rate は 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200 [bit/秒] のいずれかです。

ms#stty-mode

デバイスをオープンした後にターミナルデバイスのオプションを設定します。 利用できるオプションについては stty(1) を参照してください。

lp で指定されたデバイスをオープンするとき、 LPD は ms# で指定されたデバイスの特性を設定します。 特に関係があるのは、parenb, parodd, cs5, cs6, cs7, cs8, cstopb, crtscts, ixon モードです。 これらは stty(1) のマニュアルページで説明されています。

例題のプリンタで6番目のシリアルポートに接続された プリンタの設定を追加してみましょう。 通信速度は 38400bps に設定します。 モードとして、-parenb でパリティ無し、 cs8 で 8 ビットキャラクタ、 clocal でモデム制御無し、 そして crtscts でハードウェアフロー制御を設定します。

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:\
        :lp=/dev/ttyu5:ms#-parenb cs8 clocal crtscts:

===== テキストフィルタのインストール

ここまでで、 プリンタにジョブを送るために使うテキストフィルタを LPD に設定する準備が整いました。 テキストフィルタとは、 入力フィルタとしても知られていますが、 印字するジョブがあるときに LPD が起動するプログラムです。 LPD がプリンタのためにテキストフィルタを起動するとき、 LPD はフィルタの標準入力からプリントするジョブを入力し、 フィルタの標準出力に項目 lp で指定されたプリンタデバイスを接続します。フィルタは、 標準入力からジョブを読み込み、 プリンタのための必要な変換をおこなった後、 その結果を標準出力に出力する、 これにより印字がなされることを期待されています。 テキストフィルタについての更に詳しい情報については、「フィルタはどのように機能しているか」 をご覧ください。

ここでの簡単なプリンタ設定では、 プリンタにジョブを送るため、/bin/cat を実行するだけの簡単なシェルスクリプトで間に合います。 FreeBSD に標準で付属している lpf というフィルタでは、バックスペース文字を使った 下線引きの動作をおこなう文字ストリームをうまく扱うことができない プリンタのための代替処理をおこなってくれます。 もちろん、 他のどんなフィルタプログラムを使っても構いません。 フィルタ lpf については、「テキストフィルタ lpf」で詳しく説明します。

最初に、簡単なテキストフィルタであるシェルスクリプト /usr/local/libexec/if-simple を作ってみましょう。 次のテキストをお好みのテキストエディタでファイルに 書き込んでください。

#!/bin/sh
#
# if-simple - Simple text input filter for lpd
# Installed in /usr/local/libexec/if-simple
#
# Simply copies stdin to stdout.  Ignores all filter arguments.

/bin/cat && exit 0
exit 2

そして、このファイルを実行可能にします。

# chmod 555 /usr/local/libexec/if-simple

LPD にこのテキストフィルタを使うことを設定するためには、 /etc/printcapif 項目を使って指定します。これまでの /etc/printcap の例のプリンタ 2 台に、 このフィルタを加えてみましょう。

#
#  /etc/printcap for host rose - added text filter
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:\
        :lp=/dev/ttyu5:ms#-parenb cs8 clocal crtscts:\
        :if=/usr/local/libexec/if-simple:

if-simple スクリプトのコピーが /usr/shared/examples/printing ディレクトリにあります。

===== LPD の起動

lpd(8)lpd_enable 変数に従って /etc/rc から実行されます。この変数の デフォルト値は NO です。まだ そうしていなかったならば

lpd_enable="YES"

の行を /etc/rc.conf に追加して 計算機を再起動するか、そのまま lpd(8) を 起動してください。

# lpd

===== 印字してみよう

簡単な LPD 設定も終わりにたどり着きました。 残念ながら、設定はこれでおしまいというわけではありません。 なぜなら、さらに、設定をテストし、 すべての問題点を解決しなくてはならないからです。 設定をテストするために、 何かを印字してみましょう。 LPD システムで印字をするためには、 lpr(1) コマンドを使います。このコマンドは、 印字するためのジョブを投入する働きをします。

lpr(1) コマンドを 「プリンタとの通信状況を調べる」で紹介した、 あるテスト用のテキストを生成してくれる lptest(1) プログラムと一緒に使うこともできます。

簡単な LPD 設定のテスト

次のように入力してください。

# lptest 20 5 | lpr -Pprinter-name

ここで、printer-name/etc/printcap で指定したプリンタ名 (もしくはその別名) です。デフォルト のプリンタを使用する場合は、 -P 引数を付けないで lpr(1) を打ち込んでください。もう一度述べますが、 PostScript® を期待しているプリンタをテストするならば、 lptest(1) を使う代わりに PostScript® で書かれた プログラムをプリンタに送ってください。 プログラムを送るためには、プログラムをファイルに格納して、 lpr file と打ち込みます。

PostScript® プリンタの場合、 送信したプログラムによる結果が得られるでしょう。 lptest(1) を使った場合は、 以下のような結果が見られるでしょう。

!"#$%&'()*+,-./01234
"#$%&'()*+,-./012345
#$%&'()*+,-./0123456
$%&'()*+,-./01234567
%&'()*+,-./012345678

更にプリンタをテストしたい場合は、 (言語ベースのプリンタのための) もっと大きなプログラムを送信するか、 引数を変えて lptest(1) を実行します。たとえば、lptest 80 60 で、それぞれ 80 文字の行を 60 行生成します。

プリンタがうまく動かなかった場合は、次の節、「トラブルシューティング」をご覧ください。

== プリンタ設定上級編

この節では、特殊な形式のファイルを印字するためのフィルタ、 ヘッダページ、ネットワーク越しのプリンタへの印字、そして、 プリンタ使用の制限や課金について説明しています。

=== フィルタ

LPD は、ネットワークプロトコル、キュー、アクセス制御などの 印刷にかかわるさまざまな点を扱いますが、 実際の作業のほとんどは フィルタによっておこなわれています。 フィルタは、プリンタと通信し、 プリンタのデバイス依存性や特殊な要求を扱うプログラムです。 簡単なプリンタ設定では、 プレインテキストのためのフィルタをインストールしました。 このプレインテキストフィルタは、 ほとんどのプリンタで機能する極めて単純なものでした (「テキストフィルタのインストール」を参照)。

しかしながら、形式変換やプリンタ課金、特定のプリンタの癖、 など をうまく利用するためには、 フィルタがどのように機能するかという ことを理解しておくべきです。これらの側面を扱うことは、 最終的には、フィルタの責任であるからです。 そして、これは悪い情報ですが、ほとんどの場合において、 あなた自身が フィルタを供給する必要があるということです。また都合のよいことには、 たくさんのフィルタが一般的に利用できるということです。 もしフィルタがなかったとしても、 普通はフィルタを作るのは簡単です。

FreeBSD にも、プレインテキストを印字させることができる /usr/libexec/lpr/lpf というフィルタが 1 つ付いています (このフィルタはファイルに含まれるバックスペースやタブを扱います。 また、課金をすることもできますが、 できることはこれだけしかありません)。 いくつかのフィルタとフィルタの構成要素は FreeBSD Ports Collection にもあります。

この節で述べることは次の通りです。

  • フィルタはどのように機能しているか」では、 印字の過程におけるフィルタの役割を概説します。 この節を読むことで、LPD がフィルタを使うときに、"見えないところで" 何が起こっているかが理解できるでしょう。このことを知っておくと、 プリンタそれぞれに様々なフィルタをインストールしたときに 遭遇するかもしれない問題を予期したり、 デバッグするときに役立つでしょう。

  • LPD は、すべてのプリンタがデフォルトでプレインテキストを印字できることを期待しています。 これは、プレインテキストを直接印字できない PostScript® (または他の言語対応の) プリンタで問題になります。「プレインテキストのジョブを PostScript® プリンタで印字する」 で、 この問題を克服する方法について述べます。 PostScript® プリンタをお持ちの方は、 この節をお読みになることをおすすめします。

  • PostScript® は様々なプログラムのための有名な出力形式です。 PostScript® のコードを直接書いてしまう人すらいます。 残念ながら、PostScript® プリンタは高価です。「非 PostScript® プリンタによる PostScript® のシミュレート」節では、PostScript® データを非 PostScript® プリンタに受けつけさせ、印字させるために、 どのようにしてプリンタ用のテキストフィルタをさらに変更すればよいのか、 ということについて説明しています。PostScript® プリンタを持っていない方は、 この節をお読みになることをおすすめします。

  • 変換フィルタ」では、 図形や組版データといった特定のファイル形式を、 プリンタが理解できる形式へ変換する作業を自動的におこなわせる方法について述べます。 この節を読むと、troff のデータを印字するには lpr -t, または、TeX DVI を印字するには lpr -d、 ラスタイメージデータを印字するには lpr -v、 などといったようにユーザが入力することができるように プリンタの設定をおこなうことができます。 この節もお読みになることをお薦めします。

  • 出力フィルタ」 では、あまり使われない LPD の機能のすべて、すなわち、 出力フィルタに関することが記述されています。ヘッダページ (「ヘッダページ」参照) を印字させていない場合は、 多分、この節は飛ばしても構わないでしょう。

  • テキストフィルタ lpf」では、lpf についての説明が、ほぼ完全におこなわれています。これは FreeBSD に付属するラ インプリンタ (または、 ラインプリンタのように動作するレーザプリンタ) のための、 単純なテキストフィルタです。 プレインテキストを印字したことに対して課金をおこなう方法が 至急必要な場合、もしくは、バックスペース文字を印字しようと すると煙を発するプリンタを持っている場合は、絶対に lpf を検討するべきです。

以下で述べられているさまざまなスクリプトは、/usr/shared/examples/printing ディレクトリにあります。

==== フィルタはどのように機能しているか

既に言及したように、フィルタとは、プリンタにデータを送る際に、 デバイスに依存した部分を取り扱うために LPD によって起動される実行プログラムです。

LPD がジョブ中のファイルを印字しようとするとき、 LPD はフィルタプログラムを起動します。このとき、 フィルタの標準入力を印字するファイルに、 標準出力をプリンタに、そして、標準エラー出力を エラーログファイル (/etc/printcap 内の lf 項目で指定されたファイル、または、 指定されていない場合は、デフォルトとして /dev/console) にセットします。

LPD が起動するフィルタと、その引数が何であるかは、 /etc/printcap ファイルの内容と、ジョブの起動時にユーザが指定した lpr(1) コマンドの引数に依存しています。 たとえば、ユーザが lpr -t と入力した場合は、 LPD は出力先のプリンタ用の tf 項目で指定されている troff 用のフィルタを起動させるでしょう。 ユーザがプレインテキストの印字を指示したときは、 if で指定されたフィルタが起動されるでしょう (このことはほとんどの場合にあてはまります。 詳細については、「出力フィルタ」をご覧ください)。

/etc/printcap で指定可能なフィルタは次の3種類があります。

  • テキストフィルタ (LPD のドキュメントでは紛らわしいことに 入力フィルタと呼んでいますが) は一般のテキストの印字を扱います。これはデフォルトのフィルタと 考えてください。LPD では、すべてのプリンタに対して、 デフォルトでプレインテキストが印字できることを期待しています。 さらに、バックスペースやタブを正しく扱い、また、 他の特殊な文字が入力されてもプリンタに混乱を来さないように するのはテキストフィルタの仕事であると考えています。 プリンタの使用に対して課金をしなくてはならない環境にあ るときは、テキストフィルタが印字したページ数を数える作 業もしなくてはなりません。この作業は、通常、印字した行 数を数え、これをプリンタが 1 ページ当たりに印字できる行 数と比較することでおこなわれます。 テキストフィルタは、次のような引数を付けて起動されます。

    filter-name [ -c ] -w width -l length -i indent -n login -h host acct-file

    ここで、

    -c

    lpr -l によってジョブが入力されたときに与えられます。

    width

    /etc/printcap で指定された pw (page width) 項目の値が与えられます。デフォルトは、 132 です。

    length

    pl (page length) 項目で指定された値が与えられます。 デフォルトは 66 です。

    indent

    lpr -i によって与えられた字下げの量で、 デフォルトは 0 です。

    login

    ファイルを印字したユーザのアカウント名が 与えられます。

    host

    ジョブが入力されたホスト名が 与えられます。

    acct-file

    af 項目で指定されている課金データファイル の名前が与えられます。

  • 変換フィルタは、 特定のファイル形式をプリンタ が紙に印字できるようなものに変換します。たとえば、 プリンタで ditroff 組版データを直接印字することはできません。 しかし、ditroff データをプリンタが消化し、 印字することができる形式へ変換するために、ditroff ファイル用フィルタをインストールすることができます。 「変換フィルタ」 で、これらに関するすべてについて説明します。 プリンタの課金をする必要がある場合は、 変換フィルタでも印字ページを数える作業が必要となります。 変換フィルタは次の引数をとって起動されます。

    filter-name -x pixel-width -y pixel-height -n login -h host acct-file

    ここで、pixel-width は、 px 項目で指定された値 (デフォルトは 0)、 pixel-height は、 py 項目で指定された値 (デフォルトは 0) です。

  • 出力フィルタは、 テキストフィルタが指定されて おらず、かつ、 ヘッダページの出力が許可されている場合にのみ使われます。 「出力フィルタ」で、これらのことについて説明します。 出力フィルタに対する引数は次の 2 つだけです。

    filter-name -w width -l length

    ここで、-w-l は、 テキストフィルタの場合と同じです。

フィルタは、次に示す終了状態をもってプログラムを exit するべきです。

exit 0

フィルタがファイルを正常に印字した場合。

exit 1

フィルタはファイルの印字に失敗したが、 LPD に再度ファイルの印字を試みて欲しい場合。 この終了状態で終了した場合、LPD はフィルタを再スタートします。

exit 2

フィルタはファイルの印字に失敗し、かつ、LPD に再出力を試みて欲しくない場合。この場合、LPD はそのファイルを放棄します。

FreeBSD に付属するテキストフィルタ /usr/libexec/lpr/lpf は、FORM FEED 文字が送られたときやプリンタ使用に対する課金をどのようにするかを決定するために、 ページ幅やページ長の引数を利用します。また、 課金用のエントリを作成するため、ログイン名、ホスト名、 課金ファイル名の引数を利用します。

もし、フィルタの購入を検討しているならば、LPD と互換性があるかどうかを確認してください。もしそうならば、 上述の引数リストをサポートしていなければなりません。 一般向けの使用のためにフィルタを作成する計画をしている場合は、 同じ引数リストと終了コードをサポートしてください。

==== プレインテキストのジョブを PostScript® プリンタで印字する

コンピュータと PostScript® (または、他の言語に対応した) プリンタをあなたしか使用しない場合は、プリンタにプレ インテキストを絶対に送らない、そして、 プリンタにプレインテキストを送りたがっている 様々なプログラムの機能を決して使わないことにしてください。そうすれば、 この節に書かれたことに心を煩わせる必要はまったくなくなります。

しかし、PostScript® とプレインテキストの両方のジョブをプリンタへ送りたいと思っている場合は、 プリンタ設定についての要求が増えるでしょう。 両者をプリンタへ送信するためには、 到着したジョブがプレインテキストであるか PostScript® であるかを検出するテキストフィルタが必要です。 PostScript® のジョブはすべて %! で始まらなければならないことになっています (他のプリンタ言語に関しては、 プリンタのドキュメントをご覧ください)。 ジョブの最初の 2 文字がこれならば、PostScript® であることが分かります。 したがって、 ジョブのそれ以降の部分をプリンタに直接送ることができます (訳注: PostScript® では、% 以降はコメントとして扱われるので、最初の %! の行を読み捨てても問題はない)。 最初の2文字が %! でない場合は、 フィルタはテキストを PostScript® に変換し、 その結果を使って印字をおこないます。

この作業をどうやってやればよいのでしょうか。

シリアルポートにプリンタを接続した場合は、 lprps をインストールすることをお勧めします。 lprps は PostScript® 用のフィルタで、 プリンタとの双方向通信をおこないます。 このフィルタでは、プリンタからの冗長な情報を得ることで、 プリンタの状況を示すファイルが更新されていきます。 したがって、ユーザや管理者は (トナー残量少紙詰まりといった) プリンタの状況を正確に知ることができます。しかし、 もっと重要なことは、psif と呼ばれるプログラムが含まれているということです。 このプログラムは、 入力されたジョブがプレインテキストかどうかを検出し、 これを PostScript® に変換するために、textps (lprps に付属する別のプログラム) を呼び出します。そして、このジョブをプリンタに送るために、 lprps が使われます。

lprps は FreeBSD Ports Collection に含まれています (Ports Collection を参照してください)。 紙のサイズに合わせて print/lprps-a4 または print/lprps-letter port をインストールしてください。lprps をインストールした後は、lprps の一部である psif プログラムのパス名を指定するだけです。Ports Collection から lprps をインストールしたときは、 /etc/printcap の中のシリアル接続した PostScript® プリンタのエントリに対して、次を使ってください。

:if=/usr/local/libexec/psif:

LPD にプリンタをリード・ライトモードでオープンさせるために、 rw 項目も指定すべきです。

パラレルポート接続の PostScript® プリンタの場合 (すなわち、 lprps が 必要としているプリンタとの双方向通信ができない)、 テキストフィルタとして次のシェルスクリプトを使うことができます。

#!/bin/sh
#
#  psif - Print PostScript or plain text on a PostScript printer
#  Script version; NOT the version that comes with lprps
#  Installed in /usr/local/libexec/psif
#

IFS="" read -r first_line
first_two_chars=`expr "$first_line" : '\(..\)'`

if [ "$first_two_chars" = "%!" ]; then
   #
   #  PostScript job, print it.
   #
   echo "$first_line" && cat && printf "\004" && exit 0
   exit 2
else
   #
   #  Plain text, convert it, then print it.
   #
   ( echo "$first_line"; cat ) | /usr/local/bin/textps && printf "\004" && exit 0
   exit 2
fi

上記のスクリプトにおいて、textps はプレインテキストから PostScript® へ変換するために別にインストールしたプログラムです。 テキストから PostScript® へ変換するのには、 お好みのどんなプログラムでも使うことができます。FreeBSD Ports Collection (Ports Collection を参照してください) には、a2ps と呼ばれるテキストから PostScript® に変換するプログラムが入っています。

==== 非 PostScript® プリンタによる PostScript® のシミュレート

PostScript® は質の高い組版と印字をおこなうための 事実上の標準です。しかしながら、PostScript® は、高価な標準です。ありがたいことに、 Aladdin Enterprises から Ghostscript と呼ばれる、 PostScript® 互換の動作をするフリーのプログラムが出されていて、 FreeBSD で動きます。 Ghostscript はほとんどの PostScript® ファイルを読むことができ、 これらの各ページを多くのブランドの非 PostScript® プリンタを含む 様々なデバイス用に変換することができます。 Ghostscript をインストールし、 プリンタ用の特別なテキストフィルタを使うことによって、 非 PostScript® プリンタをあたかも本物の PostScript® プリンタであるかのように動作させることができます。

Ghostscript は FreeBSD Ports Collection に入っています。 複数のバージョンがありますが、最も良く使われているバージョンは print/ghostscript-gpl です。

PostScript® プリンタをシミュレートさせる場合は、 テキストフィルタに PostScript® ファイルを印字しようとしているかどうかを検出させます。 PostScript® ファイルでない場合は、 フィルタはそのファイルを直接プリンタに送ります (訳注: テキストファイルを直接印字できない場合は、もちろん、 変換フィルタを通す必要があります)。PostScript® の場合は、 まず、Ghostscript を使い、 ファイルをそのプリンタが理解できる形式へ変換します。

次の例のスクリプトは、Hewlett Packard DeskJet 500 プリンタ用 のテキストフィルタです。 他のプリンタで用いるときは、-sDEVICE 引数を gs (Ghostscript) コマンドに変えてください (gs -h と入力すると、現在インストールされている Ghostscript でサポートされているデバイスのリストが得られます)。

#!/bin/sh
#
#  ifhp - Print Ghostscript-simulated PostScript on a DeskJet 500
#  Installed in /usr/local/libexec/ifhp

#
#  Treat LF as CR+LF (to avoid the "staircase effect" on HP/PCL
#  printers):
#
printf "\033&k2G" || exit 2

#
#  Read first two characters of the file
#
IFS="" read -r first_line
first_two_chars=`expr "$first_line" : '\(..\)'`

if [ "$first_two_chars" = "%!" ]; then
    #
    #  It is PostScript; use Ghostscript to scan-convert and print it.
    #
    /usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 \
      -sOutputFile=- - && exit 0

else
    #
    #  Plain text or HP/PCL, so just print it directly; print a form feed
    #  at the end to eject the last page.
    #
    echo "$first_line" && cat && printf "\033&l0H" &&
    exit 0
fi

exit 2

最後に、if 項目を通して、LPD にこのフィルタを教えてやる必要があります。

:if=/usr/local/libexec/ifhp:

これでおしまいです。lpr plain.text とか lpr whatever.ps と入力してみましょう。どちらも正常に印字されるはずです。

日本語を印字する場合は、 日本語対応の Ghostscript が必要です。日本語対応版の Ghostscript も Ports Collection に入っています。

==== 変換フィルタ

プリンタ設定導入編」 に書かれた簡単な設定が完了したら、最初に、 やってみたいと思うことは、多分 (プレイン ASCII テキストに加えて) 好みのファイル形式のための変換フィルタをインストールすることでしょう。

===== なぜ、変換フィルタをインストールするのか?

変換フィルタによって、 様々な種類のファイルを印字することが簡単になります。たとえば、TeX 組版システムでたくさんの仕事をしたと仮定しましょう。 そして、PostScript® プリンタが接続 されているとします。 すると、TeX で DVI ファイルを作成する度に、DVI ファイルを印字するために、 これを PostScript® ファイルに変換する必要があります。 このコマンドは次のようになるでしょう。

% dvips seaweed-analysis.dvi
% lpr seaweed-analysis.ps

DVI ファイル用の変換フィルタがインストールしてあると、 LPD に変換を肩代わりさせることで毎回毎回 おこなわなければならなかった面倒な変換作業を省くことができます。 つまり、DVI を生成したら、 次のようなコマンドを入力するだけで、これが印字されます。

% lpr -d seaweed-analysis.dvi

LPD に DVI ファイルの変換をさせるためには、 -d オプション を指定します。 変換オプションのリストは「整形と変換に関するオプション」 に載せてあります。

変化のオプションのそれぞれをプリンタに サポートさせるためには、 変換フィルタをインストールし、 そのパス名を /etc/printcap の中で指定しなくてはなりません。変換フィルタは、 プレインテキストを印字する代わりに、フィルタはファイルを プリンタが理解できる形式に変換するところを除けば、 「プリンタの簡単な設定」で説明したテキストファイル (「テキストフィルタのインストール」 を見て下さい) に似ています。

===== どの変換フィルタをインストールすべきか?

使いたいと思う変換フィルタをインストールすべきです。 DVI のデータを頻繁に印字するならば、DVI 変換フィルタ をインストールするのが適切でしょう。印字しなくてはなら ない troff を大量に抱えている場合は、多分、 troff フィルタが欲しくなるはずです。

次の表は、LPD で動作するフィルタと、 /etc/printcap ファイルでのエントリする項目、そして、 lpr コマンドで呼び出す方法をまとめたものです。

ファイル形式/etc/printcap項目lpr オプション

cifplot

cf

-c

DVI

df

-d

plot

gf

-g

ditroff

nf

-n

FORTRAN text

rf

-f

troff

tf

-f

raster

vf

-v

プレインテキスト

if

なし、-p、または -l

先の例のように、lpr -d を使うためには、出力先のプリンタの /etc/printcap 内のエントリで、 df 項目が必要であることが分かります。

反論はあるかも知れませんが、FORTRAN テキストや plot のような形式は、多分、廃れてていくでしょう。 あなたのサイトで、自前のフィルタをインストールするだけで、 プリントオプションのいくつか、あるいは、 全部に新しい意味を与えることができます。たとえば、 Printerleaf ファイル (Interleaf デスクトップパブリッシングプログラムによるファイル) を直接印字したいとします。 そして、Printerleaf 用の変換フィルタを gf 項目で 指定したパスにインストールすれば、lpr -g の意味は "Printerleaf ファイルを印字する" 意味だとユーザに教えることができます。

===== 変換フィルタのインストール

変換フィルタは FreeBSD の基本システムのインストールとは別にインストールするプログラムなので、 変換フィルタは、 /usr/local ディレクトリの下に置くべきでしょう。 フィルタは LPD だけが実行する特別なプログラム、 すなわち、一般ユーザが実行する必要すらないプログラムなので、 /usr/local/libexec ディレクトリに置くのが普通です。

変換フィルタを使用可能にするためには、 /etc/printcap の目的のプリンタの適切な項目に フィルタがあるパス名を指定します。

DVI 変換フィルタをプリンタ bamboo のエントリに加えてみましょう。プリンタ bamboodf 項目を新たに加えた /etc/printcap ファイルの例を以下に再掲します。

#
#  /etc/printcap for host rose - added df filter for bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:\
        :lp=/dev/ttyu5:ms#-parenb cs8 clocal crtscts:rw:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:

DVI フィルタは /usr/local/libexec/psdf という 名前のシェルスクリプトです。 このスクリプトは次のようになっています。

#!/bin/sh
#
#  psdf - DVI to PostScript printer filter
#  Installed in /usr/local/libexec/psdf
#
#  Invoked by lpd when user runs lpr -d
#
exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@"

このスクリプトでは、dvips をフィルタモード (引数 -f) で、 標準入力上で起動しています。標準入力は印字するジョブです。 それから、PostScript® プリンタ用フィルタ lprps (これについては「プレインテキストのジョブを PostScript® プリンタで印字する」 を参照してください) を LPD に与えられた引数を付けて起動します。 lprps はこれらの引数を印字されたページ分の課金をおこなうために使われます。

===== 変換フィルタのその他の例

変換フィルタのインストールには決まったステップがないので、 この節では、例をもっと挙げることにします。 これを自分でフィルタを作る際のガイドにしてください。 適当な例があったら、それをそのまま使ってください。

次のスクリプト例は、Hewlett Packard LaserJet III-Si のための、raster (ええと・・実は、GIF ファイル) 用の変換フィルタです。

#!/bin/sh
#
#  hpvf - Convert GIF files into HP/PCL, then print
#  Installed in /usr/local/libexec/hpvf

PATH=/usr/X11R6/bin:$PATH; export PATH

giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 \
    && exit 0 \
    || exit 2

ここでは、GIF ファイルから PNM (portable anymap) 形式に変換し、次に PGM (portable graymap) 形式に変換してから、 LaserJet/PCL-互換データに変換しています。

上記のフィルタを使うプリンタのためのエントリを付け加えた /etc/printcap ファイルは次のようになります。

#
#  /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
        :if=/usr/local/libexec/hpif:\
        :vf=/usr/local/libexec/hpvf:

次のスクリプトは、PostScript® プリンタ bamboo のための groff 組版システムの troff データのための変換フィルタです。

#!/bin/sh
#
#  pstf - Convert groff's troff data into PS, then print.
#  Installed in /usr/local/libexec/pstf
#
exec grops | /usr/local/libexec/lprps "$@"

上記のスクリプトではプリンタとの通信をおこなうため、 lprps をまた利用しています。 プリンタがパラレルポートに接続されている場合は、代わりに、 次のスクリプトを使うかもしれません。

#!/bin/sh
#
#  pstf - Convert groff's troff data into PS, then print.
#  Installed in /usr/local/libexec/pstf
#
exec grops

これで完成しました。次に、フィルタを使用可能にするため に /etc/printcap に加える必要があるエントリを示します。

:tf=/usr/local/libexec/pstf:

次の例をみたら、FORTRAN のベテランは赤面するかもしれません。 この FORTRAN テキストフィルタは、 プレインテキストを直接印字できるすべてのプリンタで利用できます。 このフィルタをプリンタ teak にインストールすることにしましょう。

#!/bin/sh
#
# hprf - FORTRAN text filter for LaserJet 3si:
# Installed in /usr/local/libexec/hprf
#

printf "\033&k2G" && fpr && printf "\033&l0H" && exit 0
exit 2

そして、このフィルタを使用可能にするため、以下の行を /etc/printcap のプリンタ teak のエントリに加えます。

:rf=/usr/local/libexec/hprf:

これが最後の、そして、若干複雑な例です。前に紹介した LaserJet プリンタ teak に、DVI フィルタを加える ことにしましょう。最初に、 簡単な部分をおこないます。すなわち、DVI フィルタの位置を /etc/printcap に書き加えます。

:df=/usr/local/libexec/hpdf:

さて、難しい部分であるフィルタの作成をおこないます。 このために、DVI から LaserJet/PCL への変換プログラムが必要です。FreeBSD の Ports Collection (Ports Collection を参照してください) には、それがあります。 dvi2xx というのがその port の名前です。 これをインストールすると、必要なプログラム dvilj2p が使えます。このプログラムは DVI を LaserJet IIp、LaserJet III、そして LaserJet 2000 の互換コードへ変換してくれます。

dvilj2p はフィルタ hpdf を極めて複雑にしています。 なぜなら、dvilj2p は標準入力からデータを読み込むことができないからです。 このプログラムを働かせるためには、ファイル名が必要です。 もっと悪いことに、ファイル名は .dvi で終わっている必要があり、標準入力の代わりに、 /dev/fd/0 を使うのは問題があります。 この問題は、(.dvi で終わる) 一時的なファイル名から/dev/fd/0 に (シンボリックな) リンクを張る ことで回避することができます。これで、 dvilj2p に強制的に標準入力からデータを読み込ませることができます。

もう1つの問題は、一時的なリンクを張るために /tmp ディレクトリを使うことができないという事実です。 シンボリックリンクはユーザ、グループが bin であるユーザに所有されています。フィルタはユーザ daemon として起動します。そして、 /tmp ディレクトリはスティッキービットが立っています。 フィルタはリンクを作ることができます。しかし、 リンクは別のユーザに所有されているため、 作業が終了したとき、このリンクを削除することができません。

その代わりに、シンボリックリンクは現在の作業ディレクトリ、 すなわち、スプーリングディレクトリ (/etc/printcapsd 項目で指定する) に作ることにします。 フィルタが作業するにはここの場所は完璧な場所で、なぜなら、 特に、スプーリングディレクトリのディ スクの空き容量は (ときどき) /tmp ディレクトリよりもたくさんあるからです。

以下に示すのが最後のフィルタです。

#!/bin/sh
#
#  hpdf - Print DVI data on HP/PCL printer
#  Installed in /usr/local/libexec/hpdf

PATH=/usr/local/bin:$PATH; export PATH

#
#  Define a function to clean up our temporary files.  These exist
#  in the current directory, which will be the spooling directory
#  for the printer.
#
cleanup() {
   rm -f hpdf$$.dvi
}

#
#  Define a function to handle fatal errors: print the given message
#  and exit 2.  Exiting with 2 tells LPD to do not try to reprint the
#  job.
#
fatal() {
    echo "$@" 1>&2
    cleanup
    exit 2
}

#
#  If user removes the job, LPD will send SIGINT, so trap SIGINT
#  (and a few other signals) to clean up after ourselves.
#
trap cleanup 1 2 15

#
#  Make sure we are not colliding with any existing files.
#
cleanup

#
#  Link the DVI input file to standard input (the file to print).
#
ln -s /dev/fd/0 hpdf$$.dvi || fatal "Cannot symlink /dev/fd/0"

#
#  Make LF = CR+LF
#
printf "\033&k2G" || fatal "Cannot initialize printer"

#
#  Convert and print.  Return value from dvilj2p does not seem to be
#  reliable, so we ignore it.

#
dvilj2p -M1 -q -e- dfhp$$.dvi

#
#  Clean up and exit
#
cleanup
exit 0

===== 自動変換: その他の変換フィルタ

ここまでに述べてきたフィルタによって、 印字環境の能率が上がったことと思います。しかし、 これはどのフィルタを使うかを (lpr(1) のコマンドライン上で) ユーザが指定しなくてはならないという代価を支払って実現されています。 コンピュータの事情にあまり詳しくないユーザにとって、 フィルタのオプションを指定させられるということは いらいらさせられるものになるでしょう。更に悪いことに、 間違ったフィルタオプションを指定されると、 間違った形式のファイルがそのフィルタに適用されることになり、 その結果、何百枚もの紙を吐き出すことになるかもしれません。

そのような結果になるならば、 変換フィルタをインストールするよりもむしろ、 テキストフィルタ (これがデフォルトフィルタなので) に印字するよう要求されたファイルの形式を検出させ、自動的に、 適切な変換フィルタを起動するようにしたいと思うかもしれません。 ここでは file コマンドのようなツールを役立たせることができます。 もちろん、いくつかの ファイル形式の違いを見分けることは難しいことでしょう。 そして、もちろん、それらのファイルに対しては、 変換フィルタを提供するだけで済ますこともできるのです。

FreeBSD Ports Collection には、apsfilter (print/apsfilter) と呼ばれる自動変換をおこなうテキストフィルタがあります。 このフィルタは プレインテキスト、PostScript®, DVI など、ほとんどすべてのファイル形式を検出し、適当な変換をおこなった後、 データを印字することができます。

==== 出力フィルタ

LPD スプーリングシステムでは、 ここまでにまだ取り上げていないフィルタ形式、 出力フィルタをサポートしています。出力フィルタは、 テキストフィルタのように、 プレインテキストのみを印字するために意図されたものですが、 非常に簡単化されています。テキストフィルタを用いずに、 出力フィルタを使っている場合は、次のようになります。

  • LPD はジョブ中の各ファイルに一度ではなく、 ジョブ全体に対して一度だけ出力フィルタを起動します。

  • LPD は出力フィルタに対し、 ジョブ中のファイルの先頭や末尾を特定するための対策を 一切おこなっていません。

  • LPD はユーザのログイン名やホスト名をフィルタに渡しません。 したがって、課金の処理をおこなうことは考えていません。 実際、出力フィルタには、以下2つの引数しか与えられません。

    filter-name -wwidth -llength

    ここで、width は対象となるプリンタの pw 項目、 lengthpl 項目に指定された数です。

出力フィルタの簡便さに誘惑されてはいけません。もし、 ジョブ中のそれぞれのファイルに別のページ番号を付加しようとしても、 出力フィルタはうまく動作しないでしょう。 そのような動作を期待しているならば、 (入力フィルタとしても知られている) テキストフィルタを使ってください。 詳しくは、「テキストフィルタのインストール」をご覧ください。 さらに、出力フィルタは、実のところ、 もっと複雑になっています。まず、 特殊なフラグ文字を検出するために、 フィルタに送られてくるバイトストリームを検査する必要があります。 また、LPD に代わって、 自分自身にシグナルを送らなければなりません。

しかしながら、ヘッダページの印字をおこないたくて、 エスケープシーケンスやヘッダページを印字できるようにするその他の初期化文字列を送信する必要がある場合は、 出力ファイルが必要です。 (しかし、 ヘッダページを要求したユーザに対して課金しようとするのもまた無駄なことです。 LPD は出力フィルタにユーザやホストの情報を渡しません)。

1 台のプリンタに対し、LPD では出力フィルタとテキストやその他のフィルタを両方使うことができます。 このような場合、LPD はヘッダページ (「ヘッダページ」 を参照してください) だけを印字させるために、出力フィルタを起動させます。 それから LPD では、出力フィルタに 2 バイトの文字 (ASCII 031 の次に ASCII 001) を送ることで、 出力フィルタが自分自身を停止することを期待しています。 2 バイト (031, 001) が出力フィルタに送られたとき、 出力フィルタは自分自身にシグナル SIGSTOP を送ることによって停止するはずです。 LPD がその他のフィルタを動かし終わると、 出力フィルタにシグナル SIGCONT を送って、出力フィルタを再起動します。

出力フィルタがあり、 テキストフィルタがない場合、 LPD はプレインテキストジョブを扱う場合に、 出力フィルタを使います。前述したように、出力フィルタでは、 ジョブ中の各ファイルの間に FORM FEED 文字や紙を送る他の文字を入れることはしません。 この動作は多分、 あなたが求めているものとは異なっているでしょう。 ほとんどの場合において、テキストフィルタが必要なはずです。

プログラム lpf は、 テキストフィルタの項で既に紹介しましたが、 出力フィルタとしても動作させることができます。もし、 簡便で極悪な出力フィルタが必要で、かつ、 バイトストリームを検査したりシグナルを送るコードを書きたくないときには、 lpf をお試しください。 あるいは、プリントが要求する初期化コードを送るために、 lpf をシェルスクリプトに包んで使うこともできます。

==== テキストフィルタ lpf

プログラム /usr/libexec/lpr/lpf は、 FreeBSD の バイナリ配布に付属しているテキストフィルタ (入力フィルタ) で、出力を字下げしたり (lpr -i でジョブが入力さ れたとき)、 文字を未処理のままプリンタに送ったり (lpr -l でジョブが入力されたとき)、 ジョブ中のバックスペースやタブの印字位置を調節したり、 印字したページに対して課金したりすることができます。また、 このフィルタは出力フィルタとしても動作させることができます。

lpf フィルタは多くの印字環境において使用することに適しています。 このフィルタには、プリンタに初期化文字列を送る機能はありませんが、 必要とされる初期化をおこない、それから lpf を実行させるためのシェルスクリプトを作成するのはたやすいことです。

lpf に対して、 印字ページへの課金を正確におこなわせるためには、 /etc/printcap ファイルの中の pwpl の項目に正確な値を入れておく必要があります。これらの値は、 どのくらいの量のテキストがページにフィットするか、また、 ユーザのジョブが何ページあるのかを調べるために使われます。 プリンタの課金についての詳しい情報については、「プリンタの利用に対する課金」をご覧ください。

=== ヘッダページ

あなたが管理するシステムのユーザが たくさんおり、 ユーザ全員が様々なプリンタを使用する場合、多分、 必要悪であるヘッダページを 印字させることを検討したいと思うかもしれません。

ヘッダページは、バナー とか バーストページ としても知られていますが、 出力されたジョブが誰によるものなのかを特定させる働きがあります。 印字結果の山の中において、 ユーザのジョブによって印字された本物のドキュメント部分よりも際立たせるために、 ヘッダページは、通常、多分、縁が装飾されている大きな太文字で印字されます。 ヘッダページにより、 ユーザは自分が出したジョブがどこにあるのかをすばやく見つけることができます。 ヘッダページの欠点は、明らかに、すべてのジョブに対して、 紙が 1 枚余分に印字されるということです。 この紙の有効期間は短く、2 ~ 3 分も続きません。最終的に、 これらの紙は再利用紙入れの中かくずの山に入れられることでしょう (ヘッダページはジョブ中の各ファイル毎に印字されるのではなく、 ジョブ毎に印字されるということに注意してください。したがって、 紙の消費はそれほどひどくはないかもしれません)。

もし、 プリンタがプレインテキストを直接印字できるならば、LPD システムは印字物に対して自動的にヘッダページを付けることができます。 PostScript® プリンタを使っている場合は、 ヘッダページを生成する外部プログラムが必要になります。これについては、 「PostScript® プリンタでのヘッダページ」をご覧ください。

==== ヘッダページの印字を許可する

プリンタ設定導入編 」節では、/etc/printcap ファイルの sh (''suppress header'' : "ヘッダを供給しない" という意味) を指定して、 ヘッダページの印字を止めていました。 プリンタでのヘッダページの印字を許可するには、 sh 項目を取り除くだけでよいのです。

とても簡単そうに見えるけど、本当かな?

それは本当です。 プリンタに初期化文字列を送るための 出力フィルタを用意しなくてはならないかもしれません。次に、Hewlett Packard PCL 互換プリンタの例を挙げます。

#!/bin/sh
#
#  hpof - Output filter for Hewlett Packard PCL-compatible printers
#  Installed in /usr/local/libexec/hpof

printf "\033&k2G" || exit 2
exec /usr/libexec/lpr/lpf

of 項目に出力フィルタのパス名を指定してください。 詳細については、「出力フィルタ」節 をご覧ください。

次に、以前紹介したプリンタ teak のための /etc/printcap ファイルの例を示します。ここでは、 ヘッダページの印字を許可し、上記の出力フィルタを追加しました。

#
#  /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
        :if=/usr/local/libexec/hpif:\
        :vf=/usr/local/libexec/hpvf:\
        :of=/usr/local/libexec/hpof:

さて、ユーザが teak からジョブを印字させたとき、 それぞれのジョブ毎にヘッダページが印字されます。 もし、ユーザが印字物を探すのに時間を費やしたいと思うなら、 lpr -h によってジョブを入力することで、 ヘッダページの印字を止めることができます。 これ以外の lpr(1) のオプションについては、 「ヘッダページ用オプション」節をご覧ください。

LPD では、ヘッダページの最後に、 FORM FEED 文字が印字されます。 プリンタに紙排出をさせるために、別な文字、 もしくは、別な文字列が利用されている場合は、 /etc/printcap 中の ff 項目で指定することができます。

==== ヘッダページを制御する

ヘッダページの印字が許可されていると、LPD は 長いヘッダを作ります。これには、 紙全面に大きな文字でユーザ名、ホスト名、 ジョブ名が書かれています。次に、このヘッダページの例を示 します (kelly がジョブ名 "outline" を rose というホストから印字 された場合)。

      k                   ll       ll
      k                    l        l
      k                    l        l
      k   k     eeee       l        l     y    y
      k  k     e    e      l        l     y    y
      k k      eeeeee      l        l     y    y
      kk k     e           l        l     y    y
      k   k    e    e      l        l     y   yy
      k    k    eeee      lll      lll     yyy y
                                               y
                                          y    y
                                           yyyy

                                   ll
                          t         l        i
                          t         l
       oooo    u    u   ttttt       l       ii     n nnn     eeee
      o    o   u    u     t         l        i     nn   n   e    e
      o    o   u    u     t         l        i     n    n   eeeeee
      o    o   u    u     t         l        i     n    n   e
      o    o   u   uu     t  t      l        i     n    n   e    e
       oooo     uuu u      tt      lll      iii    n    n    eeee

      r rrr     oooo     ssss     eeee
      rr   r   o    o   s    s   e    e
      r        o    o    ss      eeeeee
      r        o    o      ss    e
      r        o    o   s    s   e    e
      r         oooo     ssss     eeee

                                              Job:  outline
                                              Date: Sun Sep 17 11:04:58 1995

LPD はこのテキストの終わりに FORM FEED 文字を加えます ので、ジョブは新しいページから開始されます (ただし、 /etc/printcap で出力先のプリンタのエントリに sf (suppress form feeds) が指定されているときはこ の限りではありません)。

お望みならば、LPD に短いヘッダページを出力させることもできます。 この場合は、 /etc/printcap ファイルの中で sb (short banner) を指定してください。 ヘッダページは次のようになります。

rose:kelly  Job: outline  Date: Sun Sep 17 11:07:51 1995

デフォルトでは、LPD はヘッダページを最初に印字し、次にジョブの印字をおこないます。 この順番を逆にするときは、 /etc/printcaphl (header last) を指定してください。

==== ヘッダページに対する課金

LPD に備わっているヘッダページ出力機能を使うと、 入力されたジョブに対して課金をおこなうことができても、 ヘッダページは無料で提供しなくてはならない、 という特有のやり方を強要されます。

なぜでしょうか。

出力フィルタは単なる外部プログラムなので、 課金をするための制御をおこなうとすれば、 それはヘッダページを印字するときですが、出力フィルタには、 ユーザ名とホスト名 の情報や課金情報を格納するファイルがどれな のかということが知らされません。それゆえ、出力ファイルには、 誰にプリンタ利用の課金をおこなえばよいのかが分からないのです。 テキストフィルタやその他の変換フィルタ (これらのフィルタはユーザやホストの情報が知らされます) が出力ページの枚数に "1 ページ分水増しする" だけでは十分ではありません。 なぜなら、ユーザは lpr -h に よってヘッダページの出力を止めることができるからです。 やみくもに 1 ページを水増しすると、 印字されてもいないヘッダページに対する 料金をとることになります。基本的に、lpr -h は環境に優しい心を持つユーザに好まれるオプションですが、 これを使うように奨励することもできません。

各々のフィルタに独自のヘッダページを生成させる (その結果、ヘッダページに課金することができる) という方法でも十分であるとはいえません。 この場合、LPD はフィルタに -h の情報を送りませんので、lpr -h によってヘッダページを印字しないオプションを選択したとしても、 依然としてヘッダページは印字され、 その分の課金がおこなわれてしまいます。

では、どのような選択肢があるのでしょうか。

ヘッダページへの課金に関しては、 次のことができます。

  • LPD のやり方を受け入れ、 ヘッダページは無料とする。

  • LPRng などの LPD の代替品をインストールする。 LPD と入れ替えが可能な他のスプーリングソフトウェアに関しては、 標準スプーラの代替品 をご覧ください。

  • スマートな 出力フィルタを作成する。通常、 出力フィルタはプリンタを初期化するか、 単純な文字列変換をする程度の働きしかしません。 (テキスト (入力) フィルタがない場合) 出力フィルタはヘッダページとプレインテキストの印字をおこなうのに適しています。 プレインテキストを印字するためのテキストフィルタがない場合、 LPD はヘッダページを印字するためだけの目的で出力フィルタを起動します。 そして、LPD が生成するヘッダページのテキストを解析することにより、 出力フィルタはヘッダページに課金するために必要なユーザ名と ホスト名を取得することができます。この方式の唯一の問題点は、 出力フィルタは課金情報を格納するデータファイルの名前を知ることが できないということです (af 項目で指定されたファイル名は 出力ファイルに渡されません)。しかし、既知の 名前の課金データファイルを使うのならば、 その名前を出力フィルタのプログラム中に埋め込むことができます。 解析の手順を簡単にするためには、 /etc/printcapsh 項目 (短いヘッダを指定) を使うとよいでしょう。 そしてまた、 ここまでの方法は少なからぬトラブルを生じさせるかもしれません。 そうなれば、もちろんユーザはヘッダページを無料で 提供してくれる気前のよいシステム管理者に感謝することでしょう。

==== PostScript® プリンタでのヘッダページ

これまでに述べたように、LPD ではプレインテキストのヘッダページをたくさんのプリンタに合うように生成することができます。 残念ながら、PostScript® プリンタは、 プレインテキストを直接印字することができません。ですから、 LPD のヘッダページ機能はまったく、 あるいはほとんどの場合、役に立ちません。

ヘッダページを出力するための自明な方法の1つに、 すべての変換フィルタとテキストフィルタにヘッダページを生成させる方法があります。 フィルタは、 適切なヘッダページを生成するために、 ユーザ名とホスト名の引数を使うべきです。この方法の欠点は、いつでも、 lpr -h によってジョブが入力された場合でさえも、 ヘッダページが印字されるということです。

この方法で試してみましょう。次のスクリプトは、3 つの引数 (ユーザ のログイン名、ホスト名、ジョブ名) をとり、簡単な PostScript® 用 のヘッダページを生成します。

#!/bin/sh
#
#  make-ps-header - make a PostScript header page on stdout
#  Installed in /usr/local/libexec/make-ps-header
#

#
#  These are PostScript units (72 to the inch).  Modify for A4 or
#  whatever size paper you are using:
#
page_width=612
page_height=792
border=72

#
#  Check arguments
#
if [ $# -ne 3 ]; then
    echo "Usage: `basename $0` <user> <host> <job>" 1>&2
    exit 1
fi

#
#  Save these, mostly for readability in the PostScript, below.
#
user=$1
host=$2
job=$3
date=`date`

#
#  Send the PostScript code to stdout.
#
exec cat <<EOF
%!PS

%
%  Make sure we do not interfere with user's job that will follow
%
save

%
%  Make a thick, unpleasant border around the edge of the paper.
%
$border $border moveto
$page_width $border 2 mul sub 0 rlineto
0 $page_height $border 2 mul sub rlineto
currentscreen 3 -1 roll pop 100 3 1 roll setscreen
$border 2 mul $page_width sub 0 rlineto closepath
0.8 setgray 10 setlinewidth stroke 0 setgray

%
%  Display user's login name, nice and large and prominent
%
/Helvetica-Bold findfont 64 scalefont setfont
$page_width ($user) stringwidth pop sub 2 div $page_height 200 sub moveto
($user) show

%
%  Now show the boring particulars
%
/Helvetica findfont 14 scalefont setfont
/y 200 def
[ (Job:) (Host:) (Date:) ] {
200 y moveto show /y y 18 sub def
} forall

/Helvetica-Bold findfont 14 scalefont setfont
/y 200 def
[ ($job) ($host) ($date) ] {
        270 y moveto show /y y 18 sub def
} forall

%
%  That is it
%
restore
showpage
EOF

そして、変換フィルタやテキストフィルタがそれぞれ、 最初にこのスクリプトを起動することで、 ヘッダページが出力され、それから、 ユーザのジョブの印字をおこないます。次に、 このドキュメントの始めのほうで紹介した DVI 変換フィルタを、 ヘッダページを印字するように変更したものを示します。

#!/bin/sh
#
#  psdf - DVI to PostScript printer filter
#  Installed in /usr/local/libexec/psdf
#
#  Invoked by lpd when user runs lpr -d
#

orig_args="$@"

fail() {
    echo "$@" 1>&2
    exit 2
}

while getopts "x:y:n:h:" option; do
    case $option in
        x|y)  ;; # Ignore
        n)    login=$OPTARG ;;
        h)    host=$OPTARG ;;
        *)    echo "LPD started `basename $0` wrong." 1>&2
              exit 2
              ;;
    esac
done

[ "$login" ] || fail "No login name"
[ "$host" ] || fail "No host name"

( /usr/local/libexec/make-ps-header $login $host "DVI File"
  /usr/local/bin/dvips -f ) | eval /usr/local/libexec/lprps $orig_args

このフィルタがユーザ名やホスト名を決定するために 引数リストをどのように解析しなくてはならないかという点に注意してください。 この解析方法は他の変換フィルタに対しても同様です。 しかしながら、テキストフィルタについては、 引数の設定が少し異なっています (これについては、「フィルタはどのように機能しているか」 をご覧ください)。

前述の通り、上記の手法は、極めて単純なのにも関らず、 lpr で "ヘッダページを印字しない" オプション (-h オプション) が使えなくなっています。 ユーザが森林資源を (あるいは、 ヘッダページが課金されているならば、その僅かな金額を)、 節約したいと望んでいる場合でも、 すべてのフィルタがすべてのジョブ毎にヘッダページを印字 することになっているので、節約することはできません。

ジョブ毎に印字されるヘッダページを ユーザが抑制できるようにするためには、「ヘッダページに対する課金」で紹介したトリックを 使う必要があります。すなわち、LPD が生成するヘッダページの解析をおこない、PostScript® 版のヘッダページを出力させる出力フィルタを作るのです。 この場合、ユーザが lpr -h でジョブを入力すると、 LPD はヘッダページを生成しなくなり、また、 出力フィルタも起動されません。そうでないならば、 作成した出力フィルタが LPD からのテキストを読み込み、ヘッダページを印字する適当な PostScript® のコードがプリンタに送られるでしょう。

PostScript® プリンタがシリアルポートに接続されている場合、 出力フィルタとして lprps を、 上記の動作をおこなうものとして psof を使うことができます。ただし、psof はヘッダページに対して課金をおこないませんので注意してください。

=== リモートプリンタからの出力

FreeBSD では、ネットワーク越しの印字、すなわち、 ジョブをリモートプリンタに送ることをサポートしています。 リモートプリンタからの出力をするには、一般に、 次の 2 つを参照してください。

  • リモートホストに接続されたプリンタにアクセスする方法。 プリンタがあるホストのシリアル、 または、パラレルインタフェースに接続されている場合、 ネットワーク上の他のホストからこのプリンタにアクセスできるように LPD を設定します。「リモートホストに 接続されたプリンタ」 でどのようにするかを説明します。

  • ネットワークに直接接続されているプリンタにアクセスする方法。 プリンタに、旧来のシリアル、または、 パラレルインタフェースに加えて (もしくは、これらに代わって) ネットワーク用のインタフェースがある場合。 そのようなプリンタは次のように動作するでしょう。

    • そのプリンタが LPD のプロトコルを理解でき、リモートホストからのジョブを キューに入れることさえできる場合。この場合、 プリンタは、LPD が起動している一般のホストのように振る舞います。 そのようなプリンタを設定するために、 「リモートホストに接続されたプリンタ」 と同様の手順をおこなってください。

    • そのプリンタが、 データストリームによるネットワーク接続をサポートしている場合。 この場合、ネットワーク上の1つのホストとしてプリンタを "接続" します。 このホストは、ジョブをスプーリングする責任を負い、 スプーリングされたジョブはプリンタに送られます。 そのようなプリンタをインストールするためのいくつかの提案が 「ネットワークにおけるデータストリームの インタフェースを持つプリンタ」にあります。

==== リモートホストに接続されたプリンタ

LPD スプーリングシステムでは LPD (または LPD 互換のシステム) が起動している他のホストへジョブを送る機能が 始めからサポートされています。この機能により、 あるホストに接続されたプリンタへ、 他のホストからアクセスできるようになります。また、 LPD プロトコルを理解するネットワークインタフェースを持ったプリンタに対しても、 この機能は働きます。

リモートプリンタへの出力を許可するためには、最初に、 あるホスト (これを、 プリンタホストと呼びます) にプリンタを接続します。そして、「プリンタ設定導入編」 に書かれた簡単なプリンタの設定をおこなってください。 必要ならば、「プリンタ設定上級編」 にある、更に進んだ設定をおこなってください。そして、 そのプリンタをテストしてうまく動作することを確認し、LPD に許可した機能がうまく働くかどうかを見てください。さらに ローカルホストプリンタホストの LPD サービスの使用を許可されているか確認して下さい (「リモートホストからの利用を制限する 」参照)。

LPD 互換のネットワークインタフェースを持つプリンタを使用している場合は、 そのプリンタ自身が以下で説明する プリンタホストになります。そして、 プリンタ名とは、 そのプリンタに設定した名前のことを指します。 これについては、プリンタ、および (または)、 プリンタのネットワークインタフェースに付属するドキュメントを参照してください。

ヒューレット・パッカード社の Laserjet シリーズを使用している場合には、 プリンタ名を text とすると、 自動的に LF から CRLF への変換が行なわれます。 そのため、hpif スクリプトは必要ありません。

次に、 そのプリンタにアクセスしたいと思っている他ホストにおいて、 そのホストの /etc/printcap ファイルに次にあげるエントリを作ります。

  1. 名前のエントリ。どんな名前でもよいのですが、簡単のため、多分、 プリンタホストで設定されたプリンタ名や別名と同じものを使いたいと思うでしょう。

  2. lp 項目で指定されるデバイスは明示的に空にします (:lp=: とします)。

  3. スプーリングディレクトリを作成し、 sd 項目でその位置を指定します。 LPD では、プリンタホストにジョブを送信するまでの間、 このディレクトリにジョブを格納します。

  4. rm 項目でプリンタホストの名前を指定します。

  5. rp 項目で プリンタホストに接続したプリンタ名を指定します。

これで終わりです。 変換フィルタやページの大きさやその他の事項を /etc/printcap に加える必要はありません。

次に、 リモートホストに接続されたプリンタで印字するための設定例を示します。 ホスト rose には 2 台のプリンタ bamboorattan が接続されています。これらのプリンタをホスト orchid のユーザが使えるようにしましょう。最初に orchid/etc/printcap を示します (このファイルは、「ヘッダページの出力を許可する」 で参照することができます)。このファイルには、既に、プリンタ teak 用のエントリがありました。以下では、 これに、ホスト rose にある2台のプリンタ用のエントリが加えられています。

#
#  /etc/printcap for host orchid - added (remote) printers on rose
#

#
#  teak is local; it is connected directly to orchid:
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
        :if=/usr/local/libexec/ifhp:\
        :vf=/usr/local/libexec/vfhp:\
        :of=/usr/local/libexec/ofhp:

#
#  rattan is connected to rose; send jobs for rattan to rose:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:

#
#  bamboo is connected to rose as well:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:

orchid で必要となる作業はスプーリングディレクトリを作ることだけです。

# mkdir -p /var/spool/lpd/rattan /var/spool/lpd/bamboo
# chmod 770 /var/spool/lpd/rattan /var/spool/lpd/bamboo
# chown daemon:daemon /var/spool/lpd/rattan /var/spool/lpd/bamboo

これで、orchid のユーザが rattanbamboo で印字することができるようになりました。 たとえば、orchid のユーザが次のように入力したとします。

% lpr -P bamboo -d sushi-review.dvi

すると、orchid の LPD システムは、 ジョブをスプーリングディレクトリ /var/spool/lpd/bamboo にコピーし、これが DVI ファイルを印字するジョブであることを記録します。 ホスト rosebamboo スプーリングディレクトリに十分な容量が確保でき次第、 両者の LPD は、ジョブのファイルを rose に転送します。 このファイルは、そのすべてが印字されるまで、rose のキューに留まります。 (bamboo は PostScript® プリンタなので) DVI から PostScript® への変換は rose でおこなわれます。

==== ネットワークにおけるデータストリームの インタフェースを持つプリンタ

プリンタのネットワークインタフェースカードは、 2 種類に分類することができます。 1 つはスプーラをエミュレートするもの (高価) で、もう 1 つはシリアルやパラレルポートを使うように プリンタにデータを送ることができるだけのもの (安価) です。この節では、 後者の使い方を説明します。前者のプリンタは、前節「リモートホストに接続されたプリンタ」 の方法が適用できます。

/etc/printcap ファイルでは、 シリアルかパラレルのインタフェースのどちらを使うのか、 そして、(シリアルインタフェースを使う場合) そのボーレートはいくらであるか、フロー制御は使うのか、 タブのための遅延を加えるのか、 改行文字を変換するかなどの指定をおこなうことができます。 しかし、TCP/IP や他のネットワークポートからデータを受け取るプリンタを 接続するための指定をおこなうことはでき ません。

ネットワーク接続されたプリンタにデータを送るためには、 テキストフィルタと変換フィルタから呼び出すことができる 通信プログラムを開発する必要があります。以下に、 そのようなプログラムの例を示します。スクリプト netprint では、 標準入力から印字データをすべて受け取り、 ネットワーク接続されたプリンタにこれを送ります。 netprint の最初の引数でプリンタのホスト名を、 2 番目の引数で接続するポート番号を指定します。 このプログラムでは単方向通信 (FreeBSD からプリンタ) のみをサポートしていることに注意してください。 ネットワークプリンタの多くは双方向通信をサポートしていますので、 その恩恵 (プリンタの状態を得たり、 課金をおこなうなど) にあずかりたいと思われるかもしれません。

#!/usr/bin/perl
#
#  netprint - Text filter for printer attached to network
#  Installed in /usr/local/libexec/netprint
#

$#ARGV eq 1 || die "Usage: $0 <printer-hostname> <port-number>";

$printer_host = $ARGV[0];
$printer_port = $ARGV[1];

require 'sys/socket.ph';

($ignore, $ignore, $protocol) = getprotobyname('tcp');
($ignore, $ignore, $ignore, $ignore, $address)
    = gethostbyname($printer_host);

$sockaddr = pack('S n a4 x8', &AF_INET, $printer_port, $address);

socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol)
    || die "Can't create TCP/IP stream socket: $!";
connect(PRINTER, $sockaddr) || die "Can't contact $printer_host: $!";
while (<STDIN>) { print PRINTER; }
exit 0;

このスクリプトは、 様々なフィルタが利用することができます。仮に、Diablo 750-N ラインプリンタを持っており、 これがネットワークに接続されているとしましょう。 プリンタはポート番号 5100 にて印字するデータを受け取ります。 プリンタのホスト名は scrivener とします。このとき、 このプリンタのテキストフィルタは次のようになります。

#!/bin/sh
#
#  diablo-if-net - Text filter for Diablo printer `scrivener' listening
#  on port 5100.  Installed in /usr/local/libexec/diablo-if-net
#

exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100

=== プリンタの利用に制約を与える

本節では、プリンタの利用に制約を与えるための情報を記しています。 LPD システムでは、プリンタ (ローカル、 リモートのいずれに接続されていても) にアクセスできる人を制限する機能、 複数部のコピーの印字の可否を制御する機能、 ジョブのサイズの最大値やプリンタキューに入る ジョブの最大個数を制御する機能を提供しています。

==== 複数部のコピーの印字を制限する

LPD システムではユーザが複数部のコピーの印字を簡単におこなう 機能を提供しています。ユーザが、(たとえば) lpr -#5 コマンドを使ってジョブを印字すると、 ジョブのそれぞれのファイルのコピーを 5 部得ることができます。 これがよい機能であると思うかどうかは人それぞれでしょう。

複数部のコピーの印字によってプリンタが 必要以上に消耗してしまうと感じるならば、 /etc/printcap ファイルに sc 項目を加えてください。これにより、 lpr(1)- オプションの使用が禁止されます。 このオプションが指定されているにも関らず、 - オプションを使うと、 次のようなメッセージが表示され、 このオプションの利用できない旨を伝えます。

lpr: multiple copies are not allowed

リモートホストからプリンタをアクセスできる 設定にしている場合 (この 設定については、「リモートホストに接続されたプリンタ」 をご覧ください)、そのリモートホストの /etc/printcap にも同じように sc 項目を追加する必要があることに注意してください。 そうしないと、ユーザは別なホストから複数部のコピーの 印字をすることができてしまいます。

例を使って説明しましょう。次に示す /etc/printcap ファイルは、ホスト rose のものです。プリンタ rattan は極めて頑丈なので、 複数部のコピーの印字は許可されています。しかし、 レーザプリンタの bamboo はもう少しデリケートで、 このプリンタから複数部のコピーを印字することを sc 項目を追加することで禁止しています。

#
#  /etc/printcap for host rose - restrict multiple copies on bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:sc:\
        :lp=/dev/ttyu5:ms#-parenb cs8 clocal crtscts:rw:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:

さらに、orchid の /etc/printcap にも

sc

項目を追加する必要があります (orchid でこの編集をおこなっているときに、ついでに、プリンタ teak でも複数部のコピーの印字を禁止することにしましょう)。

#
#  /etc/printcap for host orchid - no multiple copies for local
#  printer teak or remote printer bamboo

teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:sc:\
        :if=/usr/local/libexec/ifhp:\
        :vf=/usr/local/libexec/vfhp:\
        :of=/usr/local/libexec/ofhp:

rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:sc:

sc 項目を指定することにより、 lpr -# の使用を防ぐことができます。しかし、この状態では lpr(1) を複数回起動したり、 1 回のジョブで次のように同じファイルを複数個指定することを防ぐまでには至っていません。

% lpr forsale.sign forsale.sign forsale.sign forsale.sign forsale.sign

このような悪用を防ぐ方法は (その指示を無視することも含めて) たくさんあります。 各自で調べてみてください。

==== プリンタを使用できる人を限定する

それぞれのプリンタを使用できる人を限定するには、UNIX® の グループ権限のメカニズムを利用し、さらに、 /etc/printcaprg 項目を指定することでおこないます。 あるプリンタにアクセスさせてもよいと思うユーザすべてを グループのどれかに入れてください。そして、 そのグループ名を rg で指定します。

このとき、そのグループに含まれないユーザ (root も含みます) がプリントしようとすると、次のようなメッセージが表示されます。

lpr: Not a member of the restricted group

sc (suppress multiple copies : 複数部のコピーの印字を禁止する) を指定するときと同様に、rg が指定されたプリンタがリモートホストからもアクセスでき (この設定については、 「リモートホストに接続されたプリンタ」 をご覧ください)、かつ、 そのホストでもプリンタを使用できる人を限定するのが 妥当であると思う場合は、 そのホストの /etc/printcap にも rg 指定をおこなう必要があります。

たとえば、プリンタ rattan は誰でも利用できるが、bamboo はグループ artists に属している人のみが利用できるようにしてみましょう。 以下に、もうお馴染みとなったホスト rose/etc/printcap を示します。

#
#  /etc/printcap for host rose - restricted group for bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:\
        :lp=/dev/ttyu5:ms#-parenb cs8 clocal crtscts:rw:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:

これ以外の /etc/printcap ファイル (ホスト orchid のもの) はそのままにしておくことにします。もちろん、 orchid のユーザは全員 bamboo を利用することができます。これは、 orchid には特定のユーザのみにしかアクセスさせておらず、 そのユーザにはプリンタを利用させたいと思っているからなのかもしれませんし、 そうでないかもしれません。

1台のプリンタを複数グループのユーザに利用させることはできません。

==== 入力可能なジョブのサイズを制限する

たくさんのユーザからプリンタが利用される場合には、多分、 ユーザが印字要求を出すことができるファイルのサイズに 上限値を置く必要が生じるでしょう。結局のところ、 スプーリングディレクトリ が置かれているファイルシステムの空き容量がその 上限値になる訳ですが、 あるユーザがこれを独占的に使用すること避けるために、 他ユーザからのジョブ用の空き容量を確保する必要もあります。

LPD では、mx 項目を指定することにより、 ジョブ中の個々のファイルのサイズの上限値を制限する機能を提供しています。 指定される ファイルサイズの単位は BUFSIZ ブロックで、1 BUFSIZ ブロックは 1024バイトを表わします。この mx 項目の値として 0 が指定されると、 ファイルサイズの制限はなくなります。 mx が指定されない場合は、 デフォルトの制限として 1000 ブロックが使われます。

この制限はジョブ中の各 ファイルに対して適用されるものであり、 ジョブ全体のサイズ を制限するものではありません

ところで、 プリンタに設定された上限値を超えるファイルサイズの ファイルが入力された場合でも、LPD はこれを拒否しません。その代わりに、このファイルは、 その先頭から上限値のファイルサイズまでしかキューに入れられません。 そして、その部分までが印字され、 残りの部分は捨てられます。 これが正しい動作といえるのかどうかは議論の余地があるところです。

それでは、設定例に登場しているプリンタ rattanbamboo の印字可能なファイルサイズに制限を加えてみましょう。 artists グループの人達が作る PostScript® ファイルのサイズは 巨大になる傾向があるので、上限値を 5M バイトとします。 それから、 プレインテキスト用のラインプリンタは無制限とします。

#
#  /etc/printcap for host rose
#

#
#  No limit on job size:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:mx#0:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

#
#  Limit of five megabytes:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
        :lp=/dev/ttyu5:ms#-parenb cs8 clocal crtscts:rw:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:

この場合もそうですが、この制限はローカル (ホスト rose) のユーザのみに適用されます。 リモートホストからプリンタを利用できるように設定している場合は、 そのリモートホストのユーザはこの制限を受けません。 これらのユーザにも制限を加える場合は、リモートホストの /etc/printcapmx を指定する必要があります。 リモートホストから印字するための詳しい情報については、 「リモートホストに接続されたプリンタ」 を参照してください。

リモートホストに接続されたプリンタへのジョブの サイズを制限する特別な方法は他にもあります。これについては、 「リモートホストからの利用を制限する」 を参照してください。

==== リモートホストからの利用を制限する

LPD スプーリングシステムでは、 リモートホストから要求されたジョブの印字を制限するための方法がいくつか提供されています。

ホストの制限

ローカルの LPD が印字要求を受け付けるリモートホストは、ファイル /etc/hosts.equiv/etc/hosts.lpd によって制御することができます。LPD では、あるホストから印字の要求がきたとき、 このホストの名前がこれら 2 つのファイルのどちらかに含まれている かどうかを調べます。これが含まれていない場合は、LPD はこの要求を拒否します。

これらのファイルの形式は単純です。 各行にホストの名前を 1つずつ書いていきます。ファイル /etc/hosts.equiv の方は ruserok(3) プロトコルでも利用され、 rsh(1)rcp(1) といったプログラムの動作に影響するので注意が必要です。 /etc/hosts.equiv の記述は慎重におこないましょう。

例として、以下にホスト rose/etc/hosts.lpd を示します。

orchid
violet
madrigal.fishbaum.de

この例では、rose はホスト orchid, violet そして madrigal.fishbaum.de からの要求を受け付けることになります。 その他のホストが rose の LPD にアクセスしようとしても、 LPD はそのジョブを拒否します (訳注: 拒否されるのは、そのホストが /etc/hosts.equiv にも含まれていない場合です)。

サイズの制限

スプーリングディレクトリがある ファイルシステムに残しておく必要がある 空き容量の大きさを制御することができます。 ローカルプリンタ用のスプーリングディレクトリに minfree という名前のファイルを作成します。そして、 そのファイルの中にリモートホストからのジョブの 要求を受け付けるために必要な空き容量のディスクブロックサイズ (1 ディスクブロック = 512 バイト) を記します。

これで、 リモートホストのユーザにファイルシステムを満杯にされないことが保証されます。 この機能を使うと、 ローカルホストのユーザに対してある種の優先権を与えることもできます。 ローカルホストのユーザは、 minfree ファイルで指定された値よりもディスクの空き容量が下回った後でもずっと、 ジョブをキューに入れることができるのです。

たとえば、プリンタ bamboo 用の minfree を作ってみましょう。 このプリンタのスプーリングディレクトリを調べるために、 /etc/printcap を調べてみましょう。 以下に、bamboo のエントリ部分を示します。

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
        :lp=/dev/ttyu5:ms#-parenb cs8 clocal crtscts:rw:mx#5000:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:

スプーリングディレクトリは sd 項目で指定されます。LPD がリモートホストからのジョブを受け付けるために必要な ファイルシステムの空き容量を 3M バイト (= 6144 ディスクブロック) にすることにしましょう。

# echo 6144 > /var/spool/lpd/bamboo/minfree
利用ユーザの制限

/etc/printcaprs 項目を指定することで、 ローカルプリンタを利用できるリモートホストのユーザを制限することができます。 ローカルホストに接続されたプリンタ用のエントリに rs 項目が指定されている場合、 LPD は、印字を要求したユーザのアカウントと同じログイン名が ローカルホストに登録されている場合に限り、 そのジョブを受け付けます。それ以外のジョブを LPD は拒否します。

この機能は、(たとえば) 複数の部署がネットワークを共有しており、 この内のあるユーザが部署の境界を越えて活動している場合には特に有用です。 そのようなユーザに対して、システムのアカウントを与えるだけで、 これらのユーザは自分が所属する部署のシステムから そのシステムに接続されているプリンタを使用することができます。 これらのユーザにはむしろ、 プリンタの使用だけを認め、 その他のコンピュータ資源を利用させたくないときは、 それらのユーザにはホームディレクトリを与えず、 ログインシェルはシェルとしては何の役にも立たない /usr/bin/false などを指定して、 これらのユーザのアカウントはプリンタ用の "形式的な" ものとします。

=== プリンタの利用に対する課金

という訳で、印字するためには料金をとることが必要です。 取らない理由などありましょうか。紙やインクにはお金がかかります。 そして、プリンタの維持費もかかります。 プリンタには可動部分が搭載されており、 これらの部分は壊れやすいという傾向があります。 プリンタや、その利用形態、維持費について調査をし、1 ページ (1 フィート、1 メートルなど) 当たりにかかるコストを調べておいてください。 これに基づき、プリンタの利用に対する課金を、実際に、 どのように始めればよいのでしょうか。

さて、残念ながら、この部分に関しては LPD スプーリングシステムはほとんど役に立ちません。 課金は使用しているプリンタの種類、印字するもののファイルの形式、 プリンタの利用に対する課金での あなた自身の要求に大きく左右されます。

課金システムを実現するためには、プリンタのテキストフィルタ (プレインテキストのジョブに対して課金するため) と変換フィルタ (その他のファイル形式に対して課金するため) を変更して、 印字したページを数えたり、 プリンタに印字したページ数を取得するための要求を送る必要があります。 ただし、出力フィルタのみを利用している場合は、 課金をおこなうことができません。フィルタに関しては、 「フィルタ」をご覧ください。

一般に、課金方式には次の 2 つがあります。

  • 定期的に課金する方法 はよく利用される方法です。この理由は、 恐らく比較的簡単に実現できるからです。 誰かがジョブを印字する度に、フィルタはそのユーザ名、 ホスト名、印字したページ数を課金データファイルに記録します。 毎月、毎学期、毎年、その他お好みの時期に、 各プリンタの課金用ファイルを集め、 それぞれのユーザが印字したページ数を合計して その分の課金をおこないます。 次回の課金期間をデータを 0 にして課金を再開するために、 すべてのログファイルを削除します。

  • 利用毎に課金する方法 はあまり利用されていません。これは、 実現するのが比較的難しいからです。この方式では、 プリンタを使用したらすぐに、 フィルタがユーザにその利用に対する課金をおこないます。 ディスククォータのように、課金作業は瞬時におこなわれます。 この方式では、ユーザのアカウントが赤字になる場合に、 ユーザが印字をおこなうことを拒否することができます。 また、ユーザに "プリンタ版 quota" を調べたり、 調整したりする方法を提供したいと思うかもしれ ません。 これを実現するためには、ユーザとその quota を追跡するために、 あるデータベース用のコードが必要となります。

LPD スプーリングシステムでは、 どちらの方式にも簡単に対応できます。(ほとんどの場合は) フィルタを用意しなければならないので、 課金作業のためのコードも用意しなければなりません。 しかし、明るい面もあります。 それは、課金方式に関して、非常に大きな柔軟性が与えられたということです。 たとえば、「定期的に課金する方法」か、 「利用毎に課金する方法」のどちらかを選びまず、そして、 どんな情報 (ユーザ名、ホスト名、ジョブのタイプ、印字された頁数、 使用した紙の大きさ、印字をするために要した時間など) をログに記録するかを決めます。 以上のことをおこなうには、上記の情報を保持するために、 フィルタを変更しなくてはなりません。

==== 手軽なプリンタ課金方法

FreeBSD には、「定期的に課金する方法」による課金を すぐに設定できるように、2 個のプログラムを添付しています。 その内の1つはテキストフィルタ lpf で、 これについては、「テキストフィルタ lpf」をご覧ください。もう1つは、 pac(8) で、 これはプリンタの課金データファイルからのエントリを集め、 これを合計するプログラムです。

フィルタはどのように機能しているか」で述べたように、 LPD ではテキストフィルタや変換フィルタを起動しますが、 そのコマンドラインで使用している課金データファイルの名前が指定されます。 両フィルタはこの引数を使って、 どの課金データファイルのエントリに書き込めばよいのかを知ることができます。 このファイルの名前は /etc/printcap 中の af 項目によって指定されます。 このファイルが絶対パ スで指定されない場合は、 スプーリングディレクトリからの相対パスとして扱われます。

LPD は、紙のページの幅と行数 (pwpl 項目で 指定される) を引数として lpf を起動します。lpf フィルタでは、 何ページ印字したかを決定するためにこれらの引数を使用します。 ファイルをプリンタに送った後、 課金情報を課金データファイルに書き込みます。 このファイルは次のようになります。

2.00 rose:andy
3.00 rose:kelly
3.00 orchid:mary
5.00 orchid:mary
2.00 orchid:zhang

課金データファイルはプリンタ毎に分けて作るべきです。 これは、lpf にはファイルをロックする機構が組み込まれていないためです。 したがって、lpf が 2 つ起動されたとき、 同じファイルに同時に書き込みをおこなった場合、 お互いのエントリを破壊してしまうかもしれません。 課金用ファイルを各プリンタ毎に確実に分けるには、 /etc/printcap 中の af=acct 項目を使います。 そうすれば、それぞれの課金用ファイルがプリンタのスプーリングディレクトリに、 acct という名称で作成されます。

プリンタの利用に対してユーザに課金する準備ができたら、 pac(8) プログラムを実行してください (課金したいプリンタのスプーリングディレクトリに移動した後、 pac と入力してください)。 次のような、ドル中心主義の課金リストが表示されます (訳注: ドル中心主義という表現は、 表示がドルで出ることへの著者の皮肉でしょう。 セントがあるので小数点以下が表示されますが、 この機能も日本では邪魔ですね)。

  Login               pages/feet   runs    price
orchid:kelly                5.00    1   $  0.10
orchid:mary                31.00    3   $  0.62
orchid:zhang                9.00    1   $  0.18
rose:andy                   2.00    1   $  0.04
rose:kelly                177.00  104   $  3.54
rose:mary                  87.00   32   $  1.74
rose:root                  26.00   12   $  0.52

total                     337.00  154   $  6.74

pac(8) が受け付ける引数には次のようなものがあります。

-P printer

プリンタ printer の利用に対する課金リストを作成します。 このオプションは、/etc/printcapaf が絶対パスで指定されていた場合に限り、動作します。

-c

ユーザ名のアルファベット順ではなく、 課金額の低い順にリストを並べます。

-m

課金データファイルにあるホスト名を無視します。 このオプションを使用すると、ホスト alpha のユーザ smith とホスト gamma のユーザ smith は同一人物として扱われます。 このオプションが指定されない場合は、 両者は別なユーザとして扱います。

-p price

/etc/printcappc 項目で指定された値、または、 デフォルトの値 (2 セント) に代わり、紙1ページ、または、 1フィート当たりの価格を指定します。 price として、 浮動小数点数を指定することができます。

-r

リストの並べる順番を逆順にします。

-s

課金リストを作成し、 課金データファイルを削除します。

name…​

ユーザ names に対する課金情報のみを表示します。

pac(8) が生成するデフォルトのリストには、 各ホストのユーザ別に印字ページ数が表示されます。 (ユーザがサイト内のすべてのホストを使用できるため) ホスト名の情報が意味を持たない場合、 pac -m を実行してください。次のようなリストが得られます。

  Login               pages/feet   runs    price
andy                        2.00    1   $  0.04
kelly                     182.00  105   $  3.64
mary                      118.00   35   $  2.36
root                       26.00   12   $  0.52
zhang                       9.00    1   $  0.18

total                     337.00  154   $  6.74

課金額を決めるために、 pac(8)/etc/printcap ファイルの pc 項目で指定された値 (デフォルト値は 200、すなわち 1 ページ当たり 2 セント) を使います。この項目で、印字物に課金したい ファと思う 1 ページ当たり、 または、1 フィート当たりの価格を 100 分の 1 セント単位で指定します。 pac(8)-p オプション付きで起動すると、 この値を置き換えることができます。 この -p オプションで指定する額の単位は、 100 分の 1 セント単位ではなく、ドル単位です。たとえば、次の指定では、 1 ページ当たりの単価が 1 ドル 50 セントになります。

# pac -p1.50

このオプションを使うと、 実際の課金額を集計することができます。

最後に、pac -s を起動すると、課金情報は課金データ累計ファイルに保存されます。 このファイルの名前は、プリンタの課金データファイルの後ろに _sum を付けたものとなります。そして、 課金データファイルは削除されます。次に pac(8) が起動されると、 その時点までの累計金額を得るために、 課金データ累計ファイルが読み込まれ、 通常の課金データファイルからの情報に加算されます。

==== 印字されたページ数をどのように数えるか?

課金を、リモートホストからの印字でさえも、 正確におこなうためには、 ジョブで使用された紙が何ページであるかを特定できる必要があります。 このことは、プリンタ利用に対する課金をおこなう上の根本的な問題です。

プレインテキストのジョブの場合、 問題を解決するのはさほど難しくはありません。 ジョブが何行であったかを数え、プリンタがサポートしている紙 1 ページに印字できる最大の行数と比較すればよいのです。 重ね打ちするために利用されるファイル中のバックスペース文字や、 物理的に複数の行に渡る長い論理行に対する取り扱いを忘れずにおこなってください。

(「テキストフィルタ lpf」で紹介した) テキストフィルタ lpf では、課金をおこなうときに、 これらの取り扱いをおこなってくれます。 課金をおこなうために必要なテキストフィルタを作成している方は、 lpf のソースコードが参考になるでしょう。

これに対して、他のファイル形式の処理はどのようにすれば よいのでしょうか。

まず、DVI から LaserJet, または、DVI から PostScript® への変換の場合、フィルタが dviljdvips の 出力メッセージを解析することで、 何ページ分の変換がおこなわれたかを知ることができます。 他のファイル形式とその変換プログラムに関しても、 同様のことができるかもしれません。

しかし、この方式には問題点があります。それは、 変換されたページがすべて印字されるとは限らないということです。 たとえば、プリンタが紙詰まりを起こしたり、トナー切れになったり、 はたまた、爆発したりするかもしれません。 そのような状況により印字が途中で中止されたとしても、この方式では、 ユーザは全ページ分の料金を課されてしまうのです。

それでは、どのような対策をたてることができるのでしょうか。

正確な 課金をおこなうための唯一の確実な方法は、 何ページ印字したのかを知らせることができるプリンタを入手し、 これをシリアルポートかネットワークに接続することです。 ほとんどすべての PostScript® プリンタではこの概念がサポートされています。 他のプリンタも同様です (Imagen レーザプリンタをネットワーク接続するなど)。 それぞれのプリンタのフィルタを、 ジョブを印字した後で印字ページ数を得るように変更してください。 そして、課金情報はここで得られた値のみに 基づいて記録してください。行数を数えたり、 エラーが生じやすいファイルの調査は必要とされません。

もちろん、 気前よく印字料金をすべて無料にすることもできます。

== プリンタを使う

この節では、FreeBSD で設定したプリンタを使う方法について説明します。 ここでは、ユーザレベルでのコマンドを概説します。

lpr(1)

印字をおこないます。

lpq(1)

プリンタキューを調べます。

lprm(1)

プリンタキューにあるジョブを削除します。

また、「プリンタの管理」 節で説明されている管理者用コマンド lpc(8) もあり、 プリンタやそのキューの制御のために用いられています。

lpr(1)lprm(1)、そして lpq(1) の 3 コマンドは、-P printer-name オプションをとり、これによって、 /etc/printcap のように操作の対象となる プリンタやキューを指定します。 これによって、様々なプリンタに対してジョブを送る、 取り消す、調査することができます。 -P が使われなかった場合は、これらのコマンドは PRINTER 環境変数で指定されたプリンタを使用します。 そして、PRINTER 環境変数がなかった場合は、 これらのコマンドはデフォルトのプリンタ lp を使います。

以下では、デフォルトプリンタ という用語が意味するプリンタは、PRINTER 環境変数で指定されたプリンタ、もしくは、PRINTER 環境変数がない場合は、lp という名前のプリンタです。

=== 印字する

ファイルを印字するためには、 次のように入力してください。

% lpr filename ...

これにより、 入力されたファイルのそれぞれをデフォルトのプリンタ から印字します。ファイル名が与えられなかった場合、 lpr(1) は標準入力から印字するデータを読み込みます。たとえば、 次のコマンドにより、ある重要なシステムファイルが印字されます。

% lpr /etc/host.conf /etc/hosts.equiv

印字させるプリンタを選択するためには、 次のように入力します。

% lpr -P printer-name filename ...

次の例では、プリンタ rattan に、 カレントディレクトリにあるファイルの詳細なリストを印字しています。

% ls -l | lpr -P rattan

上記の lpr(1) コマンドではファイル名の指定がないので、 lpr は標準入力から印字するデータ、 この場合、ls -l コマンドの出力、を読み込みます。

lpr(1) コマンドでは、 出力の整形を制御したり、ファイル変換を適用したり、 複数部数のコピーを作成したり、 などといた様々な幅広いオプションを受け付けることもできます。 詳細については、 「その他の印字オプション」をご覧ください。

=== ジョブの処理状況を調べる

lpr(1) コマンドを使って印字をする場合、プリントしようと するデータは "プリントジョブ" と呼ばれる箱に一緒に置かれ、 これが LPD スプーリングシステムに送られます。 プリンタにはそれぞれジョブ用のキューがあり、 送られてきたジョブはあなたや他のユーザからの別のジョブと一緒にそのキューで並んで、 処理される順番を待ちます。 プリンタは到着順にこれらのジョブの印字をおこないます。

デフォルトプリンタのキューの状態を表示するには、 lpq(1) と入力します。プリンタを指定するときは、 -P オプションを使います。たとえば、次のコマンド

% lpq -P bamboo

は、プリンタ bamboo のキューの状態を表示します。この lpq コマンドの出力結果の例を次に示します。

bamboo is ready and printing
Rank   Owner    Job  Files                              Total Size
active kelly    9    /etc/host.conf, /etc/hosts.equiv   88 bytes
2nd    kelly    10   (standard input)                   1635 bytes
3rd    mary     11   ...                                78519 bytes

この例では、bamboo のキューに 3 つのジョブがあることが分かります。 最初のジョブはユーザ kelly からのものであり、 "ジョブ番号" 9 が割り当てられています。 プリンタのすべてのジョブには一意なジョブ番号が付けられています。 ほとんどの場合、このジョブ番号は無視することができますが、 ジョブをキャンセルするときにはこの番号が必要になります。 このことの詳細については、「ジョブの削除 」をご覧ください。

ジョブ番号 9 のジョブは 2 つのファイルを処理します。すなわち、 lpr(1) のコマンドラインに複数のファイル名が与えられたときは、 1つのジョブとして扱われるのです。このジョブは、現在、 アクティブジョブ ("Rank" の欄の active という後に注目) になっています。 これは、プリンタからそのジョブが現在印字されているはずであることを意味しています。 2 番目のジョブでは、 lpr(1) コマンドに標準入力からデータが与えられています。 3番目のジョブはユーザ mary から与えられました。 このジョブのサイズはとても大きくなっています。 彼女がプリントしようとしたファイルのパス名はここで表示させるには長すぎるため、 lpq(1) コマンドはドットを 3 つだけ表示しています。

lpq(1) からの出力で一番最初の行もまた有益な情報を与えています。 この行から、プリンタが現在何をしているか (あるいは、少なくとも LPD がプリンタがしていると思っていること) が分かります。

lpq(1) コマンドは -l オプションもサポートしています。 これにより、 詳しい情報が表示されます。 lpq -l の実行例を次に示します。

waiting for bamboo to become ready (offline ?)
kelly: 1st                               [job 009rose]
       /etc/host.conf                    73 bytes
       /etc/hosts.equiv                  15 bytes

kelly: 2nd                               [job 010rose]
       (standard input)                  1635 bytes

mary: 3rd                                [job 011rose]
      /home/orchid/mary/research/venus/alpha-regio/mapping 78519 bytes

=== ジョブの削除

印字するようジョブを 送った後で印字を中断したくなったときは、 lprm(1) コマンドで、 キューの中からそのジョブを削除することができます。 大抵の場合、アクティブジョブでさえも lprm(1) を使って削除することができますが、 そのジョブの一部またはすべてが印字されてしまうかもしれません。

デフォルトプリンタへのジョブを削除するためには、最初に、 lpq(1) を使ってそのジョブ番号を調べます。 すなわち、それから、 次のように入力して、ジョブを削除します。

% lprm job-number

特定のプリンタへのジョブを削除するときは、 -P オプションを使ってそのプリンタを指定します。 たとえば、プリンタ bamboo のキューからジョブ番号 10 のジョブを削除するには次のようにします。

% lprm -P bamboo 10

lprm(1) コマンドには略記法がいくつかあります。

lprm -

あなたが (デフォルトプリンタへ) 送ったジョブをすべて削除します。

lprm user

ユーザ user が (デフォルトプリンタへ) 送ったジョブをすべて削除します。 他のユーザのジョブを削除できるのはスーパユーザだけです。 あなたは、あなた自身のジョブしか削除することはできません。

lprm

ジョブ番号もユーザ名もシンボル -も指定されないときは、 lprm(1) は現在のアクティブジョブを、 そのジョブを送ったのがあなた自身であるときに限り、 デフォルトプリンタから削除します。ただし、 スーパユーザは任意のアクティブジョブを削除することができます。

上記の略記法をデフォルトプリンタではなく 特定のプリンタに対しておこなうときは、-P オプションでそのプリンタを指定するだけよいのです。たとえば、 プリンタ rattan のキューへあなたが送ったジョブを すべて削除するためには次のようにします。

% lprm -P rattan -

ネットワーク環境で作業をしている場合、 あるホストから送られたプリンタジョブは、これを送ったホストで lprm(1) を使った場合に限って、 これを削除することができます。 他のホストで同じプリンタを使えたとしても、 このジョブを削除することはできません。 次の例では、他ホストからジョブを削除することを試みています。

% lpr -P rattan myfile
% rlogin orchid
% lpq -P rattan
Rank   Owner      Job  Files                          Total Size
active seeyan     12    ...                           49123 bytes
2nd    kelly      13   myfile                         12 bytes
% lprm -P rattan 13
rose: Permission denied
% logout
% lprm -P rattan 13
dfA013rose dequeued
cfA013rose dequeued

=== その他の印字オプション

lpr(1) コマンドには、テキストの整形や、 図や他のファイル形式の変換、複数部コピーの生成、 ジョブの扱いなどを制御することができます。 この節では、これに関するオプションについて記しています。

==== 整形と変換に関するオプション

以下の lpr(1) 用のオプションはジョブにおける ファイルの整形の制御に関するものです。 このオプションは、ジョブにプレインテキストが含まれない場合や pr(1) ユーティリティを使ってプレインテキストを整形する場合に用いてください。

次の例では、プリンタ bamboo に (TeX 組版システムによる) DVI ファイル fish-report.dvi を印字しています。

% lpr -P bamboo -d fish-report.dvi

このオプションは、 ジョブに含まれるすべてのファイルに対して適用されます。 したがって、1 つのジョブに (たとえば) DVI ファイルと ditroff ファイルを混在させることはできません。その代わりに、 ファイルを形式毎に別々のジョブに分け、 それぞれのジョブでその形式用の変換オプションを使って印字してください。

-p-T を除くすべてのオプションを使用 するためには、 出力先プリンタ用の変換フィルタが必要です。たとえば、 -d オプションを使用するには、DVI 用の変換フィルタが必要 です。詳細については、「変換フィルタ」で説明しています。

-c

cifplot ファイルを印字します。

-d

DVI ファイルを印字します。

-f

FORTRAN プログラムを印字します。

-g

plot のデータを印字します。

-i number

出力に対して、number カラム分の字下げをおこないます。 number が省略されると、 8 カラム分字下げされます。 このオプションはある変換フィルタと一緒の指定されたときのみに機能します。

-i と数字の間に空白を入れてはいけません。

-l

制御文字を含む文字通りのテキストデータを印字します。

-n

ditroff (device independent troff) データを印字します。

-p

印字する前に pr(1) によってプレインテキストを整形します。 詳細については pr(1) をご覧ください。

-T title

pr(1) コマンドにより生成されるヘッダを、 ファイル名の代わりに title とする。 このオプションは、-p と一緒に使ったときのみ機能する。

-t

troff データを印字します。

-v

ラスタのデータを印字します。

次の例では、ls(1) のマニュアルを美しく整形したものをデフォルトプリンタで印字しています。

% zcat /usr/shared/man/man1/ls.1.gz | troff -t -man | lpr -t

zcat(1) コマンドで ls(1) のマニュアルのソースファイルの圧縮を復元し、これを troff(1) コマンドに渡しています。 これによりソースファイルが整形され GNU troff の形式となります。 その結果は lpr(1) に渡され、 LPD スプーラへジョブの要求が発せられます。 lpr(1) には -t オプションが使われているため、 スプーラでジョブを印字したときに GNU troff の形式から、デフォルトプリンタが解釈できる形式へと変換されます。

==== ジョブに関するオプション

以下のオプションは、lpr(1) によって、 そのジョブを特殊な扱いにするよう LPD に指示するためのものです。

-# copies

ジョブに含まれるファイルのそれぞれを 1 部だけ印字するのではなく、 copies 部のコピーを生成させるものです。管理者によっては、 プリンタの消耗を避け、コピー機による複製を奨励するために このオプションの使用が禁止されているかもしれません。 これに関しては、「複数部のコピーの印字を制限する 」をご覧ください。

次の例では、デフォルトプリンタで parser.c を 3 部コピーし、次に、 parser.h を 3 部コピーしています。

% lpr -#3 parser.c parser.h
-m

印字ジョブが完了した後で、メールを送ります。 このオプションを付けると、LPD システムはジョブの処理が終了したときに、 あなたのアカウントにメールを送ります。 メールのメッセージには、ジョブが正常終了したのか、あるいは、 何か異常があり、(しばしば) その異常が何であったのかが書かれています。

-s

印字ファイルをスプールディレクトリにコピーせず、 代わりに、 シンボリックリンクを作成するよう指示します。

印字させるジョブのサイズが大きいとき、 このオプションを使うと便利かもしれません。このオプションにより、 スプー ルディレクトリの容量が節約されます (それに、 巨大なジョブのお陰でスプールディレクトリのあるファイルシステムの空き容量がなくなってしまうかもしれません)。 さらに、LPD がいちいちすべてのデータをコピーする必要がなくなりますので、 時間の節約にもなります。

ただし、欠点もあります。LPD はオリジナルのファイルを直接参照するので、 印字が終了するまでそのファイルを変更したり削除することができません。

リモートのプリンタで印字している場合、 LPD は、結局のところ、 ローカルホストからリモートホストにファイルをコピーする必要があります。 したがって、-s オプションはローカルのスプーリングディレクトリの空き容量を節約するだけで、 リモート側では節約されません。 それでも、このオプションは有用です。

-r

ジョブに含まれるファイルを、 スプーリングディレクトリに ファイルをコピーした後に削除します。もしくは、 -s オプションと一緒に使われた場合は、 印字終了後に削除されます。 このオプションの使用には十分注意して下さい。

==== ヘッダページ用オプション

以下のオプションにより、 ジョブのヘッダページに通常印字さ れるテキストを lpr(1) に調整させることができます。 対象のプリンタからヘッダページが出力されない場合は、 これらのオプションは何の効力も持ちません。 ヘッダページの設定に関する情報については、 「ヘッダページ」を参照してください。

-C text

ヘッダページに印字されるホスト名を text に置き換えます。なお、 ホスト名の場所には、通常、 ジョブの要求があったホストの名前が印字されます。

-J text

ヘッダページに印字されるジョブ名を text に置き換えます。 ジョブ名の場所には、通常、ジョブの最初のファイル名、 または、標準入力からデータが印字されたときは stdin が印字されます。

-h

ヘッダページの出力を禁止します。

サイトによっては、 そのヘッダページの生成方法により、 このオプションの効果が現れないかもしれません。 詳細は、「ヘッダページ」をご覧ください。

=== プリンタの管理

プリンタの管理者として、プリンタの設置、設定、 そして、それらのテストをおこなう必要がありました。 lpc(8) コマンドにより、 これまでとは別な管理方法がプリンタと対話的におこなわれます。 lpc(8) により、次のことが可能となります。

  • プリンタの起動、停止をおこなう。

  • キューへの入力の許可、禁止をおこなう。

  • それぞれのキューにあるジョブの順番を変更する。

最初に用語に関する注意をしておきます。 プリンタが停止しているとは、 キューの中にあるどのジョブも印字されることがない状態 を言います。この状態においても、 ユーザはまだジョブの要求をおこなうことができますが、 これらのジョブはキューの中で、 プリンタがスタートする状態になるまで、 あるいは、キューの内容が削除されるまで待たされることになります。

キューが禁止状態にあると、 (root 以外の) すべてのユーザがプリンタにジョブを要求することができません。 キューが許可状態にある場合は、 ジョブの入力が許可されます。 キューが禁止状態にある場合でも、 プリンタをスタートす る状態にすることは可能です。この場合は、 キューが空になるまで、 キュー内のジョブの印字が続けられます。

一般的に、lpc(8) コマンドを使用するには root 権限を持っている必要があります。 一般のユーザも lpc(8) コマンドを使うことはできますが、 プリンタの状態を取得することとハングしたプリンタ を再スタートすることだけに使用が制限されています。

以下に、 lpc(8) コマンドに関する説明の要約を述べます。 ほとんどのコマンドでは、操作対象となるプリンタを指定するため printer-name 引数を与えます。 printer-name の代わりに all が与えられると、操作は /etc/printcap 内にある全プリンタに対しておこなわれることになります。

abort printer-name

現在のジョブをキャンセルし、プリンタを停止させます。 キューが許可状態にある場合は、 ユーザはまだジョブを入力することができます。

clean printer-name

プリンタのスプーリングディレクトリから、 ジョブの古いファイルを削除します。状況によって、 とりわけ、印字途中でエラーが発生していたり、 管理操作が頻発していた場合には、 ジョブで作られたファイルを LPD が完全に削除しないことがあります。このコマンドでは、 スプーリングディレクトリに入っていないファイルを見つけ出し、 それを削除しています。

disable printer-name

キューに新しいジョブを入れることを禁止します。 プリンタが動作しているときは、 キューに残っているジョブの印字は続けられます。ただし、 キューが禁止状態にあったとしても、スーパーユーザ (root) は常にジョブを入力することができます。

このコマンドは、 新しいプリンタやフィルタを設置している間に使用すると有用です。 すなわち、キューを禁止状態にしておくと、 root によるジョブのみが入力されます。 そして、他のユーザは、テストが完了し、 enable コマンドでキューが再度許可状態になるまで、 ジョブの入力はできなくなります。

down printer-name message

プリンタをダウンさせます。これは、 disable をおこなった後で、 stop をおこなった場合と等価になります。 message は、ユーザが lpq(1) コマンドでプリンタのキューの状態を調べたり、 lpc status でプリンタの状態を調べたときに、 プリンタの状況として表示されるメッセージです。

enable printer-name

プリンタのキューを許可状態にします。 ユーザはジョブの入力ができるようになりますが、 プリンタがスタートの状態になるまでは、 プリンタからは何も印字されません。

help command-name

command-name コマンドのヘルプメッセージを表示します。 command-name が指定されなかった場合は、 利用できるコマンドの要約が表示されます。

restart printer-name

プリンタをスタートさせます。通常のユーザは、 LPD がある異常な状況でハングしたときに限り、 このコマンドを使用することができます。しかし、 stop または down コマンドにより、 停止状態にあるプリンタをスタートさせることはできません。 restart コマンドは、 abort の後に start をおこなったことと同じになります。

start printer-name

プリンタをスタートさせます。 プリンタのキューにあるジョブを印字することでしょう。

stop printer-name

プリンタを停止します。プリンタは、 現在のジョブを終了させ、そして、 キューにあるその他のジョブは印字しません。 プリンタが停止状態にあったとしても、まだ、 許可状態にあるキューに対して、ジョブを送ることができます。

topq printer-name job-or-username

printer-name のキューに対して、ジョブ番号 job のジョブ、または、ユーザ username から送られたジョブを置き換えて、キューの先頭に持ってきます。 このコマンドに関しては、 printer-name の代わりに all を使用することはできません。

up printer-name

プリンタをアップ状態にします。これの反対のコマンドが down です。start の次に enable をおこなったことと等しくなります。

コマンドラインから上記のコマンドを入力すると、 lpc(8) はこれを受け付けます。コマンドが入力されなかった場合は、 lpc(8) は対話モードに入り、 exitquit、 または、 ファイル終端文字が入力されるまでコマンドの入力ができます。

== 標準スプーラの代替品

このマニュアルを最初から通読されている方ならば、ここまでで、 FreeBSD 付属の LPD スプーリングシステムに関して知っておくべきことすべてを学ばれたことと思います。 多分、このシステムにあるたくさんの欠点について認識できたことでしょう。 そこから "(FreeBSD 上で動作する) スプーリングシステムには他にどのようなものがあるのか" という疑問が自然と湧いてきます。

LPRng

"次世代 LPR" を称するLPRng は、 PLP を完全に書き換えたものです。 Patrick Powell と Justin Mason (PLP の主要な管理者) が共同で LPRng を作成しました。 LPRng の本サイトは http://www.lprng.org/ です。

CUPS

CUPS (the Common UNIX Printing System) は、UNIX® ベースのオペレーティングシステムに対して、 移植性の高い印刷レイヤを提供します。 CUPS は Easy Software Products によって、すべての UNIX® ベンダとユーザに、 標準的な印刷ソリューションを普及するために開発されています。

CUPS は、プリントジョブとキューを管理する基盤として Internet Printing Protocol (IPP) を使っています。機能は限定されますが、 ラインプリンタデーモン (LPD)、 サーバーメッセージブロック (SMB) や AppSocket (JetDirect とも呼ばれています) プロトコルにも対応しています。 CUPS は、UNIX® に現実的なプリント機能を備えるため、 ネットワークプリンタの検索、 PostScript プリンタ記述言語 (PPD) に基づいた印刷オプションを追加します。

CUPS のメインサイトは http://www.cups.org/ です

HPLIP

HPLIP (the HP Linux® Imaging and Printing system) は、 HP アプライアンス用に HP が開発した、 プリンタ、スキャナ、ファックスへの対応のためのプログラム群です。 このプログラムでは、印刷機能において CUPS 印刷システムをバックエンドとして利用しています。

HPLIP のメインサイトは、 http://hplipopensource.com/hplip-web/index.html です。

== トラブルシューティング

lptest(1) を使った簡単なテストをおこなった結果、 正しい出 力を得られずに、以下に示すような出力が得られるかもしれません。

しばらくしたら出力される、または、 紙の全体が出てこない

プリンタは上で示されたような印字を おこなったのですが、しばらくして止まってしまい、 動かなくなってしまいました。 印字された結果をプリンタから取り出すためには、 プリンタにある PRINT REMAINING ボタン、または、FORM FEED ボタンを押す必要があるようです。

この場合は、 おそらくジョブはプリントをする前に 更にデータが送られてこないか待ち続けているのでしょう。 この問題を解決するためには、プリンタに FORM FEED 文字 (あるいは特定の必要な文字コード) を 送るテキストフィルタを使ってください。 プリンタ内部に残ったデータをプリンタにすぐに印字させるには、 普通はこれで十分です。 次のジョブが前のジョブの最終ページの中央の どこかから印字を開始させないためにも、 紙の途中で印字のジョブが終了したかどうかを確認するのは有益です。

シェルスクリプト /usr/local/libexec/if-simple を次のように変更して、プリンタへジョブを送信した後に FORM FEED 文字を印字させるようにします。

#!/bin/sh
#
# if-simple - Simple text input filter for lpd
# Installed in /usr/local/libexec/if-simple
#
# Simply copies stdin to stdout.  Ignores all filter arguments.
# Writes a form feed character (\f) after printing job.

/bin/cat && printf "\f" && exit 0
exit 2
"階段効果" が現れた

出力された紙には次のように印字されていました。

!"#$%&'()*+,-./01234
                 "#$%&'()*+,-./012345
                                 #$%&'()*+,-./0123456

あなたは「階段効果」 の新たなる犠牲者になってしまいました。この原因は、 改行を表わすべき文字がなんであるか の解釈が混乱していることにあります。UNIX® スタイルのオペレーティングシステムでは、改行文字は ASCII コード 10 の line feed (LF) の 1 文字が使われています。MS-DOS® や OS/2® などは ASCII コード 10の LF 、ASCII コード 13 の文字 (carriage return または CR) をペアで使います (訳注: Macintosh では CR のみで表現されています)。大抵のプリンタでは、 改行を表わすために MS-DOS® の慣習にしたがいます。

FreeBSD で印字する場合、印字したテキストは LF 文字だけ が使われていました。プリンタでは LF 文字を見つけると、紙を 1 行分送り出しました。しかし、 次の文字を印字するた めの紙の水平方向の位置は維持されました。すなわち、CR 文字が意味することは、 次の文字を印字する位置を紙の左端に動かすことです。

FreeBSD がプリンタに動作をして欲しいと思っている動作を以下に示します。

プリンタが CR を受け取ったとき

CR 動作 (復帰) をおこなう

プリンタが LF を受け取ったとき

CR + LF 動作 (復帰、改行) をおこなう

このように動作させるための方法がいくつかあります。

  • これらの文字の解釈を変えるために、 プリンタの設定スイッチかコントロールパネルを操作する方法。 どのようにして設定をするかはプリンタのマニュアルを参照してください。

FreeBSD 以外のオペレーティングシステムを切り替えて使う場合、 CR と LF 文字の解釈をそのオペレーティングシステムで使われているようにプリンタを 再設定する必要があるかもしれません。 以下に示す解決方法のいずれかを 選ぶのがよいかもしれませんね。

  • 自動的に LF を CR+LF に変換してくれる FreeBSD 用のシリアルドライバを入手する方法。 もちろん、このドライバはプリンタ専用に接続される シリアルポート のみで動作します。 この機能を許可するためには、 ms# 項目を使い、 対象プリンタの /etc/printcap ファイルでonlcr モードを設定します。

  • LF 文字の扱いを一時的に変更するための エスケープコード をプリンタに送る方法。 プリンタがサポートしているかもしれないエスケープコード については、 プリンタのマニュアルを参照してください。 適切なエスケープコードが見つかったら、 最初にそのコードを送り、次にプリントジョブを送信 するようにテキストフィルタを変更してください。

    次に、Hewlett Packard 社の PCL エスケープコードに対応しているプリンタのための テキストフィルタの例を示します。 このフィルタでは、プリンタ に LF 文字を LF と CR の2文字として扱わせます。 その後に、プリンタにジョブを送ります。最後に、 ジョブの最終ページの紙を排出するため、FROM FEED 文字を送ります。このフィルタは Hewlett Packard 社のほとんどすべてのプリンタで機能するはずです。

    #!/bin/sh
    #
    # hpif - Simple text input filter for lpd for HP-PCL based printers
    # Installed in /usr/local/libexec/hpif
    #
    # Simply copies stdin to stdout.  Ignores all filter arguments.
    # Tells printer to treat LF as CR+LF.  Ejects the page when done.
    
    printf "\033&k2G" && cat && printf "\f" && exit 0
    exit 2

    ホスト orchid/etc/printcap の例を以下に示します。ここには、 一番目のパラレルポートにプリンタ (Hewlett Packard LaserJet 3Si) が一台接続されており、そのプリンタ名は teak です。

    #
    #  /etc/printcap for host orchid
    #
    teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
            :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
            :if=/usr/local/libexec/hpif:

LF を CR+LF に置き換える cat コマンドを作る方法も当然考えられます。 そして、このコマンドと、if-simple の cat の部分を置き換えればよいわけです。 具体的にどのようにするかは、 読者への練習問題としましょう。

各行が重ね書きされてしまった

プリンタは紙送りをまったくしませんでした。 テキストすべての行がある行の上で重ねて印字されてしまいました。

この問題は、 階段現象とは "正反対" な問題で、 ほとんどまれにしか起こりません。FreeBSD では行末として扱われる LF 文字が、紙の左端に印字位置を復帰しますが、 紙送りはしない CR 文字として扱われています。

プリンタの設定スイッチかコントロールパネルを使って、 LF と CR の文字を次のような解釈をするようにしてください。

プリンタが受け取ったときプリンタがおこなう

CR

CR 動作 (復帰)

LF

CR + LF (復帰、改行)

LF を CR+LF に置き換える cat コマンドを作る方法も当然考えられます。 そして、このコマンドと、 if-simple の cat の部分を置き換えればよいわけです。 具体的にどのようにするかは、 読者への練習問題としましょう。

プリンタが文字を紛失してしまう

印字しているのですが、 各行の 2 ~ 3 文字が印字されません。 プリンタを動かせば動かすほど、 もっとたくさんの文字が紛失されていき、 この問題は更に悪くなっていくかもしれませんでした。

この問題は、 シリアルポートを通してコンピュータから送られてくるデータの速度に、 プリンタがついていけないことに起因します (この問題は、パラレルポートに接続された プリンタでは発生することはありません)。 この問題を克服する方法が2つあります。

  • プリンタが XON/XOFF のフロー制御をサポート している場合は、項目 ms#ixon モードをセットして、FreeBSD にこの機能を使用させてください。

  • プリンタが Request to Send / Clear to Send ハードウェアハンドシェイク (通称 RTS/CTS) をサポートして いる場合は、項目 ms#crtscts モードをセットして下さい。それから、 プリンタとコンピュータを接続しているシリアルケーブルが ハードウェアフロー制御用に正しく配線されたものかどうかを確認してください。

プリンタは意味不明な文字列を印字した

プリンタはランダムなゴミのように 見えるものを印字しましたが、 意図したテキストは印字してくれませんでした。

この問題は、通常、 シリアルポートに接続したプリンタでの 通信パラメータの誤りからくる前項とは別の症状です。 br 項目の通信速度と ms# 項目を再確認してください。 また、プリンタでの設定が /etc/printcap ファイルで設定した 内容と一致しているかどうかも確認してください。

simple-if のような単純なフィルタだけの状態で、 日本語を含むテキストを印字しようとした場合にも、 シリアルポート、パラレルポートの使用に関係なく、 このような症状は見られます。日本語プリンタの場合、 漢字コードそのもの を送信しただけでその漢字を印字してくれるものは、 少なくとも訳者は見たことがありません。 漢字を印字するための制御 コードを別途送信するフィルタが必要となります。 また、そのようなフィルタを使用していても、 そのフィルタが想定してる漢字コードと異なった文書を プリントしようとしたときもこのような症状は出ます。 もちろん、これはプリンタ用の 言語を持たないプリンタの話で、PostScript® プリンタ などにプレインテキストを送信しても、日本語対応、 非対応に関らず、意味不明な文字列が印字される (もしくは、何も印字されない) ことでしょう。

何も起きない

もしプリンタが何の動作もしないのであれば、 ハード的な問題ではなく、多分 FreeBSD の中に問題があります。 /etc/printcap ファイルで、 デバッグしているプリンタのエントリに (lf 項目で) ログファイルを取るように 設定を追加してください。たとえば、プリンタ rattan 用のエントリの項目 lf は次のようになります。

rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:\
        :lf=/var/log/rattan.log

次に、もう一度印字をおこなってみます。そして、 発生したと思われるエラーメッセージを見るためにログファイル (上記の例では、 /var/log/rattan.log) を調べます。そこで見られたメッセージを元に、 問題を解決してみてください。

項目 lf が指定されていない場合、LPD はデフォルトのログファイルとして /dev/console を使います。

= Linux® バイナリ互換機能 :doctype: book :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :sectnumoffset: 10 :partnums: :source-highlighter: rouge :experimental: :images-path: books/handbook/linuxemu/

== この章では

FreeBSD は、Linux® とのバイナリ互換機能を提供しています。 このバイナリ互換機能を使うことで、ユーザは、ほとんどの Linux® バイナリを変更することなく、FreeBSD システム上にインストールして実行できるようになります。 ある状況においては Linux® バイナリを Linux® で動かすよりも FreeBSD で動かすほうが良いパフォーマンスが出るという報告もあります。

しかしながら、いくつかの Linux® に特有なオペレーティングシステムの機能は FreeBSD ではサポートされていません。たとえば、 仮想 8086 モードを有効にするような i386™ 特有の呼び出しを過度に使う Linux® バイナリは FreeBSD では動きません。

64 ビットの Linux® バイナリ互換機能は、 FreeBSD 10.3 で追加されました。

この章を読むと、以下のことがわかります。

  • FreeBSD システムで Linux® バイナリ互換機能を有効にする方法。

  • Linux® 共有ライブラリを追加する方法。

  • Linux® アプリケーションを FreeBSD システムにインストールする方法

  • FreeBSD における Linux® 互換機能の実装の詳細。

この章を読む前に、以下のことを理解しておく必要があります。

== Linux® バイナリ互換機能の設定

Linux® ライブラリは、デフォルトでは FreeBSD にインストールされません。 また、Linux® バイナリ互換機能も、デフォルトでは有効ではありません。 Linux® ライブラリは、手動もしくは FreeBSD Ports Collection を使ってインストールできます。

port を構築する前に、 linux カーネルモジュールを読み込んでください。 このモジュールを読み込んでいないと、構築に失敗してしまいます。

# kldload linux

64 ビットの互換機能を使うには、以下を実行してください。

# kldload linux64

以下のようにしてモジュールが読み込まれていることを確認してください。

% kldstat
      Id Refs Address    Size     Name
      1    2 0xc0100000 16bdb8   kernel
      7    1 0xc24db000 d000     linux.ko

Linux® ライブラリおよびバイナリの基本セットを FreeBSD システムにインストールする最も簡単な方法は、 emulators/linux_base-c7 package または port を使う方法です。port をインストールするには、 以下のコマンドを実行してください。

# pkg install emulators/linux_base-c7

起動時から Linux® 互換機能を有効にする場合には、 /etc/rc.conf に以下の行を追加してください。

linux_enable="YES"

64 ビットのコンピュータでは、 /etc/rc.d/abi により 64 ビット互換のためのモジュールは自動的に読み込まれます。

Linux® バイナリ互換機能のレイヤには、(64 ビット x86 ホストにおける) 32 および 64 ビット Linux バイナリのサポートが追加されたため、 エミュレーション機能をカスタムカーネルに静的にリンクする必要はありません。

=== 手動によるライブラリの追加のインストール

Linux® バイナリ互換機能を設定した後に、Linux® アプリケーションが必要な共有ライブラリが存在しないというエラーを出した場合には、 Linux® バイナリがどの共有ライブラリを必要としているかを確認して、 手動でインストールしてください。

Linux® システムで、ldd を使うことにより、 アプリケーションが必要とする共有ライブラリを調べることができます。 たとえば、linuxdoom が必要とする共有ライブラリを調べるには、 Doom がインストールされている Linux® システム上で、以下のコマンドを実行してください。

% ldd linuxxdoom
libXt.so.3 (DLL Jump 3.1) => /usr/X11/lib/libXt.so.3.1.0
libX11.so.3 (DLL Jump 3.1) => /usr/X11/lib/libX11.so.3.1.0
libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29

Linux® システムでの出力の最後のカラムに表示されているすべてのファイルを FreeBSD システムの /compat/linux の下にコピーしてください。コピーしたら、 最初のカラムに示されるファイル名でコピーしたファイルに対してシンボリックリンクを張ってください。 この例では、FreeBSD システムで以下のようになります。

/compat/linux/usr/X11/lib/libXt.so.3.1.0
/compat/linux/usr/X11/lib/libXt.so.3 -> libXt.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3 -> libX11.so.3.1.0
/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -> libc.so.4.6.29

ldd の出力の最初のカラムに表示されているメジャーバージョンが同じ Linux® 共有ライブラリが既にインストールされている場合は、 最後のコラムにある名前のファイルを新たにコピーする必要はありません。 既にあるライブラリで動作するはずです。 ただ、新しいバージョンの共有ライブラリがある場合には、 コピーすることをお奨めします。 新しいライブラリにシンボリックリンクを変更したら、 古いライブラリは削除してかまいません。

たとえば、以下のライブラリがすでに FreeBSD システムに存在するとします。

/compat/linux/lib/libc.so.4.6.27
/compat/linux/lib/libc.so.4 -> libc.so.4.6.27

そして、ldd の出力が以下のように、 バイナリが新しいバージョンを必要とする場合を考えます。

libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29

存在しているライブラリの最後の番号が 1 つか 2 つ古いだけなので、 わずかに古いライブラリでもプログラムは動作するはずです。 しかしながら、libc.so を新しいバージョンに置き換えるのが安全です。

/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -> libc.so.4.6.29

通常は、Linux® のバイナリが必要とする共有ライブラリを探す必要があるのは、 FreeBSD のシステムに Linux® のプログラムをインストールする最初の数回だけです。 それが過ぎれば、十分な Linux® の共有ライブラリがシステムに存在するので、 新しくインストールした Linux® のバイナリも追加の作業をせずに動作させることができるようになります。

=== Linux® の ELF バイナリのインストール

ELF のバイナリを使うためには、 追加の作業が必要です。 マークのない (unbranded) ELF バイナリを実行しようとすると、 以下のようなエラーメッセージが表示されてしまうことでしょう。

% ./my-linux-elf-binary
ELF binary type not known
Abort

FreeBSD のカーネルが FreeBSD の ELF バイナリと Linux® のバイナリとを見分けられるようにするために、brandelf(1) を以下のようにして使ってください。

% brandelf -t Linux my-linux-elf-binary

GNU のツール群が ELF バイナリに自動的に適切なマークを付加するようになったので、 この作業は通常必要ありません。

=== Linux® RPM ベースのアプリケーションのインストール

Linux® RPM ベースのアプリケーションをインストールするには、 最初に archivers/rpm4 package または port をインストールしてください。 インストールすると、このコマンドを root 権限で使うことで、 .rpm をインストールできます。

# cd /compat/linux
# rpm2cpio < /path/to/linux.archive.rpm | cpio -id

必要に応じて、インストールした ELF バイナリに brandelf を実行してください。 綺麗にアンインストールできないかもしれませんので注意してください。

=== ホストネームリゾルバの設定

DNS がうまく動作しなかったり、 以下のようなエラーメッセージが表示される場合は、 /compat/linux/etc/host.conf ファイルを以下のように設定する必要があります。

resolv+: "bind" is an invalid keyword resolv+:
"hosts" is an invalid keyword

ファイルの内容を以下のように設定してください。

order hosts, bind
multi on

この設定では /etc/hosts を最初に検索し、 次に DNS を検索するように指定します。 /compat/linux/etc/host.conf が存在しない場合には、 Linux® アプリケーションは /etc/host.conf を使用しようとし、 FreeBSD の文法とは互換性がないと警告を出力します。 /etc/resolv.conf を利用してネームサーバの設定をしていない場合には、 bind を削除してください。

== 高度なトピックス

この節では、Linux® バイナリ互換機能がどのような仕組みで動作をしているかを説明します。 以下の文章は FreeBSD chat メーリングリスト に投稿された Terry Lambert (tlambert@primenet.com) 氏のメール (Message ID: <199906020108.SAA07001@usr09.primenet.com>) をもとにしています。

FreeBSD は、"実行クラスローダ (execution class loader) " と呼ばれる抽象的な機構を持っています。これは execve(2) システムコールへの楔という形で実装されています。

歴史的には、UNIX® のローダはマジックナンバー (一般的にはファイルの先頭の 4 ないし 8 バイトの部分) の検査を行ない、システムで実行できるバイナリかどうかを検査し、 もしそうならバイナリローダを呼び出すというようになっていました。

もし、そのシステム用のバイナリでない場合には、 execve(2) システムコールの呼び出しは失敗の戻り値を返し、 シェルがシェルコマンドとして実行しようと試みていたわけです。 この仮定は"現在利用しているシェルがどのようなものであっても"デフォルトでした。

後に sh(1) に変更が加えられ、先頭の 2 バイトを検査した結果 :\n であれば代わりに csh(1) を呼び出す、 というようになりました。

FreeBSD は、単一のローダではなく、ローダの一覧を走査します。 動作しているシェルインタプリタもしくはシェルスクリプトとして、 該当するものが存在しなければ、#! ローダが用いられます。

Linux® ABI をサポートするため、FreeBSD は ELF バイナリを示すマジックナンバを確認します。 ELF ローダは、特殊なマーク (brand) があるかどうか探します。 このマークとは、ELF イメージのコメントセクションのことです。 SVR4/Solaris™ の ELF バイナリには、このセクションは存在しません。

Linux® バイナリを実行するためには、 brandelf(1) を使って Linux のマークが付けられていなければなりません。

# brandelf -t Linux file

ELF ローダが Linux マークを確認すると、 ローダは proc 構造体内の ある一つのポインタを置き換えます。システムコールは全て、 このポインタを通してインデックスされます。 さらに、そのプロセスには Linux® カーネルモジュールに必要なシグナルトランポリンコード (訳注: シグナルの伝播を実現するコード) 用の特殊なトラップベクタの設定や、 他の (細かな) 調整のための設定が行なわれます。

Linux® システムコールベクタは、 さまざまなデータに加えて sysent[] エントリーのリストを含んでおり、 それらのアドレスはカーネルモジュール内にあります。

Linux® バイナリがシステムコールを発行する際、トラップコードは proc 構造体を用いてシステムコール関数ポインタを 解釈します。そして FreeBSD ではなく Linux® 用のシステムコールエントリポイントを得るわけです。

Linux® モードは状況に応じてファイルシステム本来のルートマウントポイントを置き換えてファイルの参照を行ないます。 これは、union を指定してマウントされたファイルシステムが行なっていることと同じです。 ファイルを検索する際にはまず /compat/linux/original-path を調べます。見つけられなかったときには、 /original-path を調べます。 こうすることで、他のバイナリを要求するバイナリの実行を可能にしています。 たとえば、Linux® 用ツールチェインは Linux® ABI サポート環境下で完全に動作します。 またこれは、もし対応する Linux® バイナリが存在しない場合に Linux® バイナリが FreeBSD バイナリをロードしたり、 実行したりすることが可能であること、 その Linux® バイナリに自分自身が Linux® 上で実行されていないことを 気付かせないようにする目的で、uname(1) コマンドを /compat/linux ディレクトリに置くことができる、 ということを意味します。

要するに、Linux® カーネルが FreeBSD カーネルの内部に存在しているわけです。 カーネルによって提供されるサービス全ての実装の基礎となるさまざまな関数は FreeBSD システムコールテーブルエントリと Linux® システムコールテーブルエントリの両方で共通に利用されています。 これらにはファイルシステム処理、仮想メモリ処理、シグナル伝送、 System V IPC が含まれますが、 FreeBSD バイナリは FreeBSD グルー (訳注: glue; 二者の間を仲介するという意味) 関数群、 そして Linux® バイナリは Linux® グルー関数群を用いる、 という点だけが異なります。 FreeBSD のグルー関数群は、 カーネルの中に静的にリンクされ、 Linux® のグルー関数群は静的にリンクすることも、 カーネルモジュールを介して利用することもできるようになっています。

技術的には、これはエミュレーションではなく、 ABI の実装です。 よく "Linux® エミュレーション"と呼ばれるのは、 この機能が初めて実装された頃、 この機能を表現する言葉がなかったためです。 コードをコンパイルしてはいないので、 FreeBSD 上で Linux® バイナリを実行するという表現は、 厳密に考えると適切ではありません。

= システム管理

以下の章では、 FreeBSD のシステム管理の面について書かれています。 各章のはじめでは、その章で学ぶ内容や、 読者が実際に取り組む前に知っておくべきことについて説明します。

各章は、必要になった時に個別に参照できるように構成されています。 どの順番で読んでも構いませんし、FreeBSD を使うのに、 すべてを読み通す必要がある、というわけでもありません。

= 設定とチューニング :doctype: book :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :sectnumoffset: 11 :partnums: :source-highlighter: rouge :experimental: :images-path: books/handbook/config/

== この章では

システムを正しく設定することは、 メンテナンスや将来の更新の際の作業の量を減らします。 この章では FreeBSD システムの管理上の設定の側面について記述します。

またこの章では FreeBSD システムのパフォーマンスを最適化する チューニングについても記述します。

この章を読むと、以下のことがわかります。

  • rc.conf の設定と /usr/local/etc/rc.d スタートアップシステムの基礎

  • ネットワークデバイスに対する、仮想ホストの設定方法

  • /etc ディレクトリ内のさまざまな設定ファ イルの使い方

  • sysctl 変数を使った FreeBSD のチューニング方法

  • ディスク性能のチューニング方法と、カーネルの制限の変更方法

この章を読む前に、以下のことをやっておくとよいでしょう。

== 中核となる設定

システムの設定情報が収められている主な場所は /etc/rc.conf です。 このファイルにはシステムの起動時にシステムの設定を行なうものをはじめ 多岐に渡る設定情報が含まれています。 そのファイル名はダイレクトに、それが rc* ファイル群の設定情報であることを示しています。

管理者は /etc/defaults/rc.conf のデフォルトの設定を rc.conf ファイルにエン トリを作ることで上書きすべきです。 デフォルトのファイルをそのまま /etc にコピーするのはやめるべきです。 それはデフォルト値であってサンプルではないのです。 システム固有のすべての変更は rc.conf ファイ ルの中でするべきです。

管理の手間を減らす為、クラスター化されたアプリケーションには サイト共通の設定とシステム固有の設定を分離するさまざまな戦略が適用できます。 推奨されるアプローチは、サイト共通の設定は /etc/rc.conf.site のような別のファイルに置き、 それをシステム固有の設定情報しか含ませない /etc/rc.conf からインクルードすることです。

rc.confsh(1) によって読み込まれているので、これはじつに簡単に達成できます。 たとえば、

  • rc.conf:

    	. rc.conf.site
    	hostname="node15.example.com"
    	network_interfaces="fxp0 lo0"
    	ifconfig_fxp0="inet 10.1.1.1"
  • rc.conf.site:

    	defaultrouter="10.1.1.254"
    	saver="daemon"
    	blanktime="100"

rc.conf.site ファイルは rsync のようなプログラムを使うことで全システ ムに配布でき、一方 rc.conf ファイルはユニークなままを保つことができます。

システムを sysinstall(8)make world 等で 更新した場合 rc.conf ファイルは上書きされません。 なのでシステムの設定情報が失われることもありません。

== アプリケーションの設定

基本的に、インストールされたアプリケーションには独自の文法を持つ 固有の設定ファイルがあります。 これらのファイルがベースシステムから分離されているということは重要で、 このためパッケージ管理ツールによる配置と管理が容易になっています。

基本的に、それらのファイルは /usr/local/etc にインストールされます。 設定ファイルの数が多数にのぼるアプリケーションに対しては、 それら用にサブディレクトリが作られます。

通常、ports やパッケージがインストールされると 設定ファイルのサンプルが一緒にインストールされます。 大抵、識別のためにサフィックスとして ".default" がついています。 アプリケーションのための設定ファイルがまだ存在していなければ、 .defaults ファイルをコピーすることで作成できます。

/usr/local/etc/apache ディレクトリの例をご覧ください。

-rw-r--r--  1 root  wheel   2184 May 20  1998 access.conf
-rw-r--r--  1 root  wheel   2184 May 20  1998 access.conf.default
-rw-r--r--  1 root  wheel   9555 May 20  1998 httpd.conf
-rw-r--r--  1 root  wheel   9555 May 20  1998 httpd.conf.default
-rw-r--r--  1 root  wheel  12205 May 20  1998 magic
-rw-r--r--  1 root  wheel  12205 May 20  1998 magic.default
-rw-r--r--  1 root  wheel   2700 May 20  1998 mime.types
-rw-r--r--  1 root  wheel   2700 May 20  1998 mime.types.default
-rw-r--r--  1 root  wheel   7980 May 20  1998 srm.conf
-rw-r--r--  1 root  wheel   7933 May 20  1998 srm.conf.default

ファイルサイズの差から、srm.conf ファイルだけが変更されていることが分かります。 後に apache を更新した時にも、 この変更されたファイルは上書きされることはありません。

== サービスの起動

一つのシステムでサービスをいくつも立ち上げているということは よくあることです。 それらには独自の立ち上げかたがあることがあり、 それぞれ有利な点があります。

Ports collection やパッケージからインストールしたソフトウェアは しばしば /usr/local/etc/rc.d にスクリプトを置き、 システムが起動した時には start、システムをシャッ トダウンする時には stop を引数にして実行します。 これは root で実行すべき、または root で起動することを期待されているシステム ワイドなサービスを起動する場合に推奨される方法です。 これらのスクリプトはパッケージの一部としてインストール時に記録され、 パッケージとともに削除されます。

/usr/local/etc/rc.d にある 一般的なスクリプトは次のようなものです。

#!/bin/sh
echo -n ' FooBar'

case "$1" in
start)
        /usr/local/bin/foobar
        ;;
stop)
        kill -9 `cat /var/run/foobar.pid`
        ;;
*)
        echo "Usage: `basename $0` {start|stop}" >&2
        exit 64
        ;;
esac

exit 0

このスクリプトはその目的を果すべく起動時に start、 シャットダウン時に stop をつけて呼ばれます。

サービスの中には固有のポートに接続を受けたときに inetd(8) から起動されるものもあります。 これはメールリーダサーバ (POP や IMAP 等) の場合によくあります。 これらのサービスは /etc/inetd.conf ファイルを編集することで有効化されます。 このファイルの編集に関する詳細は inetd(8) を見てください。

これらの他に /etc/rc.conf による有効化/無効化がカバーされていないサービスもあります。 それらは伝統的に /etc/rc.local にコマンドを書き込むことで実行されていました。 FreeBSD 3.1 にはデフォルトの /etc/rc.local は存在していません。 もし管理者によって作られていれば、 その時は一般的なやりかたとして認められるべきでしょう。 rc.local は最後の場所と考えられているということを 知っておいてください。 サービスを起動させるのにもっといい場所があるなら そこから始めてください。

/etc/rc.conf でその他のコマンドを実行しないでください。 そのかわり、デーモンの起動やブート時のコマンド実行は /usr/local/etc/rc.d にスクリプトを配置してください。

この他にサービスの起動に cron(8) を利用することもできます。 このアプローチには、cron(8) がそのプロセスを crontab の所有者権限で実行したり、サービスが 非特権ユーザによって立ち上げられ管理されるなどといった有利な点が いくつもあります。

これで cron(8) の機能の利点を得ることができます。 日時の指定を @reboot で置き換えることでジョブは システムがブートした直後、cron(8) が起動した時に実行されます。

== バーチャルホスト

FreeBSD の非常にありふれた用途の一つにバーチャルサイトの ホスティングがあります。 これは一つのサーバがネットワークには複数のサーバとして現れるものです。 これは一つのネットワークインタフェイスに 複数のアドレスを割当てることで実現されます。

ネットワークインタフェイスは "真の" アドレスを 一つと "別名" のアドレスを複数持ちます。これらの別 名は通常 /etc/rc.conf に別名のエントリを置くことで追加されます。

fxp0 インタフェイスへの別名のエント リは以下の様なものです。

ifconfig_fxp0_alias0="inet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx"

別名のエントリは alias0 から始まり昇順に命名されなければなり ません (たとえば、_alias1, _alias2 の様になります)。設定プロセス は最初に欠けた番号のところで停まります。

別名のネットマスクの計算は重要ですが、幸いなことに非常に簡単です。 個々のインタフェイスについてそのネットワークのネットマスクを正しく 表現しているアドレスが必ず一つ必要です。 そのネットワークに所属しているそれ以外のアドレスのネットマスクは すべて 1 でなければなりません。

例として、fxp0 インタフェイスが二つ のネットワークに接続されているものを考えてみましょう。 一つはネットマスクが 255.255.255.0 である 10.1.1.0 ネットワークで、もう一つはネットマスクが 255.255.255.240 である 202.0.75.16 ネットワークです。 システムは 10.1.1.0 には 10.1.1.1 として、 202.0.75.20 には 202.0.75.17 として現れるようにします。

以下のエントリはネットワークインタフェイスを上述の環境に正しく 設定するものです。

 ifconfig_fxp0="inet 10.1.1.1 netmask 255.255.255.0"
 ifconfig_fxp0_alias0="inet 10.1.1.2 netmask 255.255.255.255"
 ifconfig_fxp0_alias1="inet 10.1.1.3 netmask 255.255.255.255"
 ifconfig_fxp0_alias2="inet 10.1.1.4 netmask 255.255.255.255"
 ifconfig_fxp0_alias3="inet 10.1.1.5 netmask 255.255.255.255"
 ifconfig_fxp0_alias4="inet 202.0.75.17 netmask 255.255.255.240"
 ifconfig_fxp0_alias5="inet 202.0.75.18 netmask 255.255.255.255"
 ifconfig_fxp0_alias6="inet 202.0.75.19 netmask 255.255.255.255"
 ifconfig_fxp0_alias7="inet 202.0.75.20 netmask 255.255.255.255"

== 設定ファイル

=== /etc のレイアウト

設定のための情報が含まれているディレクトリはたくさんあります。 それぞれ以下のものを含んでいます。

/etc

システム全般の設定情報。 ここにあるデータはシステム 固有のものです。

/etc/defaults

デフォルトのシステム設定ファイル。

/etc/mail

追加的な sendmail(8) の設定、他の MTA の設定ファイル。

/etc/ppp

ユーザモード、およびカーネルモードの ppp プログラムの設定。

/etc/namedb

named(8) のデータのデフォルトの置場。通常 boot ファイルはここに置かれ、 /var/db に置かれた他のデータを 参照するディレクティブを含みます。

/usr/local/etc

インストールされたアプリケーションの設定ファイル。 アプリケーションごとのサブディレクトリを含んでいることがあります。

/usr/local/etc/rc.d

インストールされたアプリケーションの起動/停止スクリプト。

/var/db

永続的なシステム固有のデータファイル。 たとえば named(8) のゾーンファイル、データベースファイル等。

=== ホスト名

==== /etc/resolv.conf

/etc/resolv.conf は FreeBSD に インターネットドメインネームシステム (DNS) にどのようにアクセスするかを指定します。

resolv.conf の最もよくあるエントリは

nameserver

リゾルバが問い合わせるべきネームサーバの IP アドレス。 サーバはリストの順に 3 番目まで問い合わせられます。

search

ホスト名をルックアップするための検索リスト。 通常、ローカルなホスト名のドメインから決定されます。

domain

ローカルドメイン名。

基本的な resolv.conf

search example.com
nameserver 147.11.1.11
nameserver 147.11.100.30

search オプションと domain オプションは、 どちらか一方しか使ってはいけません。

DHCP を利用している場合、dhclient(8) は通常 resolv.conf を DHCP サーバから受け取っ た情報で書き換えます。

==== /etc/hosts

/etc/hosts は古きインターネットを 偲ばせるシンプルなテキストのデータベースです。 これはホスト名と IP アドレスをマッピングする DNS や NIS と組み合わせて使われます。 LAN でつながれているローカルな計算機は、 名前引きを簡単にするために named(8) サーバを立ち上げるかわりにここに書くことができます。 さらに /etc/hosts はインターネット名のローカルなレコードを提供し、 よくアクセスされる名前を外部に問い合わせるのを減らすためにも使えます。

# $FreeBSD$
#
# Host Database
# This file should contain the addresses and aliases
# for local hosts that share this file.
# In the presence of the domain name service or NIS, this file may
# not be consulted at all; see /etc/nsswitch.conf for the resolution order.
#
#
::1                     localhost localhost.my.domain myname.my.domain
127.0.0.1               localhost localhost.my.domain myname.my.domain

#
# Imaginary network.
#10.0.0.2               myname.my.domain myname
#10.0.0.3               myfriend.my.domain myfriend
#
# According to RFC 1918, you can use the following IP networks for
# private nets which will never be connected to the Internet:
#
#       10.0.0.0        -   10.255.255.255
#       172.16.0.0      -   172.31.255.255
#       192.168.0.0     -   192.168.255.255
#
# In case you want to be able to connect to the Internet, you need
# real official assigned numbers.  PLEASE PLEASE PLEASE do not try
# to invent your own network numbers but instead get one from your
# network provider (if any) or from the Internet Registry (ftp to
# rs.internic.net, directory `/templates').
#

/etc/hosts は、 次のようなごく簡単なフォーマットになっています。

[インターネットアドレス] [正式なホスト名] [別名1] [別名2] ...

例:

10.0.0.1 myRealHostname.example.com myRealHostname foobar1 foobar2

これ以上の情報は hosts(5) をあたってください。

=== ログファイルに関係する設定

==== syslog.conf

syslog.confsyslogd(8) プログラムのための設定ファイルです。 これはどのタイプの syslog メッセージを対応する ログファイルに記録するかを指定します。

# $FreeBSD$
#
#       Spaces ARE valid field separators in this file. However,
#       other *nix-like systems still insist on using tabs as field
#       separators. If you are sharing this file between systems, you
#       may want to use only tabs as field separators here.
#       Consult the syslog.conf(5) manual page.
*.err;kern.debug;auth.notice;mail.crit          /dev/console
*.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
security.*                                      /var/log/security
mail.info                                       /var/log/maillog
lpr.info                                        /var/log/lpd-errs
cron.*                                          /var/log/cron
*.err                                           root
*.notice;news.err                               root
*.alert                                         root
*.emerg                                         *
# uncomment this to log all writes to /dev/console to /var/log/console.log
#console.info                                   /var/log/console.log
# uncomment this to enable logging of all log messages to /var/log/all.log
#*.*                                            /var/log/all.log
# uncomment this to enable logging to a remote log host named loghost
#*.*                                            @loghost
# uncomment these if you're running inn
# news.crit                                     /var/log/news/news.crit
# news.err                                      /var/log/news/news.err
# news.notice                                   /var/log/news/news.notice
!startslip
*.*                                             /var/log/slip.log
!ppp
*.*                                             /var/log/ppp.log

これ以上の情報は syslog.conf(5) のマニュアルページに あたってください。

==== newsyslog.conf

newsyslog.conf は、通常 cron(8) によって予定を決めて実行されるプログラム newsyslog(8) のための設定ファイルです。 newsyslog(8) は、 ログファイルをいつ保存して再編するかを決定します。 logfilelogfile.0 に移され、logfile.0logfile.1 に、そして以下同様に移されます。 また、ログファイルを gzip(1) 形式で保存することもできます。 この場合ファイル名は logfile.0.gz, logfile.1.gz の様になります。

newsyslog.conf はどのログファイルが管理され、どのくらいの期間保存され、 そしていつ touch されるかを指定します。 ログファイルはあるサイズに到達するか、ある決められた時刻・ 日時で再編されあるいは保存されます。

# configuration file for newsyslog
# $FreeBSD$
#
# filename          [owner:group]    mode count size when [ZB] [/pid_file] [sig_num]
/var/log/cron                           600  3     100  *     Z
/var/log/amd.log                        644  7     100  *     Z
/var/log/kerberos.log                   644  7     100  *     Z
/var/log/lpd-errs                       644  7     100  *     Z
/var/log/maillog                        644  7     *    @T00  Z
/var/log/sendmail.st                    644  10    *    168   B
/var/log/messages                       644  5     100  *     Z
/var/log/all.log                        600  7     *    @T00  Z
/var/log/slip.log                       600  3     100  *     Z
/var/log/ppp.log                        600  3     100  *     Z
/var/log/security                       600  10    100  *     Z
/var/log/wtmp                           644  3     *    @01T05 B
/var/log/daily.log                      640  7     *    @T00  Z
/var/log/weekly.log                     640  5     1    $W6D0 Z
/var/log/monthly.log                    640  12    *    $M1D0 Z
/var/log/console.log                    640  5     100  *     Z

これ以上の情報は newsyslog(8) のマニュアルページに あたってください。

=== sysctl.conf

sysctl.confrc.conf によく似ています。 値は変数=値のかたちでセットされます。 指定された値はシステムがマルチユーザモードに移行した後でセットされます。 すべての変数がこのモードで設定可能というわけではありません。

以下は sysctl.conf のサンプルで 致命的なシグナルを記録しないように、また Linux プログラムに それらが実際は FreeBSD 上で動いていることを知らせる様に チューニングしています。

kern.logsigexit=0       # Do not log fatal signal exits (e.g. sig 11)
compat.linux.osname=FreeBSD
compat.linux.osrelease=4.3-STABLE

== sysctl によるチューニング

sysctl(8) は稼働中の FreeBSD システムに変更を加えるためのインタフェイスです。 これには経験を積んだ管理者用の TCP/IP スタックや 仮想メモリシステムのパフォーマンスを劇的に改善する 先進的なオプションが含まれます。 500 を越えるシステム変数を sysctl(8) で読んだり セットしたりできます。

本質的には sysctl(8) の機能は次の二つ、 システムの設定を読むことと変更することです。

読み取り可能なすべての変数を表示するには以下のようにします。

% sysctl -a

個々の変数、たとえば kern.maxproc を読むには以下のようにします。

% sysctl kern.maxproc
kern.maxproc: 1044

特定の変数をセットするには、直感的な文法 変数= を使ってください。

# sysctl kern.maxfiles=5000
kern.maxfiles: 2088 -> 5000

sysctl 変数の値は通常、文字列、数値、真偽値のいずれかです。 (真偽値は yes の場合には 1 で no の場合には 0 です)。

== ディスクのチューニング

=== sysctl 変数

==== vfs.vmiodirenable

vfs.vmiodirenable sysctl 変数のデフォルトは 1 (オン) で、 0 (オフ) または 1 (オン) にセットすることができます。 このパラメータはディレクトリがシステムによってどのように キャッシュされるかを制御します。 ほとんどのディレクトリは小さく、 ファイルシステムにおいては単一フラグメント (典型的には 1K) であり、バッファキャッシュではさらに小さくなっています (典型的には 512 バイト)。 しかしデフォルトモードで動作している時は、 大量のメモリを搭載していても バッファキャッシュは固定数のディレクトリしかキャッシュしません。 この sysctl をオンにすると、バッファキャッシュが VM ページキャッシュを、 ディレクトリをキャッシュするために使うことを可能にします。 これによる利点は、全てのメモリがディレクトリを キャッシュするのに使えるようになるということです。 欠点は、キャッシュに使われる最小のメモリの大きさが 512 バイトではなく 物理ページサイズ (大抵は 4K) になることです。 多数のファイルを操作するサービスを稼動しているなら、 常にこのオプションをオンにすることを推奨します。 そのようなサービスには、web キャッシュや大規模なメールシステム、 ニューズシステムなどが含まれます。 このオプションは一般にメモリを消費しますが、 性能を削減することはありません。 ただし実験して調べてみるべきでしょう。

==== hw.ata.wc

FreeBSD 4.3 では IDE のライトキャッシュがオフになりました。 これは IDE ディスクへの書き込み帯域幅を減らしてしまうことになりますが、 ハードドライブベンダに起因するデータの一貫性に関する 重大な問題のために必要なことだと考えられました。 基本的には、書き込み完了時期について IDE ドライブが嘘をつくという問題です。 IDE ライトキャッシュがオンであると IDE ハードドライブはデータを順番に書きこまないばかりか、 ディスクの負荷が高い時にはいくつかのブロックの書き込みを 無期限に延期してしまいます。 クラッシュや電源故障の場合、 ファイルシステムの重大な破壊をもたらします。 したがって私たちはデフォルトを安全側に変更しました。 残念ながらこれは大変な性能の低下をもたらし、 私たちはあきらめてこのリリース後にオンに戻しました。 hw.ata.wc sysctl 変数を見てデフォルトを チェックしてみるべきです。 もし IDE ライトキャッシュがオフになっていたら、 hw.ata.wc カーネル変数を 1 に戻すことでオンに戻すことができます。 これはブート時にブートローダから行わなければなりません。 カーネルがブートした後に行っても効果はありません。

詳しくは ata(4) を見てください。

=== ソフトアップデート

tunefs(8) プログラムはファイルシステムを細かくチュー ニングするのに使えます。このプログラムにはさまざまなオプションがありま すが、ここではソフトアップデートをオンオフすることだけを考えま す。以下の様にして切り替えます。

# tunefs -n enable /filesystem
# tunefs -n disable /filesystem

ファイルシステムはマウントされているあいだは tunefs(8) で変更することができません。 ソフトアップデートを有効にする いい機会はシングルユーザモードでどのパーティションもマウント されていない時です。

FreeBSD 4.5 からは、ファイルシステム生成時に newfs(8)-U オプションを使って ソフトアップデートを有効化できるようになりました。

ソフトアップデートはメタデータの性能、 主にファイルの作成と削除の性能を劇的に改善します。 すべてのファイルシステムでソフトアップデートを有効にすることを推奨します。 ソフトアップデートに関して、2 つの欠点を意識すべきです。 1 つめは、ソフトアップデートはクラッシュ時におけるファイルシス テムの一貫性は保証しますが、 物理ディスクの更新が何秒か (1 分に達することもあります!) 遅れる可能性が高いことです。 システムがクラッシュした場合、より多くの作業結果が消えてしまうかもしれません。 2 つめは、ソフトアップデート はファイルシステムブロックを解放するのを遅らせるとい