ddb

Table of Contents

Windows 11 with sudo

Windows 11に「Sudo」コマンドを追加へ

こんなビックリなニュースを知った。多分WSLを多用してる連中からの、突き 上げがあって、腰を上げたのだろう。便利ならばいいじゃないって風潮があり ありだな。

端末を起動する時、右クリックして、やっと管理者権限のコマンドを実行でき るって、面倒だけどそれなりに安全な方法だな。

それを、古いとぬかして、不確かなsudoでもいいよって、OpenBSDのあの人が 怒り出すぞ。

ddb

河豚板からddbを使って、そのセッションを記事に挙げようとしたんだけど、 msgを取得する方法が不明。そこで思い付いたのが、qemuにOpenBSDを導入して、 そこにシリアル接続出来るようにする。母艦側からは、cuを使ってアクセスす る。何なら、懐かしいkermitでもいいけど。

昔の事で、qemuにOpenBSDを入れる方法を忘れてしまっている。ググったら、 Debugging the OpenBSD kernel via QEMU なんていうジャーナルが出てきた。

シリアルコンソールを使用するケース

OpenBSD 7.1 with qemu

qemu-system-i386 -m 256 -nographic -no-fd-bootchk  \
  -net nic -net user,hostfwd=tcp::2022-:22  \
  -hda disk

これでXが不要な環境(sshしたPuTTyでも)起動して、シリアルな端末が出てく る。

Booting from Hard Disk...
Using drive 0, partition 3.
Loading......
probing: pc0 com0 apm pci mem[639K 254M a20=on]
disk: fd0 hd0+
>> OpenBSD/i386 BOOT 3.65
switching console to com0>> OpenBSD/i386 BOOT 3.65
boot>
 :
OpenBSD/i386 (qemu.my.domain) (tty00)

tty00 って、シリアルな端末だ。

これをrootの.profileに記述しておけばいいのだな。

alias inddb='sysctl -w ddb.trigger=1'

check loadavg

負荷チェックをしようと思って、それには余計なダエモン君は不要だろうと、 止めておいた。最低限のプロセスですよ。

qemu# ps awx
  PID TT  STAT        TIME COMMAND
    1 ??  I        0:01.38 /sbin/init
97694 ??  IU       0:00.36 /sbin/dhcpleased
50895 ??  Ip       0:00.28 dhcpleased: engine (dhcpleased)
33430 ??  IpU      0:00.27 dhcpleased: frontend (dhcpleased)
66697 ??  IpU      0:00.10 /sbin/resolvd
 7692 ??  I        0:00.20 sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups)
81878 00  Sp       0:01.26 -ksh (ksh)
79215 00  R+pU     0:00.09 ps -awx
82694 C0  I+pU     0:00.21 /usr/libexec/getty std.9600 ttyC0
 4586 C1  I+pU     0:00.12 /usr/libexec/getty std.9600 ttyC1
16988 C2  I+pU     0:00.12 /usr/libexec/getty std.9600 ttyC2
19388 C3  I+pU     0:00.15 /usr/libexec/getty std.9600 ttyC3
89302 C5  I+pU     0:00.12 /usr/libexec/getty std.9600 ttyC5

動いてるプロセスは、こんぐらい。

qemu# inddb
Stopped at      db_enter+0x4:   popl    %ebp
ddb> ps
   PID     TID   PPID    UID  S       FLAGS  WAIT          COMMAND
*75354  450847  27546      0  7         0x3                sysctl
 27546   35314      1      0  3    0x10008b  sigsusp       ksh
 89302  320048      1      0  3    0x100083  ttyin         getty
 19388  491507      1      0  3    0x100083  ttyin         getty
 16988  482225      1      0  3    0x100083  ttyin         getty
  4586  457379      1      0  3    0x100083  ttyin         getty
 82694  200001      1      0  3    0x100083  ttyin         getty
  7692  174233      1      0  3        0x88  kqread        sshd
 66697  360121      1      0  3    0x100080  kqread        resolvd
 33430  451837  97694     77  3    0x100092  kqread        dhcpleased
 50895  399023  97694     77  3    0x100092  kqread        dhcpleased
 97694  407659      1      0  3        0x80  kqread        dhcpleased
 19119  487863      0      0  3     0x14200  bored         smr
 62180  190814      0      0  2     0x14200                zerothread
 51716  136139      0      0  3     0x14200  aiodoned      aiodoned
 60545  523191      0      0  3     0x14200  syncer        update
 85846  321198      0      0  3     0x14200  cleaner       cleaner
 51308   82522      0      0  3     0x14200  reaper        reaper
 60060  217625      0      0  3     0x14200  pgdaemon      pagedaemon
 37971   73061      0      0  3     0x14200  bored         wsdisplay0
 31604  455555      0      0  3  0x40014200  acpi0         acpi0
 77343   70439      0      0  3     0x14200  bored         softnet3
 24404   93850      0      0  3     0x14200  bored         softnet2
 67489   28520      0      0  3     0x14200  bored         softnet1
 90443  372434      0      0  3     0x14200  bored         softnet0
 17658  498391      0      0  3     0x14200  bored         systqmp
 10792  447780      0      0  3     0x14200  bored         systq
 85735    8858      0      0  3  0x40014200  bored         softclock
 83536   96226      0      0  3  0x40014200                idle0
 97336  161685      0      0  3     0x14200  kmalloc       kmthread
     1   31227      0      0  3        0x82  wait          init
     0       0     -1      0  3     0x10200  scheduler     swapper
ddb> c
ddb.trigger: 0 -> 1
qemu#

一応ddbのpsでも確認した。それでチェックすると、

qemu# w
 7:08AM  up 16 mins, 1 user, load averages: 0.05, 0.08, 0.08
USER    TTY FROM              LOGIN@  IDLE WHAT
root     00 -                 7:06AM     0 w
qemu# w
 7:28AM  up 36 mins, 1 user, load averages: 0.01, 0.01, 0.00

負荷は、ほぼゼロ。記録係りぐらいは動かすかな。

qemu# cat /etc/rc.conf.local
library_aslr=NO
ntpd_flags=NO
smtpd_flags=NO
# syslogd_flags=NO
sndiod_flags=NO
# cron_flags=NO
slaacd_flags=NO
# pflogd_flags=NO

こんな結果になった。

qemu# w
 7:56AM  up 5 mins, 1 user, load averages: 0.03, 0.23, 0.14
qemu# w
 8:17AM  up 26 mins, 1 user, load averages: 0.00, 0.00, 0.01

最後は、せわしなく動くntpdだけを停止させる。これでほぼデフォなダエモン 君が起動。

qemu$ w
 5:00AM  up 7 mins, 1 user, load averages: 0.00, 0.19, 0.15
qemu$ w
 5:19AM  up 26 mins, 1 user, load averages: 0.00, 0.00, 0.02

一方、ntpdだけを主体に動かすと、

qemu# w
 5:31AM  up 38 mins, 1 user, load averages: 0.21, 0.27, 0.17
qemu# w
 6:53AM  up  2:01, 1 user, load averages: 0.02, 0.01, 0.00
qemu# ntpctl -s all
5/5 peers valid, constraint offset -1s, clock synced, stratum 2

peer
   wt tl st  next  poll          offset       delay      jitter
162.159.200.1 time.cloudflare.com
    1 10  3  632s 1504s        -4.720ms    16.740ms     1.794ms
133.243.238.163 from pool pool.ntp.org
    1 10  1  632s 1514s        -0.263ms    20.114ms     3.743ms
133.243.238.243 from pool pool.ntp.org
 *  1 10  1  769s 1644s        -0.511ms    20.360ms     5.962ms
162.159.200.1 from pool pool.ntp.org
    1 10  3  664s 1542s        -4.429ms    18.171ms     3.060ms
129.250.35.251 from pool pool.ntp.org
    1 10  2  640s 1541s        -0.039ms    17.661ms     4.673ms

linux's ps

ddbからのpsで、普段目にしない情報が出てきてた。リナは余す所なく開陳し てたような気がするんで、見直ししてみる。

BSDスタイル

[sakae@arch ~]$ ps awx
    PID TTY      STAT   TIME COMMAND
      1 ?        Ss     0:02 /sbin/init
      2 ?        S      0:00 [kthreadd]
      3 ?        S      0:00 [pool_workqueue_release]
      4 ?        I<     0:00 [kworker/R-rcu_g]
      :
    401 ?        S      0:00 (sd-pam)
    408 ?        S      0:00 sshd: sakae@pts/0
    411 pts/0    Ss     0:00 -bash
    416 pts/0    S+     0:00 tmux
    418 ?        Ss     0:00 tmux

標準スタイル? 豊富過ぎるオプションに辟易するわ。

[sakae@arch ~]$ ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 06:30 ?        00:00:02 /sbin/init
root           2       0  0 06:30 ?        00:00:00 [kthreadd]
root           3       2  0 06:30 ?        00:00:00 [pool_workqueue_release]
root           4       2  0 06:30 ?        00:00:00 [kworker/R-rcu_g]
root           5       2  0 06:30 ?        00:00:00 [kworker/R-rcu_p]
 :
sakae        492     424  0 06:38 pts/2    00:00:00 man ps
sakae        500     492  0 06:38 pts/2    00:00:00 less

/usr/local/share/doc/qemu

なんて所に、qemuの解説書が、置いてある。最初これを、/var/www/htdocsに コピーして、普通のWEBサーバーから、アクセスしてた。 そんな私製のシステムでも、ググル製のブラウザーでちゃんと日本語に翻訳し てくれた。今迄は、URLをググルに送信して、翻訳結果を受信して表示してる ものとばかり思っていたぞ。chrome自身に翻訳機能が搭載されてるのね。

ちょっと気を良くしたオイラーは、pythonの唯一の使い道、どこでもwebサー バーも試してみる事にした。

alias server='python3 -m http.server 8080'

http://x.x.x.x:8080/ すると、普通のサーバーと遜色の無いコンテンツが返っ てきたよ。

ob$ server
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
x.x.x.x - - [15/Feb/2024 14:04:28] "GET / HTTP/1.1" 200 -
x.x.x.x - - [15/Feb/2024 14:04:29] "GET /_static/pygments.css HTTP/1.1" 200 -
 :

ddb break trace x

よく使うddbのコマンドを試してみる。 まずは、ロード・アベレージを保持してる構造体の確認。32Bitのデータが4個 で一組だ。

ddb> x/d averunnable,4
averunnable:    0
averunnable+0x4:        0
averunnable+0x8:        0
averunnable+0xc:        2048

次は、ロード・アベレージを更新する関数にBPを置く。そしてcontinue。する と、5秒なんて直に過ぎるので、ブレークする。すかさず、バックトレースす る。

ddb> break update_loadavg
ddb> c
Breakpoint at   update_loadavg: pushl   %ebp
ddb> trace
update_loadavg(0) at update_loadavg
softclock_process_tick_timeout(d0ea178c,0) at softclock_process_tick_timeout+0xdd
softclock(0) at softclock+0x87
softintr_dispatch(0) at softintr_dispatch+0x8b
Xsoftclock() at Xsoftclock+0x12
splx(0) at splx+0x23
db_ktrap(1,0,f3a9545c) at db_ktrap+0xe3
trap(f3a9545c) at trap+0x475
calltrap() at calltrap+0xc
db_enter() at db_enter+0x4
ddb_sysctl(f3a954e0,1,cf7fa7a0,f3a954d8,cf7f87a0,4,d1a4a68c) at ddb_sysctl+0xa4
sys_sysctl(d1a4a68c,f3a95550,f3a95548) at sys_sysctl+0x146
syscall(f3a95590) at syscall+0x2a0
Xsyscall_untramp() at Xsyscall_untramp+0xa9
end of kernel

思わぬフォルト発生

ddb> c
panic: uvm_fault(0xd1a9cc30, 0x0, 0, 1) -> e
Stopped at      db_enter+0x4:   popl    %ebp
    TID    PID    UID     PRFLAGS     PFLAGS  CPU  COMMAND
  69071  93527      0         0x3          0    0  sysctl
db_enter() at db_enter+0x4
panic(d0c9d953) at panic+0x76
kpageflttrap(f3a95444,0) at kpageflttrap+0x143
trap(f3a95444) at trap+0x241
calltrap() at calltrap+0xc
sysctl_rdint(d045c930,0,0,0) at sysctl_rdint+0x1f
ddb_sysctl(f3a954e0,1,cf7fa7a0,f3a954d8,cf7f87a0,4,d1a4a68c) at ddb_sysctl+0xb0
sys_sysctl(d1a4a68c,f3a95550,f3a95548) at sys_sysctl+0x146
syscall(f3a95590) at syscall+0x2a0
Xsyscall_untramp() at Xsyscall_untramp+0xa9
end of kernel
https://www.openbsd.org/ddb.html describes the minimum info required in bug
reports.  Insufficient info makes it difficult to find and fix bugs.

もう証拠を残してrebootする鹿。

ddb> boot dump
syncing disks... done
WARNING: not updating battery clock

dumping to dev 1, offset 255
dump 254 253 252 251 250 249 248 247 246 245 244 243 242 241 240 239 238 237 236
  :
14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 succeeded

rebooting...
SeaBIOS (version rel-1.16.2-0-gea1b7a073390-prebuilt.qemu.org)

起動の途中でfsckが走り、それから、証拠の安置が実行された。

/dev/wd0a (60ed7e83506cee69.a): UNREF FILE I=103777  OWNER=root MODE=100444
/dev/wd0a: SIZE=11131 MTIME=Feb 14 21:58 2024  (CLEARED)
/dev/wd0a (60ed7e83506cee69.a): FREE BLK COUNT(S) WRONG IN SUPERBLK (SALVAGED)
/dev/wd0a (60ed7e83506cee69.a): SUMMARY INFORMATION BAD (SALVAGED)
/dev/wd0a (60ed7e83506cee69.a): BLK(S) MISSING IN BIT MAPS (SALVAGED)
/dev/wd0a (60ed7e83506cee69.a): 2157 files, 32352 used, 505023 free (79 frags, )
/dev/wd0a (60ed7e83506cee69.a): MARKING FILE SYSTEM CLEAN
/dev/wd0e (60ed7e83506cee69.e): 11 files, 12 used, 1012707 free (19 frags, 1265)
/dev/wd0e (60ed7e83506cee69.e): MARKING FILE SYSTEM CLEAN
/dev/wd0d (60ed7e83506cee69.d): 22460 files, 502090 used, 1018637 free (421 fra)
/dev/wd0d (60ed7e83506cee69.d): MARKING FILE SYSTEM CLEAN
ddb.console: 0 -> 1
kern.global_ptrace: 0 -> 1
 :
starting RPC daemons:.
savecore: reboot after panic: uvm_fault(0xd1a9cc30, 0x0, 0, 1) -> e
savecore: system went down at Thu Feb 15 15:04:26 2024
savecore: /var/crash/bounds: No such file or directory
savecore: writing core to /var/crash/bsd.0.core
savecore: writing kernel to /var/crash/bsd.0
checking quotas: done.

証拠物件の確認。その時のカーネルと全メモリー内容が保持されるのか。だか ら、swapエリアのサイズは、最低でもメモリー容量(プラスα)が必要って事な んだな。

qemu# cd /var/crash/
qemu# ls -l
total 554600
-rw-------  1 root  wheel          2 Feb 15 15:14 bounds
-rw-------  1 root  wheel   15452101 Feb 15 15:14 bsd.0
-rw-------  1 root  wheel  268304916 Feb 15 15:14 bsd.0.core
-rw-r--r--  1 root  wheel          5 Oct 10 23:41 minfree
qemu# ls -l /bsd
-rwx------  2 root  wheel  15452101 Feb 13 07:53 /bsd

今後もパニくる事が有るだろう。その度に、256Mものメモリーをsaveするんじゃ 無駄だな。せいぜい96Mも有れば十分だろう。

instraction

起動直後にロード・アベレージを再採取。それっぽい値になってるかな。

qemu# w
 3:47PM  up 1 min, 1 user, load averages: 1.28, 0.44, 0.17
qemu# inddb
Stopped at      db_enter+0x4:   popl    %ebp
ddb> x/d averunnable,4
averunnable:    2412
averunnable+0x4:        891
averunnable+0x8:        344
averunnable+0xc:        2048

そして、更新関数の逆アセンブル。何やらチンプンカンプンです。

ddb> x/i update_loadavg,25
update_loadavg: pushl   %ebp
update_loadavg+0x1:     movl    %esp,%ebp
update_loadavg+0x3:     pushl   %edi
update_loadavg+0x4:     pushl   %esi
update_loadavg+0x5:     movl    cpu_info_list,%edi
update_loadavg+0xb:     xorl    %esi,%esi
update_loadavg+0xd:     testl   %edi,%edi
update_loadavg+0xf:     jz      update_loadavg+0x47
update_loadavg+0x11:    jmp     update_loadavg+0x20
update_loadavg+0x14:    int     $3
update_loadavg+0x15:    int     $3
update_loadavg+0x16:    int     $3
update_loadavg+0x17:    int     $3
update_loadavg+0x18:    int     $3
update_loadavg+0x19:    int     $3
update_loadavg+0x1a:    int     $3
update_loadavg+0x1b:    int     $3
update_loadavg+0x1c:    int     $3
update_loadavg+0x1d:    int     $3
update_loadavg+0x1e:    int     $3
update_loadavg+0x1f:    int     $3
update_loadavg+0x20:    pushl   %edi
update_loadavg+0x21:    pushl   $0xd0fd70d0
update_loadavg+0x26:    call    cpuset_isset
update_loadavg+0x2b:    addl    $0x8,%esp
update_loadavg+0x2e:    addl    0x170(%edi),%esi
update_loadavg+0x34:    cmpl    $0x1,%eax
update_loadavg+0x37:    adcl    $0,%esi
update_loadavg+0x3a:    movl    0x190(%edi),%edi
update_loadavg+0x40:    testl   %edi,%edi
update_loadavg+0x42:    jnz     update_loadavg+0x20
update_loadavg+0x44:    shll    $0xb,%esi
update_loadavg+0x47:    imull   $0x75c,averunnable,%eax
update_loadavg+0x51:    imull   $0xa4,%esi,%ecx
update_loadavg+0x57:    addl    %eax,%ecx
update_loadavg+0x59:    shrl    $0xb,%ecx
update_loadavg+0x5c:    movl    %ecx,averunnable
ddb> x/i .,20
update_loadavg+0x5c:    movl    %ecx,averunnable
update_loadavg+0x62:    imull   $0x7de,averunnable+0x4,%eax
update_loadavg+0x6c:    movl    %esi,%ecx
update_loadavg+0x6e:    shll    $0x5,%ecx
update_loadavg+0x71:    leal    0(%ecx,%esi,2),%ecx
update_loadavg+0x74:    addl    %eax,%ecx
update_loadavg+0x76:    shrl    $0xb,%ecx
update_loadavg+0x79:    movl    %ecx,averunnable+0x4
update_loadavg+0x7f:    imull   $0x7f4,averunnable+0x8,%eax
update_loadavg+0x89:    leal    0(%esi,%esi,2),%ecx
update_loadavg+0x8c:    leal    0(%eax,%ecx,4),%eax
update_loadavg+0x8f:    shrl    $0xb,%eax
update_loadavg+0x92:    movl    %eax,averunnable+0x8
update_loadavg+0x97:    pushl   $0x5
update_loadavg+0x99:    pushl   $0xd0ea178c
update_loadavg+0x9e:    call    timeout_add_sec
update_loadavg+0xa3:    addl    $0x8,%esp
update_loadavg+0xa6:    popl    %esi
update_loadavg+0xa7:    popl    %edi
update_loadavg+0xa8:    popl    %ebp
update_loadavg+0xa9:    ret
update_loadavg+0xaa:    int     $3
update_loadavg+0xab:    int     $3
update_loadavg+0xac:    int     $3
update_loadavg+0xad:    int     $3
update_loadavg+0xae:    int     $3
update_loadavg+0xaf:    int     $3
schedcpu:       pushl   %ebp
schedcpu+0x1:   movl    %esp,%ebp
schedcpu+0x3:   pushl   %ebx
schedcpu+0x4:   pushl   %edi
schedcpu+0x5:   pushl   %esi

usefull command

boot sync      Sync disks and reboot.
boot crash     Dump core and reboot.
boot dump      Sync disks, dump core and reboot.
boot halt      Just halt.
boot reboot    Just reboot.
boot poweroff  Power down the machine whenever possible; if
               it fails, just halt.

show struct name [addr]
      Prints the content of the memory at addr as a struct
      name.  Nested structures and bit fields are not
      printed.  Character arrays are printed as bytes.

ちょいと確認

ddb> show struct loadavg averunnable
struct averunnable at 0xd0f597d8 (16 bytes) {ldavg = 2377, fscale = 0x800}
ddb> pp averunnable
averunnable:    {ldavg = 2377, fscale = 0x800}
ddb> p averunnable
d0f597d8

This year's Index

Home