next up previous contents
Next: D.2 IPアドレスと名前解決 Up: D. 環境設定 Previous: D. 環境設定

D.1 起動とrcファイル

Unixではシステムの起動は、ブートシーケンスがカーネルを読み込み、 カーネルが initプログラムを起動する。起動された init プログラムが各種設定ファイルを起動し、システムが立ち上がるように なっている。

但し、PC での起動においては、その制約から以下のような順序になる。

  1. BIOS の起動
  2. 起動デバイスのMBRの読み込み(boot0)
  3. 起動デバイスのSecondary Boot Recorderの読み込み(boot1)
  4. FreeBSDのBTX loader(boot2)
  5. loader
  6. カーネル
  7. init
  8. rc

最初の4段階がPCの制約に対応するためのFreeBSDなどでの工夫で、MBR はHDDの先頭(Secondary はパーティションの先頭)に置かれ、512byteと いう大きさの制限があるために、boot0,boot1は非常に単純なプログラム になっており、実際には boot2 と loader がカーネル読み込みまでを 制御するようになっている。こうした工夫は、BSD系ではカーネルの作成が 簡単に行えるために、新たに作ったカーネルが動かない場合や、別の カーネルを動かしたい場合に容易に対応出来るように、ファイルシステム を解釈するカーネルのローダが用意されているためであり、更には loader 自体も設定が可能なため、その前段階のローダ(boot2)があるという多段 構造になっているのである。

いずれにせよカーネルが起動されると、カーネルは /sbin/init プログラム を起動し、init が各種の初期設定を行うための入り口となるスクリプト /etc/rc を動かす。

従来は、このinit以後の動作が SystemV系とBSD系で異なり(LinuxはSystemV系 に倣っている)、一般にSystemV系では /etc/rc?.d/ ディレクトリ下 の Sxx(xxは数字)を順に実行することで立ち上がる(Sxxは主 にシェルスクリプトで、実際には /etc/init.d/へのリンクが多い)。 こうしたSytemV系の工夫は、初期化あるいは起動されるプログラム毎に スクリプトを用意するだけで良いために、新しいサービスの導入や、あるいは 逆にサービスの停止が非常に簡単になるという利点を持っていた。 しかし、その一方でそれぞれのサービスのオプションなどはスクリプト中に 直接記述したり、あるいはスクリプト毎に勝手な設定ファイルを読み込むため に非常に見通しの悪いものになっていたのと、各スクリプトがお互いに依存 するような場合には非常に面倒なものになるという欠点があった。

一方、BSD系では伝統的に/etc/rc/etc/rc.localなどのスク リプトファイルを起動するようになっているが、FreeBSD 4R 以前では これらの rc ファイルから更に /etc/rc.i386,/etc/rc.pccard,/etc/rc.network などの多くのスクリプトを起動するように拡張され、SystemV系の流儀を一部だけ 持ち込んでいたが、SystemVの程プログラムの起動が分離されているとは言えない 状態であった。一方、こうした起動の分離という問題とは別に、設定パラメータ などと起動スクリプトの分離という点ではFreeBSDには非常に良い方法が導入 されていた。それは、設定パラメータは全て /etc/rc.conf に書かれるというもの であった。これによって、様々なサービスの設定が一つのファイルに集中され、 非常に管理上見通しの良いものとなっていた。

しかしながら、全てのデフォルト設定も /etc/rc.conf に書かれていたために、 非常に見づらく、長い設定ファイルであった。これはその後、デフォルト設定と その差分の独自設定の部分に分割され、更に改良された。こうして、4R以前の FreeBSDでは、各種起動スクリプトは最初に /etc/defaults/rc.conf を読み込み、 その次に /etc/rc.conf を読み込むように統一されていた。この2つの設定ファイル は何れも環境変数とその値の羅列であるために、デフォルトで定義された値は 後から読み込まれた値で上書きされるようになっている訳である。

以上のような起動プロセスは、5Rになって見直され、SystemV系の起動スクリプトの 分離を取り入れ、一方設定ファイルの統一という点では従来からの方式を維持した 形で整理統合された。起動スクリプトは /etc/rc.d/ ディレクトリに集中して 置かれている。

以下に、/etc/rc.d/ ディレクトリのリストを掲げる。

DAEMON          dumpon          ldconfig        ntpdate         serial
LOGIN           early.sh        local           othermta        sppp
NETWORKING      fsck            localpkg        pccard          sshd
SERVERS         gbde            lomac           pcvt            swap1
abi             gbde_swap       lpd             pf              syscons
accounting      hostname        mixer           pflog           sysctl
addswap         ike             motd            power_profile   syslogd
adjkerntz       inetd           mountcritlocal  ppp-user        timed
amd             initdiskless    mountcritremote pppoed          tmp
apm             initrandom      mountd          preseedrandom   ttys
apmd            ip6addrctl      moused          pwcheck         ugidfw
archdep         ip6fw           mroute6d        quota           usbd
atm1            ipfilter        mrouted         random          var
atm2            ipfs            msgs            rarpd           vinum
atm3            ipfw            named           rcconf.sh       virecover
bgfsck          ipmon           natd            resolv          watchdogd
bootparams      ipnat           netif           root            ypbind
ccd             ipsec           netoptions      route6d         yppasswdd
cleanvar        ipxrouted       network_ipv6    routed          ypserv
cleartmp        isdnd           nfsclient       routing         ypset
cron            jail            nfsd            rpcbind         ypupdated
devd            kadmind         nfslocking      rtadvd          ypxfrd
devfs           kerberos        nfsserver       rwho
ent             keyserv         nisdomain       savecore
diskless        kldxref         nsswitch        securelevel
dmesg           kpasswdd        ntpd            sendmail

また、SystemV系では起動スクリプトの起動順序は基本的にはファイル名の 順序に従って起動されるだけなために、相互依存関係が希薄であったが、 FreeBSD 5R 以降では /sbin/rcorder プログラムがスクリプトの依存関係を 調べた上で起動順序を決定するようになった(但し、依存はスクリプト中に 記述する必要がある)。

とは言え、色々な理由から /etc/rc.sendmailや /etc/rc.firewall などは 従来の形式で残されており、逆に従来は shutdown 時のデフォルト動作が なかったが、5R より /etc/rc.shutdown によってデフォルトが記述できる ようになっている。

更に、こうした起動方法はあくまでもシステムのデフォルト設定に関する もののみで、管理者が独自に導入したり、あるいは package や ports から 導入したデフォルト以外のサービスについては従来通り、 /usr/local/etc/rc.d/ に起動スクリプトを置き、/usr/local/etc/ に個別設定ファイルを置くという方法を取っている。こうしたデフォルトと 個別設定の分離は、システムのアップデート時などに便利である。実際、 SystemV系では個別に導入したサービスも /etc/rc2.d/ あるいは /etc/rc3.d などに置くために依存関係がある場合は問題となる 場合がある。

以上のように、FreeBSDではシステムの基本設定は /etc/rc.conf に 記述されているので、システム設定の基本はこのファイルを変更することに ある。但し、実際の設定などにおいては、これらのファイルに記述されている ものが単なる環境変数であるために、変数名などにタイポがあると問題の 発見に手間取ったりするので、必ず /etc/defaults/rc.conf から該当行をコピーして、それを編集 するようにした方が良い。

もっとも単純な /etc/rc.confの例を下に掲げる。

# This file now contains just the overrides from /etc/defaults/rc.conf
# please make all changes to this file.

# -- sysinstall generated deltas -- #
ifconfig_rl0="inet 192.168.0.10 netmask 255.255.255.0"
hostname="pc20.tokyo04.wakhok.ac.jp"
keymap="jp.106"

最初の環境変数は、後に出てくる ifconfigコマンドに渡すオプションで、 ネットワークインターフェースボードのIPアドレスとネットマスクを設定している。 ちなみに、rl0 はインターフェースボードの種類で、この場合は RealTeK 8139 である。自分が利用しているインターフェースボードの 名前が知りたい場合には、dmesgコマンドでシステムメッセージを見る と良い。

 > dmesg | more
Copyright (c) 1992-2004 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
        The Regents of the University of California. All rights reserved.
FreeBSD 5.3-RELEASE #0: Fri Nov  5 04:19:18 UTC 2004
    root@harlow.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC
Timecounter "i8254" frequency 1193182 Hz quality 0
CPU: Intel(R) Celeron(R) CPU 2.00GHz (2000.08-MHz 686-class CPU)
  Origin = "GenuineIntel"  Id = 0xf29  Stepping = 9
  Features=0xbfebf9ff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,SEP,MTRR,PGE,MCA,
         CMOV,PAT,PSE36,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE>
real memory  = 1038024704 (989 MB)
avail memory = 1006194688 (959 MB)
...
rl0: <RealTek 8139 10/100BaseTX> port 0x2000-0x20ff
       mem 0xec005000-0xec0050ff irq 11 at device 10.0 on pci0
miibus0: <MII bus> on rl0
rlphy0: <RealTek internal media interface> on miibus0
rlphy0:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
rl0: Ethernet address: 00:90:f5:2b:0e:d6

2番めの環境変数は自ホストの名前の定義であるが、これは後述の /etc/hostsにおける名前と混同してはいけない。通常は、 自ホスト名と自分のデフォルトインターフェース名とは一致させておくようにする (これについては後でもう一度述べる)。

3番目の環境変数はキーボードの種別の定義である。もし、これをインストール時 に定義しておらず、日本語106キーを利用している場合、US101キーボードとして しか認識せず記号などの入力が難しくなるので、設定が必要である(設定後は リブートが必要)。

これに対して、/etc/defaults/rc.conf の一部を下に掲げる。

#
# named.  It may be possible to run named in a sandbox, man security for
# details.
#
named_enable="NO"               # Run named, the DNS server (or NO).
named_program="/usr/sbin/named" # path to named, if you want a different one.
named_flags="-u bind"           # Flags for named
named_pidfile="/var/run/named/pid" # Must set this in named.conf as well
named_chrootdir="/var/named"    # Chroot directory (or "" not to auto-chroot

named は DNSのプログラム名であるが、DNSはデフォルトでは動作しないように なっていることが分かる。従って、DNSを動かしたい場合には(設定ファイルは 別だが)、以下のように /etc/rc.conf に追加すれば良い。

named_enable="YES"               # Run named, the DNS server (or NO).

なお、このような仕組みになっているので、絶対に /etc/defaults/rc.conf は変更してはいけません



Noriyo Kanayama