ggated/ggatec

FreeBSD-user-jp MLでggated/ggatecが便利だと教えてもらったので設定してみました。
今まではnfs上でmake buildworldを行っていたのですが、ggateを使うと倍以上速いです。但し、roでは複数のマシンでmountできますが、rwでは同時には1台しかmountできません。ufsなら当然の制約ですが、journal file systemで複数マシンで同時にrwマウントできないものかなぁ。今回は、/usr/srcと/usr/objを14-Currentマシンで共有することが目的です。autofsで自動的にマウントしますが、一番高速なマシンだけrwでmountして他のマシンはroでマウントすることにしました。

server# gpart add -t freebsd-ufs -s 32g -l fbsrc -i 3 nvd0
server# gpart add -t freebsd-ufs -s 32g -l fbobj -i 4 nvd0
server# newfs -j /dev/nvd0p3
server# newfs -j /dev/nvd0p4
server# echo '192.168.0.0/24   RW  /dev/nvd0p3' >> /etc/gg.gated
server# echo '192.168.0.0/24   RW  /dev/nvd0p4' >> /etc/gg.gated
server# dat <<EOF >/usr/local/etc/rc.d/ggated
#!/bin/sh

# PROVIDE: ggated
# REQUIRE: LOGIN
# KEYWORD: nojail shutdown

. /etc/rc.subr

name=ggated
command="/sbin/${name}"
desc="${name}"
rcvar=ggated_enable

load_rc_config $name
: ${ggated_enable:=NO}

sig_stop="USR1"

load_rc_config ${name}
run_rc_command "$1"
EOF
server# echo ggated_enable="YES" >> /etc/rc.conf
client# cat <<EOF >/usr/local/etc/rc.d/ggatec
#!/bin/sh

# PROVIDE: ggatec
# REQUIRE: LOGIN
# KEYWORD: nojail shutdown

. /etc/rc.subr

name=ggatec
command="/sbin/ggatec"
desc="ggatec"
rcvar=ggatec_enable

load_rc_config $name
: ${ggatec_enable:=NO}

start_cmd=ggatec_start
stop_cmd=ggatec_stop
#sig_stop="USR1"

ggatec_start() {
    ${command} create -u 0 192.168.0.1 /dev/nvd0p3
    ${command} create -u 1 192.168.0.1 /dev/nvd0p4
}

ggatec_stop() {
    umount /usr/src
    umount /usr/obj
    ${command} destroy -u 0
    ${command} destroy -u 1
}
load_rc_config ${name}
run_rc_command "$1"
EOF
client# echo ggatec_enable="YES" >> /etc/rc.conf
client# cat <<EOF >> ~root/.cshrc
alias shutdown  \
    '/bin/df /usr/src /usr/obj | ' \
    '/usr/bin/awk '"'"'/^\//{system("/sbin/mount -u -r "$6";")}'"'"'; ' \
    '/sbin/shutdown'
alias reboot    \
    '/bin/df /usr/src /usr/obj | ' \
    '/usr/bin/awk '"'"'/^\//{system("/sbin/mount -u -r "$6";")}'"'"'; ' \
    '/sbin/reboot'
EOF
echo <<EOF >> /etc/fstab
/dev/ggate0   /usr/src  ufs  ro,noauto  0  0   # 一台だけroをrwに変更
/dev/ggate1   /usr/obj  ufs  ro,noauto  0  0   # 一台だけroをrwに変更
EOF