OpenBSDの勧め

ふと気になってLenovoで年末年始セールをやってないか、見に行ったのだ。

なんでLenovoかと言うとIBM時代からの付き合いがあるから。国産のF,N,Pとかのやつだと 英語キーボードがチョイス出来なかったので、IBMのやつにしたんだった。 キーボードがごてごてしてるの嫌い。本当は無印良品なHHKがいいのだろうけど、ノーパソって 限定になると、そういう選択も憚られる。日よって、英語キーボードって訳。

昔は国産の某を使ってたけど、わんさかと試供品が付いてきて呆れたものだ。その点IBMは 良心的だったな。以来ずっとこのメーカーですよ。

福袋の期間は、2019/12/27 - 2020/01/05 だけど、続いてニューイヤーセールってのを 1月16日までやってる。なんやかんや、何時も安売りの某洋服メーカーみたい。

なんて思ってたら、Windows7のEOLに伴う、買い替え客を視野に入れてるようだ。 7が終わるまでのカウントダウンが表示されたぞ。ご丁寧なこったい。

所で賞味期限切れになった7は、どういう余生を送らせるんですかね。オイラーの友人は、去年7を棄てて、ぐぐるOSに変更したいって言ってたけど、そろそろですよ。

某雑誌はリナに乗り換え記事が満載だな。Winのあのアプリはリナではこうなってますとか 宣伝に余念が無い。

オイラーなら、壊しても良いパソコンが手に入ったと喜んで、色々なOSを試してみるんだけどな。お勧めは、OpenBSDです。

やや、 Smarter Lenovo Think Devices Inspiring Today’s Workforceこんなのが発表された。無線接続のキーボードですって。独立してるならHHKとコラボしてよね。

enjoy old gosh

前回の最後で、genstubを試供品にして #?= を実行した。どうやらloadなんて手続きが有るじゃん。それを知らなかったオイラーは、repl画面にスクリプトを貼りつけて読み込んでいたぞ。 ちょいと恥ずかしい。ソースを見てないのがバレバレ。

真面目にload.cを見る。

/* C-continuation of the loading */
static void load_cc(ScmObj result, void **data)
{
    ScmObj port = SCM_OBJ(data[0]);
    ScmObj expr = Scm_Read(port);
    if (!SCM_EOFP(expr)) {
        Scm_VMPushCC(load_cc, (void **)&port, 1);
        Scm_Eval(expr, SCM_UNBOUND);
    } else {
        Scm_ClosePort(SCM_PORT(port));
        SCM_RETURN(result);
    }
}

readがEOFを返さない間は、グルグル回りながら評価してくのね。EOFになったら、portを閉じてから、EOFになる直前の結果を返すって事かな。巧妙なやり方だな。

で、CCってのが出てる。VMに何か仕掛けが有るのだろう。vm-dumpなんてのが有ったので、走らせてみる。

debian:tmp$ ./gosh
gosh> (vm-dump)
VM 0x3efc0
 argp: ()
   pc: (#<source-info (vm-dump)>)
 envs:
   0x548a0 "[toplevel]"
       [ #<module "user"> ]
conts:
dynenv: ()
#<undef>

conts:ってのが、そうかな? load手続きで使われてるって事は、この手続きを呼べば動き出すのだろうね。

debian:tmp$ cat z.scm
(define a 1)
(vm-dump)

他愛のないコード

debian:tmp$ ./gosh
gosh> (load "z.scm")
VM 0x3efc0
 argp: ()
   pc: (#<source-info (vm-dump)>)
 envs:
conts:
   0x545a0  argp = ()
              env = 0x54858
             next = (#<c-continuation 0x3ded8> #<source-info (load "z. ...
dynenv: ()
#<undef>

やっぱり使われているね。いかんいかん、つまみ食いは! 正統にやるなら、ヘッダーファイルを見るのが鉄則。gauche.hが全般的なやつ。VMなマシンなら、vm.hね。180行目ぐらいから、命令表と言うか、説明が載ってた。

at OpenBSD

32Bit機で試していたんだけど、64BitなWindows10からのログインだった。電気の無駄なんで、 Windows10の中のOpenBSDで試してみる。

ob$ ./gosh
gosh> (vm-dump)
VM 0x78c75747f80
 argp: ()
   pc: Segmentation fault (core dumped)

セグフォなんで、検視ですかね。

ob$ gdb -q gosh gosh.core
Reading symbols from gosh...done.
[New process 388774]
Core was generated by `gosh'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00000789cf7f2194 in write_internal (obj=0x78c75750240,
    out=0x78c75746ec0, mode=0, acclen=0, limit=-1) at write.c:85
85              SCM_PUTC('(', out); nc++;

足取り確認。

(gdb) bt
#0  0x00000789cf7f2194 in write_internal (obj=0x78c75750240,
    out=0x78c75746ec0, mode=0, acclen=0, limit=-1) at write.c:85
#1  0x00000789cf7f5dbc in Scm_Vprintf (out=0x78c75746ec0,
    fmt=0x789cf7cf00b "#<source-info %S>", ap=0x7f7fffff6d70) at write.c:363
#2  0x00000789cf7f6a26 in Scm_Printf (out=0x78c75746ec0,
    fmt=0x789cf7cf00b "#<source-info %S>") at write.c:420
#3  0x00000789cf7e1fde in source_info_print (obj=0x78c757518e0,
    port=0x78c75746ec0, mode=0) at compile.c:54
#4  0x00000789cf7f28fe in write_internal (obj=0x78c757518e0,
    out=0x78c75746ec0, mode=0, acclen=1, limit=65) at write.c:97
#5  0x00000789cf7f2268 in write_internal (obj=0x78c75750180,
    out=0x78c75746ec0, mode=0, acclen=0, limit=65) at write.c:86
#6  0x00000789cf7f2978 in Scm_WriteLimited (obj=0x78c75750180,
    port=0x78c75746f40, mode=0, width=65) at write.c:124
#7  0x00000789cf7f5df6 in Scm_Vprintf (out=0x78c75746f40,
    fmt=0x789cf7cf237 "   pc: %65.1S\n", ap=0x7f7fffff79a0) at write.c:365
#8  0x00000789cf7f6a26 in Scm_Printf (out=0x78c75746f40,
    fmt=0x789cf7cf237 "   pc: %65.1S\n") at write.c:420
#9  0x00000789cf7e1670 in Scm_VMDump (vm=0x78c75747f80) at vm.c:890
#10 0x00000789cf80d071 in stdlib_vm_dump (SCM_FP=0x78c757500d8, SCM_ARGCNT=1,
    data_=0x0) at stdlib.c:3091
#11 0x00000789cf7de61d in run_loop (program=0x78c757501e0) at vm.c:334
#12 0x00000789cf7dd904 in Scm_Run (program=0x78c757501e0) at vm.c:167
#13 0x00000789cf7dc5cb in toplevel () at main.c:28
#14 0x00000789cf7dcea4 in main (argc=1, argv=0x7f7fffff7f48) at main.c:66

64Bit版のOpenBSDだけあって、出て来るポインターの幅が大きいなあ。まあいいや。 追ってみるか。

インタラクティブなアプリをemacs上のgdbからお追うとすると、ちょっとかっかい。リナだと、gdbserver上でアプリを動かして、それをgdb側からコントーロールするのが定番だ。だが、残念ながらOpenBSDにはgdbserverが無いんよ。

こういう場合の定番は、動かしておいたアプリにgdbをアタッチするのが普通。やってみるか。

ob$ ps a | grep gosh
79458 p1  S+p      0:00.01 grep gosh
55309 p2  S+       0:05.25 ./gosh
ob$ gdb -q gosh -p 55309
Reading symbols from gosh...done.
Attaching to program: /tmp/small/src/gosh, process 55309
ptrace: Operation not permitted.

うーん、ptraceが拒否された。厳しいTeo親分のガード発動って所だな。なんたって、セキュリティ原理主義(誉め言葉)だからなあ。どうやってかいくぐる。リナでこういう場面に出くわすと、ぐぐるのが定番だけど、、、マニュアルが充実してるOpenBSDなら、

ob$ man ptrace
       :
     ptrace() is only available on kernels compiled with the PTRACE option.

こういうオプションには突破口が用意されてるのが普通。そしてそれをコントロールしてるのは、sysctlだ。きっとそういう項目が有るに違いない。

ob$ sysctl -a | grep ptrace
kern.global_ptrace=0
ob$ doas sysctl kern.global_ptrace=1
doas (sakae@ob.localdomain) password:
kern.global_ptrace: 0 -> 1

やっぱり制御フラグが有った。有効にしてあげる。ptrace出来るかな?

ob$ gdb -q gosh -p 55309
Reading symbols from gosh...done.
Attaching to program: /tmp/small/src/gosh, process 55309
Reading symbols from /usr/lib/libm.so.10.1...done.
Reading symbols from /usr/lib/libc.so.95.1...done.
Reading symbols from /usr/libexec/ld.so...done.
[Switching to thread 229216]
_thread_sys_read () at -:3
3       -: No such file or directory.
(gdb) bt
#0  _thread_sys_read () at -:3
#1  0x00000e0818cf1d8e in _libc_read_cancel (fd=0, buf=0xe0825722000,
    nbytes=65536) at /usr/src/lib/libc/sys/w_read.c:27
#2  0x00000e0818c71ca2 in __sread (cookie=0xe0818cf72f0 <__sF>,
    buf=0xe0825722000 "", n=<optimized out>)
    at /usr/src/lib/libc/stdio/stdio.c:48
#3  0x00000e0818cdfb08 in __srefill (fp=0xe0818cf72f0 <__sF>)
    at /usr/src/lib/libc/stdio/refill.c:116
#4  0x00000e0818c63f2a in _libc___srget (fp=0xe0818cf72f0 <__sF>)
    at /usr/src/lib/libc/stdio/rget.c:46
#5  0x00000e0613bffded in skipws (port=0xe0826b5afc0) at read.c:78
#6  0x00000e0613bfeb05 in read_internal (port=0xe0826b5afc0) at read.c:101
#7  0x00000e0613bfeabf in Scm_Read (port=0xe0826b5afc0) at read.c:42
#8  0x00000e0613be455e in toplevel () at main.c:23
#9  0x00000e0613be4ea4 in main (NAME
     ex, vi, view - text editors
argc=1, argv=0x7f7ffffd3d28) at main.c:66

OpenBSDで気に入っているのは、ライブラリィーにも潜って行ける事。これ、とっても為になる場合が有るぞ。リナなんかだと、glibcのdebugバージョンとかを入れなくちゃ実現出来ず、とっても面倒至極ですよ。

ずっとgdbでアタッチして使う積りなら、kern.global_ptrace=1 を、/etc/sysctl.confに書いておくだけでよい。(このファイルは初期状態では存在しない)boot時から有効になる。

install OpenBSD for i386

年末の掃除の時、Windows10のvboxに入れていた少々古めのOpenBSD(32Bit版)を消してしまった。年も改まったので、新しいのを入れてあげるか。

今度は性能がvboxより良いVMWareに入れる事にした。qemeも入れて、カーネルでも触ってみようかと言う魂胆。

約10分でインストール完了。すかさず、rootユーザーで、最初の儀式をやっておく。

doas syspatch
cp /etc/examples/doas.conf /etc
vi /etc/group
operator:*:5:root,sakae                     ;; add sakae for shutdown -p now
vi /etc/fstab
swap /tmp mfs rw,nodev,nosuid,-s=1024m 0 0  ;; for ramdisk
vi /etc/installurl
http://ftp.jaist.ac.jp/pub/OpenBSD          ;; define pkg download site
vi /etc/ssh/sshd_config
X11Forwarding yes                           ;; enable X11Forwarding
shutdown -r now

syspatchでカーネルとか大事なライブラリィーをアップデート。sudoの代わりのdoasの設定を設置。groupを編集してオペレーターの仲間になる。仲間になってると、マシンを停止出来る。 fstabを編集して/tmp領域をRAMDISKに設定。installurlを編集して、近場からパッケージを落とすように設定。おまけで、X11のフォワーディングを許可。そしてreboot。

ごちゃごちゃ書いたけど必須なのはsyspatchだけだ。後はオイラーの趣味。いずれにしろ、ほとんど一行の変更で済んでしまう。分からない事はmanに聞けば、簡潔に答えてくれるしね。

o32$ df -k
Filesystem  1K-blocks      Used     Avail Capacity  Mounted on
/dev/wd0a    12378750   1048106  10711708     9%    /

X11込み、開発環境込みで、DISKの使用量は、こんなもんだ。

doas pkg_add emacs git curl gdb gmake

後は、使いそうなパッケージを、どんどんと放り込んで行く。

リナとかだと、viと言ってもvimなんだけど、あいつは嫌いだ。ぐだぐだとemacsと張り合わなくて宜しい。viは、由緒あるやつが一番さ。(石投げないでね。個人の好みですから)

NAME
     ex, vi, view - text editors

HISTORY
     The ex editor first appeared in 1BSD.  The nex/nvi replacements for the
     ex/vi editor first appeared in 4.4BSD.

AUTHORS
     Bill Joy wrote the original version of ex in 1977.

まて、またeditor戦争を始める積り? まあ、こういう論争なら、トランプ野郎のやりたいやつよりずっと健全ね。

viはいいけどvimは嫌いって事だからね。論点を間違えないでね。どこかのOSはvimをviにしちゃってる。便利ならば全て良しってのが駄目と思ってるのよ。 若し何か有った時、vimがちゃんと動くのだろうか? 非常時に着飾ったvs code みたいな奴しか無いと困るって事よ。

editorと言うアプリなんだから、何を使おうと勝手。でもそれを、根幹を成すtoolと混同しちゃうってのが気になるのよ。/etc/alternativesに有る切り替え器でviがvim.tinyってなってるよ。

bashもそうだな。shellでTCPを操れるのは便利かも知れない。でもshは根幹を成すやつだからね。bashをshと同一視するOSはどうかと思うよ。debianはshの正体がdashになってた。 そうか、bash語が席巻してると思えばいいのか。

systemdも、わけわかめな設定を持ち込んで、やたら難しい事を強いる。どうなんだかねぇ。墓穴を掘ってるとしか思えんぞ。OpenBSDだと、/etc/rcがユーザーランドの起動の全てだ。明瞭なり!

ってな事で、素直なOSをお勧めします。それがOpenBSD。

emacsとgdbがあれを連れてきた

そう、パッケージから上記を入れると、emacsはpython3.7.4を連れてやってきた。まあ、許してやる。今時pythonぐらい入ってないと馬鹿にされるから。(使わないからどうでもよい)

gdbを入れると、既にEOL(賞味期限切れの事)になった、python2.7.16を引き連れてやってくる。これも使わないからどうでもいいけど、次回は3系にしてね。親分からの警告は無かったのでしょうか?

それには、深ーーい訳が有るのよ。gdbは基本の道具なんで標準で提供されてる。6.3と言う古いやつ。カーネルをdebugするなら、昔から実績のあるこれで十分って訳。

でも、このgdbをemacsから使おうとすると、進み過ぎたemacsの機能に付いていけず、まともに動かないのよ。(オイラーみたいなのが困るのよ)それを解消する為に、有志が新しい版のやつをパッケージとして提供してる。 名前がぶつかるので、パッケージ版の方はegdbってなってる。

こういう事情を斟酌して、お目こぼしにあずかっているに違いない。

emacs and qemu

emacsを入れようとしてpkg_add emacsすると、3種類あるけどどれにするって聞いてくる。細かい事にgtk2版、gtk3版、X無し版。それぞれの事情に合わせて選ぶ事になる。

オイラーは昔からX無し派だったんだけど、それだと特殊キーの扱いが無視されるんで、やむなくgtk2版を入れてる。これだとw3mもgtk2なんで好都合and微妙に容量削減になる。

今回qemuを入れたらgtk3が一緒にやってきた。GUIなアプリなんだね。まあGUIがデフォの人達の作品だからしょうがない。そのうちに今度はQtとか言い出すんだろうか。

tmux

昔はscreenを使っていたけど、OpenBSDでは標準提供って事で、こいつを使っている。

o32$ cat .tmux.conf

set -g prefix C-t
unbind C-b
bind C-t send-prefix

set-window-option -g mode-keys emacs
set-option -g history-limit 2500

set -g bell-action none
bind-key  -T prefix Space    next-window

#  PREFIX + :  set status off
#  PREFIX + [  enter copy mode, q to exit copy mode

色々なOSでも使い回ししてるんで、OpenBSDを新たに入れると、よそのOSに初接続した時、必ずこの設定をDLしてますよ。 Ctl-T SPACEで、端末画面の切り替えぐらいしか使ってないけど、一瞬emacsを使ってる気分になって、宜しいですよ。後は2500までさかのぼれる設定かな。

kernel src

qemuでお遊び用のkernelを作る予定なので kernelのソースだけは入れた。 容量は、こんな物

o32$ du -sh sys/
212M    sys/
o32$ find sys -name '*.[ch]' | xargs ls | wc -l
    6955
o32$ find sys -name '*.[ch]' | xargs wc -l
     :
    1457 sys/uvm/uvm_vnode.c
      94 sys/uvm/uvm_vnode.h
     154 sys/uvm/uvmexp.h
 1412106 total

非常にシンプル。どこかのOSとは大違い!!

と、OpenBSD信者が吠えております。

portable OpenBSD

小さいシステムなんでUSBに焼いて、持ち運び出来るOpenBSDが簡単に作成出来る。焼くのもddコマンドを叩くだけ。オイラーも非常用に作ってあるぞ。2018年の事だ。

本格的にやるなら、美味しい河豚だ。河豚は福に通じると言うから、正月から目出鯛ぞ。

OpenBSD Live System - 河豚板