OpenBSD 5.9 & Ubuntu 16.04
OpenBSDの新版が前倒しで出たというので、1年ぶりに入れてみた。isoファイルを 取りに行ったら、2月製造って刻印が有ったぞ。i386版は順調に仕上がったけど、64Bit版が ごたごたしてて足を引っ張ったんですかねぇ。元気に色々改正されてるようですから。
5.7から5.9への変更では、オイラーには何が変わったか検知出来ず。先端機能を 触っていないんで当然か。
srcは勿論新しくした。相変わらずlib等がgdbにかけられるようになってて有り難い。 portsはrsyncでコピーして済ませた。
XをWindows側に投げようとしたら反応せず。ずーーーーーーと思い出を辿って、/etc/ss/sshd.confの X11Forwarding yesを忘れていた。情けない。
この設定をしておかないと、startxした時も随分待たされるのね。これってどういう理屈? xauthが関係してるっぽいけど、考えがまとまらないな。
例によってデフォで起動するものを極力抑えている。
[ob: ~]$ cat /etc/rc.conf.local smtpd_flags=NO sndiod_flags=NO pflogd_flags=NO ntpd_flags=NO [ob: ~]$ ps awx PID TT STAT TIME COMMAND 1 ?? Is 0:01.05 /sbin/init 2836 ?? Is 0:00.01 dhclient: vic0 [priv] (dhclient) 7022 ?? Isp 0:00.00 dhclient: vic0 (dhclient) 3489 ?? Isp 0:00.02 syslogd: [priv] (syslogd) 15775 ?? Sp 0:00.09 /usr/sbin/syslogd 17255 ?? Is 0:00.02 /usr/sbin/sshd 8677 ?? Ssp 0:00.02 /usr/sbin/cron 1354 ?? Is 0:00.11 sshd: sakae [priv] (sshd) 6780 ?? R 0:04.82 sshd: sakae@ttyp0 (sshd) 28928 ?? Rs 0:00.53 SCREEN -U (screen) 27602 ?? Is 0:02.68 emacs --daemon (emacs-24.5) 2526 p0 Isp 0:00.02 -ksh (ksh) 871 p0 S+ 0:00.04 screen -U 14620 p1 Ssp 0:00.06 -/bin/ksh 14512 p1 R+p 0:00.00 ps -awx 6880 p2 Is+p 0:00.03 -/bin/ksh 22385 C0 Is+p 0:00.02 /usr/libexec/getty std.9600 ttyC0 1041 C5 Is+p 0:00.01 /usr/libexec/getty std.9600 ttyC5
ああ、今気が付いたけど、kshのデフォルトのプロンプトがちょっと変わって親切に なってるな。ちゃんと気が付かないと、女房に怒られますから。。。
初回は時間がかかる
前回、qsp.hってC語のマクロを作った。これを作りきっかけがgdbでコードを追ってる時、 初めての関数が呼ばれる場合、随分とあちこちを引き回される事に端を発してる。 どのぐらいオーバーヘッドが有るか。測ってみろ。
mainに、
QSP( z = sin(10) ); QSP( z = sin(11) ); QSP( z = cos(12) ); QSP( z = cos(13) );
こんな意味も無いコードを書いて実行すると
exec time = 0.000105 exec time = 0.000009 exec time = 0.000032 exec time = 0.000008
初回の関数呼出が断トツで遅い結果となった。cosも初回は遅いけど、一番最初のsinに 比べれば、それほどでもない。
初回のsin呼びを分解する意味で、測定対象の無い時間測定のマクロを追加する。
QSP( ; ); QSP( z = sin(10) ); QSP( z = sin(11) ); QSP( z = cos(12) ); QSP( z = cos(13) );
結果は
exec time = 0.000052 exec time = 0.000070 exec time = 0.000008 exec time = 0.000035 exec time = 0.000008
初回のsin呼び出し時間が、前回よりは緩和された。同じ事をFreeBSDやFedoraで行うと このような顕著な差は出ない。何故? objdumpしてコードを見たら、OpenBSDは馬鹿真面目に cosとかの関数を呼び出していた。FreeBSDとかだと、計算した値が使われ、cosの 呼び出しは行われていなかった。ずるいぞ。
OpenBSDの名誉の為に言っておくと、-O2とかのオプションを付けてコンパイルすると、 FreeBSDと同様になった。
static
じゃ、cosとかの関数を自分の中に取り込んで、呼び出しを簡素化したらどうなる?
[ob: z]$ cc -g -static t.c -lm [ob: z]$ ./a.out exec time = 0.000039 exec time = 0.000009 exec time = 0.000008 exec time = 0.000008 exec time = 0.000008
やはりcosとかの呼び出しは速くなった。初回のダミーはやはり遅さが目立っているな。 ここで、ちょっと8087の資料を漁っておく。
コードを眺める
a.outをobjdumpしてみた。
QSP( z = sin(10) ); a26: e8 69 ff ff ff call 994 <time_now> a2b: 8b 83 30 00 00 00 mov 0x30(%ebx),%eax a31: dd 18 fstpl (%eax) ;; FPUreg -> mem a33: dd 83 2c df ff ff fldl 0xffffdf2c(%ebx) ;; mem -> FPUreg a39: dd 1c 24 fstpl (%esp) a3c: e8 4f fc ff ff call 690 <sin@plt> a41: dd 5d e8 fstpl 0xffffffe8(%ebp) ;; sin result a44: e8 4b ff ff ff call 994 <time_now> a49: 8b 83 34 00 00 00 mov 0x34(%ebx),%eax a4f: dd 18 fstpl (%eax) a51: 8b 83 34 00 00 00 mov 0x34(%ebx),%eax a57: dd 00 fldl (%eax) ;; sp a59: 8b 83 30 00 00 00 mov 0x30(%ebx),%eax a5f: dd 00 fldl (%eax) ;; st a61: de e9 fsubrp %st,%st(1) ;; sp - st a63: dd 5c 24 04 fstpl 0x4(%esp) a67: 8d 83 0d df ff ff lea 0xffffdf0d(%ebx),%eax a6d: 89 04 24 mov %eax,(%esp) a70: e8 eb fb ff ff call 660 <printf@plt>
fpuとのやり取りが気になったので、解析してみた。でも今回は、それが主目的では なくて、遅い原因を探るのだ。gdbで追って行くと、 time_now()の中から、辺な所へ行った。
(gdb) bt #0 _dl_bind_start () at /usr/src/libexec/ld.so/i386/ldasm.S:140 #1 0x7b238000 in ?? () #2 0x15b17a2b in main () at t.c:8
そして実行を進めてみると
(gdb) bt #0 0x001b3c84 in _dl_find_symbol (name=0x15b1753a "gettimeofday", this=0xcf7df0e4, flags=48, ref_sym=0x15b17424, req_obj=0x7b238000, pobj=0xcf7df0e0) at /usr/src/libexec/ld.so/resolve.c:600 #1 0x001b65cf in _dl_bind (object=0x7b238000, index=32) at /usr/src/libexec/ld.so/i386/rtld_machine.c:387 #2 0x001b25f7 in _dl_bind_start () at /usr/src/libexec/ld.so/i386/ldasm.S:153 #3 0x7b238000 in ?? () #4 0x15b17a2b in main () at t.c:8
同様にsin関数の呼び出し部分でも、辺な所へ飛ばされている。この変なものは何?
[ob: z]$ ldd a.out a.out: Start End Type Open Ref GrpRef Name 1b41b000 3b41f000 exe 1 0 0 a.out 04605000 2460e000 rlib 0 1 0 /usr/lib/libm.so.9.0 036bc000 236d9000 rlib 0 1 0 /usr/lib/libc.so.84.2 05798000 05798000 rtld 0 1 0 /usr/libexec/ld.so
変なものは内蔵されてた。manしてみると
ld.so is a self-contained, position independent program image providing run-time support for loading and link-editing shared objects into a process's address space. It uses the data structures (see elf(5)) contained within dynamically linked programs to determine which shared libraries are needed and loads them at a convenient virtual address using the mmap(2) system call. After all shared libraries have been successfully loaded, ld.so proceeds to resolve external references from both the main program and all objects loaded. A mechanism is provided for initialization routines to be called, on a per-object basis, giving a shared object an opportunity to perform any extra set-up, before execution of the program proper begins. ld.so is itself a shared object that is initially loaded by the kernel.
一番最初にカーネルがロードするのがこいつ。こいつの力を借りて、他のライブラリィーを ロードするとな。その後も、mainとかからの要請によって、名前解決を行う。オイラーの 超訳は信用ならんかな。そういう時は、バイナリー八苦本の、#58あたりを見れば良いのかな。
同本の219ページあたりに、Linuxでは、ld.soを直接実行出来るってコンビニな事が 説明されてた。いいじゃーーないの、便利ならーを、地で行く、無節操ぶり、かな?
多分、OpenBSDはセキュリティの強化の為、ライブラリィーのロード先を、実行の度に 変えているのだろうね。だから、その都度、名前解決が必要なんだな。
八苦本にLinuxでは、ライブラリィーをプリロードしておいて、アプリの起動を速める 事が出来るって乗ってた。(#85) なんでも、firefoxみたいに大量のライブラリィーを 使ってるアプリに、これを適用すると、いらいらが減少するとか。何でも有りだな。
次は、何でも有り版にでも触ってみるか。
ubuntu 16.04
ウブも長期サポート版が出たと言う事で、 F T P . J A I S T . A C . J Pから、 ununtu-16.04-server-i386.isoを取ってきて、入れてみた。このjaist.ac.jpは、 出力インピーダンスの低い良いサーバーだったけど、暫くの間調子悪かったよう。 サバ菅の嘆き節が聞こえてきて、ご同情申し上げます。余り負荷をかけてHDDの 寿命を縮めるような事は控えましょう。
VMWAREに入れてみたけど、ウブのおかげで、ユーザーアカウントを設定するだけで、 インストール完了。但し、少し弊害が有ったぞ。host名が長ったらしい、アメリカ時刻を 表示してる。さくっとネット上の誰かさんに聞いて修正。ウブのローカルルールなんて 知らんがな。
やっと、デフォのパイソンが3.5になった。おめでとう。パアルはこの際、引退しても いいかと思うんだけど、何かに紛れて忍び込んでいるわい。
以前のウブに何入れていたかな? そういう時は
dpkg --get-selections >install.log
するんだった。そして、16.04でどんなパッケージが有るかは
apt-get update apt list >yes-we-can-supply.txt
とかやって、型録を作っておけばOk。これもウブのローカルルールだな。ローカルルールを 世界標準と持て囃すのも、実社会とそっくりだ事。
ああ、パッケージとより良いお付き合いをするための情報収集 を見ると、apt-fileってコマンドを推奨してるな。これは知らなかったぞ。
vmwareのコンソールからstartxするとXが上がってこない。しょうがないので、Xmingを 使ってお茶を濁す事にした。そこで、emacsを上げる時に文句を言われないように、 emacs24-lucid を選んでみた。
サーバー版でstraceがデフォで入っているって、手回しが良すぎないかい。
兎も角、python3になった事だし、pythonに手を出してみるかな。
sudo apt-get install python3-scipy sudo apt-get install python3-matplotlib sudo apt-get install ipython3-notebook
ぐらいで、取りあえず試してみるか。
で、上の ipython3 notebook を、コンソールから起動したら、jsが動いてねぇぞと 怒られた。これって、ひょっとしてブラウザに依存してないか? 何も知らないオイラーが おろおろしてます。結局、ちゃんとXを動かせって事だな。CUIおじさんには、辛いものがあるなあと、 嘆いています。
X Window に取り組む
泥縄を撚ってみる事にします。えと、ウブ15.04の時はどうだった? 過去の記録と言う事で、 昔の日記を再読。
sudo apt-get -y install xserver-xorg
だけで良いそうだけど、xorgを入れちゃった。
秘伝のたれ、xorg.confを自作してるな。そして、Windows7上に置いてあるvmwareのconf ファイルを変更してる。その通りにしたけど、やはりエラー。
vmmouse.present = "FALSE"
今度は、エラー表示のメッセージに従って、 .local/share/xorg/Xorg.0.log を参照。 これって昔は、/var/logあたりに作られていなかったかな。ここでもウブのローカルルールが 炸裂してますよ。
で、EEってタグを見つけて、それを潰す作業に没頭。20年前からちっとも進歩してないな。 反省しきりであります。今度は起動したら直ぐに終了しちゃうエラーに遭遇。
この原因は、ub15.04から持ってきた、.xinitrcの設定にあった。マネージャにawesome なんてのが指定してあったぞ。そんなの居ないから、何もでけませんという事で、即終了 しちゃったんだな。ここは古式ゆかしく twm を指定しといた。気が向いたら、icewmでも 入れてみるか。
firefox入れたら、日本語文字が豆腐になっちゃう。これは日本語フォントが入って いないからだな。何も悩まず、
sakae@ub:~$ sudo apt-get install fonts-ipafont
したよ。特にフォントには拘りが有りませんからね。 折角なので、巻末に xorg.conf を添付しておく。
アプリ間のコピペはどうやるんだっけ? GUI知らないからな。 X Window Systemのクリップボードの種類,xselコマンド,履歴ツール。 マウスでなぞった所がコピされて、中ボタンのクリックでペされると、覚えておこう。
etc
xorg.conf for Ubuntu
Section "ServerLayout" Identifier "X.org Configured" Screen 0 "Screen0" 0 0 InputDevice "Mouse0" "CorePointer" InputDevice "Keyboard0" "CoreKeyboard" EndSection Section "Files" ModulePath "/usr/lib/xorg/modules" FontPath "/usr/share/fonts/X11/misc" FontPath "/usr/share/fonts/X11/cyrillic" FontPath "/usr/share/fonts/X11/100dpi/:unscaled" FontPath "/usr/share/fonts/X11/75dpi/:unscaled" FontPath "/usr/share/fonts/X11/Type1" FontPath "/usr/share/fonts/X11/100dpi" FontPath "/usr/share/fonts/X11/75dpi" FontPath "built-ins" EndSection Section "ServerFlags" Option "AIGLX" "off" EndSection Section "Module" Load "glx" EndSection Section "InputDevice" Identifier "Keyboard0" Driver "kbd" EndSection Section "InputDevice" Identifier "Mouse0" Driver "mouse" Option "Protocol" "auto" Option "Device" "/dev/input/mice" Option "ZAxisMapping" "4 5 6 7" EndSection Section "Monitor" Identifier "Monitor0" VendorName "Monitor Vendor" ModelName "Monitor Model" HorizSync 1-10000 VertRefresh 1-10000 ModeLine "1360x768" 100 1360 1460 1560 1660 768 868 968 1068 EndSection Section "Device" Identifier "Card0" Driver "vmware" BusID "PCI:0:15:0" EndSection Section "Screen" Identifier "Screen0" Device "Card0" Monitor "Monitor0" SubSection "Display" Viewport 0 0 Depth 24 Modes "1360x768" EndSubSection EndSection