FreeBSD 2.X、3.X、4.X についての FAQ (よくある質問とその答え)
Prev |  | Next

# Chapter 7. システム管理

訳: にしか `<nishika@cheerful.com>`、 1997 年 11 月 12 日

7.1. システムスタートアップファイルはどこにあるのですか?
7.2. 簡単にユーザを追加するにはどうすればいいのですか?
7.3. FreeBSD システムに新しいハードディスクを追加するには?
7.4. 新しいリムーバブルドライブを持っていますが、どうやって使うの?
7.5. 自分の crontab ファイルを編集した後 “`root: not found`” のようなメッセージが延々と表示されるのですが、 これはなぜですか?
7.6. su(1) コマンドを実行して `root` になろうとすると、 su が “`you are not in the correct group to su root`” と警告します。
7.7. `rc.conf` やその他の スタートアップファイルを書き間違えてしまいました。 しかもそのためファイルシステムがリードオンリーになってしまっていて 編集ができません。どうすればいいですか?
7.8. どのようにしたら DOS の拡張パーティションをマウントできますか?
7.9. 他のシステムのファイルシステムを FreeBSD でマウントすることはできますか?
7.10. どのようにしたら FreeBSD を NT ローダーから起動させることができますか?
7.11. FreeBSD と Linux を LILO から起動するには?
7.12. FreeBSD と Linux を BootEasy から起動するには?
7.13. 「危険覚悟の専用 (dangerously dedicated) ディスク」は健康に悪いの?
7.14. どのようにしたらスワップ領域を増やせますか?
7.15. プリンタのセットアップで問題があります
7.16. 私のシステムのキーボードマッピングは間違っています。
7.17. 起動時に、“`unknown: <PNP0303> can't assign resources`” というメッセージが表示されるのですが?
7.18. ユーザディスククォータが正常に動作していないようです。
7.19. わたしの ccd は、 何が適合していない (Inappropriate) のでしょう?
7.20. どうしてわたしの ccd のディスクラベルを変更することができないのでしょう?
7.21. FreeBSD は System V の IPC プリミティブをサポートしますか?
7.22. UUCP でメールを配送するには sendmail をどう使えばよいのですか?
7.23. ダイアルアップでインターネットに接続する環境でメールをセットアップするにはどうやるの?
7.24. この UID が 0 の `toor` という アカウントとは何ですか? 危険にさらされているのでしょうか?
7.25. しまった! root のパスワードを忘れてしまった!
7.26. Control-Alt-Delete でシステムが再起動しないようにするにはどうすればいい?
7.27. DOS のテキストファイルを UNIX のテキストファイルに整形するにはどうすればいい?
7.28. 名前で指定してプロセスにシグナルを送るにはどうすればいい?
7.29. su が not in `root`'s ACL と言って私を悩ませるのはなぜ?
7.30. Kerberos をアンインストールするにはどうすればいいの?
7.31. 疑似ターミナルを追加するには?
7.32. `snd0` デバイスを作成することができません!
7.33. 再起動せずにもう一度 `/etc/rc.conf` を読み込んで `/etc/rc` を開始させるには?
7.34. 砂場 (sandbox) とは何ですか?
7.35. セキュアレベル (securelevel) って何ですか?
7.36. フロッピーや CDROM や他のリムーバブルメディアのマウントを一般ユーザーに許可するには?
7.37. システムを新しい巨大ディスクへ移すにはどうするのですか?
7.38. システムを最新の -STABLE にアップデートしようとしたのですが -RC や -BETA になってしまいました! 何が起こったのですか?
7.39. 新しいカーネルを入れようとしたのですが、 chflags に失敗します。どうすれば良いのでしょう?
7.40. システムの時刻を 1 秒以上変更することができないのです! どうすれば良いのでしょう?
7.41. rpc.statd(8) にメモリリークを見つけました! メモリを 256 メガバイトも使っています。

7.1. システムスタートアップファイルはどこにあるのですか?

FreeBSD 2.0.5R から 2.2.1R までは、 プライマリコンフィグレーションファイルは `/etc/sysconfig` にあります。 オプションはすべてこのファイルで設定され、他の `/etc/rc` (rc(8) 参照) および `/etc/netstart` といった ファイルはこれを読み込むだけです。

ファイル `/etc/sysconfig` を見て、システムに適合するように変更してください。 このファイルには、 それぞれの場所に何を書けばいいのかを表すコメントがたくさん書かれています。

FreeBSD 2.2.2 から 3.0 までのシステムでは、 `/etc/sysconfig` は、 より分りやすい名前の rc.conf(5) に改名され、それに従って書式もいくぶん改められています。 `/etc/netstart` も `/etc/rc.network` に改名され、 全部のファイルを `cp /usr/src/etc/rc* /etc` で一度にコピーすることが出来るようになります。

FreeBSD 3.1 とそれ以降では、 `/etc/rc.conf` が `/etc/defaults/rc.conf` に移動しました。 このファイルを編集してはいけません! 代わりに、 `/etc/defaults/rc.conf` の中で変えたいエントリの行を `/etc/rc.conf` にコピーし、 そこで変更するようにしてください。

たとえば named を起動したいとしましょう。 FreeBSD 3.1 かそれ以降のシステムで FreeBSD 付属の DNS サーバを起動するには、次のようにするだけです。

    # echo named_enable="YES" >>
                  /etc/rc.conf

FreeBSD 3.1 かそれ以降でローカルサービスを起動するためには、 `/usr/local/etc/rc.d` ディレクトリにシェルスクリプトを置きます。 シェルスクリプトは起動可能に設定し、ファイル名が .sh で終わっていなければなりません。 FreeBSD 3.0 とそれ以前のリリースでは、 `/etc/rc.local` を編集する必要があります。

ファイル `/etc/rc.serial` はシリアルポートの初期化 (たとえばポートの設定を固定したり等々) のためにあります。

ファイル `/etc/rc.i386` は iBCS2 エミュレーションのような Intel アーキテクチャ固有の設定や、 PC システムコンソール設定のためにあります。

7.2. 簡単にユーザを追加するにはどうすればいいのですか?

adduser(8) コマンドを使用してください。 また、pw(8) コマンドを用いることで、さらに細かい操作が可能です。

ユーザを削除するには rmuser(8) コマンドを使用してください。 繰り返しになりますが、pw(8) でも構いません。

7.3. FreeBSD システムに新しいハードディスクを追加するには?

www.FreeBSD.org に書かれているディスクフォーマットチュートリアルを参照してください。

7.4. 新しいリムーバブルドライブを持っていますが、どうやって使うの?

そのリムーバブルドライブが ZIP であれ EZ drive であれ (あるいはもしそういう風に使いたいのなら、フロッピーであれ)、 またハードディスクであれ、一旦システムにインストールされて認識され、 カートリッジ、フロッピー等々が挿入されていれば、 ことはどのデバイスでも全く同じように進みます。

(このセクションはMark Mayo's ZIP FAQ に基づいています)

ZIP ドライブやフロッピーで、すでに DOS のファイルシステムで フォーマットしてある場合、次のコマンドを使うことができます。 これはフロッピーの場合です。

    # mount -t msdos /dev/fd0c /floppy

出荷時の設定の ZIP ディスクではこうです。

    # mount -t msdos /dev/da2s4 /zip

その他のディスクに関しては、fdisk(8) や `/stand/sysinstall` を使って、 どのようにレイアウトされているか確かめてください。

以降は ZIP ドライブが 3 番目の SCSI ディスクで、 da2 と認識されている場合の例です。

他人と共有しなければならないフロッピーやリムーバブルディスク でなければ、BSD ファイルシステムを載せてしまうのが良い考えでしょう。 ロングファイル名もサポートされ、パフォーマンスは少なくとも 2 倍は向上しますし、おまけにずっと安定しています。 まず最初に、DOS レベルでのパーティション `/` ファイルシステムを無効にしておく必要があります。使用するのは `fdisk` でも `/stand/sysinstall` でも結構です。 複数のオペレーティングシステムを入れることを考慮する 必要がないような容量の小さなドライブの場合は、 次のように FAT パーティションテーブル (スライス) 全体を飛ばして、BSD のパーティション設定を行うだけで良いでしょう。

    # dd if=/dev/zero of=/dev/rda2 count=2
    # disklabel -Brw da2 auto

複数の BSD パーティションをつくる場合、 `disklabel` か `/stand/sysinstall` を使います。 固定ディスク上にスワップ領域を加える場合、 そういうことをしたいと思うのはもっともですが、 ZIP のようなリムーバブルドライブの上ではそういう考えは不適切 でしょう。

最後に、新しいファイルシステムをつくります。ディスク全体を使用する ZIP ドライブの場合は、以下のようにします。

    # newfs /dev/rda2c

次にマウントします。

    # mount /dev/da2c /zip

また、次のような行を `/etc/fstab` (fstab(5) 参照) に入れておくのも良い考えでしょう。 `mount /zip` と入力するだけでマウントできるようになります。

    /dev/da2c /zip ffs rw,noauto 0 0

7.5. 自分の crontab ファイルを編集した後 “`root: not found`” のようなメッセージが延々と表示されるのですが、 これはなぜですか?

これは通常、システム crontab (`/etc/crontab`) を編集し、crontab(1) を使ってインストールした場合に起こります。

    # crontab /etc/crontab

この方法は正しくありません。 システム crontab のフォーマットは crontab(1) が更新する各ユーザの crontab とは異なります (フォーマットの相違点の詳細は crontab(5) で説明されています)。

もしこのような操作をしてしまったなら、 あらたな crontab は誤ったフォーマットの `/etc/crontab` のコピーになってしまっているからです。 以下のコマンドで削除してください。

    # crontab -r

今度 `/etc/crontab` を編集する時は、 その変更を cron(8) に伝えるような操作をしてはいけません。 cron(8) は、自動的にその変更を認識するからです。

もしあなたが何かを一日一回、あるいは一週間や一ヶ月に一回だけ 実行させたいなら、シェルスクリプトを `/usr/local/etc/periodic` に追加し、 periodic(8) コマンドにシステムの cron スケジュールから 他の定期的なシステムのタスクとともに 実行させたほうが良いかもしれません。

このエラーの実際の原因は、システム crontab には どのユーザ権限でコマンドを実行するかを指定する余分なフィールドがあることによるものです。 FreeBSD に添付されている標準のシステム crontab には、 すべてのエントリに `root` が書かれています。 この crontab が `root` ユーザの crontab (システム crontab とは 異なります) として使われた場合、cron(8) は `root` を実行するコマンドの最初の単語だと認識しますが、 そのようなコマンドは存在しないのです。

7.6. su(1) コマンドを実行して `root` になろうとすると、 su が “`you are not in the correct group to su root`” と警告します。

これは、セキュリティ上の機能です。su コマンドを実行して `root` (またはスーパーユーザ権限を持つ 他のアカウント) になるには、`wheel` グループに所属していなければなりません。この機能がないと、 システムにアカウントがあって `root` の パスワードを見つけさえすれば、誰でもスーパーユーザ権限で システムにアクセスできてしまいます。この機能がある場合は、 必ずしもそうはなりません。`wheel` グループに 所属していなければ、su(1) がパスワードの入力すら 拒否するからです。

誰かが `root` に su できるように するには、その人を `wheel` グループに追加してください。

7.7. `rc.conf` やその他の スタートアップファイルを書き間違えてしまいました。 しかもそのためファイルシステムがリードオンリーになってしまっていて 編集ができません。どうすればいいですか?

シェルのパス名を入力するプロンプトが表示されたときに、 単に `ENTER` を押し、`mount /` を 実行してそルートファイルシステムを再マウントさせます。 また、お気に入りのエディタがあるファイルシステムを マウントするために `mount -a -t ufs` を する必要があるかも知れません。あなたのお気に入りのエディタが ネットワークファイルシステム上にある場合は、 ネットワークファイルシステムをマウントする前にネットワークを 手動で設定するか、ed(1) のようなローカルファイルシステムにある エディタを使うかしなければなりません。

vi(1) や emacs(1) の様なフルスクリーンエディタを 使うつもりなら `export TERM=cons25` と やってエディタが termcap(5) データベースから正しい データを読み取れるようにしなければなりません。

これを行ったあとはいつもと同様、 `/etc/rc.conf` を編集して間違いを訂正することができるようになります。 カーネル起動メッセージの直後に表示されたエラーメッセージには、 問題の起こったファイル内での行番号を表示されているはずです。

7.8. どのようにしたら DOS の拡張パーティションをマウントできますか?

DOS 拡張パーティションは、 すべての基本パーティションの後に認識されます。 たとえば、2台目の SCSIドライブの拡張パーティションに “E” パーティションがあるとしますと、 これは `/dev` に「スライス 5 」のスペシャルファイルを作る必要があり、 `/dev/da1s5` としてマウントされます。

    # cd /dev
    # ./MAKEDEV da1s5
    # mount -t msdos /dev/da1s5 /dos/e

7.9. 他のシステムのファイルシステムを FreeBSD でマウントすることはできますか?

`Digital UNIX`: UFS CDROM は直接 FreeBSD でマウントすることができます。 Digital UNIX やそれ以外のシステムのサポートする UFS のディスクパーティションをマウントすることはもっと複雑なことで、 オペレーティングシステムのディスクパーティションの詳細に依存します。

`Linux`: 2.2 以降は `ext2fs` パーティションをサポートします。 詳しくは、mount_ext2fs(8) を見てください。

`NT`: FreeBSD 用の読みだしのみ可能な NTFS ドライバがあります。 詳しくは、Mark Ovens 氏によって書かれたチュートリアル http://ukug.uk.freebsd.org/~mark/ntfs_install.html をご覧ください。

この問題について他の情報があれば、他の人から感謝されるでしょう。

7.10. どのようにしたら FreeBSD を NT ローダーから起動させることができますか?

この手順は 2.2.x と (起動が 3 つのステージに分かれている) 3.x のシステムとで多少異なります。

FreeBSD のネイティブルートパーティションの最初のセクタをファイルにして DOS/NT パーティション上に置くという画期的なアイディアがあります。 ファイル名を `c:\bootsect.bsd` (`c:\bootsect.dos` からの発想です) としたとします。 `c:\boot.ini`ファイルを次のように編集します。

    [boot loader]
    timeout=30
    default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
    [operating systems]
    multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows NT"
    C:\BOOTSECT.BSD="FreeBSD"
    C:\="DOS"

この手順は、利用しているシステムが 2.2.x であり、DOS、NT、FreeBSD あるいはその他のオペレーティングシステムがすべて、 同じディスクのそれぞれの fdisk パーティションにインストールされていることを想定しています。 この例は、DOS と NT を最初の fdisk パーティションにおき、 FreeBSD は 2 番目においたシステムで確認しています。 また、FreeBSD は MBR を使わずに、 ネイティブパーティションから起動するように設定してあります (訳注: FreeBSD のインストールで、ブートマネジャを使わずに標準 MBR を使う場合に相当します)。

(もし NTFS に変換してしまっているなら)DOS フォーマットのフロッピーディスクか FAT パーティションを `/mnt` に DOS マウントします。

    # dd if=/dev/rda0a of=/mnt/bootsect.bsd bs=512 count=1

再起動して DOS か NT に切替えます。NTFS ユーザは `bootsect.bsd` や `bootsect.lnx` をフロッピーディスクから `C:\` へコピーします。 `boot.ini` のファイル属性 (パーミッション) の変更を以下のように行ないます。

    > attrib -s -r c:\boot.ini

上の例の `boot.ini` で示したような正しいエントリを加え、 ファイル属性を元に戻します。

    > attrib +s +r c:\boot.ini

FreeBSD が MBR から起動するようになっている場合、 それぞれのネイティブパーティションから起動するように設定した後で、 DOS から `fdisk` コマンドを実行して元に戻してください。

FreeBSD 3.X における手順は、これよりいくぶん簡単です。

FreeBSD が NT 起動パーティションとして同じディスクにインストールされている場合には、 `/boot/boot1` を単純に `C:\BOOTSECT.BSD` へコピーします。 もし FreeBSD が異なったディスクにインストールされている場合には、 `/boot/boot1` では動作しませんので、 `/boot/boot0` が必要です。

> Warningここで `/boot/boot1` の代わりに `/boot/boot0` をコピーするようなことをしてはいけません! そうすると、パーティションテーブルを上書きしてしまい、 コンピュータが起動できなくなってしまいます。

`/boot/boot0` をインストールするには、 sysinstall のブートマネージャを利用するかどうか尋ねられる画面で FreeBSD ブートマネージャを選択する必要があります。 `/boot/boot0` のパーティションテーブル部分は NULL 文字で埋められているのですが、 sysinstall は `/boot/boot0` を MBR にコピーする前にパーティションテーブルをきちんとコピーしてくれるからです。

FreeBSD ブートマネージャは最後に起動した OS を記録するために パーティションテーブルの最後に起動した OS のエントリにあるアクティブフラグをセットし、512 バイト全体を MBR に書き戻します。 これは `/boot/boot0` を `C:\BOOTSECT.BSD` にコピーし、 エントリの一つにアクティブフラグをセットして空のパーティションテーブルを MBR に書き込むことと同じです。

7.11. FreeBSD と Linux を LILO から起動するには?

FreeBSD と Linux が同じディスクにインストールされている場合、 単に Linux 以外の OS を起動するための LILO のインストール手順に 従えばいいだけです。非常に簡単にではありますが、記してみましょう。

Linux を起動し、`/etc/lilo.conf` に以下の行を加えて ください。

    other=/dev/hda2
            table=/dev/hda
            label=FreeBSD

(上記の手順は FreeBSD のスライスが Linux から `/dev/hda2` という名前で見えていると仮定しています。 あなたの設定にあわせてください) その後、`lilo` を `root` で実行すれば完了です。

FreeBSD が別のディスクにインストールされているのなら、 LILO のエントリに `loader=/boot/chain.b` を追加してください。たとえば、このようになります。

    other=/dev/dab4
            table=/dev/dab
            loader=/boot/chain.b
            label=FreeBSD

場合によっては、二つ目のディスクを正しく起動するために FreeBSD ブートローダに BIOS ドライブ番号を指定する必要があるかもしれません。 たとえば、FreeBSD SCSI ディスクが BIOS によって BIOS ディスク 1 として認識されるのなら、 FreeBSD のブートローダのプロンプトで、次のように指定する必要があります。

    Boot: 1:da(0,a)/kernel

FreeBSD 2.2.5 やそれ以降の版では、boot(8) を設定すれば 起動時に上記のことが自動的に行えます。

Linux+FreeBSD mini-HOWTO が FreeBSD と Linux とを相互に使えるようにするためのよい参考資料になるでしょう。

7.12. FreeBSD と Linux を BootEasy から起動するには?

LILO をマスターブートレコード (MBR) ではなく Linux の起動パーティションにインストールしてください。 これで BootEasy から LILO を起動できるようになります。

Windows95 と Linux を使用している場合は、 いずれにせよ後者の方がおすすめです。 Windows95 を再インストールする必要にかられたとき、 Linux を起動可能に戻す手続きが簡単ですむからです (Windows95 は偏屈なオペレーティングシステムで、 マスターブートレコード (MBR) から他のオペレーティングシステムを追い払ってしまうのです)。

7.13. 「危険覚悟の専用 (dangerously dedicated) ディスク」は健康に悪いの?

インストール作業中、 ハードディスクのパーティションを切る際に 2 つの方法を選ぶことができます。 デフォルトの方法では、fdisk のテーブルエントリ (FreeBSD ではスライスと呼ばれる) を使って、 自身のパーティションを使用する FreeBSD のスライスを、 同じマシンの他のオペレーティングシステムと互換性のある形にします。 それに付随して、ブートセレクタをインストールすれば、 ディスク上の使用可能なオペレーティングシステムを切り替えることができます。 もう一つの方法はディスクすべてを FreeBSD で使うというもので、 この場合ほかのオペレーティングシステムとの互換性を考慮しないことになります。

では、なぜこれが 「危険覚悟の」と言われるのでしょう? このモードのディスクが、通常の PC のユーティリティが有効な fdisk テーブルと見なす情報を持っていないからです。 ユーティリティの出来如何によりますが、 そのようなディスクを発見したとき、 警告を出すものもあります。また、もっと悪い場合、 確認も通告もなしに BSD のブートストラップにダメージを与えるものもあるでしょう。 さらには、「危険覚悟の」ディスクレイアウトは多数の BIOS、 AWARD (たとえば HP Netserver や Micronics システム、 他多数で使用されていた) や Symbios/NCR (人気のあるSCSI コントローラ 53C8xx 用) などを混乱させることが分かっています。 これは完全なリストではありません。 他にもまだまだあります。この混乱の兆候は、 起動時にシステムがロックするというだけでなく、 FreeBSD のブートストラップが自分自身を見つけられないために表示する “read error” というメッセージなどにも現れることでしょう。

そもそもいったいなぜこのモードがあるのでしょうか? これはわずかに数キロバイトのディスク容量を節約するのみであり、 新規インストールで実際に問題を生ずるのです。 「危険覚悟の」モードの起源は新しい FreeBSD インストーラでの、 BIOS から見えるディスクの 「ジオメトリ」の値とディスク自身との整合性という、 もっとも一般的な問題のひとつを回避したいという要求が背景にあります。

「ジオメトリ」は時代遅れの概念ですが、 未だに PC BIOS とディスクへの相互作用の中核をなしています。 FreeBSD のインストーラがスライスを作る時、 ディスク上のスライスを BIOS が見つけられるように、 スライス位置をディスク上に記録します。それが誤っていれば、 起動できなくなってしまうでしょう。

「危険覚悟の」モードはこれを、 問題を単純にすることで回避しようとします。 状況によってはこれでうまくいきます。 しかし次善の策として使われているに過ぎません。 この問題を解決するもっと良い方法はいくらでもあるのです。

では、 インストール時に「危険覚悟の専用」モードが必要になる 状況を回避するにはどうすればよいのでしょうか? まず BIOS が報告するディスクのジオメトリの値を覚えておくことからはじめましょう。 “boot:” プロンプトで “`-v`” を指定するか、ローダで “boot -v” と指定して、 起動時にカーネルにこの値を表示させることができます。 インストーラが起動する直前に、 カーネルがジオメトリ値のリストを表示するでしょう。 パニックを起こさないでください。 インストーラが起動するのを待ち、 逆スクロールでさかのぼって値を確認してください。 普通は BIOS ディスクユニット番号は、 FreeBSD がディスクを検出する順序と同様であり、 最初に IDE、次に SCSI となります。

ディスクをスライシングする際に、 FDISK の画面で表示されるディスクのジオメトリが正しいこと (BIOS の返す値と一致しているか) を確認してください。 万一異なっていたら “`g`” を押して修正してください。 ディスクにまったくなにもない場合や、 他のシステムから持ってきたディスクの場合は これを行なう必要があるかもしれません。 これはそのディスクから起動させようとしている場合にのみ、 問題になることに注意してください。 FreeBSD はそのディスクをうまい具合いに他のディスクと区別してくれます。

ディスクのジオメトリについて BIOS と FreeBSD 間で一致させることができたら、この問題はほぼ解決したと思ってよいでしょう。 そしてもはや「危険覚悟の専用」モードは必要ありません。 しかし、まだ起動時に恐怖の “read error” メッセージが出るようであれば、 お祈りを捧げて新しいディスクを買いましょう。 もう失うものは何もありません。

「危険覚悟の専用ディスク」を通常の PC での使用法に戻すには、 原則として 2 つ方法があります。1 つは十分な NULL バイトを MBR に書き込んで、 きたるべきインストーラにディスクはまっさらだと思い込ませる方法です。 たとえば、こんな感じです。

    # dd if=/dev/zero of=/dev/rda0 count=15

また、マニュアルには書かれていない DOS の「機能」

    > fdisk /mbr

は、BSD ブートストラップを追い払ってくれる上に、 新しいマスターブートレコードをインストールしてくれます。

7.14. どのようにしたらスワップ領域を増やせますか?

スワップパーティションのサイズを増やすのが最良の方法ですが、 別のディスクを追加しなくて済むという利点のある方法があります。 経験から得た一般的な方法はメインメモリの 2倍程度のスワップ領域を とるというものです。しかしごく小さなメインメモリしかない場合は、 それ以上のスワップを構成したいと思うでしょう。また、将来のメモリの アップグレードに備え、後でスワップの構成を変更する必要がないように 十分なスワップを構成しておくことは良い考えです。

スワップを別のディスク上に追加することは、単純に同じディスク上 にスワップを追加する場合よりも高速に動作するようになります。 例に挙げれば、あるディスク上のソースをコンパイルしているとして、 スワップが別のディスク上に作られていれば、これらが同じディスク上 にある場合よりも断然速いです。SCSI ディスクの場合は特にそうだと言えます。

ディスクが複数ある場合、スワップパーティションを各ディスクに 作るように構成すると、使用中のディスク上にスワップを置いたとしても、 通常の場合は有益です。一般的に、システムにある高速なディスクには スワップを作るようにすべきでしょう。 FreeBSD はデフォルトでインターリーブなスワップデバイスを 4つまで サポートします。複数のスワップパーティションを構成する際に、 普通はそれらを大体同じくらいの大きさにして作りたいところですが、 カーネルのコアダンプを取るのに都合が良いようにメインの スワップパーティションを大きめにとる人もいます。 メインのスワップパーティションはカーネルのコアがとれるように 最低でも実メモリと同じ大きさにすべきでしょう。

IDE ドライブは同時に同じチャネル上の複数のドライブには アクセスできません (FreeBSD は mode 4 をサポートしていないので、 すべての IDE ディスク I/O は “programmed” です)。 IDE の場合であってもやはり、スワップを別のハードディスク上に 作成することをおすすめします。 ドライブは実に安いものです、心配するだけ無駄です。

NFS 越しにスワッピングさせる方法は、 スワップ用のローカルディスクが無い場合にのみ推奨されます。 NFS 越しのスワッピングは遅く、FreeBSD 4.x より前のリリースでは 効率が悪いのですが、4.0 以降ではそれなりに高速になります。 そうはいっても、利用できるネットワークの太さに制限されますし、 NFS サーバに余計な負荷がかかります。

これは 64MBの vn-swap を作る例です (ここでは `/usr/swap0` としますが、もちろん好きな名前を使うことができます)。

カーネルが次の行を含むコンフィグファイルから構成されているかを 確認します。GENERIC カーネルには、この行が含まれています。

    pseudo-device   vn 1   #Vnode driver (turns a file into a device)

1. vn デバイスを作ります

       # cd /dev
       # sh ./MAKEDEV vn0

2. スワップファイルを作ります (`/usr/swap0`)

       # dd if=/dev/zero of=/usr/swap0 bs=1024k count=64

3. スワップファイルに適切なパーミッションを設定します

       # chmod 0600 /usr/swap0

4. `/etc/rc.conf` でスワップファイルを有効化させます

       swapfile="/usr/swap0"   # Set to name of swapfile if aux swapfile desired.

5. マシンを再起動します

スワップファイルをすぐに有効化させたいのなら以下のようにタイプします。

    # vnconfig -e /dev/vn0b /usr/swap0 swap

7.15. プリンタのセットアップで問題があります

ハンドブックのプリンタの部分を参照してください。 探している問題のほとんどが書かれているはずです。 FreeBSD ハンドブックの「プリンタの利用」をご覧ください。

プリンタによっては、印刷するのにホスト側にドライバが 必要です。これら “WinPrinters” と呼ばれるものは、 素の FreeBSD では使えません。DOS や Windows NT 4.0 で動作しない なら、そのプリンタはおそらく WinPrinter でしょう。 ただし、唯一の希望が残されています。 `ports/print/pnm2ppa` の port が 対応しているかどうか確認してみてください。 パッケージの説明にはこう書いてあります。

> このソフトウェアは PPA (printer performance architecture) プロトコルの出力を行います。このプロトコル は HP の "Windows 専用" プリンタの一部に使われています。 そのなかには、HP Deskjet 820C シリーズ、HP DeskJet 720 シリーズ、および HP DeskJet 1000 シリーズがあります。(略)

> WWW: http://pnm2ppa.sourceforge.net/

7.16. 私のシステムのキーボードマッピングは間違っています。

`kbdcontrol` プログラムは、 キーボードマップファイルを読み込むためのオプションを備えています。 `/usr/share/syscons/keymaps` の下にたくさんのマップファイルがあります。 システムに関連のあるものを一つ選んで、ロードしてください。

    # kbdcontrol -l uk.iso

`/usr/share/syscons/keymaps` と拡張子 `.kbd` は、どちらも kbdcontrol(1) によって使用されます。

これは `/etc/sysconfig` (または rc.conf(5)) 中で設定することができます。 このファイル中にあるそれぞれのコメントを参照してください。

FreeBSD 2.0.5R やそれ以降の版では、 テキストフォントやキーボードマッピングに関係のあるものはすべて、 `/usr/share/examples/syscons` の中におさめられています。

現在以下のマッピングがサポートされています。

- Belgian ISO-8859-1

- Brazilian 275 keyboard Codepage 850

- Brazilian 275 keyboard ISO-8859-1

- Danish Codepage 865

- Danish ISO-8859-1

- French ISO-8859-1

- German Codepage 850

- German ISO-8859-1

- Italian ISO-8859-1

- Japanese 106

- Japanese 106x

- Latin American

- Norwegian ISO-8859-1

- Polish ISO-8859-2 (programmer's)

- Russian Codepage 866 (alternative)

- Russian koi8-r (shift)

- Russian koi8-r

- Spanish ISO-8859-1

- Swedish Codepage 850

- Swedish ISO-8859-1

- Swiss-German ISO-8859-1

- United Kingdom Codepage 850

- United Kingdom ISO-8859-1

- United States of America ISO-8859-1

- United States of America dvorak

- United States of America dvorakx

7.17. 起動時に、“`unknown: <PNP0303> can't assign resources`” というメッセージが表示されるのですが?

以下は、freebsd-current メーリングリストへの投稿からの 抜粋です。

| “can't assign resources” というメッセージは、 そのデバイスがレガシー ISA デバイスで、PnP を意識していない ドライバがカーネルに組み込まれていることを示します。 これには、キーボードコントローラ、プログラム可能な 割り込み制御 IC やその他さまざまな標準的なデバイスが あります。リソースが割り当てられないのは、既にそのアドレスを 使っているドライバがあるからです。 |
--Garrett Wollman `<wollman@FreeBSD.org>`, 2001 年 4 月 24 日 |

7.18. ユーザディスククォータが正常に動作していないようです。

- “`/`” にはディスククォータを設定しないでください。

- クォータファイルが置かれるファイルシステム上に クォータファイルを置くようにしてください。

  Filesystem | Quota file
  --- | ---
  `/usr` | `/usr/admin/quotas`
  `/home` | `/home/admin/quotas`
  ... | ...

7.19. わたしの ccd は、 何が適合していない (Inappropriate) のでしょう?

次のような症状が現れます。

    # ccdconfig -C
    ccdconfig: ioctl (CCDIOCSET): /dev/ccd0c: Inappropriate file type or format

通常この現象はタイプを「未使用 (unused)」のまま放っておかれた `c` パーティションをつなげようとした場合に現れます。ccd ドライバは FS_BSDFFS タイプをベースとするパーティションを要求します。 つなげようとしているディスクのディスクラベルを編集して、 パーティションのタイプを `4.2BSD` に変更してください。

7.20. どうしてわたしの ccd のディスクラベルを変更することができないのでしょう?

次のような症状が現れます。

    # disklabel ccd0
    (it prints something sensible here, so let's try to edit it)
    # disklabel -e ccd0
    (edit, save, quit)
    disklabel: ioctl DIOCWDINFO: No disk label on disk;
    use "disklabel -r" to install initial label

これは ccd から返されるディスクラベルが、 実はディスク上にはないまったくの偽の情報だからです。 これを明示的に書き直すことで問題を解消できます、 それには、つぎのようにします。

    # disklabel ccd0 > /tmp/disklabel.tmp
    # disklabel -Rr ccd0 /tmp/disklabel.tmp
    # disklabel -e ccd0
    (this will work now)

7.21. FreeBSD は System V の IPC プリミティブをサポートしますか?

はい。 FreeBSD は System-V スタイルの IPC をサポートします。 共有メモリ、メッセージ、セマフォが含まれます。 以下の行をカーネルコンフィグファイルに加えると、 サポートが有効になります。

    options    SYSVSHM          # enable shared memory
    options    SYSVSEM          # enable for semaphores
    options    SYSVMSG          # enable for messaging

> Note: FreeBSD 3.2 とそれ以降では、 これらのオプションがあらかじめ GENERIC カーネルに含まれていますので、 あなたのシステムにはすでに組み込まれています。

カーネルを再構築してインストールしてください。

7.22. UUCP でメールを配送するには sendmail をどう使えばよいのですか?

FreeBSD に付属している sendmail は、 インターネットに直接つながっているサイトにあわせて設定してあります。 UUCP 経由で mail を交換したい場合には sendmail の設定ファイルを改めてインストールしなければなりません。

`/etc/sendmail.cf` を自分の手で改造するのは純粋主義者のやるような事です。 sendmail の version 8 は m4(1) のようなプリプロセッサを通して設定ファイルを生成する新しいアプローチを取っており、 より抽象化されたレベルの設定ファイルを編集します。 `/usr/src/usr.sbin/sendmail/cf` ディレクトリの中にある設定ファイルを使用してください。

もしすべてのソースをインストールしていない場合には sendmail の設定ツールは、別の tar ファイルにまとめてあります。CD-ROM が mount されている場合には、次のようにしてください。

    # cd /cdrom/src
    # cat scontrib.?? | tar xzf - -C /usr/src contrib/sendmail

これはたった数 100Kbyte ですから心配ないでしょう。 `cf` ディレクトリにある `README` に、m4 での設定の基本的な説明があります。

UUCP での配送のためには、`mailertable` を使用すれば よいでしょう。これによって、sendmail が配送方式を決定するデータベースを 作成することができます。

まずはじめに、 `.mc` ファイルを作成しなければなりません。 `/usr/src/usr.sbin/sendmail/cf/cf` というディレクトリが、 これらのファイルを作成する場所です。既にいくつか例があると思います。 これから作成するファイルの名前を `foo.mc` とすると、 `sendmail.cf` を求めているような形式に変換するには、 次のようにしてください。

    # cd /usr/src/usr.sbin/sendmail/cf/cf
    # make foo.cf
    # cp foo.cf /etc/sendmail.cf

標準的な `.mc` ファイルは次のようになります。

    include(`../m4/cf.m4')
    VERSIONID(`Your version number')
    OSTYPE(bsd4.4)

    FEATURE(nodns)
    FEATURE(nocanonify)
    FEATURE(mailertable)

    define(`UUCP_RELAY', your.uucp.relay)
    define(`UUCP_MAX_SIZE', 200000)

    MAILER(local)
    MAILER(smtp)
    MAILER(uucp)

    Cw    your.alias.host.name
    Cw    youruucpnodename.UUCP

`nodns` と `nocanonify` という指定をすることで、 mail の配送に DNS を使用しなくなります。 `UUCP_RELAY` という 行に関しては、 ある理由から必要ですがそれは聞かないでください。 .UUCP で終わる仮想ドメインを処理することのできるインターネット上での ホスト名をここに書いてください。通常は、ISP の mail リレーホストを 書くことになると思います。

これが終了したら、次に `/etc/mailertable` というファイルが必要です。標準的な例は次のとおりです。

    #
    # makemap hash /etc/mailertable.db < /etc/mailertable
    #
    horus.interface-business.de   uucp-dom:horus
    .interface-business.de        uucp-dom:if-bus
    interface-business.de         uucp-dom:if-bus
    .heep.sax.de                  smtp8:%1
    horus.UUCP                    uucp-dom:horus
    if-bus.UUCP                   uucp-dom:if-bus
    .                             uucp-dom:

見れば分かるように、これは実在する設定のファイルです。はじめの 3 行はドメイン名で指定されたメールが default の経路で配送されずに、 「近道」するために UUCP で隣りのサイトに送るための特別な状況を 処理するものです。 次の行は Ethernet でつながっているローカルのドメインに対しては SMTP で送るための設定です。 最後に、UUCP での隣りのサイトが .UUCP で終わる仮想ドメインの書式で 指定されており、default の rule を ``uucp-neighbour`!`recipient`` で上書きするためのものです。一番最後の行はいつもドットを一つ書きます。 これは、ここまでの行でマッチしなかったすべてのホストにマッチし、 このサイトから世界に向けて出ていくための mail gateway に UUCP で配送するためのものです。 `uucp-dom:` に続けて書かれているノード名は、 `uuname` コマンドで指定することによって UUCP で直接配送される正しいノード名でなければなりません。

最後に、このファイルは使用する前に DBM データベースのファイルに 変換する必要があります。これを行なうコマンドラインは mailertable の最初のコメントに書いてあります。mailertable を変更した時には、 必ずこのコマンドを実行してください。

最後のヒントです: もし特定のメール配送がうまく作動するかどうか 確かめたい場合には、sendmail の`-bt` オプションを 使用してください。このオプションによって sendmail は アドレステストモードで起動します。 `0` の後に配送したいアドレスを書いてください。最後の行に、実際に使用される mail agent、この mail agent で送られる送信先のホスト、そして (多分変換されている) アドレスが表示されます。このモードを抜けるには Control-D を押してください。

    % sendmail -bt
    ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
    Enter <ruleset> <address>
    > 0 foo@interface-business.de
    rewrite: ruleset  0   input: foo @ interface-business . de
    ...
    rewrite: ruleset  0 returns: $# uucp-dom $@ if-bus $: foo \
    < @ interface-business . de >
    > ^D

7.23. ダイアルアップでインターネットに接続する環境でメールをセットアップするにはどうやるの?

静的に IP アドレスが割り当てられる場合は、 デフォルトの状態を変更する必要はありません。 割り当てられた名前をホストネームと するだけで、sendmail が後のことを引き受けてくれます。

ダイアルアップ ppp を インターネット接続に使用し、動的に IP アドレスが割り当てられる場合は、 インターネットサービスプロバイダ (ISP) のメールサーバにメールボックスがあるはずです。 ISP のドメインが `myISP.com` で、あなたのユーザ名が `user` だと仮定します。 また、あなたが自分のマシンを `bsd.home` と呼んでおり、ISP が `relay.myISP.com` をメールリレーとして使用できると言っているとしましょう。

メールボックスからメールを取ってくるためには、 回収 (retrieval) エージェントをインストールする必要があります。 Fetchmail は多種多様なプロトコルをサポートしているのでお勧めです。 ISP が使用しているのは、大抵 POP3 プロトコルです。 ユーザ ppp を使用している場合、 `/etc/ppp/ppp.linkup` に以下のように記述すると、 インターネットと接続が完了した時点で自動的にメールを取得するようになります。

    MYADDR:
            !bg su user -c fetchmail

ローカルでないアカウントにメールを配送するのに sendmail を使用している場合 (後述)、 上に示したエントリの後に

            !bg su user -c "sendmail -q"

を記述します。これはネットワーク接続が確立したらすぐに sendmail に溜っている mailqueue を強制的に処理させるようにします。

この例では、`user` が `bsd.home` にアカウントを持ち、 `bsd.home` 上の `user` のホームディレクトリに、以下のような `.fetchmailrc` ファイルがつくられていることを想定しています。

    poll myISP.com protocol pop3 fetchall pass MySecret;

言うまでもなく、このファイルは `user` 以外のユーザが読むことが出来ないようにしなくてはなりません。 内容にパスワード `MySecret` が含まれているからです。

正しい `from:` ヘッダをつけてメールを送るためには、 sendmail に `user@bsd.home` ではなく `user@myISP.com` を使用するよう教える必要があります。 メールをより早く転送するために、すべてのメールを `relay.myISP.com` へ送るように sendmail に 指示しておくのも良いでしょう。

上の要件を満たすには、以下のような `.mc` ファイルが適しています。

    VERSIONID(`bsd.home.mc version 1.0')
    OSTYPE(bsd4.4)dnl
    FEATURE(nouucp)dnl
    MAILER(local)dnl
    MAILER(smtp)dnl
    Cwlocalhost
    Cwbsd.home
    MASQUERADE_AS(`myISP.com')dnl
    FEATURE(allmasquerade)dnl
    FEATURE(masquerade_envelope)dnl
    FEATURE(nocanonify)dnl
    FEATURE(nodns)dnl
    define(`SMART_HOST', `relay.myISP.com')
    Dmbsd.home
    define(`confDOMAIN_NAME',`bsd.home')dnl
    define(`confDELIVERY_MODE', `deferred')dnl

`.mc` ファイルから `sendmail.cf` への変換方法については、 前のセクションを参照してください. sendmail.cf を更新した後に sendmail をリスタートするのもお忘れなく。

7.24. この UID が 0 の `toor` という アカウントとは何ですか? 危険にさらされているのでしょうか?

心配無用です。`toor` は “代替の” スーパーユーザーアカウントです (toor は root を逆に綴ったものです)。 以前は、bash(1) シェルがインストールされた時に 作成されていましたが、現在は標準で作成されています。 このユーザーが作成されるのは、 スーパーユーザが非標準のシェルを使う場合を想定しており、 `root` の標準のシェルを変更しなくてもよくなっています。 基本配布に含まれていないシェル (たとえば ports や packages からインストールされるシェル) は、デフォルトでは別のファイルシステムに存在する 可能性のある `/usr/local/bin` に インストールされることが多いので、これは重要です。 `root` のシェルが `/usr/local/bin` にあり、 `/usr` (または、`/usr/local/bin` があるいずれかのファイルシステム) が何らかの理由でマウントされていないとすると、 `root` は問題を解決するために ログインすることができません (シングルユーザーモードで再起動すれば、 シェルのパスの入力を促されるのですが)。

`toor` を日々の root の仕事を 非標準のシェルで行うために使い、`root` は シングルユーザーモードや緊急時のために、標準のシェルのままに している人がいます。何もしなければ、パスワードを無効にしてあるので `toor` ではログインできません。 使いたいなら、`root` でログインして `toor` の パスワードを設定しましょう。

7.25. しまった! root のパスワードを忘れてしまった!

慌てないでください! 単にシステムを再起動し、 シングルユーザモードに移るために `Boot:` と表示されるプロンプトで `boot -s` と入力してください (FreeBSD の 3.2 より前のリリースでは `-s`となります)。 どのシェルを使うのかという質問には、ENTER キーを押してください。`#` に移ることができるでしょう。 `mount -u /` と入力して ルートファイルシステムの読み書きを再マウントし、 `mount -a` と入力して、 すべてのファイルシステムをマウントし直した後、 `passwd root` と入力して `root` のパスワードを設定し直してください。 その後、`exit` と入力すれば、起動が続けられます。

7.26. Control-Alt-Delete でシステムが再起動しないようにするにはどうすればいい?

FreeBSD 2.2.7-RELEASE 以降で syscons (デフォルトのコンソールドライバ) を使用している場合には、次の行をカーネルコンフィグレーションファイルに追加して カーネルを再構築し、インストールしてください。

    options SC_DISABLE_REBOOT

FreeBSD 2.2.5-RELEASE 以降で PCVT コンソールドライバを使用している 場合には、同様に次の行をカーネルコンフィグレーションファイルに追加して カーネルを再構築し、インストールしてください。

    options PCVT_CTRL_ALT_DEL

上にあげたものよりも古い FreeBSD の場合、 現在コンソールが使用しているキーマップを編集し、 キーワード `boot` を `nop` に書き換えてください。 `/usr/share/syscons/keymaps/us.iso.kbd` にあります。 その変更を反映させようとして、 このキーマップのロードを明示的に行なうために、 `/etc/rc.conf` を実行すべきかもしれません。 もちろん他の国のキーマップを使っているのであれば、 代わりにそのキーマップファイルを編集してください。

7.27. DOS のテキストファイルを UNIX のテキストファイルに整形するにはどうすればいい?

単に次の perl コマンドを実行してください。

    % perl -i.bak -npe 's/\r\n/\n/g' file ...

file の部分には処理するファイルを指定してください。 整形後のファイルは元のファイル名で作成され、 整形前のファイルはバックアップとして元の ファイル名の末尾に拡張子 `.bak` のつけられた名前で作成されます。

あるいは tr(1) コマンドを使うこともできます。

    % tr -d '\r' < dos-text-file > unix-file

`dos-text-file` は DOS 形式のテストファイル、 `unix-file` には変換された出力が格納されます。 perl を使うよりほんのちょっぴり速くなります。

7.28. 名前で指定してプロセスにシグナルを送るにはどうすればいい?

killall(1) を使ってください。

7.29. su が not in `root`'s ACL と言って私を悩ませるのはなぜ?

Kerberos の認証システムからくるエラーです。 この問題は致命的なものではなく、 うっとおしいといったものです。 `su` に `-K` オプションをつけて起動するか、 次の質問で説明されている方法で Kerberos をアンインストールしてください。

7.30. Kerberos をアンインストールするにはどうすればいいの?

システムから Kerberos を削除するには、 あなたの動かしているリリースの bin ディストリビューションを再インストールしてください。 もし CDROM を持っているのなら、 その CDROM をマウント (マウントポイントは `/cdrom` と仮定) して、 次のように入力してください。

    # cd /cdrom/bin
    # ./install.sh

7.31. 疑似ターミナルを追加するには?

telnet、ssh、X、screen をたくさん利用されている場合、 疑似ターミナルが足りなくなっている可能性があります。 これを増やすには次のようにします。

1. 次の行をカーネルコンフィグレーションファイルに追加して

       pseudo-device pty 256

   新たにカーネルを作りインストールします。

2. 次のコマンドを実行して

       # cd /dev
       # ./MAKEDEV pty{1,2,3,4,5,6,7}

   新たなターミナル用の 256 個のデバイスノードを作ります。

3. `/etc/ttys` を編集し 256 個のターミナルごとの定義を追加します。 既存のエントリーの形式にあわせる必要があるでしょう。 たとえばこんな感じです。

       ttyqc none network

   正規表現を使った指定は `tty[pqrsPQRS][0-9a-v]` となります。

4. 新しいカーネルでシステムを再起動すると完了です。

7.32. `snd0` デバイスを作成することができません!

`snd` というデバイスは存在しません。 この名前は、FreeBSD サウンドドライバによって作成されるさまざまなデバイス、 `mixer` や `sequencer`、 `dsp` などを総称したものです。

これらのデバイスを作成するには、次のようにする必要があります。

    # cd /dev
    # sh MAKEDEV snd0

7.33. 再起動せずにもう一度 `/etc/rc.conf` を読み込んで `/etc/rc` を開始させるには?

シングルユーザモードに移行して、 マルチユーザモードに戻ってください。

コンソールで次のように実行します。

    # shutdown now(注: -r や -h は付けません)
    # return
    # exit

7.34. 砂場 (sandbox) とは何ですか?

“砂場 (Sandbox)” とはセキュリティ用語の一つで、 次の二つの意味があります。

- 一つ目は、「仮想的な『防壁』で囲まれているプロセス」です。 その『防壁』は、そのプロセスに侵入した第三者が、 さらにシステムの広い範囲に影響を与えることを防ぐように設計されます。

  このプロセスの振舞いは、『防壁』の中だけに制限される、と表現できます。 つまり、このプロセスにおいて、『防壁』を越えるようなコードの実行は できないという意味です。そのため、コードの実行におけるセキュリティは 確かなものであると保証でき、実行の詳細な追跡を行なう必要はなくなります。

  その『防壁』とは、たとえばユーザ ID がそれにあたるでしょう。 この定義は、security(7) や named(8) のマニュアルページで用いられています。

  `ntalk` サービス (/etc/inetd.conf 参照のこと) を例にとってみます。 このサービスはかつて、実行時の ユーザ ID として root を用いていましたが、現在では tty というユーザ ID で動作します。 ユーザ tty は、 ntalk を経由してシステムの侵入に成功した第三者が そのユーザ ID 以上の権限を得ることを、 より一層困難にするために設計された砂場 (sandbox) なのです。

- 二つ目は「シミュレートされたマシンの内側で実行されるプロセス」のことで、 こちらはより中核的です。 普通に考えれば、あるプロセスに侵入することができる第三者は、 マシンのより広い範囲にも侵入できると信じるものなのですが、 この種のプロセスの場合、それは実際にはシミュレートされたマシンに 侵入しただけなので、現実のデータを変更することは何一つできません。

  これを実現するための最も広く用いられている方法は、 シミュレートされた環境をサブディレクトリに構築し、 そのディレクトリに chroot して、そのディレクトリで プロセスを実行すること (つまり、そのプロセスにとって `/` は システムの実際のルートディレクトリ `/` ではなく、 chroot されたサブディレクトリを指す) です。

  広く用いられているもう一つの方法があります。 それは、既に存在しているファイルシステムを 読み込み専用 (read-only) でマウントし、その上に、あるプロセスに対して そのファイルシステムが書き込み可能であるように見せるような、 もう一つのファイルシステムの層を用意するものです。すると、 そのプロセスはファイルを書き込むことができると認識し、 実際に書き込むことができるのもその特定のプロセスだけ - システムにある他のプロセスは書き込めないのに対して - であるという状況を実現することができます。

  この種の砂場 (sandbox) は、 その非常に透過的な性質を使って、ユーザ (もしくは侵入者) が その事実に気付かないように実現されます。

UNIX は、内部的に二つの砂場 (sandbox) を実装しています。 一つはプロセスレベルのもの、もう一つはユーザ ID レベルのものです。

UNIX プロセスはすべて、他の UNIX プロセスから完全に隔離されています。 どのプロセスも、他のプロセスのアドレス空間を変更することはできません。 これは、あるプロセスが他のプロセスのアドレス空間を上書きできるような、 クラッシュにつながる行為が容易に実現できる Windows とは全く異なるものです。

UNIX プロセスは、特定のユーザ ID が所有します。 もし、実行者のユーザ ID が `root` ユーザのものでなければ、 ユーザ ID は、他のユーザが所有するプロセスから そのプロセスを守る機能を果たすわけです。 また、そのユーザ ID は、ディスク上にあるデータを 保護するのにも使われています。

7.35. セキュアレベル (securelevel) って何ですか?

セキュアレベルとはカーネルに実装されているセキュリティ機構の一つです。 簡単に言うと、カーネルはセキュアレベルが正の値の時に、 ある特定の操作を制限します。この制限は、たとえスーパユーザ (`root` のこと) であっても例外ではありません。 この文を書いている時点では、 セキュアレベル機構を使って以下のような操作を制限することができます。

- `schg` (system immutable flag) のようなファイルフラグの変更

- `/dev/mem` および `/dev/kmem` 経由でのカーネルメモリへの書き込み

- カーネルモジュールのロード

- ipfirewall(4) ルールの変更

稼働中のシステムでセキュアレベルの状態をチェックするには、 次のコマンドを実行します。

    # sysctl kern.securelevel

出力には、sysctl(8) 変数 (今の場合は `kern.securelevel`) と数字が現れます。 数字が現在のセキュアレベルの値です。 これがもし正の値なら、 何らかのセキュアレベルによる制限が有効になっています。

システム稼働中にセキュアレベルを下げることはできません。 これは、それを可能にするとセキュアレベルの意味がなくなってしまうからです。 セキュアレベルが正の値でないことを要求する操作 (たとえば `installworld` や日付の変更など) を行なう必要がある場合は、`/etc/rc.conf` にあるセキュアレベルの設定 (`kern_securelevel` と `kern_securelevel_enable` という変数) を変更して再起動する必要があります。

セキュアレベルに関する詳しい情報や、 各レベルで実現される機能に関しては init(8) のマニュアルページを参照してください。

> Warningセキュアレベルは万能というわけではなく、 弱点も数多く存在します。また、場合によっては、 セキュリティを低下させてしまうこともあります。

> 最も大きな問題の一つに、 セキュアレベルの機能を有効にするには、 起動処理でセキュアレベルが設定されるまでに使われるすべてのファイルを 保護する必要があるということがあります。 もし攻撃者が、システムがセキュアレベルを設定する前にコードを実行することができるとしたら、 セキュアレベルによる保護は無意味になってしまいます (起動時には低いセキュアレベルでしか実行できない処理を行なう必要があるため、 セキュアレベルの設定は、起動処理の最後の方で行なわれます)。 起動処理で使われるすべてのファイルを保護することは技術的に不可能です。 もしそうできたとしても、システムの保守はまさに悪夢となるでしょう。 設定ファイル一つ書き換えるのにも、 シングルユーザモードに切替えなければならなくなるのですから。

> 以上で説明した内容やその他の点については、 メーリングリストでも良く話題にのぼります。 議論のようすをこのページから検索してみてください。 セキュアレベルは、 いずれより粒度の細かい機構にとって代わるだろうと考えている人々もいますが、 その点についてはまだ不透明なままです。

> どうか注意するようにしてください。

7.36. フロッピーや CDROM や他のリムーバブルメディアのマウントを一般ユーザーに許可するには?

一般ユーザーでもデバイスをマウントできるようにすることができます。 手順は次のとおりです。

1. `root` になって、 sysctl 変数である `vfs.usermount` を `1` に設定します。

       # sysctl -w vfs.usermount=1

2. `root` になって、 リムーバブルメディアに関連するブロックデバイスに適切なパーミッションを設定します。

   例として、最初のフロッピーデバイスをユーザーがマウントできるようにするには、 次のようにします。

       # chmod 666 /dev/fd0

   `operator` グループに所属するユーザが CDROM ドライブをマウントできるようにするには 以下のようにします。

       # chgrp operator /dev/cd0c
       # chmod 640 /dev/cd0c

3. 最後に `vfs.usermount=1` という行を `/etc/sysctl.conf` ファイルに追加し、 ブート時にセットされるようにしておきます。

これで、すべてのユーザは フロッピー `/dev/fd0` を 自身の所有するディレクトリへマウントすることができます。

    % mkdir ~/my-mount-point
    % mount -t msdos /dev/fd0 ~/my-mount-point

これで、`operator` グループに所属するユーザは CDROM `/dev/cd0c` を 自身の所有するディレクトリへマウントすることができます。

    % mkdir ~/my-mount-point
    % mount -t msdos /dev/cd0c ~/my-mount-point

デバイスのアンマウントは簡単です。

    % umount ~/my-mount-point

しかし、 `vfs.usermount` を有効にすることは、セキュリティ上よいことではありません。 MSDOS 形式のメディアにアクセスには、Ports コレクションにある パッケージ mtools を使用した方がよいでしょう。

7.37. システムを新しい巨大ディスクへ移すにはどうするのですか?

一番良いのは新しいディスクに OS を再インストールして、 それからユーザデータを移すことです。特にあなたが -stable を 複数のリリースを跨いで追い掛けている場合にはこの方法をおすすめします。 あなたは boot0cfg(8) を使うことで booteasy を両方の ディスクにインストールでき、新しい配置で満足している間 デュアルブートができます。これを行ったあとデータを移す 方法を探すなら次の段落は読み飛ばしてください。

何もないディスクへインストールしないことに決めたならば `/stand/sysinstall`、なり fdisk(8) と disklabel(8) なりを使って新しいディスクに パーティションとディスクラベルを作らなければなりません。 また boot0cfg(8) で booteasy を両方のディスクに インストールして、コピーの作業が終わったあとに 古いシステムからでも新しいディスクからでも起動できるように しておく必要があります。この作業の詳細は formatting-media tutorial を見てください。

新しいディスクの立ち上げが終わってデータの移動を 待つばかりになりました。しかし悲しいかな、無闇やたらと コピーすればいいというものではありません。デバイスファイル (`/dev`) やシンボリックリンクなどは 失敗の元になります。これらを理解するツール、すなわち dump(8) や tar(1) 等を使う必要があります。 データの移転はシングルユーザで行うことをお勧めしますが、 絶対と言うわけではありません。

あなたは dump(8) と restore(8) 以外のもので root ファイルシステムを移行してはなりません。 tar(1) コマンドでもたぶんうまく行くでしょうが、 やらないほうがいいでしょう。パーティション一つを もう一つのからのパーティションに移すときは dump(8) と restore(8) 使うべきです。 パーティションのデータを新しいパーティションに移すのに dump を使うやり方は以下の通りです。

1. 新しいパーティションに newfs をかける。

2. それを暫定的なマウントポイントにマウントする。

3. そのディレクトリに cd。

4. 古いパーティションを dump し、 その出力をパイプで新しい方へ。

たとえば root を `/dev/ad1s1a` へ、暫定的なマウントポイントを `/mnt` として移そうとすると以下のようになります。

    # newfs /dev/ad1s1a
    # mount /dev/ad1s1a
    # cd /mnt
    # dump 0uaf - / | restore xf -

もしパーティションの構成を変えようと思っているなら - つまり一つだったものを二つにしたり二つだったものをくっつけたり しようとしているなら、自前であるディレクトリ以下のすべてを 新しい場所へ移す必要が出てくるかも知れません。dump(8) は ファイルシステムに働くのでこの目的には使えません。この場合は tar(1) を使います。一般に `/old` から `/new` への移動は tar(1) で 以下のようにします。

    # (cd /old; tar cf - .) | (cd /new; tar xpf -)

`/old` に他のファイルシステムが マウントされていて、そのデータの移動までは考えてないならば 最初の tar(1) に 'l' フラグを追加します。

    # (cd /old; tar clf - .) | (cd /new; tar xpf -).

tar(1) のかわりに cpio(1) や pax(1), cpdup (ports/sysutils/cpdup) 等を 使っても構いません。

7.38. システムを最新の -STABLE にアップデートしようとしたのですが -RC や -BETA になってしまいました! 何が起こったのですか?

短い答え: ただの名前です。RC は “リリース候補 (Release Candidate)” に 由来するもので、リリースが間近であることを意味します。 また、FreeBSD における -BETA は通常、 リリース前のコードフリーズ期間に入っているという意味になります。

長い答え: FreeBSD はそのリリースを 2 ヶ所あるうちの 一方から派生させます。3.0-RELEASE や 4.0-RELEASE の様な (0 のマイナー番号を持つ) メジャーリリースは、一般に -CURRENT と呼ばれる 開発版の流れから分岐させられてできます。3.1-RELEASE や 4.2-RELEASE などのマイナーリリースはアクティブな -STABLE ブランチ (枝) の スナップショットでした。 4.3-RELEASE からは、リリース毎にブランチが作成されるように なりました。ものすごく保守的な開発速度 (主にセキュリティ 勧告のみ) を求めている人は、このブランチを追跡すると よいでしょう。

リリースを作る時になるとそれを分岐させるブランチは 特定のプロセスへ突入します。そのプロセスの一つは コードフリーズ (コードの凍結) です。コードフリーズが 始まると、そのブランチの名前がリリースになろうとしていることを 反映するものに変えられます。たとえば、4.0-STABLE と 呼ばれていたブランチは名前が 4.1-BETA へと 変えられ、コードフリーズとリリース前のテストが 始まったことを示します。 バグの修正はリリースの一部としてコミットされます。 ソースコードがリリースの形を取ったなら名前が 4.1-RC へと 変えられ、それからリリースが作られることを示します。 ひとたび RC のステージになってしまうと、発見された もっとも致命的なバグの修正しかできなくなります。 ひとたびリリースが (この例では 4.1-RELEASE) 作られれば、 そのブランチは 4.1-STABLE と改名されます。

7.39. 新しいカーネルを入れようとしたのですが、 chflags に失敗します。どうすれば良いのでしょう?

簡単な回答: 多分、セキュアレベルが 0 より大きくなっているのでしょう。 直接シングルユーザモードで再起動して、 カーネルをインストールしてください。

詳しい回答: FreeBSD では、セキュアレベルが 0 より大きい場合、 システムフラグの変更が禁止されます。 現在のセキュアレベルは、次のコマンドを使って調べることができます。

    # sysctl kern.securelevel

セキュアレベルを下げる操作は、できないようになっています。 そのため、カーネルをインストールするには、 シングルユーザモードで起動するか、`/etc/rc.conf` のセキュリティ設定を変更して再起動する必要があります。 セキュアレベルの詳細は init(8) を、 rc.conf の詳細は `/etc/defaults/rc.conf` および、 rc.conf(5) のマニュアルページをご覧ください。

7.40. システムの時刻を 1 秒以上変更することができないのです! どうすれば良いのでしょう?

簡単な回答: 多分、セキュアレベルが 1 より大きくなっているのでしょう。 直接シングルユーザモードで再起動して、 時刻の変更をしてください。

詳しい回答: FreeBSD では、セキュアレベルが 1 より大きい場合、 1 秒以上の時刻変更が禁止されます。 現在のセキュアレベルは、次のコマンドを使って調べることができます。

    # sysctl kern.securelevel

セキュアレベルを下げる操作は、できないようになっています。 そのため、システムの時刻を変更するには、 シングルユーザモードで起動するか、`/etc/rc.conf` のセキュリティ設定を変更して再起動する必要ばあります。 セキュアレベルの詳細は init(8) を、 rc.conf の詳細は `/etc/defaults/rc.conf` および、 rc.conf(5) のマニュアルページをご覧ください。

7.41. rpc.statd(8) にメモリリークを見つけました! メモリを 256 メガバイトも使っています。

いいえ。それはメモリリークではありませんし、 256 メガバイトのメモリを使っている、ということでもありません。 おそらく (ほとんどの場合)、 処理に都合が良いように非常にたくさんの量のメモリを そのプロセスのアドレス空間にマッピングしているのでしょう。 技術的な見地から考えても、これは大きな害があることではなく、 単に top(1) や ps(1) といったツールの表示に影響がある程度です。

rpc.statd(8) は、(`/var` にある) ステータスファイルを自分のアドレス空間にマッピングします。 マッピングは、後で大きな空間が必要になった時に再マッピングしないで済むよう、 非常に大きなサイズを指定して行なわれます。 これは、ソースコードに含まれる mmap(2) 関数のマッピング長を示す引数に `0x10000000` が指定されていることからも分かります。 この数字が IA32 アーキテクチャの持つアドレススペース全体の 16 分の 1、すなわち、ちょうど 256 メガバイトに相当するのです。

Prev | Home | Next
カーネルコンフィグレーション |  | X Window System と仮想コンソール