inetd

Table of Contents

FreeBSD on VMWare

以前、FreeBSDを一歩前へって事で、ブリッジモードの設定をVMWareに施した。 が、その設定で使っていると、何度かネットワークが不通になる現象に見舞れ た。こうなってしまうと、Windows10を普通にrebootするか、コールド・ブート(シフトキーを押しな がら、再起動)するしか、回復の手段が無い。これって、多分、糞Windowsのせ いだと思うぞ。

緊急な時はネットワークの使用を諦め(ssh login出来ないので)、シリアル接 続で我慢してる。が、このTeraTermでは、微妙に画面サイズが小さい。 サイズを大きくしておいて、resizewinコマンドを叩けば、新画面サイズを shellが認識してくれる。こんなコマンドは、.profileを見ていて発見した。 怪我の功名である。

talkの補習

そもそも、talkに目をつけたのは、cursesを使っているアプリって事で、検索 したのが、始まりだった。さっぱりcursesしてなかったので、すこし探検。

display.c

/*
 * Display a symbol on somebody's window, processing some control
 * characters while we are at it.
 */
void
display(xwin_t *win, wchar_t *wc) {
        switch (*wc) {
          :
        case 025:       /* ^U */
kill:
                wmove(win->x_win, win->x_line, 0);
                wclrtoeol(win->x_win);
                getyx(win->x_win, win->x_line, win->x_col);
                wrefresh(win->x_win);
                return;

        case L'\f':
                if (win == &my_win)
                        wrefresh(curscr);
                return;

これ、特殊文字のハンドリングの一部。この関数を呼出してるのは、io.c

/*
 * The routine to do the actual talking
 */
void
talk(void) {
         :
        for (;;) {
                fds[0].fd = fileno(stdin);
                fds[0].events = POLLIN;
                fds[1].fd = sockt;
                fds[1].events = POLLIN;
                nb = poll(fds, 2, INFTIM);

                if (fds[1].revents & POLLIN) {
                        w = fgetwc(sockfp);
                        display(&his_win, &w);

                if (fds[0].revents & POLLIN) {
                        if ((w = getwchar()) != WEOF) {
                                display(&my_win, &w);
                                (void )fputwc(w, sockfp);
                                (void )fflush(sockfp);

パケットかキー入力が有るかを、pollで監視し(リナならselectを使うらしい)、 それにより、処理を振り分けている。キー入力の場合は、そのデータを相手側 に届ける為、fputwc,fflushも呼出ている。

dialog

もう一つ、強烈にcursesをFreeBSDは利用している。そう、FreeBSDを使い始め る最初の一歩目からね。 /usr/src/release/rc.localの一節。

dialog --backtitle "FreeBSD Installer" \
       --title "Welcome" \
       --extra-button \
       --extra-label "Shell" \
       --ok-label "Install" \
       --cancel-label "Live CD" \
       --yesno "Welcome to FreeBSD! Would you like to begin an installation or use the live CD?" 0 0

リナの上で実行しても大丈夫だよ。決っしてFreeBSDが乗っ取りを初める事は 無いから。但し、dialogってコマンドは必要だけど。

インストールを選択すると、bsdinstallに実行はバトンタッチされる。下記は その一節で、初期の内蔵時計の時刻合わせの部分だ。

sakae@fb:/usr/src/usr.sbin/bsdinstall/scripts $ cat time
# Set time
exec 3>&1
TIME=$(dialog --backtitle 'FreeBSD Installer' \
        --title 'Time & Date' \
        --ok-label 'Set Time' \
        --cancel-label 'Skip' \
        --defaultno \
        --time-format '%H%M.%S' \
        --timebox '' 2 40 \
2>&1 1>&3) && date $TIME
exec 3>&-

簡易な説明は、dialog –helpで得られる。 詳細なマニュアルは、先人の努力で、こちらで公開されている。 dialog (jman)

OpenBSDだとデフォではインストールされていないので、misc/dialogを横目で 見てから入れる。本家は下記。

https://invisible-island.net/dialog/dialog.html

サンプルが大量に付属しているので、GUIはイヤだけど、それっぽい事をした い場合の参考になるだろう。

┌────────────Time & Date───────────────┐
│                                      │
│           ┌──┐ ┌──┐ ┌──┐             │
│           │07│:│02│:│45│             │
│           └──┘ └──┘ └──┘             │
│                                      │
├──────────────────────────────────────┤
│       <Set Time>    <  Skip  >       │
└──────────────────────────────────────┘

陰影が付いていないけど、これが正解。一見GUIっぽく見えるけど、中身はテ キストだ。VGAな端末と違って、自由にコピペ出来る。

lqqqqqqqqqqqqTime & Dateqqqqqqqqqqqqqqqk
x                                      x
x           lqqk lqqk lqqk             x
x           x07x:x03x:x10x             x
x           mqqj mqqj mqqj             x
x                                      x
tqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqu
x       <Set Time>    <  Skip  >       x
mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj

使う端末によっては、枠が文字化けする場合が有る。そんな時は、 –ascii-lines のオプションを追加すれば良い。

+------------Time & Date---------------+
|                                      |
|           +--+ +--+ +--+             |
|           |07|:|04|:|38|             |
|           +--+ +--+ +--+             |
|                                      |
+--------------------------------------+
|       <Set Time>    <  Skip  >       |
+--------------------------------------+

nc

前回は、クラサバの基本をやった。一から作る必要なんて、全くなくてWeb用 なんかだと、curlなんていう特化したアプリが提供されてる。 これブラウザーと同様にアグレッシブに開発されているせいか、CVE番号を貰っ て改修にいそしむ事が多いな。余り近付きたくないアプリだ(個人の感想です)。

でも、もっと汎 用化したものが欲しい。煩悩は無限ですから。。。ncを使ってOK。

ob$ nc -l 23238
hello
I'm Server

サーバーは、ポート番号 23238 で、接続を待ちます。

ob$ nc localhost 23238
hello
I'm Server

クライアントは、サーバーに接続しに行きます。一度接続が確立すると、サー バー側からも、データを送信できます。

ob$ printf "GET / HTTP/1.0\r\n\r\n" | nc fb 8080
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.9.18
Date: Wed, 27 Mar 2024 20:59:06 GMT
 :

こんな具合に、Webサーバーからもデータを引き出せます。

この道具を利用して何をやるか? そう、inetdが自前で提供してるサーバー をつついてみたいんです。

rfc 867

いにしえの、インターネットの試験プロトコルである。

UDP Based Daytime Service

   Another daytime service service is defined as a datagram based
   application on UDP.  A server listens for UDP datagrams on UDP port
   13.  When a datagram is received, an answering datagram is sent
   containing the current date and time as a ASCII character string (the
   data in the received datagram is ignored).

/etc/inetd.confで下記を有効にしておく。勿論、inetdの再起動が必要。

daytime dgram   udp     wait    root    internal
time    stream  tcp     nowait  root    internal
sakae@fb:/tmp $ nc -u fb 13
;; Hit RET
Wed Mar 27 07:15:13 2024
;; Hit RET
Wed Mar 27 07:15:16 2024
^C

UDPでの接続には、-u が必要。それからポート番号には、名前(この場合 daytime)は使えないみたい。

rfc 868

次も同じようなやつだけど、機械可読バージョンね。ntpdateが無い時代には、 これを利用して、マシンの時計を合わせていたとか。

Time Protocol

When used via UDP the time service works as follows:

   S: Listen on port 37 (45 octal).

   U: Send an empty datagram to port 37.

   S: Receive the empty datagram.

   S: Send a datagram containing the time as a 32 bit binary number.

   U: Receive the time datagram.

   The server listens for a datagram on port 37.  When a datagram
   arrives, the server returns a datagram containing the 32-bit time
   value.  If the server is unable to determine the time at its site, it
   should discard the arriving datagram and make no reply.

inetdのソースを読むと、重要な注意書きが出てきた。

/*
 * RFC738/868 Time Server.
 * Return a machine readable date and time, in the form of the
 * number of seconds since midnight, Jan 1, 1900.  Since gettimeofday
 * returns the number of seconds since midnight, Jan 1, 1970,
 * we must add 2208988800 seconds to this figure to make up for
 * some seventy years Bell Labs was asleep.
 */

rfcではUDPでの提供って事になってたけど、inetd.confを見たらTCPもサポー トしてたので、-u 無して接続。

sakae@fb:/tmp $ nc fb 37 >Z
;; Hit RET
sakae@fb:/tmp $ hd Z
00000000  e9 ad c5 b7                                       |....|

得られるデータはバイナリー。しかも70年分の下駄を履いている。そこでgdb を利用して、混合演算。まあ、calc/emacsでもいいけど。

sakae@fb:/tmp $ gdb -q
(gdb) p (0xe9adc5b7 - 2208988800)
$1 = 1711490871
(gdb) q
sakae@fb:/tmp $ date -r 1711490871
Wed Mar 27 07:07:51 JST 2024

chargen

CHARGENプロトコル

これを見ると、文字列をドンドコ生成して、送付してくる、とっても迷惑にな るかも知れない機能。昔は、おおらかだったんすね。

inetd

inetdがどんな仕組みで動いているか? 幸いな事に、debugモードが用意され てる。それをonにして起動すると、ダエモンにならずに、端末に貼り付いて、 逐次状況を報告してくれる。

root@fb:~ # inetd -d
ADD : ssh proto=tcp accept=1 max=0 user=root group=(null)class=daemon builtin=0x0 server=/usr/sbin/sshd policy=""
inetd: ssh/tcp: ipsec initialization failed; in entrust
inetd: ssh/tcp: ipsec initialization failed; out entrust
inetd: enabling ssh, fd 4
inetd: registered /usr/sbin/sshd on 4
ADD : ntalk proto=udp accept=0 max=1 user=tty group=ttyclass=daemon builtin=0x0 server=/usr/libexec/ntalkd policy=""
inetd: ntalk/udp: ipsec initialization failed; in entrust
inetd: ntalk/udp: ipsec initialization failed; out entrust
inetd: enabling ntalk, fd 5
inetd: registered /usr/libexec/ntalkd on 5
ADD : daytime proto=udp accept=1 max=1 user=root group=(null)class=daemon builtin=0x40cd34 server=internal policy=""
inetd: daytime/udp: ipsec initialization failed; in entrust
inetd: daytime/udp: ipsec initialization failed; out entrust
inetd: enabling daytime, fd 6
inetd: registered internal on 6
ADD : time proto=tcp accept=1 max=0 user=root group=(null)class=daemon builtin=0x40ccf8 server=internal policy=""
inetd: time/tcp: ipsec initialization failed; in entrust
inetd: time/tcp: ipsec initialization failed; out entrust
inetd: enabling time, fd 7
inetd: registered internal on 7

ここまでは、起動時の所業。下記は、利用時の状況。

inetd: someone wants daytime
inetd: someone wants time
inetd: accept, ctrl 9
inetd: someone wants ssh
inetd: accept, ctrl 9
inetd: 1449 execl /usr/sbin/sshd
inetd: handling signal flag 20
inetd: 1449 reaped, status 255
inetd 1447 - - /usr/sbin/sshd[1449]: exited, status 255
inetd: someone wants ntalk
inetd: 1460 execv /usr/libexec/ntaldk 

TODO

冒頭でWindowsがらみ(と思われる)VMWareの不具合を嘆いた。 約2週間のうちに、23回余りFreeBSDを使用してる。その間に2回の不具合。 また発生するか も知れないので、心構えをしておく。

1. ifconfig,resolv.confは正しいか?
2. Routing tables は、正しいか? (netstat -rn4)
3. ping localhostに応答するか?
4. ping ob はどうか?
5. OpenBSDからのping fb はどうか?
6. arp -a は、fb,obの両者で確認せよ
7. 現象発現時、NATモードで動作させてるArchLinuxは大丈夫か
8. tcpdumpでパケットを精査してみる

こんな所かな。多分、Debian/WSL2とかが誘引になってるかと想像してて、ガ シガシ並行動作させてるんだけど、発現しない。災害は突然発生するって、地 震と一緒かな。

そうだ、マーフィーの法則の適用って出来ないものかしら。

ChatGPT

"あっぱれ 日本の新発明" なんて本を読んだ。NICTの成果を紹介したブルーバッ クスと言う科学系の文庫本。その中で、磁気冷却やら光格子時計の解説が出て た。光格子時計の重要な技術要素である、レーザー冷却ってどんな技術か知ら なかったので、聞いてみた。

Q: レーザー冷却とは、どんな技術ですか?3,000文字で説明してください

A: レーザー冷却は、物体を非常に低温に冷却するための革新的な技術です。この技術は、原子や分子の熱運動を利用して物体の温度を下げる方法を採用しています。通常の冷却技術では到達できない極低温領域に到達することが可能であり、さまざまな科学や工学の分野で革新的な応用が期待されています。

レーザー冷却の原理は、レーザー光の特性を利用しています。レーザー光は、光子と呼ばれる光の粒子が集まってできており、光子は物体の表面に当たるとそのエネルギーを物体に伝達します。しかし、通常の光は物体の温度を上げる傾向があります。レーザー冷却では、特定の原子や分子を標的としてレーザー光を照射し、その原子や分子が特定のエネルギー準位にジャンプすることを利用しています。

レーザー冷却の過程は、いくつかの段階で構成されています。最初の段階では、レーザー光を用いて原子や分子を励起状態に導きます。次に、励起された原子や分子が周囲の物体やガスと衝突することでエネルギーを失い、低エネルギーの状態に戻ります。この際、エネルギーが物体全体の運動エネルギーとして分散され、物体全体の温度が下がります。このプロセスを繰り返すことで、物体の温度を徐々に低下させることが可能となります。

レーザー冷却の最も有名な例の一つは、1997年にエリック・コーネルとカール・ヴァイマンによって開発されたボース=アインシュタイン凝縮(Bose-Einstein Condensate, BEC)です。この実験では、レーザー光を用いて原子を冷却し、ボース=アインシュタイン凝縮を達成しました。BECは、物質波の性質を示す超冷却原子の状態であり、量子物理学や原子物理学の研究に革命をもたらしました。

レーザー冷却技術は、その精密さと効率性から、さまざまな科学分野で応用されています。例えば、原子時計や量子コンピューターの開発において、原子やイオンの冷却が不可欠です。また、宇宙船の推進や光トラップの開発など、宇宙工学の分野でも重要な役割を果たしています。さらに、医学や生物学においても、生体組織や細胞の冷却が細胞保存や生理学研究に利用されています。

しかしながら、レーザー冷却技術にはいくつかの課題も存在します。例えば、レーザー冷却に使用されるレーザーの制御や安定性、原子や分子の状態を正確に制御するための精密な装置が必要です。また、一部の物質はレーザー冷却に対して反応性が高く、効果的な冷却を妨げることがあります。

総括すると、レーザー冷却は現代の科学技術における重要な革新の一つであり、その応用範囲は広範囲にわたります。将来的には、より効率的な冷却技術の開発や新たな応用領域の発見が期待されています。

Q: 温度はどのように定義されていますか?

A: 温度は物体の熱運動の度合いを表す物理量であり、その定義はいくつかの方法で行われます。最も一般的な温度の定義は、統計力学や熱力学の観点からの定義です。

  1. **統計力学的定義**: 統計力学的定義では、温度は物体の微視的な状態やエネルギーの分布に関連付けられます。物体内の粒子(原子や分子など)のエネルギー分布は、温度に応じて変化します。統計力学的な視点では、温度は物体内の粒子の平均運動エネルギーに比例します。すなわち、温度が高いほど粒子の平均運動エネルギーも高くなります。
  2. **熱力学的定義**: 熱力学的定義では、温度は熱平衡の状態における物体間のエネルギーの流れの方向を規定します。二つの物体が熱平衡にあるとき、それらの物体の間には熱のネットの流れは発生しないとされます。このとき、二つの物体の温度は等しくなります。熱力学的な定義では、統計力学的な定義に基づいて温度を解釈し、熱平衡の状態において物体の間でのエネルギーのやり取りを定量化します。

一般的に、温度はケルビン(K)単位で表されます。絶対温度スケールでは、絶対零度が0Kと定義され、これは理論的に物体の分子運動が完全に停止する温度です。絶対温度スケールを使用することで、物体の温度を統一的かつ正確に表現することができます。

このように、温度の定義は統計力学と熱力学の両方の理論に基づいており、物体の熱的な性質を理解する上で重要な概念です。

【光格子時計】次世代の原子時計を未来のインフラに活用する構想

「冷やすメカニズム」を根底から変える「磁気冷凍」の凄い技術


This year's Index

Home