Top > FreeBSD > jail fulltree 10.2-Release
FreeBSD 10.2-Releaseにjail fulltreeを導入した時の備忘的まとめです
今後、このfulltreeを使用して minitree を作成していきます
このリリースから jail.conf を使用します
jail fulltree 10.0-Releaseでできなかった bsdinstall jail で導入しています
HOST環境での作業
bsdinstall jailを使用して jail環境を構築します
# mkdir /jail # mkdir /jail/mainte # zfs create -o mountpoint=/jail/mainte tank0/jail/mainte102
# bsdinstall jail /jail/mainte
一番近い "日本" のミラーサーバを選択
baseのみインストールするため すべてのチェックを外します
# mount -t devfs devfs /jail/mainte/dev # jail /jail/mainte test.localdomain 192.168.1.102 /bin/tcsh
# touch /etc/fstab
# newaliases
# vi /etc/rc.conf network_interface="" rpcbind_enable="NO" inet_enable="NO" syslogd_flags="-ss" sshd_enable="NO" sendmail_enable="NO" sendmail_submit_enable="NO" sendmail_outbound_enable="NO" sendmail_msp_queue_enable="NO"
# echo 'nameserver 192.168.1.1' > /etc/resolv.conf
# vipw root:*:0:0::0:0:Charlie &:/root:/usr/sbin/nologin toor:*:0:0::0:0:Bourne-again Superuser:/root:/usr/sbin/nologin 上記2行のみ変更
# cp -p /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# vi /etc/crontab # SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin HOME=/var/log # #minute hour mday month wday who command 1 0 * * * root newsyslog その他は削除
# vi /etc/newsyslog.conf # logfilename [owner:group] mode count size when flags [/pid_file][sig_num] /var/log/all.log 600 7 * @T00 - その他は削除
# echo '*.* /var/log/all.log' > /etc/syslog.conf # touch /var/log/all.log # chmod 600 /var/log/all.log
# echo 'ALL : ALL : deny' > /etc/hosts.allow
# vi /etc/make.conf WITHOUT_X11=yes WITHOUT_GUI=yes NO_X=true WITHOUT_IPV6=yes WITH_MBSTRING=yes SUPHOST=cvsup3.jp.freebsd.org MASTER_SITE_OVERRIDE=ftp://ftp3.jp.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR} WRKDIRPREFIX=/tmp DISTDIR=/tmp/distfiles CPUTYPE=slm CFLAGS= -O2 -fno-strict-aliasing -pipe COPTFLAGS= -O2 -fno-strict-aliasing -pipe
# exit
HOST環境での作業
# vi /etc/devfs.rules [devfsrules_jail_inet=250] add include $devfsrules_hide_all add path null unhide [devfsrules_jail_vnet=249] add include $devfsrules_hide_all add path null unhide add path mem unhide add path kmem unhide
# vi /etc/jail.conf /* 共通項目 */ path = "/jail/$name"; $hostname = "localhost.com"; host.hostname = "${name}.${hostname}"; $int_if = "re0"; $bridge_if = "bridge0"; $defaultroute = "192.168.1.251"; $devfs_jail = "4" $devfs_jail_inet = "250" $devfs_jail_vnet = "249" mount.nodevfs; devfs_ruleset = $devfs_jail; securelevel = "0"; allow.raw_sockets = "0"; allow.sysvipc = "0"; vnet.interface = "epair${jid}b"; exec.prestart = "ifconfig epair${jid} create up > /dev/null 2>&1"; exec.prestart += "ifconfig ${bridge_if} addm epair${jid}a > /dev/null 2>&1"; exec.start = "/sbin/ifconfig epair${jid}b up ${ip4addr}"; exec.start += "/sbin/route add default ${defaultroute}"; exec.poststart = ""; exec.prestop = ""; exec.stop = ""; exec.poststop = "ifconfig epair${jid}a destroy > /dev/null 2>&1"; /* 共通項目 */ mainte { mount.devfs; devfs_ruleset = $devfs_jail; allow.raw_sockets = "1"; // allow.sysvipc = "1"; jid = "250"; $ip4addr = "192.168.1.250"; /* inet */ ip4.addr = ${ip4addr}; interface = ""; exec.prestart = ""; exec.start = ""; exec.poststart = ""; exec.prestop = ""; exec.stop = ""; exec.poststop = ""; vnet.interface = ""; /* inet */ /* vnet * vnet; /* vnet */ exec.prestart += "/bin/mkdir -p /tmp/${name}/tmp/distfiles"; exec.prestart += "/sbin/mount -t nullfs /tmp/${name}/tmp ${path}/tmp"; exec.start += "/bin/sh /etc/rc"; exec.poststart += ""; exec.prestop += ""; exec.stop += "/bin/sh /etc/rc.shutdown"; exec.poststop += "rm -rf /tmp/${name}"; exec.poststop += "/sbin/umount ${path}/tmp"; /* persist */ // persist; /* depend */ // depend }
# vi /etc/rc.conf # jail jail_enable="YES" jail_list="mainte"
/usr/sbin/service jail start mainte /usr/sbin/service jail stop mainte
# service jail start mainte # jexec mainte /bin/tcsh
JAIL環境での作業
# portsnap fetch && portsnap extract && portsnap update 2回目以降 # portsnap fetch && portsnap update
portsnap fetch の代わりに portsnap cron を使ったスクリプトを記述します
portsnap の実行ログを保存します
後で、ログローテーションの対象にするので、ひたすら追記書きさせます
portsnap を cron で流して ports の自動更新をします。
# mkdir /root/update # cd /root/update # vi ports_update_cron.sh #!/bin/sh LogFile="/var/log/ports_update.log" echo "### `date` ###" >> $LogFile /usr/sbin/portsnap cron >> $LogFile 2>&1 /usr/sbin/portsnap update >> $LogFile 2>&1 echo "### `date` ###" >> $LogFile
# vi port_update.sh #!/bin/sh /usr/sbin/portsnap fetch /usr/sbin/portsnap update
# chmod u+x ports_update.sh ports_update_cron.sh
vi /etc/crontab # portsnap ports_update 1 9 * * 1,4 root /root/update/ports_update_cron.sh > /dev/null 2>&1
vi /etc/newsyslog.conf # logfilename [owner:group] mode count size when flags [/pid_file][sig_num] /var/log/all.log 600 7 * @T00 - /var/log/ports_update.log 600 7 1 * N
ports 更新の有無を簡単に知る為に、定期的に portversion のコマンド結果をメールで送信します
# vi portvermail.sh #!/bin/sh #------------------------------------------ MailTO="root" MilTmp=/tmp/pkgversion.txt MilHed="mainte pkg version list" #------------------------------------------ echo $MilHed > $MilTmp echo "" >> $MilTmp /usr/sbin/pkg_version -v >> $MilTmp cat $MilTmp | /usr/bin/mail -s "$MilHed" $MailTO
chmod u+x portvermail.sh
echo '/root/update/portvermail.sh' >> ports_update_cron.sh
ports の更新やインストールに pkg_replace を入れます
# cd /usr/ports/ports-mgmt/pkg_replace # make install clean # rehash
portをインストールする際の設定をmake install でも同じくするためのツールだそうです
# pkg_replace -vcCN ports-mgmt/portconf
ports ソフトウェアの脆弱性をチェックします
# pkg audit -F
毎日 pkg audit のチェック結果をメールで報告させます
#cd /root/update #vi pkg_auditmail.sh #!/bin/sh RanDOM=`jot -r 1 1 1800` /bin/sleep $RanDOM #------------------------------------------ MailTO="root" MilTmp="/tmp/pkg_audit.txt MilHed="pkg audit report" #------------------------------------------ echo $MilHed > $MilTmp echo "" >> $MilTmp /usr/sbin/pkg audit -F >> $MilTmp cat $MilTmp | /usr/bin/mail -s "$MilHed" $MailTO
chmod u+x pkg_auditmail.sh
vi /etc/crontab # pkg audit 1 5 * * * root /root/update/pkg_auditmail.sh > /dev/null 2>&1
結果メールを送信する為に sendmail を起動し、送信後に sendmail を止めるスクリプトを作成します
# vi /root/update/hosts.allow_deny ALL : ALL : deny
# vi /root/update/hosts.allow_mail sendmail : localhost : allow sendmail : 192.168.1.90 : allow sendmail : .localdomain : allow ALL : ALL : deny
cp /etc/rc.conf rc.conf_none
# cp /etc/rc.conf rc.conf_mail # sed -i -e "/^sendmail_/d" /root/update/rc.conf_mail # echo 'sendmail_enable="NO"' >> /root/update/rc.conf_mail
echo 'admin@localdomain' > /root/.forward
#!/bin/sh cp -p /root/update/rc.conf_mail /etc/rc.conf cp -p /root/update/hosts.allow_mail /etc/hosts.allow sh /etc/rc.sendmail start sleep 6 sh /etc/rc.sendmail stop sleep 4 pkill sendmail cp -p /root/update/hosts.allow_deny /etc/hosts.allow cp -p /root/update/rc.conf_none /etc/rc.conf
# chmod u+x resend.sh
echo '/root/update/resend.sh' >> /root/update/portvermail.sh
echo '/root/update/resend.sh' >> /root/update/portauditmail.sh
freebsd-updateがディレクトリ指定で updateできるようなのでその機能を利用します
# exit
HOST環境での作業
# mkdir /root/update # cd /root/update # vi freebsd-update_cron.sh #!/bin/sh ### HOST用 /usr/sbin/freebsd-update cron #/usr/sbin/freebsd-update install ### mainte jail用 /usr/sbin/freebsd-update -b /jail/mainte -d /jail/mainte/var/db/freebsd-update fetch /usr/sbin/freebsd-update -b /jail/mainte -d /jail/mainte/var/db/freebsd-update install
chmod u+x freebsd-update_cron.sh
# vi /etc/crontab # freebsd-update 0 6 * * 2,4,6 root /root/freebsd-update_cron.sh > /var/log/freebsd-update.log 2>&1
echo 'admin@localdomain' > /root/.forward