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
こういう所を見ておけば十分だろう。
オイラーが知りたいのは、システムのシャットダウンと共に電源断を依頼した時に どんな事が起きるはずかって仕組みだ。手始めに、 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した。携帯屋から(ほぼ)無料で提供を受けた楽々スマホでは 機能が限定すぎて、やりたい事が出来ないって、ほざいていた。よくもまあ、あんな チンケな画面を眺められるもんだ。
オイラーもちょっと、ご相伴に与ったぞ。アイコンだらけの画面。なにこれ、石器 時代の象形文字じゃん。まずは、ステータスの確認だな。さっぱり分からん。
どこかに、機種固有のアイコン辞書ってないものか? 本屋に走ってスマホ本を眺めてきた。オイラーは70代だから、70歳からのスマホ入門って 本を眺めればいいんだな。60歳、65歳からのってのも有ったけど何が違うの。ヨーするに 年寄って表示できないから、ボカしてるんだな。
Lubuntuは無料なのに、しっかり取説が付属してるぞ。スマホは有料のくせに、マニュアルも 付いていない欠陥商品です。それが当たり前に通用しちゃう風潮ってどうよ。消費者は 舐められた物である。
それから、インストールされてるアプリがズラーと出てくるのもどうよ。少し整理したら 探しやすいと思うぞ。Lubuntuのメニューはきちんとカテゴリー分けされてるぞ。
下側のアイコンも大事そうなので、調査。
真ん中の〇マーク cd 左向きの▲マーク back 右下にある■マーク history
こんな理解でいいのかなあ? cdしてホームに復帰するのはいいけど、それまで動いて いたアプリは、ずっと稼動したまま? ps awx; kill -TERM PID に相当する事をいの一番 に習得しときたいぞ。
通知が飛んできた。Android 15 の用意ができましたからアップデートしてくださいって。 容量が2.6Gとの事。人知れずDLしてたんだな。歯車アイコンのあたりでウロウロしてて、 やっと糸口をつかめた。upgradeを実施すると、rebootが実行されて、15になってた。 長い時間待たせるのは失礼なんで、展開されてる15にポインターを貼り変えるだけ なんだな。Lubuntuは3.6Gを真面目にその場でDISKに転送してるから時間がかかる。 ちょっとした工夫だけど、イライラ防止にはなるな。
フリック入力、慣れるまで面倒だな。慣れてしまえばJK並みな高速入力が出来る様に なるんだろうけど。いや、どうせなら音声入力だろうよ。合言葉は、ヘイ、グーグル な のかな。
README
なんて本を読んだ。奇想天外で、世の中の一切かっさいの電気が使用不能になる。 念を入れてバッテリーも動作しない。だから、車も飛行機もガラクタ扱い。
こんなんで生活できるのか? もちろんNO。流通がダメでしょ。スーパーに 走って、買いだめしようとしたら、スマホ決済できません。現金のみです。 食料高騰。それより大事なのは水ですよ。
そこら辺の水を飲んじゃうと下痢しちゃう。そんな時の為に携帯用の浄水器を 準備しましょう。無ければバッテリーの補充液も飲めるそうです。 それから、釣った魚は一夜干しにしましょう。その為には、それ用のネットを 用意しましょう。排泄物はシャベルで穴を掘って自然に返してあげましょう。 たき火をするには、ファイヤー・スターターが必需品。東急ハンズあたりで 調達しておきましょう。らしいです。
この騒動に巻き込まれた一家は東京を脱出して、実家のある鹿児島に向かう。 その過程が克明に描写され、上記のような蘊蓄となっている。途中SL山口号が 登場したりして、ああSLは石炭と水が有れば走行できるんだなあ、なんて気づく 塩梅だ。SFチックだけど、面白かったよ。