BSD界隈四方山話

第6回サービス管理の要/etc/rc.confと/etc/rc.conf.d/、単一ファイルと分割ファイル

システム設定の要/etc/rc.conf

FreeBSDのサービス管理の特徴の一つに、すべての設定を/etc/rc.confファイルに書いておけるというものがあります。システムのデフォルト設定は/etc/defaults/rc.confに記述されています。/etc/rc.confはこれよりも優先されますので、そのシステムがどんな設定になっているのかは/etc/rc.confファイルを読めばわかるようになっています。

リスト1 /etc/rc.confの例-システムで動作するサービスやその設定の要がまとまっている
# server
defaultrouter="X.X.X.X"
hostname="parancell.ongs.co.jp"
ifconfig_bge0="inet Y.Y.Y.Y netmask Z.Z.Z.Z up"
dumpdev="AUTO"
zfs_enable="YES"
clear_tmp_enable="YES"
powerd_enable="YES"

# jail
jail_enable="YES"

# ntp
ntpd_enable="YES"

# sshd
sshd_enable="YES"
sshd_flags="-oUsePAM=no -oChallengeResponseAuthentication=no -oUseDNS=no"

# smartd
smartd_enable="YES"

# nfs
nfs_client_enable="YES"
rpcbind_enable="YES"
rpc_statd_enable="YES"
rpc_lockd_enable="YES"
nfs_server_enable="YES"
nfs_server_flags="-u -t -n 4"
nfsd_enable="YES"
mountd_enable="YES"

# Nginx
nginx_enable="YES"

# ipfw
firewall_enable="YES"
firewall_quiet="YES"
firewall_type="OPEN"

FreeBSDプロジェクトはFreeBSD 5系でNetBSD由来のサービス制御システムを移植しました。システム起動時のソフトウェアの自動アップデート、起動後のサービスの制御はrc(8)のもとで実行できます。/etc/rc.confで有効化されていないサービスはそのままでは制御できないようになっています(強制制御も可能です⁠⁠。典型的には次のようにservice(8)コマンド経由でサービスを制御します。

図1 サービスの起動(ntpdの場合)
# service ntpd start
Starting ntpd.
#
図2 サービスの終了(ntpdの場合)
# service ntpd stop
Stopping ntpd.
Waiting for PIDS: 22889.
#
図3 サービスの再起動(ntpdの場合)
# service ntpd restart
Stopping ntpd.
Waiting for PIDS: 734.
Starting ntpd.
#
図4 サービス制御で指定できるサブコマンド(ntpdの場合)
# service ntpd help
/etc/rc.d/ntpd: unknown directive 'help'.
Usage: /etc/rc.d/ntpd [fast|force|one|quiet](start|stop|restart|rcvar|enabled|status|poll)
#

service(8)コマンド経由で実行される制御スクリプトは/etc/rc.d/にまとまっています。直接このスクリプトを実行しても同じように処理が実行されますが、サービスを制御するために適切な環境変数の設定などservice(8)コマンドは事前に設定してくれるので、service(8)コマンドを経由して制御したほうが良いでしょう。

図5 実際に制御しているのは/etc/rc.d/ディレクトリ以下の個々のスクリプト
# ls /etc/rc.d/
DAEMON                  initrandom              pflog
FILESYSTEMS             ip6addrctl              pfsync
LOGIN                   ipfilter                postrandom
NETWORKING              ipfs                    power_profile
SERVERS                 ipfw                    powerd
abi                     ipmon                   ppp
accounting              ipnat                   pppoed
addswap                 ipropd_master           pwcheck
adjkerntz               ipropd_slave            quota
amd                     ipsec                   random
apm                     ipxrouted               rarpd
apmd                    iscsictl                rctl
archdep                 iscsid                  resolv
atm1                    jail                    rfcomm_pppd_server
atm2                    kadmind                 root
atm3                    kdc                     route6d
auditd                  keyserv                 routed
auditdistd              kfd                     routing
automount               kld                     rpcbind
automountd              kldxref                 rtadvd
autounmountd            kpasswdd                rtsold
bgfsck                  ldconfig                rwho
bluetooth               local                   savecore
bootparams              local_unbound           sdpd
bridge                  localpkg                securelevel
bsnmpd                  lockd                   sendmail
bthidd                  lpd                     serial
ccd                     mdconfig                sppp
cleanvar                mdconfig2               sshd
cleartmp                mixer                   statd
cron                    motd                    static_arp
ctld                    mountcritlocal          static_ndp
ddb                     mountcritremote         stf
defaultroute            mountd                  swap
devd                    mountlate               swaplate
devfs                   moused                  syscons
dhclient                mroute6d                sysctl
dmesg                   mrouted                 syslogd
dumpon                  msgs                    timed
faith                   natd                    tmp
fsck                    netif                   ubthidhci
ftp-proxy               netoptions              ugidfw
ftpd                    netwait                 utx
gbde                    newsyslog               var
geli                    nfscbd                  virecover
geli2                   nfsclient               watchdogd
gptboot                 nfsd                    wpa_supplicant
gssd                    nfsuserd                ypbind
hastd                   nisdomain               yppasswdd
hcsecd                  nscd                    ypserv
hostapd                 nsswitch                ypset
hostid                  ntpd                    ypupdated
hostid_save             ntpdate                 ypxfrd
hostname                othermta                zfs
inetd                   pf                      zvol
#

パッケージやPorts Collection経由でインストールしたサードパーティ製のソフトウェアの制御スクリプトは/usr/local/etc/rc.d/以下にインストールされます。

図6 サードパーティ製ソフトウェアの制御スクリプトは/usr/local/etc/rc.d/以下にインストールされる
# tree /usr/local/etc/rc.d/
/usr/local/etc/rc.d/
|-- git_daemon
|-- mdnsd
|-- mdnsresponderposix
|-- nginx
|-- smartd
\`-- svnserve

0 directories, 6 files
# file /usr/local/etc/rc.d/*
/usr/local/etc/rc.d/git_daemon:         POSIX shell script, ASCII text executable
/usr/local/etc/rc.d/mdnsd:              POSIX shell script, ASCII text executable
/usr/local/etc/rc.d/mdnsresponderposix: POSIX shell script, ASCII text executable
/usr/local/etc/rc.d/nginx:              POSIX shell script, ASCII text executable
/usr/local/etc/rc.d/smartd:             POSIX shell script, ASCII text executable
/usr/local/etc/rc.d/svnserve:           POSIX shell script, ASCII text executable
#

/usr/local/etc/rc.d/以下のスクリプトも/etc/rc.confで利用するかどうかを設定でき、service(8)コマンドでの制御の対象となります。

/etc/rc.confの利点と欠点

なにごとにも利点と欠点があるように、/etc/rc.confの方法にも双方の面があります。まず利点を見てみましょう。/etc/rc.confには次のような利点があります。

  • このファイルだけでシステム設定の多くを知ることができる
  • 人間にとって扱いやすい

これに対して次のような欠点があります。

  • 設定内容が膨れあがってくると把握も管理も面倒になってくる
  • ソフトウェアにとって扱いにくい

/etc/rc.conf.d/*および/usr/local/etc/rc.conf.d/*というのは、こうした欠点に応えるために仕組みです。

分割配置のための/etc/rc.conf.d/と/usr/local/etc/rc.conf.d/

/etc/rc.conf.d/*と/usr/local/etc/rc.conf.d/*はこれまで/etc/rc.confファイルにまとめていた設定を、それぞれ個別の設定に分割できるというものです。たとえば、sshd(8)とnginx(8)の設定を個別に分離すると、次のようにファイルを分けることになります。

リスト2 /etc/rc.conf.d/sshd
sshd_enable="YES"
sshd_flags="-oUsePAM=no -oChallengeResponseAuthentication=no -oUseDNS=no"
リスト3 /usr/local/etc/rc.conf.d/nginx
nginx_enable="YES"

/etc/rc.confの設定のほうが優先されますので、試す場合には/etc/rc.confからは設定を削除しておいてください。

この方法はChefやPuppetのような管理ツール、またはFreeBSDをベースにして開発されるソフトウェアアプライアンスなどと相性の良い方法です。サービスの有効化や無効化、またはその設定などを個別のファイルとして作成するだけでよいからです。

/etc/rc.confをそのまま使う方法だと、ソフトウェアを使って/etc/rc.confファイルを編集しなければなりません。これはソフトウェアにとってはあまり使いやすい方法ではないわけです。ソフトウェアアプライアンスではあとからサードパーティ製のソフトウェアを追加したり、プラグインやアドオンを追加できるようにするものがあります。/etc/rc.confの場合、このファイルを編集する必要がありますが(rc.conf.localを使うと言った別の方法もあります⁠⁠、/usr/local/etc/rc.conf.d/にファイルを置く、またはファイルを置き換えるだけで良いので、ソフトウェアにとっては管理が簡単です。

設定ファイルを単一のファイルにまとめるか、個別のファイルに分割するか、好みの問題もあります(単一ファイルだとファイル削除などの危険性が高いとして好まないユーザもいます⁠⁠。どちらの方法も提供されていますので、要望に応じて使ってみてください。

おすすめ記事

記事・ニュース一覧