Spike (read-only probe, tools/physdisk_probe.py): the agent-side walk (partition -> disk, dm/LVM slaves, loop -> backing file) names the right physical disk for one-disk boxes, two disks, two partitions of one disk and a pass-through USB bridge; inside a VM (Tester 1) every disk is "unknown". Today's agent lists whole disks only and calls an empty partition table "data-bearing"; the controller's Tier-2 "different disk" is st_dev. sys_drive is a folder of mp0 (backup=1), so the design gives one-disk boxes a separate internal data place outside the whole-guest copy instead. Draft only; waits on the operator's rulings D1-D6 (16 section 12). 07 section 6.1's stale mp1 cell corrected. Register 163 -> 169. Scratch loop disk and Tester 1 scratch disk removed. Claude-Session: https://claude.ai/code/session_012qRErfCoiTkvDK9N5XHbzb
5.5 KiB
REPORT — storage that knows its physical disks: design draft + spike (2026-10-15)
Written in ASD-STE100 Simplified Technical English. Baselines read 19:50: felhom.eu 340804f9af, felhom-controller
83392064ae, felhom-agent d2053e7d47. Read first: 03-host-agent.md, 04-control-plane-authorization.md,
07-backup-architecture.md §6 and §7.5, 15-media-library.md, 02-controller-module-map.md, the agent's /disks
code and classifier, the controller's drive model and Tier-2 choice, the installer's step_grows.
Design: documentation/architecture/16-storage-physical-identity.md (DRAFT). Evidence: documentation/audits/storage-identity-2026-10-15/.
What waits on you
Answer six questions: 16-storage-physical-identity.md §12 (STATUS D10). My picks: D1 (a), D2 (a), D3 (a), D4 (a),
D5 (a), D6 (a). If you do nothing: one-disk boxes keep refusing media apps, and boxes in a VM keep counting same-disk
copies as second copies. Nothing is built until you answer.
1. Did the agent-side method name the right physical disk? (Part B)
| Case | Right? |
|---|---|
| 1 One disk (N100, demo-hp): every system place → the one SSD | yes |
| 2 Two disks: system vs enrolled drive (demo-hp, N100) | yes |
| 3 Two partitions of one disk (a scratch loop disk) | yes — after one fix in my probe |
| 4a USB bridge that passes the identity (N100's backup drive) | yes |
| 4b USB bridge that hides the serial | not measured — no device (R-1077) |
| 5 / 6 Inside a VM: same host disk vs a different host disk | both „unknown" — correct |
| 7 Network share | „network, unknown" by rule (no live share mounted today) |
VM cases in one sentence: inside a VM all virtual disks look the same, so the agent can only say „unknown".
2. The design in eight lines
- Every storage place gets
physical_disksandidentity: proven | unknown, with a reason. - The agent computes it from
/sysand udev; the controller only asks. The hub gets it in the report. - A disk's key is bus + model + serial; a vendor-less WWN is not trusted.
- Tier-2 counts as a second copy only on proven different disks. Otherwise the page says „only one copy", in plain words.
- A one-disk box gets an internal data place on the system disk, outside the whole-box copy. Media apps then install with no extra step.
- Films never go into
sys_drive: it is inside every whole-box copy. - A partition can be a storage place. The classifier judges the partition. Only the installer makes partitions.
- A VM box is always „unknown". The OMV guide says: a second disk must be a different physical disk.
3. The decisions (my pick first)
- D1 same-disk second copy: do not make it; say „only one copy".
- D2 unknown disks: never count them; the copy is still made.
- D3 installer:
mp070/130/250 GiB, reserve max(16 GiB, 10 %), the rest is the internal place (512 GB disk → ≈ 152 GiB, 1 TB → ≈ 438, 2 TB → ≈ 1,266). - D4 old one-disk boxes: a plain sentence; the internal place only by a signed operator job.
- D5 partitions: the installer only this round.
- D6 NAS films (R-1071): a separate decision; this design makes it easier, not harder.
4. What the build task will change
- Agent: place identity in
/disksand in the hub report; a „same disk?" call; partitions as candidates; the loop step. - Controller: Tier-2 and the one-copy notice ask the agent; the sentences move to i18n (informal voice); the install refusal in words; the internal place registered as the default drive.
- Installer:
step_growswith the new rule; the internal LV, mounted on the host like a drive. - Hub: store and show the two new fields.
- Guides and website: the OMV guide's second-disk line; the backup explanation page.
5. Claims in the brief that were wrong
- „That volume is the guest's
mp1 /mnt/sys_drive" — wrong. There is nomp1.sys_driveis a folder ofmp0(/var/lib/felhom,backup=1), next to Docker (all three boxes;07§7.5.1). This is why films must not go there. - „The installer … data volume" — partly wrong: the installer computes the size; the agent grows
mp0. - „The classifier must judge the partition, not refuse the whole disk because it has a partition table" — today it does not refuse: it marks the whole disk „data-bearing" and offers only „initialize" (wipe all, customer-confirmed). An empty partition is never offered (measured).
- „Tier-2 = a mirror on the second drive" — incomplete: there is also a state-only fallback onto
sys_drive(tier2.go:157-178). - R-1068's „probable way through — attaching
sys_drive" — it would work in code, but it puts films into every whole-box copy. The design rejects it.
6. Commits, register, STATUS
- One commit to felhom.eu (design, evidence, rows, STATUS, this report).
- Doc fix without a row:
07-backup-architecture.md§6.1 still namedmp1; corrected (the document contradicted live source). - Register: 163 → 169. Opened 6 (R-1074 to R-1079), closed 0. Updated R-1068 (now waits on D3/D4).
- STATUS: line D10 in „Waiting on you — decide".
- Boxes put back: the scratch loop disk on demo-hp and the scratch virtual disk on Tester 1 are removed; nothing that held data was written; DooPlex and ep0 not touched. My first loop try left the loop device for about one minute (a missing tool); I removed it at once.
- No product code changed. No changelog entry: this repo has changelogs only for hub, scripts, website and marketing.
unproven.py: unchanged (35 of 55 not walked).