gates / gates (push) Successful in 6m43s
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
80 lines
5.5 KiB
Markdown
80 lines
5.5 KiB
Markdown
# 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
|
|
|
|
1. Every storage place gets `physical_disks` and `identity: proven | unknown`, with a reason.
|
|
2. The agent computes it from `/sys` and udev; the controller only asks. The hub gets it in the report.
|
|
3. A disk's key is bus + model + serial; a vendor-less WWN is not trusted.
|
|
4. Tier-2 counts as a second copy only on proven different disks. Otherwise the page says „only one copy", in plain words.
|
|
5. 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.
|
|
6. Films never go into `sys_drive`: it is inside every whole-box copy.
|
|
7. A partition can be a storage place. The classifier judges the partition. Only the installer makes partitions.
|
|
8. 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: **`mp0` 70/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 `/disks` and 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_grows` with 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 no `mp1`. `sys_drive` is a folder of `mp0`
|
|
(`/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 named `mp1`; 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).
|