NetBSD」カテゴリーアーカイブ

NetBSD 6.1.5 → 7.0.1

(先月書いた記事だが公開を忘れていた)

今回は pkgsrc/sysutils/sysbuild を使ってみた。sysbuild は The NetBSD Guide にも載っている。CVS でソースを取得してビルドコマンドを実行するってのをやってくれるそうだ。いつから載ってたんだろう? 気づかなかったな。

sysbuild の細かい設定は /usr/pkg/etc/sysbuild/default.conf で行う。今回はソースの置き場と作業ディレクトリを変更するために BUILD_ROOT, SRCDIR, XSRCDIR を変更した。

一般ユーザでビルドするため The NetBSD Guide に従って事前に src, xsrc ディレクトリを用意したら、最初の fetch で cvs update を実行しようとして失敗する。どうやら src があると cvs update になる仕様のようだ。src ディレクトリを削除したら無事 cvs checkout が実行された。

ちなみに CVS で取得する際のタグは CVSTAG で指定する。つまりソース取得だけならこう、

$ sysbuild -o CVSTAG=netbsd-7-0-1-RELEASE fetch

いきなりビルドするならこうだ。

$ sysbuild -o CVSTAG=netbsd-7-0-1-RELEASE build

で、root になって sysupgrade だそうだ。

# sysupgrade auto ~/sysbuild/release/$(uname -m)

実行するとインストールの後に etcupdate が走って各種ファイルのマージ。それが終わると postinstall が実行された。


...
postinstall checks failed: varshm
To fix, run:
sh /usr/sbin/postinstall -s /var/cache/sysupgrade/etc.tgz -d / fix varshm
Note that this may overwrite local changes.
sysupgrade: E: Some postinstall(8) checks have failed

追加で postinstall を手動で実行するところはこれまでと同じ

$ sudo sh /usr/sbin/postinstall -s /var/cache/sysupgrade/etc.tgz -d / fix varshm

squid の名前解決

Squid を 3.0.9 から 3.5.19 にあげたらアクセスできなくなったのでメモ

NetBSD サーバの pkgsrc を 2016Q2 にし、squid を更新したところ 3.0.9 が 3.5.19 になった。

以前に特別な設定はしていなかったことを確認して、デフォルトの squid.conf を /usr/pkg/etc/squid/ にコピー。
squid を起動…したところつながらない。

ブラウザにはエラーが出ている。

ホスト名 “qiita.com” の IPアドレスがわかりません。

名前解決のエラーだ。

言うまでもないが、squid 以外の接続は正常で、ローカルの DNS は問題ない。

cache.log を見ると

2016/07/26 xx:xx:xx kid1| Adding nameserver 0.0.0.0 from /etc/resolv.conf
2016/07/26 xx:xx:xx kid1| WARNING: Squid does not accept 0.0.0.0 in DNS server specifications.
2016/07/26 xx:xx:xx kid1| Will be using [::1] instead, assuming you meant that DNS is running on the same machine

/etc/resolv.conf で指定した 0.0.0.0 が [::1] にフォールバックしている。
3.0.9 のときのログを見るとここは 127.0.0.1 だった。
というか 0.0.0.0 が許可されていないことに気づいてなかった。

ローカルの named はオプション -4 で運用しているのでつながらなかったわけだ。

どうしたものかちょっと考えた結果、squid.conf で明示的に 127.0.0.1 を指定することに。

dns_nameservers 127.0.0.1

今まで深くは考えていなかったけど、resolv.conf での 0.0.0.0 の指定ってどうなんだろう?

NetBSD 6.1.4 → 7.0

sysupgrade を使う方法は NetBSD 5.x → 6.x のときにはまっていたので今回はパス。リモートだし。

$ cd /home/NetBSD/src
$ cvs update -PdAC -r netbsd-7-0-RELEASE
$ rm -rf ../obj ../tools
$ ./build.sh -O ../obj -T ../tools -j 8 -U tools kernel=GENERIC distribution
…
$ sudo rm -f /onetbsd
$ sudo ln /netbsd /onetbsd
$ sudo cp /home/NetBSD/obj/sys/arch/i386/compile/GENERIC/netbsd /nnetbsd
$ sudo mv /nnetbsd /netbsd
$ sudo shutdown -r now
…
$ cd /home/NetBSD/src/
$ sudo ./build.sh -O ../obj -T ../tools -U install=/
...
$ sudo /usr/sbin/etcupdate -s /home/NetBSD/src
...
*** Checking for new directories
Create /usr/include/gcc-4.1? (y/[n])
...
postinstall checks passed: bluetooth ddbonpanic defaults dhcpcd dhcpcdrundir envsys fontconfig gid gpio hosts iscsi makedev motd mtree named pam periodic pf pwd_mkdb ssh wscons x11 xkb uid varrwho tcpdumpchroot atf catpages manconf ptyfsoldnodes
postinstall checks failed: rc varshm obsolete
To fix, run:
    sh /usr/sbin/postinstall -s /home/NetBSD/src -d / fix rc varshm obsolete
Note that this may overwrite local changes.
*** All done
$ sudo /usr/sbin/postinstall -s /home/NetBSD/src -d / fix rc varshm obsolete
...
postinstall fixes passed: rc varshm obsolete
postinstall fixes failed:
$ sudo shutdown -r now 

a2ps-j が動かない

事例としては NetBSD の pkgsrc なんだけど、他の環境でも発生するかもしれない。しらないけど。

a2ps-j のバージョンは 1.45 (pkgsrc としてのバージョンは ja-a2ps-1.45nb4)、perl-5.20.0 (perl-5.20.0nb2) の組み合わせ。2014/12/18 に chechout した pkgsrc で作成している。

症状は、日本語を含むテキストを読ませると、日本語を読んだところで終了する。異常終了ではなく、そこでテキストがなくなったかのような終わり方。

終了している箇所を探すと、a2ps-j の内部で日本語文字コードの変換してるところで発生していた。処理の仕組みがよくわからないので直せない、ってかこれ Perl4 時代のコードじゃね?

対処方法としてはオプション -nc をつける。オプション -nc を指定すると内部変換をしないようにできるので、このバグを回避できる。ただし、受け付ける日本語が ISO2022-JP 限定になってしまうので、iconv か何かを使って事前に変換してやる必要がある。

$ iconv -f utf-8 -t iso-20220-jp hoge.txt | nkf -nc -p > hoge.ps

とかなんとか。

これだとファイル名とかヘッダにつかないのでシェルスクリプト書いて処理させてる。

#! /bin/sh

LANG=

while [ "$#" -gt 0 ]
do
    s=$1
    for i in .c .h .f90 .sh .pl .json; do
        d=${s%$i}.ps
        if [ $d != $s.ps ]; then break; fi
    done
    t=`stat -f "%Sm" -t "%F %T %z" $s`
    iconv -f utf-8 -t iso-2022-jp $s |
    a2ps-j -nc -p -l "$s" -L "$t" -f8 > $d
    shift
done

NetBSD 6.1.4→6.1.5 (sysupgrade)

sysupgrade を使って NetBSD 6.1.4 を 6.1.5 に更新する。
前回 と違ってマイナーアップデートだからすんなりできた。

$ sudo sysupgrade auto ftp://ftp.NetBSD.org/pub/NetBSD/NetBSD-6.1.5/$(uname -m)
sysupgrade: I: Starting auto-update with stages: fetch modules kernel sets etcupdate postinstall clean
sysupgrade: I: Downloading ftp://ftp.NetBSD.org/pub/NetBSD/NetBSD-6.1.5/i386/binary/sets/base.tgz into /var/cache/sysupgrade
Trying 2001:470:1f05:3d::21:21 ...
ftp: Can't connect to `2001:470:1f05:3d::21:21': No route to host
Trying 199.233.217.249:21 ...
Connected to ftp.NetBSD.org.
220 ftp.NetBSD.org FTP server (NetBSD-ftpd 20100320) ready.
(略)
local: /var/cache/sysupgrade/netbsd-GENERIC.gz.tmp remote: netbsd-GENERIC.gz
229 Entering Extended Passive Mode (|||53527|)
150 Opening BINARY mode data connection for 'netbsd-GENERIC.gz' (5911061 bytes).
100% |***********************************|  5772 KiB  216.85 KiB/s    00:00 ETA
226 Transfer complete.
5911061 bytes received in 00:26 (216.84 KiB/s)
221-
    Data traffic for this session was 5911061 bytes in 1 file.
    Total traffic for this session was 5915695 bytes in 1 transfer.
221 Thank you for using the FTP service on ftp.NetBSD.org.
sysupgrade: I: Upgrading kernel modules
sysupgrade: I: Extracting modules into /
100% |***********************************|  5890 KiB  739.47 KiB/s    00:00 ETA
sysupgrade: I: Upgrading kernel using GENERIC in /
sysupgrade: I: Backing up 'netbsd' kernel as 'onetbsd'
sysupgrade: I: Upgrading base system
(略)
(etcupdateの実施)
(略)
postinstall checks failed:
sysupgrade: I: Cleaning downloaded files

TeX (pkgsrc-2014Q1) が動かない

pkgsrc-2014Q1 にロールアップしたら TeX が動かなくなった。

$ platex test.tex
This is e-pTeX, Version 3.1415926-p3.4-110825-2.6 (utf8.euc) (Web2C 2013)
 restricted \write18 enabled.

kpathsea: Running mktexfmt platex.fmt
/usr/pkg/bin/mktexfmt: /usr/pkg/share/texmf/texconfig/tcfmgr: not found
fmtutil: config file `fmtutil.cnf' not found.
I can't find the format file `platex.fmt'!
$ 

tcfmgr は /usr/pkg/share/texmf-dist/texconfig にある。

調べてみると TeX Live 2012 から 2013 になって、texmf → texmf-dist という変更が入ったらしい。pkgsrc でインストールされる TeX のツール群で何か不整合でもあったのだろう。TeX は pkg_rolling-replace で入れなおしている。

そのうちに修正されると思うけど、それまでは TEXMFMAIN=/usr/pkg/share/texmf-dist を環境変数に指定しておくといいみたい。

sysupgrade

NetBSD 5.1.2 のシステムがあって、6.1.4 にあげようと思ったわけだ。

ソースからコンパイルするのは時間が掛かるし、インストールDVDを用意してコンソールから作業するのも面倒なので、ちょっと調べてみると、pkgsrc/sysutils/sysupgrade というのが見つかった。

インストール用のバイナリデータを持ってきて、展開してインストールしてくれるらしい。

やってみた。

$ sudo sysupgrade auto
sysupgrade: I: Starting auto-update with stages: fetch modules kernel sets etcupdate postinstall clean
sysupgrade: W: Reusing existing /var/cache/sysupgrade/base.tgz
sysupgrade: W: Reusing existing /var/cache/sysupgrade/comp.tgz
sysupgrade: W: Reusing existing /var/cache/sysupgrade/etc.tgz
sysupgrade: W: Reusing existing /var/cache/sysupgrade/games.tgz
sysupgrade: W: Reusing existing /var/cache/sysupgrade/man.tgz
sysupgrade: W: Reusing existing /var/cache/sysupgrade/misc.tgz
sysupgrade: W: Reusing existing /var/cache/sysupgrade/tests.tgz
sysupgrade: W: Reusing existing /var/cache/sysupgrade/text.tgz
sysupgrade: W: Reusing existing /var/cache/sysupgrade/netbsd-GENERIC.gz
sysupgrade: I: Skipping modules installation (modules not in SETS)
sysupgrade: I: Upgrading kernel using GENERIC in /
sysupgrade: I: Backing up 'netbsd' kernel as 'onetbsd'
sysupgrade: I: Upgrading base system
sysupgrade: I: Extracting base into /
100% |***********************************|   100 MiB  426.04 KiB/s    00:00 ETA
sysupgrade: I: Extracting comp into /
[1]   Bad system call (core dumped) progress -zf "${...
(略)
$ /bin/ls
Bad system call

おおっと。

6.1.4 のバイナリに置き換わった時点でコマンドが使えなくなった。だが 6.1.4 のカーネルのインストールは済んでいるはずなので、再起動すれば動くような気がする。

reboot(8) も動かない状態なのでやむなくリセットボタンによる再起動。

なんとか動くようになったので、もう一度 sysupgrade を実行して 6.1.4 に。

あと、/usr/pkg/etc/sysupgrade.conf で SET=AUTO だと、/etc/mtree/set.modules が無いせいで modules がインストールされていなかったので追加でインストールしておいた。

$ sudo sysupgrade -o SET=modules modules

Apache 2.4 で PHP (mod_php) が動かなくなってた件

先日の件はPHP-FPM に切り替えることで対処。

pkgsrc/www/php-fpm をインストール。
/etc/rc.conf に php_fom=YES を追加して php-fpm を起動。

/usr/pkg/etc/httpd/httpd.conf で以下のモジュールを有効に。

LoadModule proxy_module lib/httpd/mod_proxy.so
LoadModule proxy_fcgi_module lib/httpd/mod_proxy_fcgi.so

php5_module の設定が残っている場合は削除。

Apache の ProxyPassMatch ディレクティブを使ってPHP ファイルへのアクセスを php-fpm へ転送する設定。ProxyPassMatch の第1引数は URL のルートからのパスにマッチする正規表現、第2引数の fcgi://127.0.0.1:9000 以降は対応する PHP ファイルの絶対パスを指定する。

ProxyPassMatch ^/~alice/(.*\.php)$ fcgi://127.0.0.1:9000/home/alice/public_html/$1

…userdir が絡むと面倒だな。

zoneedit と ddclient

zoneedit の dynamic DNS の更新に ddclient (pkgsrc/net/ddcleint) を利用していたのだが、エラーが出て更新できなくなってしまった。

zoneedit のアナウンスとかは見当たらなかったが、どうやら HTTPS でのみ更新が可能なように仕様が変更されたっぽい。

pkgsrc-2014Q1 の ddclient-3.6.6 は SSL が使用できないが、最新版では使用できるらしいとの話を聞きつけて、ddclient-3.8.2 を本家から持ってきて試してみたのだがエラーが出てうまくいかない。

syswrite() on closed filehandle GEN1 at ./ddclient line 1902.
Use of uninitialized value $result in numeric ne (!=) at ./ddclient line 1904.
WARNING:  cannot send to dynamic.zoneedit.com:443 (Bad file descriptor).

デバッグ出力を埋め込んで調べてみると、zoneedit の SSL 証明書の検証ができなくて失敗していることがわかった。

WARNING:  cannot connect to dynamic.zoneedit.com:443 socket: SSL connect attempt failed with unknown error error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed SSL connect attempt failed with unknown error error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

とはいえ、ブラウザはともかく、NetBSD で SSL ルート証明書の管理などしてない。どうしよう。

結局、検証は行わないように ddclient を修正して対処した。

@@ -1881,8 +1880,9 @@
             Proto => 'tcp',
             MultiHomed => 1,
             Timeout => opt('timeout'),
+            SSL_verify_mode => IO::Socket::SSL::SSL_VERIFY_NONE(),
         );
-           defined $sd or warning("cannot connect to $peer:$port socket: $@ " . IO::Socket::SSL::errstr());
+           fileno($sd) or warning("cannot connect to $peer:$port socket: $@ " . IO::Socket::SSL::errstr());
     } else {
            $sd = IO::Socket::INET->new(
             PeerAddr => $peer,

SSL_VERYFY_NONE は IO::Socket::SSL 内で定義されている定数だが、他所から明示的に参照したいときはサブルーチンのように記述すれば良いらしい。

あと、IPアドレス取得用の URL も https://dynamic.zoneedit.com/checkip.html のように HTTPS しか受け付けなくなってしまった。上記の修正だけでは HTTP で取得しようとしてしまうのだが、ddclient.conf の web の引数に https:// を付けて記述すればよい。

use=web, web=https://dynamic.zoneedit.com/checkip.html, web-skip='IP Address'

pkgsrc-2014Q1 で Apache 2.4 と PHP 5.5 が動かなくなった

pkgsrc-2014Q1 がリリースされたのでアプリケーションをアップデートしていたところ、表題のように Apache が起動できなくなった。

$ sudo /etc/rc.d/apache start
Starting apache.
[Tue Apr 22 16:57:14.926914 2014] [:crit] [pid 19113:tid 3214934016] Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.  You need to recompile PHP.
AH00013: Pre-configuration failed

tech-pkg 012766 で既に話題には出ていたようだ。

で、対処方法としては AP-PHP の代わりに PHP-FPM を使え ってことなのかな。めんどくさいなあ。

そもそも PHP-FPM って何やねん、というレベルなのだが、ぐぐったら こんなページ が見つかったので、あとで参考にさせてもらうことにしよう。

ということで、まだ壊れて動かないまま。