ついに、晴れて憧れのOpenBSDユーザになれた。 2005年以来の3度目の挑戦で成功。
前々からOpenBSDに至高感は感じていた。 去年WIDE合宿にゲストスピーカー(BSD BoF)参加したときに、 次の話者の加藤朗先生がOpenBSD w/ ThinkPad X1 Carbon でプレゼンされているのを見てから、やはりカッコいいなあとの思いが倍増した。 そして、今年導入した2019年版ThinkPad Xシリーズで軒並み NetBSD が使えないのを機に、 15年ぶりにOpenBSDチャレンジしたら、いとも簡単に実用域まで設定できた。 変化に驚きつつ、OpenBSDユーザに収まることとした。 いまのところまだエンドユーザモードだが。
ほとんどいないと思うが「NetBSDユーザの前提知識」を 持った上でのOpenBSDの利点を挙げてみる。
これに尽きる。NetBSDは新しいラップトップPCでまず動かない。 これまでずっと中古ThinkPad(とくに X220 世代サイコー)で十分だと思っていたが、ThinkPad X280 からの Type-C/Thunderbolt の快適さに心を奪われてしまった。 X280はNetBSD動いたが、それのAMD版であるA285はダメ。FreeBSDもダメ。 で、今年になってX390を用意したのだが、FもNもダメ。しばらくLを 使っていたのだが、やっぱり世界観が違って使いたくない。 てときに、OpenBSD 6.6を試したら、あっさり起動できXもアクセラレーション込 で使えた。X280、A285、X395も全部行けた。なんてすばらしい。まとめると、
のように、きょーびのハードウェア構成でしっかりインストールでき、 HDMIが主流になってきたプレゼン用ワイド対応液晶プロジェクタへの 出力もスムーズに行ける。
上記項目に関連するが、ACPI対応もばっちり。かつ、 up/down時の挙動を /etc/apm/ 内のスクリプトで制御できるので ネットワーク繋ぎ直しなどが簡単。Nなユーザとしてはサスペンド/レジューム なんてこの世にないものと考えてきたので、飛躍的に楽になった。 さらにハイバネーションもできる。インストーラのデフォルト設定で、 swapパーティションをメモリサイズ以上に取ってくれるので、 それに任せておけば。ZZZ(大文字)でハイバネートできる。感動。 あ、でもX1 Carbon(2018以降)ではACPI周り、NGだった。
上記 /etc/apm/ のほか、USBデバイスにホットプラグIN/OUT が発生したときは /etc/hotplug/ ディレクトリに指定された名前の スクリプトを置いておけば自動的に呼んでくれる。このため、 haldなんかが要らない。USBメモリなどの自動マウント/アンマウント を仕込んでおけばそれで十分。この文書の最後の方にサンプルを載せた。
え、wpa_supplicant だって? これ、悪夢だよね? パスワードなしのフリースポットにつなぐのでさえ、いちいち /etc/wpa_supplicant.conf に key_mgmt="NONE" を足して再起動? おかしいって。OpenBSDの ifconfig なら
ifconfig NIC nwid SSID wpakey PASSPHRASE
だけでOK。パスフレーズなしなら nwid だけ指定すればよい。 出先のフリーWi-Fiごときなら ifconfig 叩くだけ。よく使う SSIDについては /etc/hostname.NIC ファイルに
up join SSID1 wpakey KEY1 join SSID2 wpakey KEY2 join FREEPOST1 dhcp
みたいに列挙しておくだけ。急ぎで SSID1 に繋ぎたかったら
ifconfig NIC nwid SSID1
するだけ。そして、wpa_supplicant より電波のツカミが早い(気がする)。
とくにサーバホスト等を環境変数に設定しなくても pkg_add でアプリケーションを足せる。慣れたら近場のホストとか設定できるんだが、 それまでは Linux の apt みたいな感覚で取り敢えず入って欲しいものである。 あと、指定があいまいなときに候補から選ばせてくれるのも地味だが助かる。 そして、chromium なんかもビシっと綺麗な画面で動く。pkgの品質高そう。 でもCannaのバイナリは起動できなかった。
FreeBSD/portsやNetBSD/pkgsrcに比べてアプリケーション数は少ないが、 KritaとかInkscapeとかsupertuxkartとかLibreOfficeとか派手めなものも ちゃんと入っている。JDKも8と11があるのでJavaアプリも困らない。 個人的にどうしても足りなくて独自ビルドしたのが いまのところ以下の2つ。
kinput2-cannaもportsで動かなくて、自力で作り直したが SEGV で動かないのでSCIM+anthyで妥協した。
PFがNetBSDから消されてしまうのなら、OpenBSDを使えばいいじゃないの! 家庭ネットワークでマルチホームなどをするなら PF の reply-to ルール が必須なのだが、いまのところNPFにこれはない。自宅ルータの設定、 どうしようと考えていたのだがOSを換えてしまえばよいじゃないの!
rc.confでなんでもやっちゃう不変の方式。ブラックボックス的要素、 いっさいなし。これはありがたい。
逆にOpenBSDで残念なところ。 でもそれを補って余りあるのでヨシ。
Linux-emuはNetBSDで使いまくりだが、そもそもLibreOfficeを使うためにしか 活躍させてない。OpenBSDではportsにLibreOfficeがあるので実質なくても困らない。 LibreOfficeにja(日本語パッケージ)がないのだが、日本語は入るので気に しない。
unionfs や nullfs がない。これは、chroot環境を作るために 常用しているのだが、OpenBSDでは随分前に削除されたようだ。 chroot環境構築が超絶面倒臭い。
まあ、しゃーない。CGI動かすのがややこしい。 うーん、Apache入れちゃおうかな...
まだ調べ切っていないが3TB以上のHDDはブートディスクにできないっぽい? またvmmではまだマルチコア対応できてない? 巨大ディスク対応+zfs 的なものがないとゲストOSへのストレージ供給が厳しいね。 このへんの領域はしばらくFreeBSDでやることにしたのでまあ OpenBSD は当面ラップトップPCでのエンドユーザ利用で満足することにしよう。
初期インストール直後にやらねばならぬことがいくつかあるのでまとめた。
sudo要らない。doas.conf(5) を参照して自分ユーザを足しておく。
無線チップなど、いくつかのデバイスがそのままでは使えないのでこれ。
doas fw_update doas shutdown -r now
これでdrmやWi-Fiデバイスが使えるようになる……はず。ちなみに ThinkPad X390 では内蔵無線LANは使えなかった。しかたなく urtwn (ちっちゃいUSB無線LANプラグ)を使った。
ラップトップPCなら、apmdのフラグを -A に変えておく。 /etc/rc.conf.local に
apmd_flags="-A"
を足す。そのへん、rcctl(8) コマンドで設定可能。
上記なら rcctl set apmd flags -A
で。
プロセスのリソースリミットが低すぎる。 Javaなんかはこのままじゃ動かないだろう。 datasize-max=infinity でよかろう。
コンソールで使う場合に以下は必須である。
これは、/etc/X11/xorg.conf あたりに書いた方がいいのかもしれないが、 せっかく zero-configuration でXが映っているのでなんとなく .xinitrc に書いてみた。以下を ~/.xinitrc に追加する。
setxkbmap -option ctrl:nocaps xinput set-prop "/dev/wsmouse" "WS Pointer Wheel Emulation" 1 xinput set-prop "/dev/wsmouse" "WS Pointer Wheel Emulation Axes" 6 7 4 5 xinput set-prop "/dev/wsmouse" "WS Pointer Wheel Emulation Button" 2 xinput set-prop "/dev/wsmouse" "WS Pointer Wheel Emulation Timeout" 50 xinput set-prop "/dev/wsmouse" "WS Pointer Wheel Emulation Inertia" 3
これで十分。
Xを上げてないときのコンソールは、NetBSDと同じでいいのかな。 あ微妙に違う。/etc/wsconsctl.conf に以下を記述。
keyboard.encoding=us.swapctrlcaps
同じことは /etc/kbdtype に
us.swapctrlcaps
とだけ書いても得られる。
サスペンド/復帰のときに、/etc/apm/ 内にある指定した名称の プログラム(スクリプト)が呼ばれる。詳しくはapmd(8)参照。
resume
#!/bin/sh wifi=${WIFI:-urtwn0} upscript=/etc/apm/wifi-reconn.sh (trial=3 while [ $trial -gt 0 ]; do if $upscript; then break else sleep 3 trial=$((trial-1)) fi done )
↑で呼び出している wifi-reconn.sh:
#!/bin/sh retry=10 mydir=`dirname $0` static=$mydir/ssid if [ -e $static ]; then ssids=`cat $static` else ssids=`egrep -ql '^ *(join|nwid)' /etc/hostname.*|sed 's/.*\.//'` fi for wlif in $ssids do echo i=$wlif sh /etc/netstart $wlif ifconfig $wlif | grep -q 'status: active' && exit 0 for ssid in `egrep '^ *(join|nwid)' /etc/hostname.$wlif|awk '{print $2}'` do echo Trying.........................$ssid i=$retry ifconfig $wlif nwid $ssid while [ $i -gt 0 ]; do ifconfig $wlif | grep -q 'status: active' &&; exit 0 i=$((i-1)) sleep 1 done done done exit 1
ストレージクラスのUSBデバイスを挿したとき/抜いたときに マウント/アンマウントするスクリプトを作った。これはそれぞれ attach, detach という名前のスクリプトにする。実例は hotplugd(8) に書いてある。
attach
#!/bin/ksh # # $Header$ DEVCLASS=$1 DEVNAME=$2 # (echo `date`: args="$*" disk=$DEVNAME) >> /tmp/attach.args 2>&1 [[ $DEVCLASS != 2 ]] && exit 0 case $DEVNAME in sd[123]) echo Mounting $DEVNAME >> /tmp/attach.args disklabel $DEVNAME | grep i:.*MSDOS > /dev/null [[ $? -eq 0 ]] && mount /dev/"$DEVNAME"i ;; cd[01234]) disklabel $DEVNAME | grep -i 'ISO9660' > /dev/null 2>&1 [[ $? -eq 0 ]] && mount /dev/${DEVNAME}a esac
detach
#!/bin/ksh # # $Header$ DEVCLASS=$1 DEVNAME=$2 [[ $DEVCLASS != 2 ]] && exit 0 case $DEVNAME in [cs]d[0-9]) umount /dev/${DEVNAME}i exit 0 ;; esac
msdosfsもISO9660もぶすっと挿して、すぱっと抜いておっけー。
apm(8)コマンドでバッテリー情報出てくるが、 「あと何分でフル充電?」とか欲しいのでこんなシェルスクリプトを作ってみた。
#!/bin/sh getval() { case $1 in lastfull) fld=acpibat0.watthour0 ;; remain) fld=acpibat0.watthour3 ;; rate) fld=acpibat0.power0 ;; power) fld=acpiac0.indicator0 ;; esac sysctl -n hw.sensors.$fld | cut -d' ' -f1 } for v in remain lastfull rate power; do eval $v=`getval $v` done percent=`echo "100*$remain/$lastfull"|bc -l|cut -d. -f1` case $rate in 0.0*) rate=0 ;; esac case $power in Off) printf "AC Offline: Battery remaining %5.1f%%\n" $percent if [ x"$rate" = x"0" ]; then echo Unknown lifetime else life=`echo "$remain/$rate"|bc -l` hour=${life%.*} dmin=${life#*.} min=`echo "0.$dmin * 60" | bc -l | cut -d. -f1` printf "Discharging at %.2f(%.2f/%.2f) - ${hour:-0}h%02dm to go\n" $rate $remain $lastfull $min fi ;; On) printf "AC ONline: Battery remaining %5.1f%%\n" $percent if [ x"$rate" = x"0" ]; then echo "Last full capacity: ${lastfull}Wh" else tf=`echo "$lastfull - $remain"|bc -l` tofull=`echo "$tf/$rate"|bc -l` hour=${tofull%.*} dmin=${tofull#*.} min=`echo "0.$dmin * 60" | bc -l | cut -d. -f1` printf "Rate $rate to $tf ($remain/$lastfull) - " printf "${hour:-0}h%02dm to full\n" $min fi ;; esac
出力はこんな感じ。
# オフライン時
battery
AC Offline: Battery remaining 99.0%
Discharging at 7.73(45.45/45.87) - 5h52m to go
# オンライン時
AC ONline: Battery remaining 92.0%
Rate 13.89 to 3.49 (42.38/45.87) - 0h15m to full
FreeBSD 2.2.8Rとかあたりの時代に戻った気分。やっぱこうでなくっちゃ!