1月 072009
 

新年明けましておめでとうございます。今年も宜しくお願いします。

今年の一発目。FreeBSD ネタですが、sshd を port:22 ではないポートで起動するようにしてみたいと思います。そんなの簡単じゃん。て?そりゃーそーだけどさー。rcNG な起動スクリプトを書くのが難儀なのよ。

port:22 で起動する sshd は /etc/rc.conf に

sshd_enable="YES"

 
と書けば良いのだけど、これとは別に、例えば port:22022 で sshd を起動したい。どうしてか?と、言えば網内では port:22 で ssh するんだけど、BB ルータの外側から各サーバにダイレクトに ssh したい場合、個々のサーバで sshd を別ポートで起動して、BB ルータ側でポートの転送をしてあげればダイレクトに入れるよねー。って感じですかね。

なんだよー。そんなの IPv6 あればできるじゃん。と思うんですけど、IPv4 の世界しか無い場合は不可能なので・・。

で、ここまでが前置きで、サーバを起動したときに sshd を port:22022 で起動するようにスクリプトを書くわけです。しかし、これがまた大変・・。例えば、sshd だけでなく、httpd を port:8080 で起動するスクリプトはどうするのだ?とか、色々出てきてですねぇ・・。

一応できたスクリプトがこんな感じ。

#!/bin/sh
#
# PROVIDE: sshd-diff-port
# REQUIRE: LOGIN cleanvar
#
# Define these smartd_* variables in one of these files:
#       /etc/rc.conf
#       /etc/rc.conf.local
#
# DO NOT CHANGE THESE DEFAULT VALUES HERE
port="22022" sshd_diff_port_enable="${sshd_diff_port_enable-NO}" sshd_diff_port_pidfile="/var/run/sshd-${port}.pid"
. /etc/rc.subr
name="sshd_diff_port" rcvar=`set_rcvar` command="/usr/sbin/sshd" pidfile=${sshd_diff_port_pidfile}
load_rc_config $name
command_args="-o PidFile=${sshd_diff_port_pidfile} -p ${port}"
run_rc_command "$1"

 
簡単かぁ?これを書くために jman rc.subr してじっくりと眺めます。後はコマンド、今回の場合は sshd ですが、それのオプションをじっくりと調査します。

で、スクリプト名は sshd_diff_port としました。command_args で sshd のオプションを書きました。/etc/rc.conf.local には以下のように書けば起動できることでしょう。

sshd_diff_port_enable="YES"

 
良かった良かった。

それにしても rcNG スクリプトを書く上で疑問な点がまだ残っています。

スクリプトを起動してその中から実際のデーモンを起動した場合(firefox みたいなイメージかな) stop ができない。例えば kdm は スクリプトでそれを起動時に呼ぶのだけど、その中では kdm-bin をキックしている。その場合、stop オプションで実行しても kdm が終了しない。pidfile=${kdm_pidfile} を記述しても 以下のメッセージが出力され終了できない。なんで〜(?_?)。ちょっとだけrc.subr 見てみたけど $name とかが絡んでいる? けど、実際のプロセスは kdm ではなく、kdm-bin なのよー。どうすれば kill できるのー?

kdm not running? (check /var/run/kdm.pid).

 
で、できたスクリプトがこれ。stop は受け付けてくれないので rc スクリプト内で完結するようにした。reload も stop 部分は自前にして start だけ rc.subr に任せた。ダサいなぁ・・。

#!/bin/sh
#
# kdm start
#
# PROVIDE: kdm
# REQUIRE: DAEMON
# BEFORE: LOGIN
# KEYWORD: FreeBSD shutdown
# Define these smartd_* variables in one of these files: # /etc/rc.conf # /etc/rc.conf.local # /etc/rc.conf.d/kdm # # DO NOT CHANGE THESE DEFAULT VALUES HERE # kdm_enable="${kdm_enable-NO}" kdm_pidfile="/var/run/kdm.pid"
. /etc/rc.subr
name="kdm" rcvar=`set_rcvar`
load_rc_config $name
command="/usr/local/kde4/bin/kdm" pidfile=${kdm_pidfile}
case $1 in 'stop' ) if [ -f ${pidfile} ] ; then kill -TERM `cat ${pidfile}` /bin/rm ${pidfile} fi echo 'Stopping kdm.' exit; ;; 'restart' ) if [ -f ${pidfile} ] ; then kill -TERM `cat ${pidfile}` /bin/rm ${pidfile} fi echo 'Stopping kdm.' ;; esac
run_rc_command "$1"

 
httpd を 8080 で起動するスクリプトはもう、書くのもイヤになっちゃった・・。どこかに rc スクリプトのサンプル置き場とか無いかなぁ?

本当に書き方、よく分からないや・・。きっと rc.subr 眺めて書くんでしょうなぁ・・。トホホ・・。

Linux の rc スクリプトも汚いと思っていたけど、最近の FreeBSD の rc スクリプト書くのも、簡単なのは良いのだけど、ちょっと何かやろうとしたら全然書けない・・。トホホ・・。