改めて河豚板
Table of Contents
gc for mlterm
お勧めのmlermをUSBに入れた。そう河豚板ね。そしたら、
fug$ df -k Filesystem 1K-blocks Used Avail Capacity Mounted on : mfs:94471 1014455 566230 397503 59% /ram
こんな具合になった。導入前は容量が確か38%ぐらいだったから、大幅に増加
している。ただ ja_JP.UTF-8
が扱かえる端末が欲しかっただけなのに。汎用
的に構成されすぎている。例えばsvgを扱かえるようになってたり。
ldd mltermすると、/usr/local/lib/libpng.so.18.0 とか、 /usr/local/lib/libjpeg.so.70.1みたいに、削除したくなるものが有るけど、 それをしちゃうと起動しなくなるからね。
稼動に関係なさそうなファイルを削除できないか? その対象は、安全を担保 したいんで、/usr/local/share下としたい。いわゆる、保守的なゴミ集めね。 GCの起点に移動して、インストール日に作成されたdirの容量を確認。
fug$ du -sk `ls -l | awk '/Feb 3/{print $9}'` | sort -nr 37795 locale/ 14042 icons/ 13490 gir-1.0/ 11269 doc/ 5453 mime/ 461 gtk-2.0/ 395 glib-2.0/ 162 examples/ 111 mlterm/ 39 aclocal/ 17 dbus-1/ 13 themes/ 12 vala/ 8 gettext/ 7 xml/ 6 graphite2/ 4 pkgconfig/ 4 defaults/ 3 thumbnailers/
一番安全だと思うアイコンの類を全て削除。 次はロケールの中
fug$ du -sk * | sort -nr | head 700 uk 649 sr 643 ru 634 bg 606 kn 606 bn_IN 596 ta 593 te 588 or 585 ml
ukって女王陛下の国の事(今は国王か)。なんかドングリの背比べっぽいな。チ リも積れば山を信じて地道に消してみるか。ちなみに、天皇陛下の国は
fug$ du -sk ja 521 ja
こんくらい。取らぬ狸の皮算用する? enとjaだけ残せばいいか。壊しても安 心な河豚板なんで、気楽に試せる。126地域からen,jpだけを残す。
fug$ doas mv en EN fug$ doas mv ja JA fug$ doas rm -rf [a-z]* fug$ doas mv EN en fug$ doas mv JA ja
そして、こうなった。
mfs:85137 1014455 512172 451561 54% /ram
後は、チマチマと消しても、劇的before afterとはならないだろうから、これ ぐらいにしておく。それより、たっての懸念事項のチェックだな。
TAGS
そう、emacsを使って/sys内を闊歩する時の大事なデータベースが(メモリー極 小環境で)機能するかだな。早速チェックしてみる。
fug$ doas mount /dev/sd0d /mnt fug$ cd /mnt/src/sys/ fug$ emacs kern/init_main.c
こんな風に、母艦の /usrをマウントしてからemacsを起動。TAG jumpの操作を 始めると、mini-bufferにこんな質問が出てくる。
Visit tags table (default TAGS): /mnt/src/sys/arch/i386/ File TAGS is large (267 MiB), really open? (yes, no, literally, ?):y
/usr/src/sys/arch/i386/i386/machdep.c 336:cpu_startup( /usr/src/sys/arch/i386/include/cpu.h 217:#define CPU_STARTUP(
無事にロードできて、候補が出てきた。
Rerun etags: `^cpu_startup(' not found in /usr/src/sys/arch/i386/i386/machdep.c
けど、アクスセスしてみると、そんなの無いとな。そりゃそうだ。/mnt/src/sys… が正解なんだけど な。
強引に、TAGSファイルを開いてみると
/usr/src/sys/dev/ic/smc93cx6.c,175 static struct seeprom_cmd ^?70,3290 unsigned char len;^?71,3318 : /usr/src/sys/crypto/criov.c,89
こんな風に、ソースの在処がしっかり絶対PATHで埋め込まれていた。困った脳。 散歩して脳を冷却してくるわ。
一つは河豚板の方からリンクを貼っちゃう方法(by 作者さんの運用術)
> /homeや/usr/localなど、容量の要りそうなのは例えば、 > ln -s /opt/home /home > みたいにしてます。
もう一つは、TAGS ファイルを独自な方法で構築して、sysあたりからの相対PATHにしちゃ う方法。arch/i386 kern/lib/arch/i386 だけにしておいてから、sysの直下で実行。 (OpenBSDのツリーを傷付けないように、FreeBSD上で実行)
find . -name '*.[chs] | etags -
TAGSは、sysの直下に配置する。そして、そのTAGSを利用する。
TAGSの発動前のTopの一部
Memory: Real: 852M/1277M act/tot Free: 1559M Cache: 317M Swap: 0K/2071M PID USERNAME PRI NICE SIZE RES STATE WAIT TIME CPU COMMAND 77121 sakae 2 0 16M 24M sleep kqread 0:01 2.34% emacs-29.1
発動後
Memory: Real: 1122M/1550M act/tot Free: 1285M Cache: 317M Swap: 0K/2071M PID USERNAME PRI NICE SIZE RES STATE WAIT TIME CPU COMMAND 77121 sakae 2 0 286M 295M sleep kqread 0:04 6.45% emacs-29.1
さすがはLispだ。全部をメモリーに展開してるな。じゃ、viでtagsしたらどう なる? それは又の機会に。
メモリーが一杯は正義だと思う。オイラーみたいにAV嫌いにはCPUパワーなん て、必要にはならないのさ。
リンクの功罪
上で出てきた、作者さんの運用術ってのは、
fug$ ls -l / lrwxr-xr-x 1 root wheel 8 Feb 5 05:27 home@ -> ram/home lrwxr-xr-x 1 root wheel 7 Feb 5 05:27 usr@ -> ram/usr
この /ram/home となってるリンクを /opt/home の様に母艦側のものにしちゃ いましょって技。非常に綺麗な方法だ。
ただ一つ、ほとんど いいがかりと思える心配事がある。母艦とセットでしか 使えないって事だ。
遠方の友達からハッキング・パーティーやるから出ておいで、って誘いを受け たとしよう。旅慣れたオイラーは、3Kならぬ、母艦の3Oパソコン(重い、大きい、遅い)なんて抱えて行きたくない。
かの昔、重い作業カバンを持ってのドサ回りをしてた。身の回り品、最低限で、 ドライヤーやら整髪料はオミット。ならば職人風の髪型だな、高校球児スタイ ルだな、で、30年以上は続いているぞ。
河豚板のUSBだけを持参。出先ではパソコンを借用。場合によってはネット問 題も有るだろうから、UTPなケーブルを一本。おまけで、クロス・ケーブルも 出来たら用意。パソコンと直のデータ交換が出来るよ。
完全ポータブルになった時、/usrが利用できないかもです。
訓練、訓練、訓練、訓練、訓練、訓練、訓練、訓練、訓練、訓練、訓練、訓練
fug$ cd /bin fug$ ls [* cpio* ed* ls* pwd* sha512* cat* csh* eject* md5* rksh* sleep* chgrp* date* expr* mkdir* rm* stty* chio* dd* hostname* mt* rmdir* sync* chmod* df* kill* mv* sh* tar* cksum* domainname* ksh* pax* sha1* test* cp* echo* ln* ps* sha256*
で、何が出来るか(/sbinも可)、じっくり考えておこう。糞味噌一緒のリナ陣 営は、こんな発想無いだろう。SSDで、信頼性十分と見做しているからね。 昔のHDDは信用ならん所が有ったから、HDDを分割して、非常品(/bin,/sbin)も、 独立で動くように注意を払っていたのさ。
家に居る時は、母艦をマウントして使ってもいいかな。そんな時、母艦の区割 りがどうだったか、忘れてしまうと面倒だ。で、下記のように、マウント・ポ イントに、そかはかとなく区割り文字を混ぜ込んでおいた。
fug$ ls /ram/opt/ Aroot/ Dusr/ Elocal/ Fhome/ Gvar/
たかが4つぐらいの区割りなんだから、長期記憶で定着させろよってのは却下 ね。大事な大事な生ram(脳)なんだから、余計な記憶は残したくないのさ。
shutdown -hp now
こんなタイトルを付けちゃうと、某HP社の弁護士からクレームのメールが届き そうだけど、全く他意はございませんので、あしからず。文句は下記を熟読し てからにして下さい。
リアルマシンを手に入れたものだから、仮想コンソールを利用してる。 ALT-CTL-F1 で、仮想端末C0をsakaeが利用。ALT-CTL-F2で、C1な端末をrootが 利用。このシチィエーションのまま、マシンを落そうとして、shutdown -hp nowしたら、直ぐに停止するぞとwallメッセージが流れるものの一向に停止し ないんだ。何故?
なお余談だけど、C0の端末以外だと、Xは起動しないみたい。 home/sakae.local/share/xorg/Xorg.0.log
Fatal server error: [ 7510.252] (EE) xf86OpenConsole: No console driver found Supported drivers: wscons Check your kernel's console driver configuration and /dev entries(EE) [ 7510.258] (EE)
こんな見当違い?なログが出てくる。そんなものなのか。
コードは1つのファイルになってる。コードリーディングのお友は、man shutdown いきなりじゃ、焦点が暈けるからね。
-k Kick everybody off. The -k option does not actually halt the system, but leaves the system multi-user with logins disabled (for all but superuser).
全員退出せよ、こんなオプションは知らなかった。それから、shutdown時刻の 5分前になると、新たなloginは禁止される。これ、よく有る方策だ。有る会員 サイトの閉鎖が決定すると、何月何日以降は、新規会員の受付はしませんと言 うアレだ。この機構は、/etc/nologinを操作する事で、実現してるみたい。
case 'k': killflg = 1; break; die_you_gravy_sucking_pig_dog(void) { if (killflg) { (void)printf("\rbut you'll have to do it yourself\r\n"); finish(0); finish(int signo) { if (!killflg) (void)unlink(_PATH_NOLOGIN); if (signo == 0) exit(0); else _exit(0); }
こんなメッセージが作成されてる。
fug$ cat /etc/nologin NO LOGINS: System going down at 08:14 JST
if (doreboot) { path = _PATH_REBOOT; *arg++ = "reboot"; } else { path = _PATH_HALT; *arg++ = "halt"; } execve(path, args, NULL);
最終的には、halt等に、委ねている。
vm.loadavg
相変わらず、嘘を返すやつを調査してみる。
fug$ grep loadavg -l -r . ./kern_pledge.c ./sched_bsd.c
sched_bsd.c
/* * constants for averages over 1, 5, and 15 minutes when sampling at * 5 second intervals. */ update_loadavg(void *unused) { static struct timeout to = TIMEOUT_INITIALIZER(update_loadavg, NULL); CPU_INFO_ITERATOR cii; struct cpu_info *ci; u_int i, nrun = 0; CPU_INFO_FOREACH(cii, ci) { if (!cpuset_isset(&sched_idle_cpus, ci)) nrun++; nrun += ci->ci_schedstate.spc_nrun; } for (i = 0; i < 3; i++) { averunnable.ldavg[i] = (cexp[i] * averunnable.ldavg[i] + nrun * FSCALE * (FSCALE - cexp[i])) >> FSHIFT; } timeout_add_sec(&to, 5);
5秒毎にCPUの状態を取得して、それに集計間隔の係数を乗算してから蓄積して く、過去のデータは係数により減衰と読めるな。
static const fixpt_t cexp[3] = { 0.9200444146293232 * FSCALE, /* exp(-1/12) */ 0.9834714538216174 * FSCALE, /* exp(-1/60) */ 0.9944598480048967 * FSCALE, /* exp(-1/180) */ }; struct loadavg averunnable;
これがデータの保持元。構造体の作りは?
#if __BSD_VISIBLE /* Load average structure. */ struct loadavg { fixpt_t ldavg[3]; long fscale; }; #endif /* __BSD_VISIBLE */
fixpt_t
って謎。あちこちを引き回されて、
typedef unsigned int __uint32_t;
こんな風に決着が付いた。それより、#ifで囲ってあるな。BSDな人には見せて あげるって読めるんだけど、本当か? bss領域に掲載されてればOKのはず。
河豚板のカーネルを確認してみる。
fug$ cp /sysmedia/bsd-fi.mp /tmp/bsd.gz fug$ gzip -d bsd.gz fug$ nm bsd | grep averunnable d11cd408 B averunnable
良かった。これでddbで遊べそう。
安心した所で、もうひとつloadavgの語句に反応したファイル(
kern_pledge.c
)
が有ったな。調べてみる。
case CTL_VM: switch (mib[1]) { case VM_PSSTRINGS: /* setproctitle() */ case VM_LOADAVG: /* vm.loadavg / getloadavg(3) */ case VM_MALLOC_CONF: /* vm.malloc_conf */ return (0); } break;
どうやら、sysctlに反応する部分だな。それとC言語からも値を取得出来るっ てコメントが入いっている。親切な人達だ。
NAME getloadavg - get system load averages SYNOPSIS #include <stdlib.h> int getloadavg(double loadavg[], int nelem); SEE ALSO uptime(1), sysctl(2), kvm_getloadavg(3)
次々とリンクが出てきて、尽きないなあ。この関数の使用実例は、uptimeを見 てねと暗にほのめかしているよ。
実際は、uptimeとwは似ているんで、コードは、usr.bin/w に有った。この関 係を暴き出すには、locate uptime.1 すれば良い。これは刑事(デカ)の知恵で すよ。
fug$ cd usr.bin/w fug$ ls Makefile pr_time.c uptime.1 w.c extern.h proc_compare.c w.1 fug$ grep getloadavg *.c w.c: if (getloadavg(avenrun, sizeof(avenrun) / sizeof(avenrun[0])) == -1)
コードだけじゃなくて、レシピも見ておいて下さい。有用な情報が載ってます から。
fug$ cat Makefile # $OpenBSD: Makefile,v 1.8 2017/05/30 15:10:48 schwarze Exp $ PROG= w SRCS= pr_time.c proc_compare.c w.c MAN= w.1 uptime.1 DPADD= ${LIBKVM} LDADD= -lkvm LINKS= ${BINDIR}/w ${BINDIR}/uptime .include <bsd.prog.mk>
オイラー的には、kvmをリンクしてる所(loadavgとは関係ないかも、ですが)。