NetBSD 6.1.3

NetBSD 5.1.2 から 6.1.3 へのアップデート。

$ cd /home/NetBSD/src
$ cvs update -PdAC -r netbsd-6-1-3-RELEASE
$ rm -rf ../obj ../tools
$ ./build.sh -O ../obj -T ../tools -j 8 tools
$ ./build.sh -O ../obj -T ../tools -j 8 kernel=GENERIC
$ ./build.sh -O ../obj -T ../tools -j 8 -U 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

postinstall checks passed: bluetooth ddbonpanic defaults dhcpcd envsys fontconfig gid gpio hosts iscsi makedev motd named pam periodic pf ssh wscons x11 xkb uid varrwho tcpdumpchroot atf
postinstall checks failed: mtree pwd_mkdb rc catpages obsolete ptyfsoldnodes
To fix, run:
sh /usr/sbin/postinstall -s ‘/home/NetBSD/src’ -d / fix mtree pwd_mkdb rc catpages obsolete ptyfsoldnodes
Note that this may overwrite local changes.
*** All done
$ sudo /usr/sbin/postinstall -s ‘/home/NetBSD/src’ -d / fix mtree pwd_mkdb rc catpages obsolete ptyfsoldnodes
$

postinstall fixes passed: mtree pwd_mkdb rc catpages obsolete ptyfsoldnodes
postinstall fixes failed:
$ sudo shutdown -r now

CPU: Intel Core i3 530 (2.933GHz)、Memory: 2GB での実行時間。

$ time ./build.sh -O ../obj -T ../tools -j 8 tools
real 6m37.895s
user 10m33.438s
sys 1m22.799s
$ time ./build.sh -O ../obj -T ../tools -j 8 kernel=GENERIC
real 3m14.105s
user 9m10.315s
sys 0m53.143s
$ time ./build.sh -O ../obj -T ../tools -j 8 -U distribution
real 42m3.439s
user 104m30.964s
sys 15m15.407s

参考

ASTEC-X の日本語入力

ASTEC-X 8.0 で Windows の IME 使って日本語入力するための設定。IME は Google 日本語入力を使用。ASTEC-X のコントロールパネルの「日本語入力」で XIM プロトコルは有効にしておく。

Emacs24 なら環境変数 LANG と XMODIFIERS を設定する。XMODIFIERS に何を設定するのだったかをよく忘れる。正解は @im=ASTEC_IMS 。LANG は ja_JP.eucJP とかでも可。

export LANG=ja_JP.UTF-8
export XMODIFIERS=@im=ASTEC_IMS
emacs

gedit なら、上記に加えて GTK_IM_MODULE の設定が必要。

export LANG=ja_JP.UTF-8
export XMODIFIERS=@im=ASTEC_IMS
export GTK_IM_MODULE=xim
gedit

a2ps-j

a2ps-j が古くて、pkgsrc からインストールしたのは perl-5.16.2 では動かない模様。

パッチがあった。ただし若干修正が必要。
http://ftp.cc.uoc.gr/mirrors/macports/release/ports/print/a2ps-j/files/patch-a2ps-j.diff

上記の URL からパッチをダウンロードし、/etc/mk.conf の LOCALPATCHES で指定したディレクトリに置く。

LOCALPATCHES=/anywhere/localpatches なら、
/anywhere/localpatches/print/a2ps-j/patch-a2ps-j.diff
となる。

パッチがあたっているファイル名が異なるので、修正する。

元のパッチで

--- a2ps-j.orig	2012-02-23 15:04:21.000000000 +0900
+++ a2ps-j	2012-10-02 01:58:37.000000000 +0900
@@ -1,4 +1,4 @@
-#!/usr/local/bin/perl
+#!/usr/bin/env perl
 ;#

となっているのを

--- a2ps.pl-1.45.orig   2012-02-23 15:04:21.000000000 +0900
+++ a2ps.pl-1.45        2012-10-02 01:58:37.000000000 +0900
@@ -1,4 +1,4 @@
-#!/usr/local/bin/perl
+#!/usr/bin/env perl
 ;#

のようにする。

a2ps-j の出力は PostSccript なので、PDF 変換のために ghostscript をインストールする。

pkgsrc/print/ghostscript をインスト-ル。日本語フォントを入れるときに文句を言われるので、予め /etc/mk.conf に下のオプションを指定してコンパイルする。

PKG_OPTIONS.ghostscript+=disable-compile-inits

日本語フォントとして、
pkgsrc/font/ghostscript-cidfonts-ryumin
をインストールする。フォントが複数あって、インストール時のオプションで排他的に指定するようになっている。

IPAフォントを使うのが良さそう。
PKG_OPTIONS.gcr_type+=ipa

ソースコードの印刷

コメントに日本語を含むソースコード(Fortran95)を印刷するのに良い、そして手軽なツールはないかと模索してみた。

コーディングは NetBSD 上で作成してるが、印刷環境は Windows にあるので、どっちでもいいが、とにかく手軽のものを希望。

スプリント
http://www.vector.co.jp/soft/win95/writing/se252056.html

おおむね問題ないが、一点だけ不満。

UTF-8のテキストでバックスラッシュが含まれる場合に全角で印刷されてしまう。半角のバックスラッシュか、半角の円マークで印刷して欲しいところ。

保留。

paps-0.6.8
http://lfsbookja.sourceforge.jp/BLFS/svn.ja/pst/paps.html

日本語も処理できるような記述はあるのだが、何も考えないで NetBSD の pkgsrc からインストールして実行したら日本語は表示されなかった。エラーは特に出ていない。

フォントの問題かもしれないが、ドキュメントが少なくてよくわからない。

却下。

gnome-u2ps
http://www.gnome.gr.jp/~nakai/u2ps/

pkgsrc に含まれていないようなので、見送り。gnome 関連を個別に入れるというのは敷居が高すぎる。gnome がアップデートしたときにどうなるのかよくわからないので。

却下。

u2ps (perlで記述されている)
http://u2ps.berlios.de/

こちらも pkgsrc には含まれていないが、perl ならなんとかなるかな。

と思ったらだめだった。パスとか埋め込みだったりでいろいろと手を入れないと動かなそう。

完成度がイマイチなので却下。

a2ps-j + iconv

昔なつかし a2ps-j。UTF-8 を処理できないので iconv による前処理で EUC-JP に変換する必要がある。

安定度は問題なし。バックスラッシュもちゃんとバックスラッシュとして印刷される。

iconv を通すところがちょっと面倒だけど、これが一番実用的かな?

OpenLDAPでユーザ管理 (12)

amd (am-utils) のマップを LDAP で管理する。これができないと NIS から移行できない。以前は確か NetBSD 付属の am-utils は LDAP に対応していなかったように記憶しているが、NetBSD 5.0 のアナウンス によれば、5.0 から対応していたようだ。

NetBSD のソースツリーにある、src/external/bsd/am-utils/dist/ldap.schema を /usr/pkg/etc/openldap/schema/am-utils.schema にコピーする。

LDAP サーバの /usr/pkg/etc/openldap/slapd.conf に include /usr/pkg/etc/openldap/schema/am-utils.schema を追加して再起動する。

LDAP Admin に am-utils.schema を読ませる方法がわからなかったので、下の LDIF を手書きして ldapadd で登録した。その状態で LDAP Admin で接続すると以後は LDAP Admin で am-utils.schema 内で定義された ObjectClass を扱えるようになった。

dn: cn=amdmap amd.home timestamp,ou=Amd Map,dc=example,dc=co,dc=jp
objectClass: amdmapTimestamp
cn: amdmap timestamp
amdmapTimestamp: 1365580086
amdmapName: amd.home

dn: cn=amdmap amd.home[/defaults],ou=Amd Map,dc=example,dc=co,dc=jp
objectClass: amdmap
cn: amdmap amd.home[/defaults]
amdmapName: amd.home
amdmapKey: /defaults
amdmapValue: type:=nfs;sublink:=${key};opts:=rw,intr,nodev,nosuid,resvport,tcp

“ou=Amd Map,dc=example,dc=co,dc=jp” は事前に作成しておいた organizationUnit。単に整理のために作成しただけで必須ではない。名前も任意。

am-utils では、タイムスタンプ (amdmapTimestamp) とマップ (amdmap) の2種類の Object Class を使用する。

cn の形式は src/external/bsd/am-utils/dist/scripts/amd2ldif.in に合わせた。am-utils で要求されているのかどうかはよくわからない。

amdTimestamp では “cn=amdmap $mapname timestamp” で、amdmap では “cn=amdmap $mapname[$key]” となる。ここで $mapname は、am-utils で指定するマップ名 (map_name) が、$key にはキー名が入る。この例では、amd.home というマップのタイムスタンプと、/defaults の設定をしたことになっている。

タイムスタンプの値は、perl -e ‘print time,”\n”‘ として得られる Epoch を入れた。

ここで LDAP Admin が使用できるようになるので、LDAP Admin を使って個々のエントリを作成する。

LDIF で記述すると以下の通り。

dn: cn=amdmap amd.home[alice]
objectClass: top
objectClass: amdmap
amdmapName: amd.home
amdmapKey: alice
amdmapValue:
  -rhost:=gemini;rfs:=/vol/home
  host==${rhost};type:=link;fs:=${fs}
  host!=${rhost}

amdmapValue の値は am-utils でのそれ。LDAP Admin では1行になるのでやや読みにくい。
ユーザ alice のホームディレクトリが、ファイルサーバ gemini の /vol/home/alice として置かれていて、gemini からは /home がエクスポートされている環境を想定している。gemini が同じマップを使用してマウントしようとした場合には、NFS ではなく、シンボリックリンクを作成する。

次、クライアント。

まず、/etc/amd.conf。

[global]
ldap_proto_version = 3
ldap_base = "ou=Amd Map,dc=example,dc=co,dc=jp"
ldap_hostports = aries.example.co.jp:389
restart_mounts = yes

[/home2]
map_type = ldap
map_name = amd.home

見ればだいたいわかると思う。要注意は ldap_proto_version=3 。デフォルトでは 2 なので忘れると接続できない。

あとは、/etc/rc.conf に NFS と amd に必要な設定をして、起動すれば接続できる。

OpenLDAPでユーザ管理 (11)

LDAP サーバに接続できない場合について。

クライアント側の /usr/pkg/etc/ldap.conf に “bind_policy soft” を設定する。

# Reconnect policy:
#  hard_open: reconnect to DSA with exponential backoff if
#             opening connection failed
#  hard_init: reconnect to DSA with exponential backoff if
#             initializing connection failed
#  hard:      alias for hard_open
#  soft:      return immediately on server failure
bind_policy soft

これで、LDAP サーバが起動していないとかの場合には、接続を待たないですぐにエラーが返ってきて、ローカルユーザではログインできるようになる。

pam_ldap の ignore_unknown_user とか ignore_authinfo_unavail オプションはいらないのかな? なくても大丈夫そうだったけど。

OpenLDAPでユーザ管理 (10)

OpenLDAPでユーザ管理 (7) で管理用のエントリを作成したが、それがどのように使われるかを書いていなかった。

slapd の ACL (Access Control List) によるアクセス制御に用いる。

openldap authentication on netbsd を参考に、/usr/pkg/etc/openldap/slapd.conf に以下のような記述を追加する。

access to attrs=userPassword
  by dn="cn=nss,dc=example,dc=co,dc=jp" write
  by anonymous auth
  by self write
  by * none

access to attrs=uidNumber,gidNumber,uid,homeDirectory
  by dn="cn=nss,dc=example,dc=co,dc=jp" write
  by self read
  by * read

access to *
  by dn="cn=nss,dc=example,dc=co,dc=jp" write
  by self write
  by * read

ここには “access to” で始まる3つのブロックがある。行頭が空白の行は継続行だ。

1つ目のブロックは、属性 (attrs) が “userPassword” に一致するデータに関するアクセス制御を表す。

つまり保存されたパスワード文字列 (またはその暗号化またはハッシュ化された文字列)に対するアクセス許可が記述されており、”attrs=userPassword” で制御の対象がマッチする条件を記述した後に、誰がどのようにアクセスできるかを示した記述が “by” で始まる記述として続く。こちらは先頭から順に検査され、先に一致したものが使用される。

1番目の ‘by dn=”cn=nss,dc=example,dc=co,dc=jp” write’ が、以前定義した管理用の DN “cn=nss,dc=example,dc=co,dc=jp” で接続した場合の制御で、ここでは “write”、つまり、管理者はパスワードの書き込みが許可される。

2番目の ‘by anonymous auth’ は、匿名 (anonymous) で接続した場合。この場合は “auth”、つまり匿名で接続した場合は認証に限って許可される。パスワード文字列を読み出すことはできない。

3番目の ‘by self write’ は、自分が接続した場合。参照している DN と接続に用いる DN が一致している場合だ。この場合は “write”、つまり、自分のパスワードだけは書き込みが許可される。

4番目、最後の ‘by * none’ は、その他の場合。管理者でもなく、自分でもなく、認証の際に使用される匿名でもない、という場合。ようするに、他人が接続した場合だ。この場合は “none”、全てが許可されない。パスワード文字列の読み出しは不要だし、認証の必要もない(通常の認証は匿名で行われる)

2つ目のブロックは、属性が “uidNumber”, “gidNumber”, “uid”, “homeDirectory” の場合。これらは誰でも読める必要がある。また、本人が書き換えてはいけない項目でもある。

3つ目のブロックは、その他の場合。誰でも読める公開情報で、本人が更新できるようにする。

OpenLDAPでユーザ管理 (9)

LDAP に登録されているユーザのパスワードを変更しようとすると、エラーになってしまう。

$ passwd
Changing password for alice.
Enter login(LDAP) password: 
Unable to change auth token: authentication error
$ 

openldap authentication on netbsd によれば、

/etc/pam.d/system
(略)
# password
password sufficient pam_ldap.so
password sufficient pam_krb5.so try_first_pass
password sufficient pam_unix.so try_first_pass
password required pam_deny.so prelim_ignore

The last bit here with pam_deny, is a bit special, it is what enables you to change passwords for both local users and those in the ldap database with the passwd command. pam_deny with the prelim_ignore flag is needed, else pam will will fail in the preliminary phase (it is always run trough twice) and you will not be able to change passwords.

ということで、/etc/pam.d/system の password の pam_unix.so を sufficient に変更し、最後に pam_deny.so を required で追加、オプションを prelim_ignore にするらしい。

prelim_ignore?

続きを読むと、pam_deny.c にパッチをあてて pam_deny.so を作り直せと書いてある。ドキュメントは少し古いのだが、今でもその対応しかないのだろうか。

Google で検索したが最近の事情はわからずじまい。

OpenLDAPでユーザ管理 (8)

slapd のログにエラー?が出ている。

slapd[29164]: conn=1013 op=1 SRCH base="dc=example,dc=co,dc=jp" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uidNumber=6400))" 
slapd[29164]: conn=1013 op=1 SRCH attr=uid userPassword uidNumber gidNumber cn homeDirectory loginShell gecos description objectClass shadowLastChange shadowMax shadowExpire
slapd[29164]: <= bdb_equality_candidates: (uidNumber) not indexed 

検索した属性にインデックスがないとで出るらしい。なくても検索はできるが遅くなる。インデックスを作りすぎるとHDD容量を圧迫する、ってとこかな?

よく出てくるものに対しては設定するのがよさそう。

/usr/pkg/etc/openldap/slapd.conf の index の設定を変更

 # Indices to maintain
-index   objectClass     eq
+index   objectClass,uid,uidNumber,gidNumber     eq

変更したら、slapindex でインデックスを作り直す必要があるらしい。

$ sudo /etc/rc.d/slapd stop
$ sudo slapindex
$ sudo /etc/rc.d/slapd start

OpenLDAPでユーザ管理 (7)

LDAP に登録した認証情報を使ってログインはできるようになったが、このままではセキュリティ上の問題がある。

LDAP でユーザ情報を管理用するための DN を作成して、その他はアクセス権を制限する。

管理用 DN の作成。openldap authentication on netbsd を参考に、次の DN を作成する。

dn: cn=nss,dc=example,dc=co,dc=jp
objectClass: top
objectClass: inetOrgPerson
cn: nss
sn: manager

システムにログインするユーザではないので、objectClass に posixAccount は含まれていない。エントリが置かれる場所も ou=People,dc=exacple,dc=co,dc=jp の下ではなく、dc=example,dc=co,dc=jp の直下だ。

今回は LDAP Admin で追加する。

まずは、ツリーのトップエントリ dc=example,dc=co,dc=jp を選択した状態で、メニューバーの [Edit] – [New] – [Entry…] を選ぶ。

左下ペインの Objectclass に top と inetOrgPerson を追加。inetOrgPerson を追加すると右下のペインに Attribute が現れるので、cn に nss、sn に manager を入力する。入力すると、中段の Rdn で cn=nss と sn=manager が選べるようになるので cn=nss を選ぶ。これが今作成しているエントリの DN の一部になる。

ここまで入力したら、New Entry ウィンドウのメニューバーの [File] – [Save and close] を選択してエントリを登録する。

下のようにトップの直下に cn=nss が作成される。

パスワードも設定しておく。