トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

ServersMan@VPSのCentOSでpkgsrc

ServersMan@VPSのCentOS 6.5上で、pkgsrcをつかってみる。自分用のメモ。

はじめに

pkgsrcは、NetBSDの公式のパッケージシステムで、NetBSD以外にたくさんのOSに対応したパッケージシステムです。ここでは、DTIのVPSサービスである、ServersMan@VPSの"Entryプラン(Mem:1G HDD:50G)"上の"シンプルセット CentOS 6.5(64bit)"でpkgsrcを使ってみることにします。

# そんなにServersMan@VPS固有の話はないはず。CentOSでpkgsrcを使おうとしている人には少しだけ参考になるかも。

CentOSの設定

 リモートログイン

まず、SSHでログイン。ブラウザベースのコンソールもついているのですが、さくらのVPSやConoHa等と比較して使いにくいので、適当なSSHクライアントでリモートログイン。

デフォルトでは、SSHのポート番号が、22番から変更されているので、指定されたポート番号を設定する。(でないと、ログインできない。)

 不要デーモンの停止

2014年8月時点では、

 # ps augxww
 USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
 root         1  0.0  0.1  19236  1448 ?        Ss   14:15   0:00 init
 root         2  0.0  0.0      0     0 ?        S    14:15   0:00 [kthreadd/30447]
 root         3  0.0  0.0      0     0 ?        S    14:15   0:00 [khelper/30447]
 root       344  0.0  0.1 189892  1508 ?        Sl   14:15   0:00 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
 root       378  0.0  0.1  66612  1244 ?        Ss   14:15   0:00 /usr/sbin/sshd
 root       385  0.0  0.0  22184   976 ?        Ss   14:15   0:00 xinetd -stayalive -pidfile /var/run/xinetd.pid
 root       392  0.0  0.0  66804  1004 ?        Ss   14:15   0:00 /usr/sbin/saslauthd -m /var/run/saslauthd -a pam -n 2
 root       394  0.0  0.0  66804   696 ?        S    14:15   0:00 /usr/sbin/saslauthd -m /var/run/saslauthd -a pam -n 2
 root       400  0.0  0.5 201016  5472 ?        Ss   14:15   0:00 /usr/sbin/httpd
 root       407  0.0  0.1 117300  1280 ?        Ss   14:15   0:00 crond
 apache     414  0.0  0.2 201016  3112 ?        S    14:15   0:00 /usr/sbin/httpd
 nobody     415  0.0  0.7 267164  7824 ?        Sl   14:15   0:02 python /usr/local/share/ajaxterm/ajaxterm.py --daemon --port=8022 --uid=nobody
 root       440  0.0  0.4  96376  4264 ?        Ss   15:52   0:00 sshd: root@pts/0 
 root       443  0.0  0.1 108308  1904 pts/0    Ss   15:53   0:00 -bash
 root       493  0.0  0.1 110236  1156 pts/0    R+   16:14   0:00 ps augxww
 # chkconfig | grep 3:on
 ajaxterm       	0:off	1:off	2:on	3:on	4:on	5:on	6:off
 crond          	0:off	1:off	2:on	3:on	4:on	5:on	6:off
 httpd          	0:off	1:off	2:off	3:on	4:off	5:off	6:off
 ip6tables      	0:off	1:off	2:on	3:on	4:on	5:on	6:off
 iptables       	0:off	1:off	2:on	3:on	4:on	5:on	6:off
 modules_dep    	0:off	1:off	2:on	3:on	4:on	5:on	6:off
 network        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
 portreserve    	0:off	1:off	2:on	3:on	4:on	5:on	6:off
 rsyslog        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
 saslauthd      	0:off	1:off	2:off	3:on	4:off	5:off	6:off
 sshd           	0:off	1:off	2:on	3:on	4:on	5:on	6:off
 udev-post      	0:off	1:on	2:on	3:on	4:on	5:on	6:off
 vzquota        	0:on	1:on	2:on	3:on	4:on	5:on	6:on
 xinetd         	0:off	1:off	2:off	3:on	4:on	5:on	6:off

という状態だった。まず、いらないものを全部止める。

 service ajaxterm stop
 service httpd stop
 service portreserve stop
 service saslauthd stop
 service xinetd stop
 service sendmail top
 chkconfig ajaxterm off
 chkconfig httpd off
 chkconfig portreserve off
 chkconfig saslauthd off
 chkconfig xinetd off
 chkconfig sendmail off
 # ps augxww
 USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
 root         1  0.0  0.1  19236  1448 ?        Ss   14:15   0:00 init
 root         2  0.0  0.0      0     0 ?        S    14:15   0:00 [kthreadd/30447]
 root         3  0.0  0.0      0     0 ?        S    14:15   0:00 [khelper/30447]
 root       344  0.0  0.1 189892  1508 ?        Sl   14:15   0:00 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
 root       378  0.0  0.1  66612  1244 ?        Ss   14:15   0:00 /usr/sbin/sshd
 root       407  0.0  0.1 117300  1280 ?        Ss   14:15   0:00 crond
 root       440  0.0  0.4  96376  4264 ?        Ss   15:52   0:00 sshd: root@pts/0
 root       443  0.0  0.1 108308  1908 pts/0    Ss   15:53   0:00 -bash
 root       605  0.0  0.1 110236  1160 pts/0    R+   16:24   0:00 ps augxww

だいぶすっきりした。

 不要なパッケージの除去

あまりまじめにやると、結構大変なので、それなりにやる。すべてのパッケージをpkgsrcから提供できるといいけど、それも大変なので、あくまでもそれなりに。

# yum remove stunnel tcl rsync tcpdump samba-common talk talk-server aspell centos-indexhtml cvs finger-server finger httpd httpd-tools ncompress portreserve tcsh

 その他必要な設定

いつもしそうなことをしておく。

  • logrotateの設定。dateextを無効化し、rotateを12に、compressを有効に。
  • sshdの設定。sshd_configを変更し、公開鍵認証しかしないので、必要な作業ののち、パスワード認証を無効に。
    • めも:ServersMan@VPSでは、ListtenAddressを明示的に書かないと、IPv6アドレスをListenしてくれないので、IPv4・IPv6アドレス両方をちゃんと書く。

 EPELの導入(オプション)

EPEL (Extra Packages for Enterprise Linux)を導入する。https://fedoraproject.org/wiki/EPEL に書いてあるとおり。

 # rpm -Uvh http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
 # rpm --import https://fedoraproject.org/static/0608B895.txt

 yum-plugin-prioritiesの導入(オプション)

yum-plugin-prioritiesは、リポジトリの優先順位を指定することができるので、入れておく。

 # yum -y install yum-plugin-priorities

インストールしたら、優先順位をつける。[centosplus]を有効にして、以下のようにした。(優先順位を表示する、ワンライナーは、CentOSのWikiに書いてある。)

 # sed -n -e "/^\[/h; /priority *=/{ G; s/\n/ /; s/ity=/ity = /; p }" /etc/yum.repos.d/*.repo | sort -k3n
 priority = 1 [vz-base]
 priority = 1 [vz-updates]
 priority = 2 [base]
 priority = 2 [extras]
 priority = 2 [updates]
 priority = 3 [centosplus]
 priority = 4 [epel]

 yum update

とりあえず、yum updateしておく。この文書を書いた時点では、

 # yum update
 <snip>
 Dependencies Resolved
 
 =====================================================================================================================
  Package                      Arch                Version                              Repository               Size
 =====================================================================================================================
 Updating:
  avahi-libs                   x86_64              0.6.25-12.el6_5.1                    updates                  54 k
  ca-certificates              noarch              2014.1.98-65.0.el6_5                 updates                 1.1 M
  coreutils                    x86_64              8.4-31.el6_5.2                       updates                 3.0 M
  coreutils-libs               x86_64              8.4-31.el6_5.2                       updates                  50 k
  e2fsprogs                    x86_64              1.41.12-18.el6_5.1                   updates                 553 k
  e2fsprogs-libs               i686                1.41.12-18.el6_5.1                   updates                 127 k
  e2fsprogs-libs               x86_64              1.41.12-18.el6_5.1                   updates                 120 k
  initscripts                  x86_64              9.03.40-2.el6.centos.3               updates                 940 k
  iproute                      x86_64              2.6.32-32.1.el6                      vz-updates              364 k
  kernel-headers               x86_64              2.6.32-431.23.3.el6                  updates                 2.9 M
  libcom_err                   i686                1.41.12-18.el6_5.1                   updates                  37 k
  libcom_err                   x86_64              1.41.12-18.el6_5.1                   updates                  37 k
  libss                        x86_64              1.41.12-18.el6_5.1                   updates                  41 k
  libtirpc                     x86_64              0.2.1-6.el6_5.2                      updates                  79 k
  libxml2                      i686                2.7.6-14.el6_5.2                     updates                 800 k
  libxml2                      x86_64              2.7.6-14.el6_5.2                     updates                 800 k
  nspr                         x86_64              4.10.6-1.el6_5                       updates                 113 k
  nss                          x86_64              3.16.1-4.el6_5                       updates                 832 k
  nss-sysinit                  x86_64              3.16.1-4.el6_5                       updates                  41 k
  nss-tools                    x86_64              3.16.1-4.el6_5                       updates                 360 k
  nss-util                     x86_64              3.16.1-1.el6_5                       updates                  64 k
  openssl                      x86_64              1.0.1e-16.el6_5.15                   updates                 1.5 M
  tzdata                       noarch              2014e-1.el6                          updates                 453 k
 
 Transaction Summary
 =====================================================================================================================
 Upgrade      23 Package(s)
 
 Total download size: 14 M
 Is this ok [y/N]:

となった。もちろん、y する。

ここで、いったんreboot。

pkgsrcの設定

 bootstrapに必要なRPMパッケージのインストール

コンパイラが全くインストールされていないので、まずはそれをインストールする。

 # yum -y install gcc gcc-c++ glibc-devel\*i686 file

c++は、bootstrapに必要なわけではないのだが、それが必要なpkgsrcパッケージがすぐ出てくるので、一緒にいれておく。

fileコマンドも、同様に一緒にいれておく。

glibc-devel\*i686 は、ないと、bootstrapがコケる(はず)。

 pkgsrcの取得

いよいよpkgsrcを導入する。まず、pkgsrcを取ってきて、bootstrapスクリプトを実行しないといけない。取ってくるのは、開発先端(-current)か、四半期リリース(Qなんとか)か、どちらかだが、ここでは、四半期リリースを使うことにする。

pkgsrcのVCSは、CVSである。しかし、とてもアップデートが遅いので、半公式リポジトリとして、Githubでgitリポジトリが公開されており、そちらを使うことにする。

まず、gitがインストールされていないので、gitをインストールする。

 # yum install git

つぎに、かつて DragonFly BSD で用いられていた、/usr/Makefile を少しいじったものを用意したので、こちらを使うことにする。(詳しくは、"手っ取り早くpkgsrcとかを使うためのMakefile"を参照。)

 # cd /opt
 # curl http://www.rururu.org/~isihara/Makefile.usr.gmake -o Makefile

makeの引数をなにも取らないと、ヘルプが出てくる。

 # make
 HELP:
    make pkgsrc-create              - fetch initial pkgsrc repository from the net
    make pkgsrc-create-shallow      - fetch initial history-free pkgsrc repository
    make pkgsrc-create-repo         - fetch pkgsrc repository only, no checkout
     
    make pkgsrc-wip-create          - fetch initial pkgsrc-wip repository from the net
    make pkgsrc-wip-create-shallow  - fetch initial history-free pkgsrc-wip repository
    make pkgsrc-wip-create-repo     - fetch pkgsrc-wip repository only, no checkout

そのまま実行すると、-currntをとってくることになるので、BRANCHを引数で指定する。

 # make pkgsrc-create-shallow BRANCHPS=pkgsrc-2014Q2

最新の四半期リリースは、http://www.pkgsrc.org/ で確認しよう。

 pkgsrcのアップデート

make pkgsrc-create-shallowで、アップデートまで一緒に行われているはずである。手動で行うときは、

 # cd /opt
 # make pkgsrc-update

である。

 bootstrap

次は、bootstrapである。pkgsrcに必要最小限のコマンド群のインストールである。

 # cd /opt/pkgsrc/bootstrap

ヘルプを見る。

 # ./bootstrap --help
 ===> bootstrap command: ./bootstrap --help
 ===> bootstrap started: Thu Aug 14 18:03:44 JST 2014
 Usage: ./bootstrap
     [ --abi [32|64] ]
     [ --binary-kit <tarball> ]
     [ --binary-macpkg <pkg> ]
     [ --compiler <compiler> ]
     [ --full ]
     [ --gzip-binary-kit <tarball> ]
     [ --help ]
     [ --mk-fragment <mk.conf> ]
     [ --pkgdbdir <pkgdbdir> ]
     [ --pkginfodir <pkginfodir> ]
     [ --pkgmandir <pkgmandir> ]
     [ --prefer-pkgsrc <list|yes|no> ]
     [ --prefix <prefix> ]
     [ --preserve-path ]
     [ --quiet ]
     [ --sysconfdir <sysconfdir> ]
     [ --unprivileged | --ignore-user-check ]
     [ --varbase <varbase> ]
     [ --workdir <workdir> ]

無指定だと、NetBSDに似たdir構成になる。これを、Linux風(FHS風)にするため、以下のようにした。

 # ./bootstrap --prefix /opt/pkg --pkgdbdir /var/opt/pkg/db --sysconfdir /etc/opt/pkg --varbase /var/opt/pkg --workdir /tmp/bootstrap-pkgsrc

bootstrapが最後まで走ると、以下のようなメッセージが出てくる。

 <snip>
 => Automatic manual page handling
 => Running POST-INSTALL script actions
 => Please note the following:
 
 ===========================================================================
 $NetBSD: MESSAGE,v 1.5 2009/02/02 12:34:59 joerg Exp $
 
 You may wish to have the vulnerabilities file downloaded daily so that
 it remains current.  This may be done by adding an appropriate entry
 to a user's crontab(5) entry.  For example the entry
 
 # download vulnerabilities file
 0 3 * * * /opt/pkg/sbin/pkg_admin fetch-pkg-vulnerabilities >/dev/null 2>&1
 
 will update the vulnerability list every day at 3AM. You may wish to do
 this more often than once a day.
 
 In addition, you may wish to run the package audit from the daily
 security script.  This may be accomplished by adding the following
 lines to /etc/security.local
 
 if [ -x /opt/pkg/sbin/pkg_admin ]; then
         /opt/pkg/sbin/pkg_admin audit
 fi
 
 Alternatively this can also be acomplished by adding an entry to a user's
 crontab(5) file. e.g.:
 
 # run audit-packages
 0 3 * * * /opt/pkg/sbin/pkg_admin audit
 
 Both pkg_admin subcommands can be run as as an unprivileged user,
 as long as the user chosen has permission to read the pkgdb and to write
 the pkg-vulnerabilites to /var/opt/pkg/db.
 
 The behavior of pkg_admin and pkg_add can be customised with
 pkg_install.conf.  Please see pkg_install.conf(5) for details.
 
 If you want to use GPG signature verification you will need to install
 GnuPG and set the path for GPG appropriately in your pkg_install.conf.
 ===========================================================================
 
 => Registering installation for pkg_install-20130902nb1
 ===> running: /bin/sh /tmp/bootstrap-pkgsrc/bin/install-sh -d -o root -g root /etc/opt/pkg
 
 ===========================================================================
 
 Please remember to add /opt/pkg/bin to your PATH environment variable
 and /opt/pkg/man to your MANPATH environment variable, if necessary.
 
 An example mk.conf file with the settings you provided to "bootstrap"
 has been created for you. It can be found in:
 
       /etc/opt/pkg/mk.conf
 
 You can find extensive documentation of the NetBSD Packages Collection
 in /opt/pkgsrc/doc/pkgsrc.txt.
 
 Hopefully everything is now complete.
 Thank you for using pkgsrc!
 
 ===========================================================================
 
 ===> bootstrap started: Thu Aug 14 19:42:07 JST 2014
 ===> bootstrap ended:   Thu Aug 14 19:52:14 JST 2014

前半は、インストールしたパッケージのセキュリティ警告の自動化の設定について書かれている。CentOS風にこれをやろう。まず、/etc/cron.daily/check-pkg-vulnerabilities というファイルをつくり、セキュリティチェックして、メールが出るようにする。

#!/bin/sh
/opt/pkg/sbin/pkg_admin fetch-pkg-vulnerabilities >/dev/null 2>&1

cat <<EOT | /usr/sbin/sendmail -oi -t
From: root@hoge.example.org
To: root@hoge.example.org
Subject: Installed pkgsrc's package audit result
 
Installed pkgsrc's package audit result:
$(/opt/pkg/sbin/pkg_admin audit)
 
EOT

これで、セキュリティ上問題があるVer.かどうかのチェックが1日1回あって、rootにメールが出ることになる。(実際は、sendmailの設定をしていないので、出ない。あとでする。)

後半は、pkgsrcの設定ファイルである、mk.confの位置と説明。環境設定などの説明。

環境設定については、これもCentOS風に/etc/profile.d/pkgsrc.{csh,sh}のようなファイルをつくる。中身については以下のとおり。

# add /opt/pkg/bin to PATH environment variable
# and /opt/pkg/man to MANPATH environment variable.
setenv PATH ${PATH}:/opt/pkg/sbin:/opt/pkg/bin
if ( "$?MANPATH" == 0 ) then
  setenv MANPATH /usr/man:/usr/share/man:/usr/local/man:/usr/local/share/man:/usr/X11R6/man:/opt/pkg/man
else
  setenv MANPATH ${MANPATH}:/opt/pkg/man
endif
# add /opt/pkg/bin to PATH environment variable
# and /opt/pkg/man to MANPATH environment variable.
PATH=${PATH}:/opt/pkg/sbin:/opt/pkg/bin;export PATH
MANPATH=${MANPATH}:/opt/pkg/man;export MANPATH

mk.confについては、以下のように変更する。distfilesは、pkgsrcの下にできるのがデフォルトだが、次の四半期リリースのpkgsrcが出たら、/opt/pkgsrcごと入れ替えられるようにするため、/opt/pkgsrcの外にできるようにしている。また、rc.dスクリプトは、デフォルトでは、/opt/pkg/share/example/rc.d の下にインストールされるが、CentOS風に、自動的に/etc/opt/pkg/rc.d以下にインストールするようにしている。

--- mk.conf.orig        2014-08-14 19:52:14.000000000 +0900
+++ mk.conf     2014-08-14 23:40:17.000000000 +0900
@@ -11,6 +11,13 @@
 PKG_TOOLS_BIN=         /opt/pkg/sbin
 PKGINFODIR=            info
 PKGMANDIR=             man
+DISTDIR=               /var/opt/pkg/distfiles
+PKGVULNDIR=            /var/opt/pkg/distfiles
+LOCALPATCHES=          /opt/pkg/patches
+
+## rc.d script automatically install at ${PREFIX}/etc/rc.d
+RCD_SCRIPTS_DIR=       ${PKG_SYSCONFBASEDIR}/rc.d
+PKG_RCD_SCRIPTS=       YES


 .endif                 # end pkgsrc settings

あと、できるだけ、pkgsrcの中のパッケージは、pkgsrcの中のパッケージに依存させたい、という人は、

PREFER_PKGSRC=  yes

を、.endifより上に追加する。

ディレクトリを掘っておく。

 # mkdir /etc/opt/pkg/rc.d
 # mkdir -p /var/opt/pkg/distfiles

 NetBSDユーザ向け:イライラ解消

たぶん、たいぶイライラがたまっているはず。(わたしのこと。)素直に、NetBSDライクにすればよかった。なんて。とりあえず、うっかりタイプしてしまうとこだけ、symlinkをはっておこう。

 # ln -s /opt/pkgsrc /usr/pkgsrc
 # ln -s /opt/pkg /usr/pkg
 # ln -s /etc/opt/pkg /opt/pkg/etc
 # ln -s /etc/pkg/mk.conf /etc/mk.conf

 直感に反するdirの修正(?)

FHS風とはいうものの、ログだけは、/var/log 以下にできてほしい。あと、pidファイルとかは、やはり、/var/run 以下がよい。などとぜいたくをかます。

 # cd /var/opt/pkg
 # ln -s /var/run .
 # ln -s /var/log .

 最初にインストールするもの

お試し

さて、まずは、何かインストールしてみる。全く個人的な好みだが、とりあえず、

  • misc/lv
  • pkgtools/pkgclean

をインストールしてみる。

 # cd /opt/pkgsrc/misc/lv
 # bmake install 

インストールが終われば、lvコマンドに加え、依存関係で、digest と nbpatch と libtool-base と ncurse がインストールされたはず。

 # pkg_info
 nbpatch-20100124    Patch files using diff output
 pkg_install-20130902nb1 Package management and administration tools for pkgsrc
 digest-20121220     Message digest wrapper utility
 bmake-20140314      Portable (autoconf) version of NetBSD 'make' utility
 ncurses-5.9nb3      CRT screen handling and optimization package
 bootstrap-mk-files-20140516 *.mk files for the bootstrap bmake utility
 lv-4.51nb1          Powerful Multilingual File Viewer
 libtool-base-2.4.2nb7 Generic shared library support script (the script itself)

pkg_install と bootstrap-mk-files はbootstrapで最初に入るパッケージである。

同様に、pkgtools/pkgclean をインストールしてみよう。

 # cd /opt/pkgsrc/pkgtools/pkgclean
 # bmake install

workディレクトリがいっぱい残っているので、pkgcleanコマンドでまとめて消すことにする。

 # pkgclean
 ===> Cleaning in /opt/pkgsrc/devel/libtool-base/work
 ===> Cleaning in /opt/pkgsrc/devel/nbpatch/work
 ===> Cleaning in /opt/pkgsrc/devel/ncurses/work
 ===> Cleaning in /opt/pkgsrc/misc/lv/work
 ===> Cleaning in /opt/pkgsrc/pkgtools/digest/work
 ===> Cleaning in /opt/pkgsrc/pkgtools/pkgclean/work

あとは、同様に、必要なパッケージをインストールしていくだけである。

RPMでいれているものとパッケージがかぶることがあるが、しょうがないと思って、あきらめた方が、トラブルがなくてすむ。(とはいえ、Perlとか大きいので、ディスクの空き容量で困ったことになるかもしれない。)

# 空き容量に困った時は、distfilesは全部消して良いので、覚えておく。

 # rm -rf /var/opt/distfiles/*

rc.dスクリプトの手当て

まず、以下のものをインストールする。

  • pkgtools/rcorder
  • pkgtools/rc.subr

どちらも、そのままインストールすればよい。後者は /etc 直下に rc.conf と rc.example と rc.subr をインストールする。とても気持ち悪いのだが、pkgsrcでインストールされる起動スクリプト群は、/etc/rc.conf と /etc/rc.subr 決め打ちとなっている。やむをえまい。

次に、以下のファイルを/etc/init.d/rcdに作成する。(このファイルは、pkgsrcをデフォルトパッケージとするLinuxディストリビューションであるDracoLinuxからもってきたもの。自分で同じようなファイルを作っていたのだが、もっとよかったので。)

rcd.sh

#!/bin/sh
#
# Run pkgsrc scripts in /etc/opt/pkg/rc.d with rcorder.
# 
# This file imported from DracoLinux (http://www.dracolinux.org/).
#
# chkconfig: - 95 20
# description: NetBSD rc.d startup scripts

. /etc/rc.subr
. /etc/rc.conf
_rc_conf_loaded=true

scripts=$(for rcd in /etc/opt/pkg/rc.d/*; do echo ${rcd} ;done)

RETVAL=0
prog="rcd"
servicename=$prog

start() {
echo "Starting pkgsrc services: "
files=$(/opt/pkg/sbin/rcorder -s nostart ${rc_rcorder_flags} ${scripts})
for _rc_elem in $files; do
       run_rc_script $_rc_elem start 2> /dev/null
done
}

stop() {
echo "Stopping pkgsrc services: "
files=$(/opt/pkg/sbin/rcorder ${rc_rcorder_flags} ${scripts}|tac)
for _rc_elem in $files; do
       run_rc_script $_rc_elem stop 2> /dev/null
done
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    *)
        echo "Usage: $prog {start|stop|restart}"
        exit 1
        ;;
esac
exit $RETVAL

自動起動するようにする。

# chkconfig --add rcd
# chkconfig rcd on

次に、以下のファイルを、/etc/opt/pkg/rc.d/mountcritremoteに作成する。(NetBSD環境とは違うので、それをごまかすダミーファイル。)

mountcritremote.sh

#!/bin/sh
#
# mountcritremote
#

# PROVIDE: mountcritremote
# REQUIRE: NETWORKING

#	This is a dummy.

これで、rc.dスクリプトの手当てができた。

 新しい四半期リリースが出たときは?

make pkgsrc-updateすると、新しい四半期リリースが出たことに気づいたとき。

# make pkgsrc-update
cd /opt/pkgsrc && git pull
remote: Counting objects: 10052, done.
remote: Compressing objects: 100% (3344/3344), done.
remote: Total 10052 (delta 7344), reused 9153 (delta 6663), pack-reused 0
Receiving objects: 100% (10052/10052), 5.30 MiB | 1.10 MiB/s, done.
Resolving deltas: 100% (7344/7344), completed with 2278 local objects.
From git://github.com/NetBSD/pkgsrc
   701f752..f93ffee  KIENTZLE   -> origin/KIENTZLE
   b56062e..4976322  TNF        -> origin/TNF
   de54e6f..c5bca81  pkgsrc-2016Q1 -> origin/pkgsrc-2016Q1
 * [new branch]      pkgsrc-2016Q2 -> origin/pkgsrc-2016Q2
   fd5f318..0d1dde8  trunk      -> origin/trunk
Updating de54e6f..c5bca81
<snip>

こうしたときは、新しいbranchに切り替えよう。

# cd pkgsrc
# git branch pkgsrc-2016Q2 origin/pkgsrc-2016Q2
Branch pkgsrc-2016Q2 set up to track remote branch pkgsrc-2016Q2 from origin.
# git checkout pkgsrc_2016Q2
Checking out files: 100% (11006/11006), done.
Switched to branch 'pkgsrc-2016Q2'
# git pull
remote: Counting objects: 9, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 9 (delta 6), reused 9 (delta 6), pack-reused 0
Unpacking objects: 100% (9/9), done.
From git://github.com/NetBSD/pkgsrc
   0d1dde8..3ce9352  trunk      -> origin/trunk
Already up-to-date.
# git branch
  pkgsrc-2016Q1
* pkgsrc-2016Q2

切り替え完了。あとは、今までどおり、make pkgsrc-updateで四半期リリースのアップデートができる。

個別パッケージのインストール

 前提

ドメイン登録や、DNSサーバの設定等は、ひととおり終わっている前提。

  • メールを受けたいドメイン名で、MX レコードが引けること
  • 上記MXレコードで、A and/or AAAA レコードが引けること
  • Webページを公開したいドメイン名で、A and/or AAAA レコードが引けること

は、もちろん、確認しているよね?

あと、hostnameコマンドの出力がFQDNになっていることと、その名前がDNS上にあることを確認しよう。

# 確認しようと思って、dig or host or nslookupコマンドを探しても、「シンプルセット」では、入っていません。yum install bind-utils するか、pkgsrcから、net/drillをインストールしましょう。(drillはdigコマンドの代わり。)

 mail/opensmtpd

基本設定

まずは、メールを受信したい。標準(RPM)でSendmailが入っているんだけれども、いまさら、Sendmail、という気もするので、OpenSMTPDをインストールして使ってみることにする。

 # cd /opt/pkgsrc/mail/opensmtpd
 # bmake install
 # bmake clean clean-depends

インストールできたら、設定。/etc/opt/pkg/smtpd.conf に設定する。といっても、テンプレートどおりに書くだけ。

# To accept external mail, replace with: listen on all
# listen on localhost
listen on XXX.XXX.XXX.XXX
listen on 2001:XxX:XXX:X:X:X:X:xX
listen on 127.0.0.1
listen on ::1

# If you edit the file, you have to run "smtpctl update table aliases"
table aliases db:/etc/aliases.db

# Uncomment the following to accept external mail for domain "hoge.example.org"
accept from any for domain "hoge.example.org" alias <aliases> deliver to mbox

accept for local alias <aliases> deliver to mbox
accept for any relay

listen on、のところは、"listen on all"と書くと、エラーが出る。これは、ServersMan@VPSの仕様。よって、listenしたいアドレスをいちいち全て書く。

あとは、/etc/rc.conf に、

opensmtpd=YES

を書けば、サーバ起動時に自動起動する。

これで、ローカルからメールを出したり、hoge.example.orgドメインのメールを外から受け取ることができるようになった。(そして、aliasをみて、再度、外へ出すこともできるようになった。)

もし、仮に、ホスト名は、hoge.example.orgなんだけど、@example.orgでメールを受けたい場合は、

accept from any for domain "hoge.example.org" alias <aliases> deliver to mbox

accept from any for domain "example.org" alias <aliases> deliver to mbox

としよう。また、メールを出す際、ホスト名はhoge.example.orgなんだけど、@hoge.example.orgではなくて、@example.orgでメールを出したい場合は、

accept for any relay

accept for any relay as "@example.org"

としよう。

SMTP Auth

メールソフトのメールの送信にもつかいたい。まずは、SSLのオレオレ証明書をつくる。

 cd /etc/opt/pkg/private
 /usr/pkg/bin/openssl genrsa -out hoge.example.org.key 4096
 chmod 600 hoge.example.org.key
 cd /etc/opt/pkg/certs
 /usr/pkg/bin/openssl req -new -x509 -key hoge.example.org.key -out hoge.example.org.crt -days 3650
 chmod 600 hoge.example.org.crt
 <割愛>

ちなみに、/etc/opt/pkg/certs、というのはopensmtpdの決め打ち。(smtpd.confのmanにある。)

あとは、pki行を2行追加し、listenの行を以下のように書き換える

pki hoge.example.org certificate "/etc/opt/pkg/openssl/certs/hoge.example.org.crt"
pki hoge.example.org key "/etc/opt/pkg/openssl/private/hoge.example.org.key"

listen on XXX.XXX.XXX.XXX
listen on XXX.XXX.XXX.XXX port 587 tls-require pki hoge.example.org auth
listen on 2001:XxX:XXX:X:X:X:X:xX
listen on 2001:XxX:XXX:X:X:X:X:xX port 587 tls-require pki hoge.example.org auth
listen on 127.0.0.1
listen on ::1

これで、このサーバのローカルアカウントのユーザIDとパスワードで、メールを送信できるようになった。

注意点

注意点としては、opensmtpdのユーザ権限(デフォルトだと、_smtpd)で実行されるプログラム(メーリングリスト等)は、ちゃんとそのユーザ権限で実行できないといけないし、ファイルを読み書きできないといけない。Postfixで動いていたものが、OpenSMTPDで動かない、などという時は、まずここを確認しよう。

あと、はまったところとしては、PostfixやSendmailでは、aliasに、

 hoge: :include:/path/to/file

として、fileに、

 "|/path/to/command"

と書くことができたが、試した限り、OpenSMTPDではできず、

 |/path/to/command

と書かないとダメだった。場合によって、ここも確認した方がよいだろう。

 www/lighttpd

共通設定

次は、WWW。小さいWebサーバだと、その昔は、thttpdなんかがよく使われていた。自分は、boabozotic HTTP server(bozohttpd)Mathopdなんかを使っていた。今回は、すっかりNginxの影で存在感が薄くなってしまった、lighttpdを使うことにする。

 # cd /opt/pkgsrc/www/lighttpd
 # bmake install
 # bmake clean clean-depends

まず、lighttpd.confを以下のように編集する。

 --- lighttpd.conf.orig	2014-08-15 05:41:04.000000000 +0900
 +++ lighttpd.conf	2014-08-16 13:14:15.000000000 +0900
 @@ -13,10 +13,10 @@
  ## if you add a variable here. Add the corresponding variable in the
  ## chroot example aswell.
  ##
 -var.log_root    = "/var/opt/pkg/log/lighttpd"
 +var.log_root    = "/var/log/lighttpd"
  var.server_root = "/srv/www"
 -var.state_dir   = "/var/opt/pkg/run"
 -var.home_dir    = "/var/lib/lighttpd"
 +var.state_dir   = "/var/run"
 +var.home_dir    = "/var/opt/pkg/lib/lighttpd"
  var.conf_dir    = "/etc/opt/pkg/lighttpd"
  
  ## 
 @@ -50,7 +50,8 @@
  ## conf.d/simple_vhost.conf
  ## vhosts.d/vhosts.template
  ##
 -var.vhosts_dir  = server_root + "/vhosts"
 +#var.vhosts_dir  = server_root + "/vhosts"
 +var.vhosts_dir  = server_root
  
  ##
  ## Cache for mod_compress
 @@ -96,6 +97,9 @@
  ## bind to a specific IP
  ##
  #server.bind = "localhost"
 +server.bind = "[2001:XxX:XXX:X:X:X:X:xX]"
 +
 +$SERVER["socket"] == "xxx.xxx.xxx.xxx:80" { }
  
  ##
  ## Run as a different username/groupname.
 @@ -178,7 +182,7 @@
  ##
  ## linux-sysepoll is recommended on kernel 2.6.
  ##
 -#server.event-handler = "linux-sysepoll"
 +server.event-handler = "linux-sysepoll"
  
  ##
  ## The basic network interface for all platforms at the syscalls read()
 @@ -451,6 +456,6 @@
  ## custom includes like vhosts.
  ##
  #include "conf.d/config.conf"
 -#include_shell "cat /etc/lighttpd/vhosts.d/*.conf"
 +include_shell "cat /etc/opt/pkg/lighttpd/vhosts.d/*.conf"
  ##
  #######################################################################

server.bindとその下の$SERVERの行は、こう書かないと、IPv6とIPv4のアドレスを両方listenしてくれない。これも、ServersMan@VPSの仕様。(ちなみに、server.bindの方をIPv4アドレスにすると、うまくいかない。)

次に、modules.confを編集する。

 --- modules.conf.orig       2014-08-15 05:41:02.000000000 +0900
 +++ modules.conf        2014-08-16 21:17:30.000000000 +0900
 @@ -41,10 +41,10 @@
 
  server.modules = (
    "mod_access",
 -#  "mod_alias",
 +  "mod_alias",
  #  "mod_auth",
  #  "mod_evasive",
 -#  "mod_redirect",
 +  "mod_redirect",
  #  "mod_rewrite",
  #  "mod_setenv",
  #  "mod_usertrack",
 @@ -66,7 +66,7 @@
  ##
  ## mod_status
  ##
 -#include "conf.d/status.conf"
 +include "conf.d/status.conf"
 
  ##
  ## mod_webdav
 @@ -81,7 +81,7 @@
  ##
  ## mod_userdir
  ##
 -#include "conf.d/userdir.conf"
 +include "conf.d/userdir.conf"
 
  ##
  ## mod_magnet
 @@ -134,7 +134,7 @@
  ##
  ## plain old CGI (mod_cgi)
  ##
 -#include "conf.d/cgi.conf"
 +include "conf.d/cgi.conf"
 
  ##
  #######################################################################

mod_redirectとmod_statusは別に有効にしなくてもよい。mod_userdirは/~なんとか/で、ホームディレクトリのpublic_html以下を参照させるつもりがないなら、同様に有効にしなくてもよい。

普通のCGIを動かすつもりなので、mod_cgiを有効にする。

conf.d/cgi.conf を編集する。

 --- cgi.conf.orig       2014-08-16 11:47:20.000000000 +0900
 +++ cgi.conf    2014-08-16 17:26:35.000000000 +0900
 @@ -12,11 +12,11 @@
  ##
  ## For PHP don't forget to set cgi.fix_pathinfo = 1 in the php.ini.
  ##
 -cgi.assign                 = ( ".pl"  => "/usr/bin/perl",
 -                               ".cgi" => "/usr/bin/perl",
 -                               ".rb"  => "/usr/bin/ruby",
 -                               ".erb" => "/usr/bin/eruby",
 -                               ".py"  => "/usr/bin/python" )
 +#cgi.assign                 = ( ".pl"  => "/opt/pkg/bin/perl",
 +#                               ".cgi" => "/opt/pkg/bin/perl",
 +#                               ".rb"  => "/usr/bin/ruby",
 +#                               ".erb" => "/usr/bin/eruby",
 +#                               ".py"  => "/usr/bin/python" )
 
  ##
  ## to get the old cgi-bin behavior of apache

これは、個別のvirtual hostの設定の方に書くため、コメントアウトしている。

あとは、conf.d/debug.confを編集し、

 --- /usr/pkg/share/examples/lighttpd/conf.d/debug.conf  2014-08-15 05:41:02.000000000 +0900
 +++ debug.conf  2014-08-16 13:11:25.000000000 +0900
 @@ -12,7 +12,7 @@
  ## log-request-handling allows you to track the request
  ## handing inside lighttpd.
  ##
 -#debug.log-request-handling        = "enable"
 +debug.log-request-handling        = "enable"
 
  ##
  ## log all request headers.
 @@ -34,7 +34,7 @@
  ##
  ## log if a file wasnt found in the error log.
  ##
 -#debug.log-file-not-found          = "enable"
 +debug.log-file-not-found          = "enable"
 
  ##
  ## debug conditionals handling

起動前に文法をチェックする。

 # /opt/pkg/sbin/lighttpd -t -f /etc/opt/pkg/lighttpd/lighttpd.conf
 Syntax OK

個別設定

上記では、バーチャルホストを前提にしているので、その設定をする。(どうせひとつしかいらないんだけど、そのうちいるようになるかもしれないので。)

考え方としては、Apacheのmod_vhost_aliasでよくやるように、

  • /src/www/ホスト名/htdocs
  • /src/www/ホスト名/cgi-bin
  • /var/log/lighttpd/ホスト名/{access,error}.log

となるようにしたい。

まず、必要なdirを掘る。

 # mkdir -p /src/www/www.example.org/htdocs
 # mkdir -p /var/log/lighttpd/www.example.org
 # chown lighttpd:lighttpd /var/log/lighttpd/www.example.org
 # chmod 755 /var/log/lighttpd/www.example.org

設定ファイルを書く。ここでは、/etc/opt/pkg/lighttpd/vhost.d/www.example.org.conf に書くことにし、以下のように書いた。

#######################################################################
##
 
$HTTP["host"] == "www.example.org" {
  var.server_name = "www.example.org"
  server.name = server_name

  server.document-root = vhosts_dir + "/" + server_name + "/htdocs"
  accesslog.filename   = log_root + "/" + server_name + "/access.log"
  server.errorlog = log_root + "/" + server_name + "/error.log"

  alias.url = ( "/cgi-bin/" => vhosts_dir + "/" + server_name + "/cgi-bin/" )
  $HTTP["url"] =~ "^/cgi-bin" {
    cgi.assign =  ( ".cgi" => "/opt/pkg/bin/perl",
                    ".pl"  => "/opt/pkg/bin/perl" )
    cgi.execute-x-only = "enable"
  }
 
  index-file.names += ( "wiki.cgi" )
 
  alias.url += ( "/fswiki/" => vhosts_dir + "/" + server_name + "/fswiki/" )
  $HTTP["url"] =~ "^/fswiki/" {
    cgi.assign = ( ".cgi" => "/opt/pkg/bin/perl" )
    cgi.execute-x-only = "enable"
    url.access-deny = ( "pm", "dat", "wiki", "log", "bak", "orig" )
  }
}
 
##
#######################################################################

このサイトは、FreeStyleWikiのデータを別のサーバから移行してくる必要があったため、/srv/www/www.example.org/fswiki/ に設置することにし、その設定を後半に書いている。

Apache風にいうと、cgi-binディレクトリも、fswikiディレクトリもScriptAlias(にしたい)なのだが、上記の設定では、データファイルであっても、ScriptAliasと違い、アクセスできてしまう。(つまり、http://www.example.org/fswiki/setup.dat で、アクセスできてしまう。)FreeStlyewikiの場合、これが問題になるので、url.access-denyで、アクセスさせないファイルの拡張子を設定している。

テストファイルを置く。

 # echo "Hello!" > /srv/www/www.example.org/htdocs/index.html

起動して、ログをみつつ、アクセスして、動作テストしよう。

 # tail -f /var/log/lighttpd/*.log

問題ないようであれば、conf.d/debug.confを元に戻して、lighttpdをリスタートしよう。

あとは、/etc/rc.conf に、

lighttpd=YES

を書けば、サーバ起動時に自動起動する。

 net/nsd

DNS権威サーバとするために、NSDをインストールする。

 # cd /opt/pkgsrc/net/nsd
 # bmake install
 # bmake clean clean-depends

インストール後の設定は、てっとりばやくNSDを参照。

あとは、/etc/rc.conf に、

nsd=YES

を書けば、サーバ起動時に自動起動する。

 security/openssh

CentOS 6のOpenSSHは、5.3p1で、正直いって古い。新しいOpenSSHが使いたいので、インストールすることにする。

まず、/etc/mk.confに高速化パッチがあたるよう、オプションを書いておく。

PKG_OPTIONS.openssh=    hpn-patch

インストールする。

 # cd /opt/pkgsrc/security/openssh
 # bmake install
 # bmake clean clean-depends

あとは、/etc/rc.conf に、

sshd=YES

を書けば、サーバ起動時に自動起動する。

既存のssh_host_*_keyがあるはずなので、コピーしておくとよい。

 # cp -avi /etc/ssh/ssh_host_*_key* /etc/opt/pkg/ssh

sshd_configを修正する。(/etc/opt/pkg/ssh/sshd_configを必要に応じて参照する。)

  • Port
    • DTIのデフォルトは22ではない。合わせるなら、直す。
  • ListenAddress
    • IPv4アドレス、IPv6アドレスはそれぞれ指定しないと、動作しない。
  • SyslogFacility
    • AUTHPRIV にしないとだめ。
  • Subsystem
    • sftp /opt/pkg/libexec/sftp-server と、pkgsrcからインストールしたものにする。
  • PasswordAuthentication
    • 公開鍵認証のみとするなら、(必要な作業を行った後、)no にしておく。
  • PidFile
    • Linux側のPidFileとバッティングするので、適当に名前を変えておく。(/var/run/pkgsrc-sshd.pidとか。)

CentOS側のsshdを停止し、pkgsrcで入れたsshdを起動する。

 # /etc/init.d/sshd stop
 # chkconfig sshd off
 # /etc/opt/pkg/rc.d/sshd start

別のターミナル画面を開き、sshログインできるかどうか試しておく。

あとは、必要に応じて、/etc/profile.d/pkgsrc.{csh,sh} にaliasを書いておくとよい。

間違いの指摘や、ご意見などは、FrontPageにある連絡先にメールを下さるとうれしいです。

最終更新時間:2016年12月25日 05時52分19秒