more systemd

Table of Contents

bootせえへん

Thinkpad E560の本体にLubuntuを入れ、外付けのUSB-HDDに河豚板(OpenBSD)を入れている。 河豚板を使う時は、USB-HDDの電源を入れておいて起動すると、USB優先にしてるんで、河豚板 が起動してきてた。が、どうやってもLubuntuしか起動しなくなっちゃたんだ。 何でだ?

パソコンの挙動をじっと見てると、Lubuntuの起動が始まるとUSBのアクセス・ランプが点灯 する。その結果が、これだ。

sakae@lu:apt$ df -h
Filesystem      Size  Used Avail Use% Mounted on
  :
/dev/sdb5       1.2G  1.2G  8.6M 100% /media/sakae/670aae175528e01c
/dev/sdb4       1.2G  1.2G  8.6M 100% /media/sakae/670aae175528e01c1
sakae@lu:apt$ sudo fdisk -l|grep sdb
ディスク /dev/sdb: 149.05 GiB, 160041885696 バイト, 312581808 セクタ
/dev/sdb1             64      1087      1024   512K ef EFI (FAT-12/16/32)
/dev/sdb4  *        1088 312581807 312580720 149.1G a6 OpenBSD

ひょっとして、USBに起動命令が出されるも、レスポンスが返るタイミングが遅いので、 USBは接続されていないとBIOSが認識しちゃってるのかなあ。それで本体側のSDDに起動 命令が送出されてLubuntuが起動。遅れて起動したHDDをLubuntuがマウントしちゃった、 これで理論的には説明がつく、、が、現実にそんな事が起こるものだろうか?

この事象の前に、オイラーが何かしでかしていないか? 胸に手をあてて良く思い出してみれ。

で、関係あるかわからんが、クリチカルっぽいパッケージをアップデートしてるぞ。 grubなんてヤバそうなののアップデートをしてるんだ。

apt update log

記憶より証拠だな。証拠と言えばログだ。

sakae@lu:~$ cd /var/log/apt/
sakae@lu:apt$ ls -l
合計 468
-rw-r--r-- 1 root root  82332  1月 18 07:46 eipp.log.xz
-rw-r--r-- 1 root root 143161  1月 18 07:46 history.log
-rw-r----- 1 root adm  238012  1月 18 07:46 term.log

上から順番に点検していく。キーワードはgrub

sakae@lu:apt$ xz -dc eipp.log.xz | less
  :
Package: grub-pc-bin
Architecture: amd64
Version: 2.12-1ubuntu7.1
APT-ID: 78547
Phased-Update-Percentage: 22
Multi-Arch: foreign
Status: installed
Depends: libc6 (>= 2.38), libdevmapper1.02.1 (>= 2:1.02.36), grub-common (= 2.12-1ubuntu7.1)

ふむ、このファイルは、apt info した時の要約っぽい。

次はヒストリーのログ。

Start-Date: 2025-01-16  14:59:16
Commandline: apt upgrade grub-efi-amd64-bin grub-efi-amd64-signed grub-pc grub-p
c-bin
Requested-By: sakae (1000)
Upgrade: grub-pc-bin:amd64 (2.12-1ubuntu7, 2.12-1ubuntu7.1), grub-efi-amd64-signed:amd64 (1.202+2.12-1ubuntu7, 1.202.2+2.12-1ubuntu7.1), grub-efi-amd64-bin:amd64 (2.12-1ubuntu7, 2.12-1ubuntu7.1), grub2-common:amd64 (2.12-1ubuntu7, 2.12-1ubuntu7.1), grub-common:amd64 (2.12-1ubuntu7, 2.12-1ubuntu7.1), grub-pc:amd64 (2.12-1ubuntu7, 2.12-1ubuntu7.1)
End-Date: 2025-01-16  14:59:31

段々思い出してきたぞ。15日の水曜日はchromeの週間アップデートの日。この時はLubuntuの 使用を避けてOpenBSDを(普通に)使っていたんだ。そして翌日には、chromeの配布を ゆき渡っているだろうってんでアップデートしたんだな。 そしたら、上記が取り残されてしまったんで、個別に更新した。以後、OpenBSDを起動 しようとしたら、駄目になってた。それが、日曜日の午後の事。

もう一つのログterm.logを点検。

.../0-grub2-common_2.12-1ubuntu7.1_amd64.deb を展開する準備をしています ...
grub2-common (2.12-1ubuntu7.1) で (2.12-1ubuntu7 に) 上書き展開しています ...
.../1-grub-pc_2.12-1ubuntu7.1_amd64.deb を展開する準備をしています ...
grub-pc (2.12-1ubuntu7.1) で (2.12-1ubuntu7 に) 上書き展開しています ...
.../2-grub-pc-bin_2.12-1ubuntu7.1_amd64.deb を展開する準備をしています ...
grub-pc-bin (2.12-1ubuntu7.1) で (2.12-1ubuntu7 に) 上書き展開しています ...
.../3-grub-common_2.12-1ubuntu7.1_amd64.deb を展開する準備をしています ...
grub-common (2.12-1ubuntu7.1) で (2.12-1ubuntu7 に) 上書き展開しています ...
.../4-grub-efi-amd64-signed_1.202.2+2.12-1ubuntu7.1_amd64.deb を展開する準備をし
ています ...
  :
grub-efi-amd64-signed (1.202.2+2.12-1ubuntu7.1) を設定しています ...
Installing grub to /boot/efi.
Installing for x86_64-efi platform.
Installation finished. No error reported.
install-info (7.1-3build2) のトリガを処理しています ...
man-db (2.12.0-4build2) のトリガを処理しています ...
Log ended: 2025-01-16  14:59:31

なる程、こんなターミナルに流れる奴もログしてくれてるのか。

少しgrubの勉強。

Ubuntuの標準ブートローダーであるGRUBを改めて見直す

/etc/default/grubを編集してメニューを出すように設定してみた。 情報量0のアイコン表示は避けて、テキスト表示を積極的にしてます。

sakae@lu:~$ grep '^[A-Z]' /etc/default/grub
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR='Ubuntu'
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX=""

そして更新する

sakae@lu:default$ sudo update-grub
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/lubuntu-grub-theme.cfg'
Generating grub configuration file ...
Found theme: /usr/share/grub/themes/lubuntu-grub-theme/theme.txt
Found linux image: /boot/vmlinuz-6.8.0-51-generic
Found initrd image: /boot/initrd.img-6.8.0-51-generic
Found linux image: /boot/vmlinuz-6.8.0-41-generic
Found initrd image: /boot/initrd.img-6.8.0-41-generic
Found memtest86+ 64bit EFI image: /boot/memtest86+x64.efi
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
Adding boot menu entry for UEFI Firmware Settings ...
done

more systemd

前回からの続きで、もう少しsystemdします。こやつダエモン君だな。直接手を下せないので systemctl と言うインターフェース・コマンドを介して色々と要求を出す。

systemdの思想と機能 内容が多岐に渡るので、こんなムック本が出版されている。 けど、別に専門家になりたい訳でもない通りすがりの人なら、

systemd - サーバ構築、運用時によく使うコマンド、TIPS

第10章 systemd によるサービス管理

こういう所を見ておけば十分だろう。

オイラーが知りたいのは、システムのシャットダウンと共に電源断を依頼した時に どんな事が起きるはずかって仕組みだ。手始めに、 shutdownコマンドは昔のなごり(今はsystemd) こんなのを見付けた。

systemctlから追跡していったら、途中で迷子になりました。そこで方針を変更して 直接、systemd(1)します。

SIGHUP
    Reloads the complete daemon configuration. This is mostly
    equivalent to systemctl daemon-reload.
 :
SIGRTMIN+4
    Powers off the machine, starts the poweroff.target unit. This is
    mostly equivalent to systemctl start poweroff.target
    --job-mode=replace-irreversibly.

kill -HUP 1 とかと同一なレベルで電源断の信号線が用意されてた。このシグナル名を 頼りに追跡していったら、こんな所に到達。

systemd-255.4/src/nspawn/nspawn-stub-pid1.c

} else if (state == STATE_POWEROFF)
        (void) reboot(RB_POWER_OFF); /* if this fails, fall back to normal exit. */

出たなシステムコール!! reboot(2)からシンボルを抽出して、それで検索したる。

into kernel

普通に man reboot すると、

POWEROFF(8)                        poweroff                        POWEROFF(8)

NAME
       poweroff, reboot, halt - Power off, reboot, or halt the machine

SEE ALSO
       systemd(1), systemctl(1), shutdown(8), wall(1)

こんな風に、systemdの片割れのマニュアルが出てきてしまう。更に困った事に関連 コマンドにも案内が無い。カーネルなんて手を出すもんじゃないから、抑止してるんだな。 確信が有るなら、man -S 2 reboot してみよう。

reboot(2)                     System Calls Manual                    reboot(2)

NAME
       reboot - reboot or enable/disable Ctrl-Alt-Del
       :
       LINUX_REBOOT_CMD_POWER_OFF
              (RB_POWER_OFF,  0x4321fedc;  since  Linux  2.1.30).  The message
              "Power down." is printed, the system is stopped, and  all  power
              is  removed  from the system, if possible.  If not preceded by a
              sync(2), data will be lost.

検索ワードが出てきたんで、それでカーネルソース内を探索。

sakae@lu:linux-6.8.0$ grep LINUX_REBOOT_CMD_POWER_OFF -r .
./include/uapi/linux/reboot.h:#define   LINUX_REBOOT_CMD_POWER_OFF      0x4321FEDC
./arch/alpha/kernel/sys_miata.c:        case LINUX_REBOOT_CMD_POWER_OFF:
./arch/alpha/kernel/process.c:  common_shutdown(LINUX_REBOOT_CMD_POWER_OFF, NULL);
./arch/alpha/kernel/sys_nautilus.c:     case LINUX_REBOOT_CMD_POWER_OFF:
./arch/alpha/kernel/sys_alcor.c:        case LINUX_REBOOT_CMD_POWER_OFF:
./tools/include/nolibc/types.h:#define RB_POWER_OFF    LINUX_REBOOT_CMD_POWER_OFF
./kernel/pid_namespace.c:       case LINUX_REBOOT_CMD_POWER_OFF:
./kernel/reboot.c: * reboot when the reboot call was invoked with LINUX_REBOOT_CMD_POWER_OFF, but
./kernel/reboot.c:      if ((cmd == LINUX_REBOOT_CMD_POWER_OFF) && !kernel_can_power_off()) {
./kernel/reboot.c:      case LINUX_REBOOT_CMD_POWER_OFF:

arch毎に分かれているかと思ったらそうなっていない。いやな予感がするぞ。 何故か? それぞれのマシン毎に事情が有るはずなんだけど、それがarchに反映 されていないから。まあ、先に進もう。

void kernel_power_off(void)
{
        kernel_shutdown_prepare(SYSTEM_POWER_OFF);
        do_kernel_power_off_prepare();
        migrate_to_reboot_cpu();
        syscore_shutdown();
        pr_emerg("Power down\n");
        kmsg_dump(KMSG_DUMP_SHUTDOWN);
        machine_power_off();

マシン毎ってのが出てきそうな手続が有ったぞ。

sakae@lu:linux-6.8.0$ grep machine_power_off -r .
  :
./arch/x86/kernel/reboot.c:static void native_machine_power_off(void)
./arch/x86/kernel/reboot.c:     .power_off = native_machine_power_off,
./arch/x86/kernel/reboot.c:void machine_power_off(void)
./arch/x86/xen/enlighten_pv.c:static void xen_machine_power_off(void)
./arch/x86/xen/enlighten_pv.c:  .power_off = xen_machine_power_off,

やっと、それっぽいのに出会った。

static void native_machine_power_off(void)
{
        if (kernel_can_power_off()) {
                if (!reboot_force)
                        machine_shutdown();
                do_kernel_power_off();
        }
        /* A fallback in case there is no PM info available */
        tboot_shutdown(TB_SHUTDOWN_HALT);
}

折角糸口を見付けたんだけど、あちこち引き廻されてしまい、まともな神経の人は 神経衰弱になっちまうぞ。

linux-6.8.0/drivers/acpi/sleep.c あたりに、それっぽいコードが表われているけど、 ハンドラーに登録してムニャムニャでよー解らん。

into FreeBSD

軸足をFreeBSDに移してみる。13.5が頑張ってリリースされるそうなので、取りあえず13.4 をソース付きでインストールした。そして賺さず、TAGSを作成しておいた。リナでは、 こういう事は容易にできないだろう。で、ざっと見する。 dev/acpica/acpi.c

static void
acpi_shutdown_final(void *arg, int howto)
{
    :
    if ((howto & RB_POWEROFF) != 0) {
        status = AcpiEnterSleepStatePrep(ACPI_STATE_S5);
        if (ACPI_FAILURE(status)) {
            device_printf(sc->acpi_dev, "AcpiEnterSleepStatePrep failed - %s\n"\,
                AcpiFormatException(status));
            return;
        }
        device_printf(sc->acpi_dev, "Powering system off\n");
        intr = intr_disable();
        status = AcpiEnterSleepState(ACPI_STATE_S5);

次は、これかな。さすがにこのあたりになると、寄贈品をそのまま利用してるな。 contrib/dev/acpica/components/hardware/hwxfsleep.c

/******************************************************************************\
*
 *
 * FUNCTION:    AcpiEnterSleepState
 *
 * PARAMETERS:  SleepState          - Which sleep state to enter
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Enter a system sleep state
 *              THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED
 *
 ******************************************************************************\
/

ACPI_STATUS
AcpiEnterSleepState (
    UINT8                   SleepState)
{
     :
    Status = AcpiHwSleepDispatch (SleepState, ACPI_SLEEP_FUNCTION_ID);
    return_ACPI_STATUS (Status);

ちゃんと注意書きがしてある。電源を断するってのは、OSの動作を退行させる行為だ。 だから、プロセスを全部停止、マウントを全部解除、シングルユーザーになって、誰にも 邪魔されないようにして、念のために割り込み禁止。そしてやっと電源を切断できる。 更に追跡すると、AcpiHwSleepDispatchの中で

Status = SleepFunctions->ExtendedFunction (SleepState);

ここから先は、コンパイラーがドウタラで意味不な領域になるんで、追跡中止かな。 インテルさんたら困ったものだ。

Pixel 8a

女房がスマホをupgradeした。携帯屋から(ほぼ)無料で提供を受けた楽々スマホでは 機能が限定すぎて、やりたい事が出来ないって、ほざいていた。よくもまあ、あんな チンケな画面を眺められるもんだ。

オイラーもちょっと、ご相伴に与ったぞ。アイコンだらけの画面。なにこれ、石器 時代の象形文字じゃん。まずは、ステータスの確認だな。さっぱり分からん。

Android スマホの上のアイコンは何のマーク?

どこかに、機種固有のアイコン辞書ってないものか? 本屋に走ってスマホ本を眺めてきた。オイラーは70代だから、70歳からのスマホ入門って 本を眺めればいいんだな。60歳、65歳からのってのも有ったけど何が違うの。ヨーするに 年寄って表示できないから、ボカしてるんだな。

Lubuntuは無料なのに、しっかり取説が付属してるぞ。スマホは有料のくせに、マニュアルも 付いていない欠陥商品です。それが当たり前に通用しちゃう風潮ってどうよ。消費者は 舐められた物である。

それから、インストールされてるアプリがズラーと出てくるのもどうよ。少し整理したら 探しやすいと思うぞ。Lubuntuのメニューはきちんとカテゴリー分けされてるぞ。

下側のアイコンも大事そうなので、調査。

真ん中の〇マーク   cd
左向きの▲マーク   back
右下にある■マーク history

こんな理解でいいのかなあ? cdしてホームに復帰するのはいいけど、それまで動いて いたアプリは、ずっと稼動したまま? ps awx; kill -TERM PID に相当する事をいの一番 に習得しときたいぞ。

知っているようで意外と知らないスワイプの便利な操作方法

70 old ? how to use

活用ヒント by google

通知が飛んできた。Android 15 の用意ができましたからアップデートしてくださいって。 容量が2.6Gとの事。人知れずDLしてたんだな。歯車アイコンのあたりでウロウロしてて、 やっと糸口をつかめた。upgradeを実施すると、rebootが実行されて、15になってた。 長い時間待たせるのは失礼なんで、展開されてる15にポインターを貼り変えるだけ なんだな。Lubuntuは3.6Gを真面目にその場でDISKに転送してるから時間がかかる。 ちょっとした工夫だけど、イライラ防止にはなるな。

フリック入力、慣れるまで面倒だな。慣れてしまえばJK並みな高速入力が出来る様に なるんだろうけど。いや、どうせなら音声入力だろうよ。合言葉は、ヘイ、グーグル な のかな。

Android 15 is released to AOSP

Android (オペレーティングシステム)

README

サバイバルファミリー

なんて本を読んだ。奇想天外で、世の中の一切かっさいの電気が使用不能になる。 念を入れてバッテリーも動作しない。だから、車も飛行機もガラクタ扱い。

こんなんで生活できるのか? もちろんNO。流通がダメでしょ。スーパーに 走って、買いだめしようとしたら、スマホ決済できません。現金のみです。 食料高騰。それより大事なのは水ですよ。

そこら辺の水を飲んじゃうと下痢しちゃう。そんな時の為に携帯用の浄水器を 準備しましょう。無ければバッテリーの補充液も飲めるそうです。 それから、釣った魚は一夜干しにしましょう。その為には、それ用のネットを 用意しましょう。排泄物はシャベルで穴を掘って自然に返してあげましょう。 たき火をするには、ファイヤー・スターターが必需品。東急ハンズあたりで 調達しておきましょう。らしいです。

この騒動に巻き込まれた一家は東京を脱出して、実家のある鹿児島に向かう。 その過程が克明に描写され、上記のような蘊蓄となっている。途中SL山口号が 登場したりして、ああSLは石炭と水が有れば走行できるんだなあ、なんて気づく 塩梅だ。SFチックだけど、面白かったよ。


This year's Index

Home