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 

SSL証明書

いつからか、さくらのレンタルサーバでも名前ベースのバーチャルホストで SSL が使えるようになっていた (SNI) ので、このサイトにも導入してみた。

“無料のSSL証明書StartSSLを活用する” を参考に、StartSSL の SLL 証明書を取得、さくらのサーバに証明書を設置した。

これでいけるかと思ったら、エラーが出て接続できない。

www.uconst.org への接続中にエラーが発生しました。
The OCSP server has no status for the certificate. 
(エラーコード: sec_error_ocsp_unknown_cert) 

接続できないのは Firefox からで、IE8 からだと接続できる。でも IE8 だと単に OCSP を見に行ってないだけかもしれない。

ググったら こんなツイート を見つけた。CA への登録が完了してないっぽい。しょせん無料だし気長に待つか。

(追記 15:20)
今つながった。つながるまで3時間半くらいかかったかな。

Emacs からの make (Windows 上)

Windows だと make を実行するのがわりとめんどくさい。これはコマンドプロンプトとか PowerShell をとかを使ってるからで、bash とか使えばましになるのかもしれないけれど、複数のターミナルを表示させてその都度切り替えて使うってやり方が Windows と合ってないのかもしれない。

Emacs 使ってるんだから make の実行も Emacs からすればいいんだよね。どうすればよかったんだっけ?

あらかじめ Emacs の変数 compile-command に make を実行するコマンドを設定しておく。実行の際は M-x compile とすればよい。

;; make の設定
(setq compile-command "mingw32-make -k")

Windows 上の Emacs からの印刷

職場で Windows 上の Emacs から印刷したいんだけどと質問を受けた。

自分は UTF-8 のソースコードなどを印刷するときは、NetBSD で iconv で EUC-JP に変換してから a2ps-j に送って Postscript に変換、Windows の SumatraPDF (内部で ghostscript を呼び出している)で印刷という手順を踏んでるんだけど、めんどくさいよね。

Windows で動くフリーのテキスト印刷ツール (sprint とか)を試してみたけど、日本語が文字化けとかしてまともに動かない。結局 VisualStudio で印刷したら、ってその場をしのいだけど敗北感必至。

そこで Windows 上の Emacs のバッファを印刷する方法を調べてみた。

GNU 本家のマニュアルと日本語用の追加の設定によれば以下の通り。これで一応 M-x ps-print-buffer が動作する。メニューでいえば Postscript Print Buffer だ。

;; Windows での印刷設定
(setq ps-printer-name t)
(setq ps-multibyte-buffer (quote non-latin-printer))
;; なぜか両面印刷できない
(setq ps-lpr-command "C:/gs/gs9.14/bin/gswin32c.exe")
(setq ps-lpr-switches '("-q" "-dNOPAUSE" "-dBATCH"
                         "-sDEVICE=mswinpr2" -sPAPERSIZE=a4"))

しかしコメント欄に書いてるように、複数ページだとなぜか両面印刷できない。もちろんプリンタのプロパティで両面印刷をしている。同様の指摘はネットにもいくつか転がっていた。

直接印刷せずに、一旦ファイルに保存してから印刷すると両面印刷可能になる。ならば、gs を直接呼ぶんじゃなくてツールを咬ませばいいのではないか、ということでこれ。

;; Windows での印刷設定
(setq ps-printer-name t)
(setq ps-multibyte-buffer (quote non-latin-printer))
;; 直接 gs に送るとなぜか両面印刷できない
;; (setq ps-lpr-command "C:/gs/gs9.14/bin/gswin32c.exe")
;; (setq ps-lpr-switches '("-q" "-dNOPAUSE" "-dBATCH"
;;                         "-sDEVICE=mswinpr2" -sPAPERSIZE=a4"))
(setq ps-lpr-command "C:/Program Files/SumatraPDF/SumatraPDF.exe")
(setq ps-lpr-switches nil)

これで、ps-print-buffer を実行すると SumatraPDF が立ち上がるのでそこで印刷すればよい。SumatraPDF が終了するまで Emacs は操作できないが、まあ許容範囲かな。

あと、英数字と日本語の幅は 1:2 にはならない。日本語フォントの設定は mule.el でやっているようだが、印刷用の文字幅の調整は簡単にはできないようだ。

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

FreeBSD アップデート (9.2 → 10.1)

FreeBSD 9.2 のホストを 10.1 に更新する。基本的には freebsd-update で問題ない。

$ sudo freebsd-update -r 10.1-RELEASE upgrade
Password:
Looking up update.FreeBSD.org mirrors... 5 mirrors found.
Fetching metadata signature for 9.2-RELEASE from update4.freebsd.org... done.
Fetching metadata index... done.
Fetching 2 metadata patches.. done.
Applying metadata patches... done.
Inspecting system... done.

The following components of FreeBSD seem to be installed:
kernel/generic world/base

The following components of FreeBSD do not seem to be installed:
src/src world/doc world/games

Does this look reasonable (y/n)? y

Fetching metadata signature for 10.1-RELEASE from update4.freebsd.org... done.
Fetching metadata index... done.
Fetching 1 metadata patches. done.
Applying metadata patches... done.
Fetching 1 metadata files... done.
Inspecting system... done.
Fetching files from 9.2-RELEASE for merging... done.
Preparing to download files... done.
Fetching 10177 patches.....10....20....30....40....50....60....70....80....90....100....(略)....10010....10020....10030....10040....10050....10060....10070....10080....10090....10100....10110....10120....10130....10140....10150....10160....10170... done.
Applying patches... done.
Fetching 1719 files... done.
Attempting to automatically merge changes in files... done.

The following changes, which occurred between FreeBSD 9.2-RELEASE and
FreeBSD 10.1-RELEASE have been merged into /etc/group:

(略)

The following files will be removed as part of updating to 10.1-RELEASE-p3:
/boot/kernel/amd.ko
/boot/kernel/amd.ko.symbols
/boot/kernel/atadisk.ko
/boot/kernel/atadisk.ko.symbols
/boot/kernel/atapicam.ko
/boot/kernel/atapicam.ko.symbols
/boot/kernel/atapicd.ko
/boot/kernel/atapicd.ko.symbols
/boot/kernel/atapifd.ko
/boot/kernel/atapifd.ko.symbols
(略)

The following files will be updated as part of updating to 10.1-RELEASE-p3:
/.cshrc
/.profile
/COPYRIGHT
/bin/[
/bin/cat
(略)
/var/cache
/var/db/mergemaster.mtree
/var/empty
/var/yp/Makefile.dist
To install the downloaded upgrades, run "/usr/sbin/freebsd-update install".
$ sudo freebsd-update install
Password:
Installing updates...
Kernel updates have been installed.  Please reboot and run
"/usr/sbin/freebsd-update install" again to finish installing updates.
$ 

ここで再起動…したら起動途中で止まってしまった。

Trying to mount root from ufs:/dev/ada0p2 [rw]...
mountroot: waiting for device /dev/ada0p2 ...
Mounting from ufs:/dev/ada0p2 failed with error 19.

Loader variables:
  vfs.root.mountfrom=ufs:/dev/ada0p2
  vfs.root.mountfrom.options=rw

Manual root filesystem specification
  : [options]
      Mount  using filesystem 
      and with the specified (optional) option list.

    eg. ufs:/dev/da0s1a
        zfs:tank
        cd9660:/dev/acd0 ro
          (which is equivalent to: mount -t cd9660 -o ro /dev/acd0 /)

?                 List valid disk boot devices
.                 Yield 1 second (for background tasks)
      Abort manual input

mountroot>

“?” を叩いて有効なデバイスの一覧を見ると、ada0p2 の代わりに da0p2 があったのでそれを入力したら起動した。

/dev/fstab を ada0p2 → da0p2, ada0p3 → da0p3 と書き換えて正常に起動することを確認。

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 を環境変数に指定しておくといいみたい。