改めて河豚板

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とは関係ないかも、ですが)。


This year's Index

Home