tmpfs or mfs
コロナ蔓延は田舎にも及んでいて、何度目かの図書館閉鎖になっている。本を読みたかったら、申し込み書に記載して提出ヨロって奴。翌々日には受け取れるように包みを用意しとくから、取りにこられたし。日に十数人の利用があるようだった。
面倒くさい昭和のやり方だ。包みを宅急便で送れなんて贅沢は言わないけど、申しこみぐらいは、電子式にして欲しいぞ。蔵書検索は家で出来るので、それをメールで送るだけじゃん。だれでも思い付くぞ。紙を介さないと仕事が進まんと思ってる役人思想だな。
本当は、WEBから注文が出来れば楽なんだけど、荒らしが怖いんで踏み切れないんですかね。だったら、登録制にすれば済む事なんだろうけどね。どこかのメーカーの図書館システムを使ってるので、おいそれとシステム変更出来無いんです(仕様変更に数百万円かかるので、手が出せない)って、好意的に解釈してあげようか。
テンプレートを用意して、そこに記入。メールで送信、ぐらいは、1時間仕事で、仕組みが構築出来るぞ。それぐらいなら、ボランティアでやってあげるよ。
firefox のリサイズ
この間からdual bootなマシンにicewmを入れて使っているんだけど、何故かfirefoxが、最大な大きさで起動してしまい困っている。
GUIなアプリなら起動時に firefox –geometry=800x600+0+0 みたいな事出来るだろうと思ってた。けど、どう調べてもそんなオプションは無いみたい。実際にやってみても機能せず。
例えばemacsなんかだとちゃんと出来るんだけどね。これってGUIの慣例を破る勝手なふるまいだな。ひょっとして、各自の設定ファイル内にそれらしいのが有るかと思ったけど見付からず。about:config を調べてみるも、それらいのには遭遇せず。しょうがないので、ぐぐったよ。
Firefoxでウィンドウサイズのサイズ変更や位置指定を行う方法
こんなものを追加しろ、ですって。全く困ったものだのう。皆が困っているんだから、デフォで提供しろよな。プンプン。
これって、アドオンを分解して、調べろって言う、題材が提供されたって事かな。多分javascriptの世界だと思うけどな。全方位外交だな。
xbacklight
前回のLCD輝度調整を根に持っている。どんな成分で出来ているか、外観検査(at OpenBSD)
vbox$ ldd `which xbacklight` /usr/X11R6/bin/xbacklight: Start End Type Open Ref GrpRef Name 1421e000 34220000 exe 1 0 0 /usr/X11R6/bin/xbacklight 0dde7000 2dde9000 rlib 0 1 0 /usr/X11R6/lib/libxcb-randr.so.2.3 02898000 2289a000 rlib 0 1 0 /usr/X11R6/lib/libxcb-util.so.0.0 073f6000 273f8000 rlib 0 3 0 /usr/X11R6/lib/libxcb.so.4.1 0d022000 2d033000 rlib 0 1 0 /usr/lib/libc.so.96.0 0f3ea000 2f3ec000 rlib 0 1 0 /usr/X11R6/lib/libXau.so.10.0 099d4000 299d6000 rlib 0 1 0 /usr/X11R6/lib/libXdmcp.so.11.0 06f36000 06f36000 ld.so 0 1 0 /usr/libexec/ld.so
これが普通なのか、よく判らないので、有名所のものも参照してみた。
vbox$ ldd `which oclock` /usr/X11R6/bin/oclock: Start End Type Open Ref GrpRef Name 15cc9000 35ccb000 exe 1 0 0 /usr/X11R6/bin/oclock 05665000 25667000 rlib 0 1 0 /usr/X11R6/lib/libXmu.so.11.0 072b5000 272b7000 rlib 0 2 0 /usr/X11R6/lib/libXext.so.13.0 03c65000 23c6a000 rlib 0 2 0 /usr/X11R6/lib/libXt.so.11.0 03cb6000 23cba000 rlib 0 5 0 /usr/X11R6/lib/libX11.so.17.1 043be000 243c0000 rlib 0 1 0 /usr/X11R6/lib/libxkbfile.so.6.0 0e84c000 2e84e000 rlib 0 1 0 /usr/lib/libm.so.10.1 089ce000 289df000 rlib 0 1 0 /usr/lib/libc.so.96.0 06cb0000 26cb2000 rlib 0 2 0 /usr/X11R6/lib/libSM.so.9.0 06e12000 26e16000 rlib 0 3 0 /usr/X11R6/lib/libICE.so.11.0 0a08c000 2a08e000 rlib 0 5 0 /usr/X11R6/lib/libxcb.so.4.1 00dc0000 20dc2000 rlib 0 1 0 /usr/X11R6/lib/libXau.so.10.0 0f660000 2f662000 rlib 0 1 0 /usr/X11R6/lib/libXdmcp.so.11.0 0b227000 0b227000 ld.so 0 1 0 /usr/libexec/ld.so
なんか、xbacklightって、特殊っぽいな。次はソース嫁ですかな。
OpenBSDだとXのソース一式が普通に提供されてるので、取ってきて展開するだけ。約1Gと巨大だ。xbacklightはappの中に入っている。
COPYING aclocal.m4 depcomp ChangeLog compile install-sh INSTALL config.guess man/ Makefile.am config.h.in missing Makefile.bsd-wrapper config.sub xbacklight.c Makefile.in configure README.md configure.ac
個別にインストール出来るように、関係者が多数ついてきているな。これが普通の事なのか。
取り敢えず、エラーを発生させて、どこで出してるか確認。炙り出し作戦とでも言うのかな。
vbox$ xbacklight RANDR Query Version returned error -1
Xが起動していないシステムのCUI端末からって言う、どう転んでエラーな条件です。
conn = xcb_connect (dpy_name, NULL); ver_cookie = xcb_randr_query_version (conn, 1, 2); ver_reply = xcb_randr_query_version_reply (conn, ver_cookie, &error); if (error != NULL || ver_reply == NULL) { int ec = error ? error->error_code : -1; fprintf (stderr, "RANDR Query Version returned error %d\n", ec); exit (1); }
Xサーバーに接続してバージョン情報を取り出そうとしてエラーなんだな。細かい関数のmanは、どこに有るのかな。man,manと騒ぐなボケ。ヘッダーファイルでも見て桶。
それより X Window System こういうのを見て、まずは全体像を掴めよ。それが早道と思うぞ。 Xlib とか XCB なんてのも有るな。ここらあたりがXを使う上での底辺になるのか。
vbox$ lv /usr/X11R6/lib/xorg/protocol.txt # Registry of protocol names used by X Server # This will eventually be replaced by server-side XCB # # Format is Xnnn <extension-name>:<object-name> # R=Request, V=Event, E=Error # # This is a security-sensitive file, please set permissions as appropriate. # R000 Apple-DRI:QueryVersion R001 Apple-DRI:QueryDirectRenderingCapable R002 Apple-DRI:CreateSurface :
こんなファイルが有ったぞ。
for RAMDISK
図書館から本が来ないので、BSD本を開いてみた。 読みかけのやつ。NFSに章が割当られてた。重要な構成要素って訳だな。
サンマクロシステムズの商売戦略により普及したとな。似たやつにAFSなんてのが有るのか。Windowsグループだとサンバさんが相当するのかな。オイラーはNFSに良いイメージを持っていない。サーバー側が落るとクライアント側がにっちもさっちも行かなくなり、随分苦労した覚えがある。昔は何も知らないユーザーだったからね。
まあ、今の環境じゃ、NFSを運用するなんて、ありえない事になってるんで、蜈利益のありそうなものを読んでみる。
メモリー・ファイルシステムなんてのが目に飛び込んできたので、お世話になってる /etc/fstab の設定を列挙してみた。これらを書いておく事で、RAMDISKになるよ。揮発性って事に注意すれば、十分に使えるぞ。ガンガン、コンパイルする人向けです。
FreeBSD
tmpfs /tmp tmpfs rw,size=1g,mode=1777 0 0
Debian
tmpfs /tmp tmpfs rw,nosuid,nodev 0 0
OpenBSD
swap /tmp mfs rw,nodev,nosuid,-s=1024m 0 0
vfs, vnode
OpenBSD fstab(5)に列挙されてたもの。
cd9660 An ISO 9660 CD-ROM filesystem. ext2fs A local Linux compatible ext2fs filesystem. ffs A local UNIX filesystem. mfs A local memory-based UNIX filesystem. msdos An MS-DOS FAT filesystem. nfs A Sun Microsystems compatible Network File System. ntfs An NTFS filesystem. swap A disk partition to be used for swapping. tmpfs A local memory-based UNIX filesystem. udf A UDF filesystem. vnd A VND image file.
OpenBSDでは、mfsがお勧めだと言うので、何も考えずmfsです。tmpfsは昔有ったらしいんだけど、不安定なので余り使うなって事らしい。
まあ、これだけ多種なファイルシステムを扱かうのは、カーネルに取っては非常に大変。 カーネルとそれぞれのファイルシステムの間に仮想化したファイルシステムを挟む。カーネルは、その仮想化したものだけを扱かう事にした。
vfsは仮想化したやつ。で、その核心はvnodeって奴が受け持つ。 vnode(9)
Each vnode has a set of methods which start with the string “VOP_”. These methods include VOP_OPEN(), VOP_READ(), VOP_WRITE(), VOP_RENAME(), VOP_CLOSE(), and VOP_MKDIR(). Many of these methods correspond closely to the equivalent file system call - open(2), read(2), write(2), rename(2), etc. Each file system (FFS, NFS, etc.) provides implementations for these methods.
mfs
ソースは/sys/ufs/mfsに置いてある。ufsな一族なんですなあ。tmpfsとかnfsとは、/sys直下に有る事からすれば、奴等は外様大名扱い、要するに冷遇されてる訳(あくまで、個人の感想です)。
その点mfsは、徳川御三家みたいに、磐石なやつです。安心して使えます。 コードサイズもこんなもの
ob$ wc * 65 382 2489 mfs_extern.h 220 834 6238 mfs_vfsops.c 269 899 6751 mfs_vnops.c 53 378 2400 mfsnode.h 607 2493 17878 total
対するtmpfsは
ob$ wc /sys/tmpfs/* 378 1464 11134 /sys/tmpfs/tmpfs.h 127 511 3779 /sys/tmpfs/tmpfs_fifoops.c 225 719 5606 /sys/tmpfs/tmpfs_mem.c 122 503 3712 /sys/tmpfs/tmpfs_specops.c 1282 4115 32726 /sys/tmpfs/tmpfs_subr.c 375 1260 10012 /sys/tmpfs/tmpfs_vfsops.c 2703 9189 68320 /sys/tmpfs/tmpfs_vnops.c 79 427 2857 /sys/tmpfs/tmpfs_vnops.h 5291 18188 138146 total
全々規模が違います。コード量が多いって事は、それだけあちこちに配慮しないといけないって事です。まあ、配慮しすぎて力を付けられても、あれですが。。。時代小説風解説もいいもんだ。
mfs_vfsope.c
const struct vfsops mfs_vfsops = { .vfs_mount = mfs_mount, .vfs_start = mfs_start, .vfs_unmount = ffs_unmount, .vfs_root = ufs_root, .vfs_quotactl = ufs_quotactl, .vfs_statfs = ffs_statfs, .vfs_sync = ffs_sync, .vfs_vget = ffs_vget, .vfs_fhtovp = ffs_fhtovp, .vfs_vptofh = ffs_vptofh, .vfs_init = mfs_init, .vfs_sysctl = ffs_sysctl, .vfs_checkexp = mfs_checkexp, };
これ、vfsと個別fsとの、それぞれの関数の対応表。
親戚同士で、助け合いをしてるんだな。だから、コード量が少くてもやっていける。同時に、メインストリームなffsとかの安心安全なコードに依存して、大船に乗っていられるとな。
一方のtmpfsは、 tmpfs_vfsopes.c
を見てみると
const struct vfsops tmpfs_vfsops = { .vfs_mount = tmpfs_mount, .vfs_start = tmpfs_start, .vfs_unmount = tmpfs_unmount, .vfs_root = tmpfs_root, .vfs_quotactl = (void *)eopnotsupp, .vfs_statfs = tmpfs_statfs, .vfs_sync = tmpfs_sync, .vfs_vget = tmpfs_vget, .vfs_fhtovp = tmpfs_fhtovp, .vfs_vptofh = tmpfs_vptofh, .vfs_init = tmpfs_init, .vfs_sysctl = (void *)eopnotsupp, .vfs_checkexp = (void *)eopnotsupp, };
ほとんど自前ですよ。参勤交代で財力を削がれるようなもの(例えが悪いぞ)。
まだまだ暑くて、やる気が出ないので、今回は、短めで失礼します。