Add install-to-disk.sh, and get the GPU firmware into the initramfs
Some checks failed
build image / build (push) Has been cancelled

Validated by running it on the machine, twice, and inspecting the result.

Two properties of this laptop rule out the obvious approach, and the script
exists mainly to encode them. Its internal UFS reports 4096-byte logical
sectors, so the image — built with 512-byte geometry — cannot be dd'd onto it;
the GPT header and every partition offset would land in the wrong place. And
there are no EFI runtime variables, so efibootmgr cannot register a boot entry
and GRUB has to sit at the removable-media path where the firmware looks
unprompted.

Three things the validation runs caught that review would not have:

rsync is not in the image. I had put it in the build container and never in
the package list, so the first run died at the copy. It now falls back to tar
(--xattrs-include='*', or SELinux labels are silently dropped and the result
does not boot), and rsync is in base.pkgs for the progress output.

Copying a live root makes tar exit non-zero — files change underneath it, and
this machine's clock is wrong besides, so every mtime looks like it is in the
future. With pipefail that aborted the install after the root filesystem and
before /boot, leaving a half-installed disk that looked plausible. Warning-level
exits are now tolerated and only a fatal exit 2 stops the run.

systemd-machine-id-setup keeps an existing valid id, and one had just been
copied off the stick, so the installed system was a clone. The file is removed
first now.

Also: msm_dpu probes ~6s in, while the initramfs is still root, and asks for
qcom/a630_sqe.fw before the real filesystem carrying it is reachable. It never
retries. Adding the Adreno firmware to the initramfs is a few tens of
kilobytes. c630-firmware does the same for the DSP blobs once they exist, since
dracut rejects install_items globs that match nothing.

chrony, because the RTC reads 1970 and nothing was correcting it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XWRjNJMistCy6ngXH5aJLS
This commit is contained in:
2026-07-27 19:23:29 +03:00
parent 482c5d9c9a
commit f0b2d7846a
6 changed files with 334 additions and 31 deletions

View File

@@ -131,10 +131,23 @@ Confirmed on hardware, from a USB stick:
subsystem, WiFi and IPA all appear as platform devices, so
`DEVICE_CMDLINE` and the DTB are right
- The framebuffer console works (`simple-framebuffer`, 240x67)
- The root filesystem mounts and systemd starts
- The root filesystem mounts, systemd starts, and it reaches a login prompt
- Networking works over a USB WiFi dongle, and sshd is reachable
- `build/install-to-disk.sh` copies it onto the internal UFS
Not yet confirmed: reaching a login prompt, and anything past it. SELinux is
shipped permissive — see below.
Not yet confirmed: booting from the internal drive rather than USB.
Onboard WiFi does not appear at all, and audio, sensors, video decode and
accelerated graphics are all absent — every one of them waiting on the
model-signed firmware described in [docs/firmware.md](docs/firmware.md). On
this machine Windows has been wiped, so those blobs are gone; the kernel names
each missing file explicitly in `dmesg`.
The internal drive needs `build/install-to-disk.sh` rather than `dd`: its UFS
uses 4096-byte logical sectors, which the 512-byte image geometry cannot be
written onto directly. See [docs/install.md](docs/install.md).
SELinux is shipped permissive — see below.
### SELinux