Een Rust-OSD, Op De Dag Dat Hij Uitkwam
croit zette FlashStore OSD op 9 november 2026 in public preview1.
Het is een Ceph-OSD, vanaf nul geschreven in Rust, met een eigen object store in plaats van BlueStore, en hij spreekt het Ceph-wireprotocol.
De belofte is dat hij in een cluster past dat je al draait: je monitors, je managers, je ceph-CLI en je clients blijven zoals ze zijn, en je vervangt één schijf tegelijk1.
Die belofte telt zwaarder voor een Proxmox-omgeving dan voor de meeste.
Op een hyperconverged Proxmox VE-node installeer je Ceph niet apart.
Het komt uit de Proxmox-GUI, uit de eigen repositories van Proxmox, gebouwd en gepatcht door Proxmox, en het geheel wordt aangestuurd door pveceph.
Als een OSD van iemand anders daarin kan zitten zonder iets te breken, krijg je een nieuwe storage-engine zonder de tooling op te geven.
Kan dat niet, dan merk je het op de harde manier, op een node die ook je VM’s draait.
Dus heb ik het geprobeerd.
Ik werk voor croit, dat FlashStore maakt. Daarom probeerde ik het binnen twee dagen na de release, en het is ook de reden dat hieronder niets wordt verzacht. Het is een preview, de README zegt dat hij “not yet recommended for production data” is1, en dit is een verslag van wat het vergde op echte hardware, geen brochure.
Kort antwoord: het werkt. Acht FlashStore-OSD’s leveren op dit moment een RBD-pool aan een VM op een standaard Proxmox VE 9.2-node, HEALTH_OK. Het lange antwoord is dat het twee fixes kostte die de documentatie niet noemt, de ene vanwege de manier waarop Proxmox zijn Ceph-config opslaat en de andere vanwege de kernel van Proxmox, en de rest van deze post gaat over die fixes en hoe ze gevonden zijn. Wil je het alleen draaiend hebben, dan staat er tegen het eind een script dat alles doet, en het is op deze node gedraaid.
De Machine
Het lab is één node, pve2, op mijn thuisnetwerk, en het is een brakke Minisforum B550-mini-pc uit 2021.
Ceph op één node is niet hoe je productie draait, en de CRUSH-regel verderop is de prijs daarvan, maar elke stap hier is hetzelfde op een node met buren.
| Proxmox VE | pve-manager 9.2.26, kernel 7.0.14-28-pve, Debian 13.7 |
| Machine | Minisforum B550-mini-pc, 2021; het bord meldt BESSTAR TECH B550, BIOS 5.17 |
| CPU | AMD Ryzen 7 5700G, 8 cores, 16 threads, 1 NUMA-node |
| Geheugen | 58 GiB |
| OSD-schijven | 8 × Intel Optane P4800X 375 GB (6 met Dell-branding, 2 Intel retail) |
| PCIe naar de Optanes | alle acht achter één Broadcom PEX880xx-switch, op één PCIe 3.0 x16-link vanaf de APU |
| Bootschijf | WD SN750 512 GB, VG pve, buiten dit alles gehouden |
| Netwerk | één 2,5 GbE-poort, vmbr0 |
| FlashStore | snapshot-2026-11-10, upstream commit c5792750020e2 |
De Optanes zitten erin omdat FlashStore twee harde eisen stelt waar veel schijven op zakken.
De schijf moet bescherming tegen stroomverlies hebben, en de namespace moet 4096-byte-blokken gebruiken, als hele namespace zonder partities of bestandssysteem erop1.
FlashStore bevestigt een schrijfactie zodra die duurzaam op de schijf staat, dus een schijf die met een vluchtige cache over duurzaamheid liegt, wordt bij mkfs geweigerd3.
Elke P4800X meldt in zijn Identify-gegevens geen vluchtige schrijfcache (vwc 0), en dat is de schijf zelf die zegt dat de cache geen bevestigde schrijfactie kan kwijtraken.
Daarmee is de mini-pc de beperkende factor in deze deep dive, niet FlashStore en niet de schijven. Acht cores betekent één per OSD en niets over, 58 GiB moet Ceph en de VM’s allebei voeden, en acht Optanes delen één PCIe 3.0-link omdat de APU niet meer te bieden heeft. Lees elk getal hieronder als wat deze machine toelaat.
Umbrella Of Niets
FlashStore wordt gebouwd voor één Ceph-release tegelijk.
De branch bepaalt het: main spreekt Ceph 21.2.0 Umbrella, en een branch v20.2.4 spreekt 20.2.4 Tentacle4.
De daemon controleert bij het starten de release van het cluster en weigert er een buiten zijn venster4.
De pakketten op de releasepagina zijn gebouwd uit main, en de binary zegt dat zelf: croit-flashstore-osd 21.2.0 umbrella.
Proxmox VE 9 biedt drie Ceph-repositories, en maar één daarvan sluit aan.
Tentacle is de standaard van Proxmox, dus is dat de veilige keuze?
Het is degene die niet werkt.
De Proxmox-repository heeft Tentacle tot en met 20.2.5-pve1, en de Tentacle-branch van FlashStore mikt precies op 20.2.4.
Umbrella in de repository van Proxmox is 21.2.0-pve1, dezelfde release waar main op mikt.
Proxmox verstopt niet wat Umbrella is.
PVE/Ceph/Releases.pm noemt hem met unsupported => 15, en de GUI-wizard zegt het in duidelijke woorden zodra je hem kiest.

“Technology Preview”, geen enterprise-repository, en de installer vraagt het in de terminal nog een keer, continue (y/N)?, voordat hij apt aanraakt.
Dat is precies genoeg waarschuwing, en het is goed om het te lezen als uitspraak over de hele stack: een preview-OSD op een preview-release van Ceph.
De installatie is standaard Proxmox. Datacenter → Ceph → Install, versie Umbrella, repository No-Subscription, daarna het publieke netwerk en de eerste monitor.

Dertien pakketten bijgewerkt, 46 nieuw, 107 MB gedownload.
Eén ding op die lijst is nieuw in Umbrella: ceph-osd-classic naast ceph-osd.
Geen van beide wordt hier gebruikt, omdat er nooit een klassieke OSD wordt aangemaakt.
Ongeveer een minuut later draaiden mon.pve2 en mgr.pve2, meldde ceph versions 21.2.0 … umbrella, en was de health OK, met nog niets om op te slaan.
Vier Schijven Op 512 Bytes
Vier van de acht Optanes waren doorgegeven aan een lab-VM en stonden nog op 512-byte-formaat, met oude ZFS-labels erop. Twee andere hadden het juiste formaat en dezelfde labels. De oplossing is voor beide simpel: haal ze van de VM af, formatteer naar 4 KiB, wis de labels.
De P4800X biedt 4096 bytes zonder metadata aan als LBA-formaat 3, wat nvme id-ns weergeeft als lbaf 3 : ms:0 lbads:12.
nvme format /dev/nvme0n1 --lbaf=3 --force --timeout=900000
wipefs -a /dev/nvme0n1
sgdisk --zap-all /dev/nvme0n1
De eerste poging mislukte, en een latere ook.
Beide keren kwam nvme format terug met Interrupted system call en stond de schijf nog op 512 bytes.
De kernellog geeft de reden:
nvme nvme0: I/O tag 0 (0000) opcode 0x2 (Admin Cmd) QID 0 timeout, reset controller
nvme nvme1: I/O tag 9 (0009) opcode 0x6 (Admin Cmd) QID 0 timeout, reset controller
Opcode 0x2 is Get Log Page en 0x6 is Identify.
Geen van beide is de format.
Een P4800X formatteert het hele medium, en dat duurde hier 345 tot 351 seconden per schijf.
Zolang dat loopt, beantwoordt de controller geen andere admin-commando’s, dus alles wat de schijf een vraag stelt, moet wachten.
Na de admin-timeout van 60 seconden geeft de kernel het op en reset hij de controller, en die reset maakt de format kapot.
| Poging | Wat de schijf bereikte | Resultaat |
|---|---|---|
| nvme0, eerste | een Get Log Page om 09:53:04, midden in de Ceph-installatie | afgebroken, nog 512 B |
| nvme0, in een unit | niets | 4 KiB in 345 s |
| nvme1 | mijn eigen nvme list, om de voortgang te bekijken | afgebroken, nog 512 B |
| nvme2, nvme3 | niets | 4 KiB in 351 s en 350 s |
| nvme1, alleen | niets | 4 KiB in 346 s |
De oplossing is elke format in een tijdelijke unit met een lange timeout te draaien, één schijf tegelijk, en de schijven met rust te laten tot hij klaar is:
systemd-run --unit=fmt4k /root/fmt4k.sh
journalctl -u fmt4k -f # read progress from the journal, not from the drive
Zo is de journal de enige voortgangscontrole, en bereikt niets de controller.
Daarna gaven alle acht 4 KiB in nvme list.
Het Pakket
De releasepagina heeft .deb- en .rpm-pakketten, met daartussen Debian 13 trixie, waar Proxmox VE 9 op gebouwd is2.
Eén build bedient elke distributie en vraagt glibc 2.34 of nieuwer6.
B=https://github.com/croit/ceph-rust/releases/download/snapshot-2026-11-10-0b6783237291
curl -LO "$B/flashstore_21.2.0+git.20261110063351.c5792750020e_debian-trixie_amd64.deb"
curl -LO "$B/sha256sums.txt"
sha256sum flashstore_*_debian-trixie_amd64.deb
grep debian-trixie/flashstore_ sha256sums.txt
Controleer het met de hand.
sha256sum -c kan deze download niet controleren, omdat het checksumbestand hem debian-trixie/flashstore_…_amd64.deb noemt terwijl het asset flashstore_…_debian-trixie_amd64.deb heet.
De hashes komen overeen, ce1fb352…26c8 aan beide kanten, dus het bestand is in orde en alleen de lijst loopt niet gelijk met de assets.
apt install ./flashstore_*_debian-trixie_amd64.deb
croit-flashstore-osd --version
croit-flashstore-osd 21.2.0 umbrella (build 0.0.0) git c5792750020e
net tiers: kernel (+rdma upgrade)
Hij installeerde netjes naast de eigen ceph-osd en ceph-osd-classic van Proxmox.
Het pakket installeert alleen een minimale ceph-osd.target op hosts die er geen hebben6, en Proxmox heeft er al een, dus de FlashStore-units hangen aan dezelfde target als de klassieke zouden doen.
Drie dingen over het pakket die je moet weten voordat je ertegen scripts schrijft:
| Wat de docs zeggen | Wat het pakket is | |
|---|---|---|
| Pakketnaam | apt remove flashstore …6 | croit-flashstore-osd, het assetbestand is flashstore_… |
| Store-backends | de productie-featureset van main is knet,spdk,rdma,mimalloc1 | geen SPDK: --check meldt “SPDK NVMe driver: compiled out” |
Waarden voor flashstore_dev | spdk:<pci>, of file: in development-builds7 | de kernel-tier, kernel:/dev/…, is in deze build het enige echte store-pad |
De middelste rij is belangrijk.
De SPDK-tier, de NVMe-driver in user space die de schijf aan vfio-pci gebonden wil hebben, zit niet in het gepubliceerde Debian-pakket.
Wat er wel in zit, is de kernel-tier: de schijf blijft op de eigen nvme-driver van de kernel en FlashStore praat ermee via io_uring.
De broncode laat zien dat die erin gecompileerd is, omdat de feature knet kernel-nvme binnenhaalt8, ook al noemt de samenvattingsregel van de hostcheck hem “compiled out of this build”.
Die regel klopt niet.
Een lezer die hem gelooft, zou daar stoppen.
Wat De Hostcheck Zegt
croit-flashstore-osd --check is alleen-lezen en draait voordat er iets geschreven wordt.
Hij controleert de build, CPU, geheugen, IOMMU, elke NVMe-controller, de NIC, de kernel en de config, en geeft voor elke bevinding de exacte fix9.
Op deze node draaide hij 115 checks, en hij is goed: elke bevinding komt met het commando dat hem oplost, en dat scheelde een hoop zoekwerk.
| Bevinding | Resultaat | Wat ik deed |
|---|---|---|
| Hugepages: niets gereserveerd | FAIL | de gevraagde 16 GiB gereserveerd, vastgelegd in /etc/sysctl.d |
| SN750-bootschijf: vluchtige schrijfcache | FAIL | niets, het is geen OSD-kandidaat |
vfio-pci niet geladen | WARN | niets, deze build heeft geen SPDK om het te gebruiken |
| memlock-limiet 8 MiB | WARN | niets, hij meet de shell; de unit zet LimitMEMLOCK=infinity |
geen isolcpus / nohz_full | WARN | genoteerd, latency-tuning |
IOMMU in vertaalmodus, niet iommu=pt | WARN | genoteerd |
init_on_alloc=1 | WARN | genoteerd, kost volgens hem 15 tot 20 % CPU bij grote reads |
| 2,5 GbE-poort, standaard NIC-rings, IRQ’s op vijf CPU’s | WARN | genoteerd |
| 8 × P4800X: geen VWC, 4096+0 actief, x4 op 8 GT/s, vrij | OK | |
| io_uring met SEND_ZC en fixed buffers, kernel 7.0 | OK |
Reken op de tweede FAIL.
De check telt elke controller in de machine, en de boot-SSD heeft een schrijfcache, dus hij zakt voor de stroomverliestest, ook al markeert dezelfde check hem terecht als “in use, not a candidate”.
De tutorial zegt dat exit 0 betekent dat er geen FAIL is9.
Op elke host die van een consumenten-SSD boot, en dat zijn veel Proxmox-hosts, kan --check nooit exit 0 geven, wat je ook oplost.
Schrijf je scripts tegen de regels per check, niet tegen de exitcode.
De tuning-WARN’s bleven staan. Elk daarvan vraagt een wijziging van de kernel-commandline en een reboot, en dit is een uitrol, geen benchmark. Ze zijn de juiste lijst om af te werken voordat iemand een getal van deze machine noemt.
Cores en hugepages voor acht OSD’s
FlashStore draait thread-per-core, en de check legt uit wat dat betekent: “one core = one shard/PG owner”, hoogstens 8 cores per OSD, en elke OSD-core op een eigen fysieke core in plaats van gedeeld met een SMT-sibling.
Acht fysieke cores en acht OSD’s betekent één core per stuk, flashstore_lcores = 0 tot en met 7, met de SMT-siblings over voor Proxmox en de VM’s.
Opnieuw gedraaid met dat in de config, markeert de check elk coreplan als OK.
Kijk nog eens naar de hugepages.
De check vraagt 2048 MiB per OSD, wat de standaard --mem van de daemon is, dus acht OSD’s hebben 16 GiB gereserveerd nodig.
Draaiend heeft elke OSD 512 MiB van zijn 2048 gebruikt.
Dat klopt met de eigen ontwerpnotitie van croit voor de kernel-backend, die een kwart van --mem reserveert voor de payload-allocator10.
Op deze machine, met alle acht draaiende OSD’s, staat er dus 12 GiB RAM als hugepages gereserveerd waar niets aankomt, op een host die ook VM’s moet voeden.
Een storagenode zou zijn schouders ophalen.
Op een Proxmox-node was dat geheugen een VM, en verderop wordt het ingekort tot wat de OSD’s gebruiken.
Mag Ik Vragen Waarom Hij ceph.conf Niet Kan Lezen?
Met de schijven geformatteerd, het pakket erop en de hostcheck in orde, wilde de eerste OSD niet starten.
croit-flashstore-tool: refused: /etc/ceph/ceph.conf: Permission denied (os error 13)
Op Proxmox is /etc/ceph/ceph.conf een symlink naar /etc/pve/ceph.conf, en /etc/pve is pmxcfs, het clusterbestandssysteem dat de config van elke node gelijk houdt.
Bestanden daar zijn root:www-data 0640, en pmxcfs laat je dat niet per bestand veranderen11.
De eigen Ceph-daemons van Proxmox redden zich omdat ze als root starten, de config lezen en dan overstappen naar de gebruiker ceph, en dat is wat --setuser ceph --setgroup ceph op elke ceph-osd@-unit doet.
De unit van FlashStore start niet als root.
Hij is User=ceph vanaf de eerste instructie, ExecStartPre inbegrepen12, dus hij komt nooit aan het lezen van het bestand toe.
Mag ik vragen waarom een pakket dat voor Debian gebouwd is, voor een product dat als drop-in wordt aangeboden, niet getest is op het meest gangbare Ceph-platform op Debian-basis dat er is? Ik vraag niet wie. pveceph bewaart zijn config op pmxcfs, en elke FlashStore-OSD op een node die door pveceph beheerd wordt, loopt hier bij de eerste start tegenaan.
De daemon heeft het antwoord al ingebouwd.
De broncode beschrijft een klassieke drop via --setuser/--setgroup: “started as root by a classic unit (--setuser ceph --setgroup ceph), the daemon becomes that user before it opens the store, a socket or a file”13.
Een drop-in die de unit start zoals Proxmox zijn eigen OSD’s start, zou dus genoeg moeten zijn.
Bijna. Gestart als gewone root was de volgende weigering de schijf.
activate: device kernel:/dev/ng0n1 not ready: /dev/nvme0n1: Permission denied (os error 13)
De CapabilityBoundingSet van de unit laat CAP_DAC_OVERRIDE weg12, dus root is gebonden aan gewone bestandsrechten, en de namespace-nodes zijn van ceph:ceph.
Starten als root met de groep op ceph dekt beide: root is eigenaar van het configbestand, de groep ceph opent de schijf, en de daemon stapt over naar ceph voordat hij iets anders doet.
# /etc/systemd/system/croit-flashstore-osd@.service.d/pve-ceph-conf.conf
[Service]
User=root
Group=ceph
ExecStart=
ExecStart=/usr/bin/croit-flashstore-osd run --id %i --cluster ${CLUSTER} -f --setuser ceph --setgroup ceph
De daemon bevestigt de overstap in zijn eigen log: set uid:gid to 64045:64045 (ceph).
Er is een kortere fix, SupplementaryGroups=www-data, en die heb ik niet gebruikt.
Die zou de OSD elk groepsleesbaar bestand onder /etc/pve laten lezen, niet alleen de Ceph-config.
Een OSD heeft niets te zoeken in de rest van de clusterconfiguratie, en de drop-in hierboven geeft hem niets meer dan Proxmox zijn eigen OSD’s geeft.
Dan de device-nodes.
De docs van FlashStore zeggen dat de namespace-node schrijfbaar moet zijn voor ceph, “(udev rule)”14, en het pakket levert er geen mee.
Deze matcht de schijven op model, dus hij kan de bootschijf niet raken, wat de nummering ook doet:
# /etc/udev/rules.d/70-croit-flashstore-optane.rules
SUBSYSTEM=="nvme-generic", KERNEL=="ng*n*", ATTRS{model}=="Dell Express Flash NVMe P4800X*|INTEL SSDPE21*", OWNER="ceph", GROUP="ceph", MODE="0660"
SUBSYSTEM=="block", KERNEL=="nvme*n*", ENV{DEVTYPE}=="disk", ATTRS{model}=="Dell Express Flash NVMe P4800X*|INTEL SSDPE21*", OWNER="ceph", GROUP="ceph", MODE="0660"
Na udevadm trigger waren de zestien Optane-nodes ceph:ceph 0660 en bleef de SN750 root.
De Passthrough Die Deze Kernel Weigert
De kernel-tier heeft twee modi, en de node die je opgeeft, kiest ertussen.
kernel:/dev/ngXnY stuurt NVMe-commando’s via io_uring rechtstreeks naar de schijf, wat croit kernel-cmd noemt.
kernel:/dev/nvmeXnY doet O_DIRECT-reads en -writes op het blockdevice, kernel of direct genoemd10.
croit mat kernel-cmd als sneller in elke cel die ze testten10, en de quick start van de README gebruikt hem zelf1, dus dat heb ik geconfigureerd.
Met de rechten op orde stapte de daemon over naar ceph, las zijn config, en stopte bij de eerste read:
croit-flashstore-osd: --dev kernel:/dev/ng0n1: /dev/ng0n1: kernel-cmd fixed-buffer probe read: Errno(13)
Dezelfde probe was een minuut eerder geslaagd in activate, dat nog de capabilities van root had.
De vraag is dus of deze kernel een proces zonder rechten I/O-commando’s door /dev/ngXnY laat sturen.
Dat valt te beantwoorden zonder FlashStore, met dezelfde read via nvme-cli, als ceph:
| Als | Commando op /dev/ng0n1 | Resultaat |
|---|---|---|
ceph | Identify Namespace | toegestaan |
ceph | Read, LBA 0, 4 KiB | Permission denied |
root | Read, LBA 0, 4 KiB | toegestaan |
Alle acht Optanes gaven hetzelfde antwoord, ook twee die ik nooit had geformatteerd of gereset, met de firmware van Intel in plaats van die van Dell. Het ligt dus niet aan de schijven en niet aan de formats van die ochtend.
Upstream zegt dat het zou moeten werken.
In Linux 7.0 laat nvme_cmd_allowed() een proces zonder rechten een I/O-commando sturen als de Commands Supported and Effects-log van de schijf het als ondersteund markeert zonder bijzondere effecten, en eist alleen een schrijfbare open voor commando’s die data schrijven of veranderen15.
De effects-log van de P4800X markeert Read als ondersteund, 00000001, en verder niets.
De read is toegestaan.
De kernel van Proxmox is niet die van upstream.
De changelog van deze build bevat een gebackporte fix op precies dit pad, CVE-2026-90227: nvme/ioctl: check SUBMIT_IO with nvme_cmd_allowed(), die op het eerste gezicht een andere ioctl betreft dan degene die ik testte.
Ik heb niet vastgesteld welke wijziging in de 7.0.14-28-pve-kernel het verschil maakt, en ik ga er niet naar raden.
Wat vaststaat, is het gedrag: op deze kernel wordt NVMe-passthrough-I/O zonder rechten geweigerd.
FlashStore heeft een terugvaloptie voor geweigerde passthrough, en die sloeg niet aan.
De ontwerpnotitie van croit zegt dat een kernel-cmd-device, als Identify geweigerd wordt, terugvalt op directe I/O op zijn block-node en dat bij het starten meldt10.
Hier is Identify toegestaan en Read niet, dus de terugval treedt nooit in werking en de OSD stopt in plaats daarvan.
Directe I/O maakt het niet uit. Het is één regel per OSD:
flashstore_store_backend = kernel
Daarmee kwam osd.0 op.
croit-flashstore-osd: store mounted (1 shards, replayed 4 txns in 16 ms)
croit-flashstore-osd: set uid:gid to 64045:64045 (ceph)
[ 1.398] crush location set (create-or-move updating item name 'osd.0' weight 0.3359 at location {host=pve2,root=default} to crush map)
[ 2.406] osd.0 is now active (up_from 10, map 10)
Actief in 2,4 seconden.
De OSD’s Voorbereiden En Starten
Elke OSD krijgt een sectie in de Ceph-config, wat op Proxmox betekent dat je /etc/pve/ceph.conf bewerkt, en dat mag gewoon met de hand.
[osd.0]
flashstore_dev = spdk:0000:05:00.0
flashstore_store_backend = kernel
flashstore_lcores = 0
Het device wordt benoemd met zijn PCI-adres, niet met /dev/nvme0n1, en het voorvoegsel spdk: betekent hier geen SPDK.
Met een kernel-backend ingesteld zoekt de daemon het adres bij elke start op in sysfs en vindt hij de huidige nodes van de controller10.
Dat doet er hier toe.
De SN750-bootschijf was in oktober nvme7 en is nu nvme8, en de minors van de generieke nodes volgen de schijfvolgorde ook niet, met ng1n1 op minor 0 en ng0n1 op minor 2.
Een config die /dev/nvme4n1 zegt, kan na een reboot naar een andere schijf wijzen.
Een config die 0000:0b:00.0 zegt, kan dat niet.
Dan één commando per schijf, dat de store schrijft en de OSD bij de monitor registreert:
croit-flashstore-tool prepare --dev spdk:0000:05:00.0 --id 0
kernel-cmd /dev/ng0n1: fixed-buffer NVMe passthrough probe ok (IORING_URING_CMD_FIXED on)
mkfs: device lba 4096 B x 91573146 (375083606016 B), awupf 1 lba, vwc false, max_xfer 32 lba
mkfs: 1 store shards, WAL ring 4096 MiB each
osd.0 prepared in /var/lib/ceph/osd/ceph-0
Twee seconden, als root.
prepare leest de bootstrap-sleutel uit /var/lib/ceph/bootstrap-osd/ceph.keyring16, die pveceph pas schrijft wanneer het voor het eerst een eigen OSD aanmaakt, dus zonder klassieke OSD’s moet je hem eerst ophalen:
ceph auth get client.bootstrap-osd -o /var/lib/ceph/bootstrap-osd/ceph.keyring
Zes schijven gingen in één keer door prepare. Twee werden geweigerd:
croit-flashstore-tool: refused: device is not empty (non-zero data in the first 8192 bytes); --wipe destroys it
croit-flashstore-tool: refused: device is not empty (non-zero data at 65536 bytes); --wipe destroys it
lsblk en blkid hadden die twee schijven allebei als leeg gemeld.
Wat erop stond, was het tekstmetadatagebied van een LVM-volumegroep uit een eerder lab, allang verwijderd, met het label vooraan al op nul gezet.
De probe van FlashStore leest de eerste 8 KiB en de gebieden op 64 KiB en 256 KiB17, verder dan de gebruikelijke tools kijken, en hij had gelijk.
Een schijf weigeren waar ook maar iets op staat, tenzij je --wipe zegt, is precies wat een OSD-tool hoort te doen.
Ze wissen is een beslissing voor wie de schijven bezit, niet voor de tool. Toen dat besloten was, bereidde --wipe beide in zo’n twee seconden voor, en ze kwamen erbij na de installatie verderop. Daarom tonen de schermafbeelding van het paneel en de cijfers van de installatie er zes.
Dan starten:
systemctl enable --now croit-flashstore-osd@0
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 2.01535 root default
-3 2.01535 host pve2
0 nvme 0.33589 osd.0 up 1.00000 1.00000
1 nvme 0.33589 osd.1 up 1.00000 1.00000
2 nvme 0.33589 osd.2 up 1.00000 1.00000
3 nvme 0.33589 osd.3 up 1.00000 1.00000
4 nvme 0.33589 osd.4 up 1.00000 1.00000
5 nvme 0.33589 osd.5 up 1.00000 1.00000
Elke OSD zette zichzelf onder host=pve2 met device class nvme.
Wat ze het cluster over zichzelf vertellen, is één keer lezen waard:
| Veld | Monitor en manager | FlashStore-OSD’s |
|---|---|---|
ceph versions | 21.2.0 (087cd25db8f1) umbrella (dev - None) | 21.2.0 (b060042deb05) umbrella (dev - croit-flashstore-osd) |
| Gebouwd door | Proxmox, -pve1-pakketten | croit, vanaf de upstream v21.2.0-commit die de README noemt1 |
osd_objectstore | bluestore, met elk bluestore_bdev_*-veld ingevuld | |
| Wat het echt is | FlashStore, geen BlueFS, geen RocksDB |
Het BlueStore-antwoord is bewust.
flashstore_report_objectstore staat standaard op bluestore omdat klassieke monitors sommige features pas aanzetten als elke OSD het meldt, dus de standaard houdt een gemengd cluster werkend7.
Het is niet waar, en dat is goed om te weten voordat je de metadata van het cluster leest en gelooft.
Wat Proxmox Ervan Maakt
Het OSD-paneel van Proxmox toont ze alle zes, up en in, class nvme, versie 21.2.0, 344 GiB per stuk.
Het noemt ze ook FileStore.

FileStore is de object store die BlueStore heeft vervangen.
Proxmox bepaalt het label in PVE/API2/Ceph/OSD.pm: heeft de metadata van de OSD een sleutel bluefs, dan is het BlueStore, en al het andere is FileStore18.
FlashStore heeft geen BlueFS, omdat er geen RocksDB onder zit, dus hij meldt BlueStore in het ene veld en krijgt het label FileStore op grond van een ander.
Geen van beide klopt.
En het paneel is waar de meeste Proxmox-beheerders het eerst kijken.
De latency-kolommen staan in rust op 0 / 0.
Tijdens de installatie hieronder meldde ceph osd perf commit-latencies van 0 tot 3 ms over de zes.
Start, Stop en Restart in het paneel sturen ceph-osd@N aan, de klassieke unit, en dat is niet wat er draait19.
Daarom is het paneel een weergave van deze OSD’s, geen bediening.
Gebruik systemctl … croit-flashstore-osd@N en de CLI voor alles wat de daemons raakt, en blijf hier ver weg van Create: OSD en Destroy.
Een Pool, Een Storage En Een VM Met Fisher-Price OS (Windows)
De eerste PG in het cluster, die van de .mgr-pool van de manager, stond op undersized+degraded zodra de OSD’s opkwamen.
Dat komt door de ene node.
De standaard replicated_rule zet elke kopie op een andere host, en er is één host.
ceph osd crush rule create-replicated replicated_osd default osd nvme
ceph osd pool set .mgr crush_rule replicated_osd
Een regel met failure domain osd en device class nvme20 zet elke kopie op een andere OSD, en de PG ging binnen een paar seconden naar active+clean.
Op een echt cluster met drie of meer hosts houd je de host-regel en sla je dit over.
Alles daarna is de Proxmox-GUI zoals altijd.
Ceph → Pools → Create: naam flashstore, size 3, min size 2, regel replicated_osd, Add as Storage aangevinkt.
Later ging hij naar size 2, min size 1, voor de belastingstest verderop.

Proxmox maakte de pool en de RBD-storagedefinitie in één keer aan, en flashstore verscheen in de boom met 654 GiB bruikbaar, wat de 2 TiB ruw gedeeld door drie kopieën is, minus overhead.
129 PG’s gingen naar active+clean, en de autoscaler bracht de nieuwe pool kort daarna van 128 naar 32.
De testgast is een VM met Fisher-Price OS (Windows).
Dat is geen voorkeur, het is wat een groot deel van de klanten echt op hun Proxmox-pools draait, dus het is de belasting die telt: 16 GiB geheugen, 4 cores, een schijf van 60 GiB op flashstore met discard en iothread aan.
Het is bovendien praatgraag richting de schijf en gaat er inefficiënt mee om, en daar gaat het juist om: een storagetest wil de gast die de schijf het zwaarst belast.
De pool elke tien seconden bemonsterd, gedurende de eerste vijftien minuten van de installatie:
| Schrijven naar de pool | mediaan 9,3 MB/s als er activiteit is, piek 302 MB/s |
| Schrijfoperaties | piek 2.486 per seconde |
| Lezen uit de pool | piek 60 MB/s |
| Ruwe ruimte gebruikt | 35 GiB over zes OSD’s |
| Health | HEALTH_OK in alle 90 metingen |
| OSD-herstarts | 0 |
| Resident geheugen per OSD | daarna 565 tot 871 MiB per stuk |
Dat zijn de cijfers van een installer, met de VM en de OSD’s op dezelfde host en de tuning-WARN’s onaangeroerd, en ze zeggen niets over de snelheid van FlashStore. Wat ze wel zeggen, is dat een klassieke Proxmox-client een installatie van een besturingssysteem op Rust-OSD’s heeft gezet, 35 GiB ruw, zonder fout, en dat is de bewering die deze post wilde testen.
Wat Het Doet Onder Belasting
Een installatie bewijst dat het werkt. Het vertelt je niet hoe de VM in gebruik aanvoelt.
Dus kreeg de VM CrystalDiskMark 9.0.321, drie keer: het profiel Real World Performance [+Mix], Read&Write [+Mix], een bestand van 16 GiB op C: en een mix van 70% lezen en 30% schrijven, één keer met drie passes en twee keer met negen. Dat profiel stuurt alles één verzoek tegelijk af op één thread, en dat is wat een desktop of een kleine database echt doet, niet wat een datasheet doet.
Inmiddels was de opstelling sinds de installatie veranderd. De VM had zes cores, en de pool was in de GUI omgezet naar size 2, min size 1 en 256 PG’s. Size 2 met min size 1 is een labinstelling op één machine: met nog maar één kopie blijft de pool writes aannemen die één enkele storing daarna kan kwijtraken. Overal anders: houd 3 en 2 aan.
De disk stond op de standaard van Proxmox, geen cache, wat sinds Proxmox 2 de standaard is22.

| Real World Performance [+Mix], 16 GiB | 3 passes | 9 passes | opnieuw 9 passes |
|---|---|---|---|
| SEQ1M Q1T1 lezen | 1.279,71 MB/s | 1.675,33 MB/s | 1.852,32 MB/s |
| SEQ1M Q1T1 schrijven | 563,67 MB/s | 576,65 MB/s | 580,08 MB/s |
| SEQ1M Q1T1 mix | 1.043,75 MB/s | 1.043,28 MB/s | 986,10 MB/s |
| RND4K Q1T1 lezen | 5.342 IOPS, 186,57 µs | 5.659 IOPS, 176,17 µs | 5.706 IOPS, 174,73 µs |
| RND4K Q1T1 schrijven | 2.419 IOPS, 412,51 µs | 2.405 IOPS, 414,79 µs | 2.435 IOPS, 409,77 µs |
| RND4K Q1T1 mix | 3.938 IOPS, 253,13 µs | 3.826 IOPS, 260,49 µs | 3.936 IOPS, 253,25 µs |
Writes en de latentie van kleine blokken blijven van run tot run binnen ongeveer 1%. Sequentieel lezen stijgt over de drie met 45%. Dat is het eerste teken dat de leeskolom niet meet waar hij op lijkt.
De host werd tijdens alle drie elke vijf seconden gesampled, uit /proc/diskstats voor de acht Optanes, ceph status voor de pool en /proc voor elk proces en elke thread, en die twee beelden vertellen niet hetzelfde verhaal.
Writes: De Disk Is Het Kleine Deel
| Eén random write van 4 KiB tegelijk, laatste run | |
|---|---|
| Tijd per write, gezien door de VM | 409,77 µs |
| Tijd per write, op elke Optane | 17 µs |
| Writes op de Optanes per write van de VM | 4,05: twee kopieën, elk zo’n twee writes |
| Grote sequentiële writes | 580 MB/s vanuit de VM, 1,14 GB/s op de Optanes, de tweede kopie verdubbelt het |
De disk is minder dan 5% van een kleine write. De overige 393 µs is de reis: QEMU, librbd, de messenger naar het OSD, het OSD zelf en het wachten op de tweede kopie. Niets daarvan is hier apart gemeten, dus ik zet niet op elk stuk een eigen getal. Wat het wel zegt, is dat op deze machine de Optanes niet de grens zijn voor I/O die één voor één komt, en dat een snellere disk die 410 niet veel zou verschuiven. De grens ligt nu bij de client, de librbd die Proxmox meelevert, en daar komt meer over zodra croits eigen librustyrbd hier draait.
Lezen: De Cache, Niet De Optanes
In de laatste run deed de random read van 4 KiB 5.700 reads per seconde over het hele bestand van 16 GiB, en de acht Optanes lazen helemaal niets.
De sequentiële pass haalde 2,2 GB/s op de pool terwijl de reads van de disks zelf van 755 MB/s naar nul zakten.
CrystalDiskMark gaat om de cache van de gast heen en de disk heeft er in QEMU geen, dus het geheugen dat het werk doet zit in de OSD’s.
flashstore_obj_cache staat in deze build standaard aan, het deel van het bestand per OSD is bij size 2 zo’n 2 GiB, en elk OSD was gegroeid tot ongeveer 2,6 GiB.
FlashStore rapporteert zijn hits niet, dus noem het bijna zeker in plaats van bewezen.
Daarom steeg sequentieel lezen ook bij elke run: meer van het bestand was er al.
Lees de leeskolom als een cachecijfer, niet als een cijfer van de store.
CPU: Waar De Cores Heen Gingen
| Laatste run, in cores | Host bezet | OSD’s | vCPU’s van de gast | librbd en Ceph-client | QEMU |
|---|---|---|---|---|---|
| Idle tussen passes | 20 tot 24% | 3,3 | 0,1 | 0,03 | 0,03 |
| Random write 4 KiB | 30% | 3,9 | 0,38 | 0,20 | 0,08 |
| Random read 4 KiB | 30% | 3,6 | 0,47 | 0,39 | 0,15 |
| Sequentiële mix | 41 tot 53% | 3,8 | 1,5 tot 2,3 | 0,5 | 0,12 |
De drie kolommen van de VM komen uit haar threads: QEMU geeft de vCPU’s van de gast een naam, en de messenger- en workerthreads van librbd draaien in hetzelfde proces.
De OSD-kolom beweegt nauwelijks. Acht pollende OSD’s kosten 3,3 cores als ze niets doen en 3,9 op vol vermogen, dus op een machine met 16 threads is een vijfde van de CPU weg voordat een VM ergens om vraagt. Niets anders kwam in de buurt van zijn grens. De drukste losse thread was een vCPU van de gast op 47%, en de drukste van librbd bleef onder 15%. Bij één verzoek tegelijk is de grens het wachten, niet het werk, en een CPU-cijfer kan geen wachten laten zien.
Geheugen: Reken Op De Piek
| Over alle drie de runs | |
|---|---|
| Health | HEALTH_OK in elke sample, elke PG active+clean, geen OSD-herstarts |
| Gebruikte hugepages | 4 GiB van begin tot eind |
| Wat de host nog kan uitdelen, met één VM van 16 GiB actief | 3,1 tot 4,0 GiB |
De hugepage-regel is de budgetsectie opnieuw, dit keer onder belasting: 512 MiB per OSD, en de andere 12 GiB nooit aangeraakt.
Gewoon geheugen is het getal om in de gaten te houden, want de cache hierboven bestaat eruit. Zodra een read het bestand had binnengehaald, stond elk OSD op zo’n 2,5 GiB, en dit hield Ceph vast op een host van 58,7 GiB:
| Geheugen van Ceph op de piek, standaarddoel 4 GiB | |
|---|---|
| OSD-processen, alle acht samen | 19,9 GiB, 2,4 tot 2,6 GiB per stuk |
| Hugepages gereserveerd voor de OSD’s | 16 GiB, waarvan 4 GiB in gebruik |
| Monitor en manager | 0,3 GiB |
| Totaal | 36,2 GiB, 62% van de host |
| Wat de host nog kan uitdelen, met één VM van 16 GiB actief | 3,6 GiB |
Het komt terug, maar niet volgens een schema dat ik kon zien.
Het bleef 25 minuten op 19,9 GiB, pauzes meegerekend, zakte toen aan het eind van de laatste run naar 13,9 GiB, en de host had weer 10,2 GiB om uit te delen.
osd_memory_target stond bij dit alles op de standaard van 4 GiB per OSD, dus acht OSD’s hadden recht op 32 GiB voordat er ook maar één hugepage geteld is.
Op een node die ook VM’s moet draaien, is de piek het budget om uit te rekenen vóór de disks, en daar doen de 12 ongebruikte GiB aan hugepages het meeste pijn.
Drie VM’s Tegelijk, Met Een Krapper Budget
Eén VM laat ruim plaats. Bij drie moet het budget kloppen. Dus veranderden eerst twee instellingen.
ceph config set osd osd_memory_target 1073741824 # 1 GiB per OSD, was 4
sysctl -w vm.nr_hugepages=2048 # what eight OSDs use, was 8192
Het doel heeft verder niets nodig: elk OSD meldde de nieuwe waarde binnen enkele seconden, en ze werden toch één voor één herstart, met alle 257 PG’s terug op active+clean voor de volgende.
De hugepages hebben een addertje.
Voor elke OSD-start wil croit-flashstore-prep een hele --mem vrij hebben, 2048 MiB, en vergroot de pool als die tekortschiet, maar verkleint hem nooit meer.
De herstart van osd.7 na het inkorten trok de pool meteen weer omhoog:
croit-flashstore-prep[7]: hugepages 2048kB: free 256 < need 1024, nr_hugepages 2048 -> 2816
De ondergrens die een herstart of reboot overleeft, is dus wat de OSD’s gebruiken plus de marge voor één start: 2.816 pages, 5,5 GiB, tegenover de 16 GiB die de check vraagt. Het installatiescript hierboven reserveert nu precies dat. Opnieuw inkorten naar 2.048 zodra alle acht draaien, levert tot de volgende herstart nog 1,5 GiB op.
Daarna draaiden drie klonen van de VM, elk met 10 GiB, tegelijk CrystalDiskMark: Real World Performance [+Mix], drie passes, maar op een bestand van 1 GiB per VM in plaats van 16 GiB. Daarmee is de leeskolom meer dan ooit een cachecijfer, dus lees de writes.
| CrystalDiskMark, drie VM’s tegelijk | VM 104 | VM 105 | VM 106 | Alle drie | Eén VM alleen |
|---|---|---|---|---|---|
| SEQ1M Q1T1 schrijven | 346,99 MB/s | 318,99 MB/s | 446,98 MB/s | 1.113 MB/s | 580,08 MB/s |
| SEQ1M Q1T1 lezen | 796,05 MB/s | 905,03 MB/s | 1.160,93 MB/s | 2.862 MB/s | 1.852,32 MB/s |
| RND4K Q1T1 schrijven | 1.901 IOPS | 1.928 IOPS | 1.862 IOPS | 5.691 IOPS | 2.435 IOPS |
| RND4K Q1T1 schrijflatentie | 524,56 µs | 517,00 µs | 535,42 µs | 409,77 µs | |
| RND4K Q1T1 lezen | 3.773 IOPS | 3.916 IOPS | 3.909 IOPS | 11.598 IOPS | 5.706 IOPS |
| RND4K Q1T1 mix | 2.978 IOPS | 3.027 IOPS | 3.411 IOPS | 9.416 IOPS | 3.936 IOPS |
Drie VM’s haalden 2,3 keer de kleine writes van één, en elke VM betaalde daarvoor ongeveer 27% aan latentie. De Optanes waren nog steeds niet de reden. Ze piekten op 20.900 writes per seconde van elk 17 µs, dezelfde 17 µs als bij één VM, en de drukste van de acht was 14% bezet.
| Host, elke vijf seconden tijdens de run | Standaarddoel 4 GiB, één VM | Doel 1 GiB, drie VM’s |
|---|---|---|
| Grootste OSD-proces | 2,7 GiB | 1,15 GiB op de piek, daarna 0,8 |
| Alle acht OSD-processen samen | 19,9 GiB | 8,0 GiB op de piek, daarna 5,8 |
| Gereserveerde hugepages | 16 GiB, 4 in gebruik | 4 GiB, alles in gebruik |
| Geheugen voor VM’s | 16 GiB | 30 GiB |
| Wat de host nog kan uitdelen, op het laagst | 3,1 GiB | 14,8 GiB |
| Groei van swap | geen | geen |
FlashStore houdt zich dus wel aan osd_memory_target.
Op de piek van een read-pass ging het er 15% overheen en kwam het er weer onder, met de cache die zijn werk binnen het budget doet in plaats van erbuiten.
Tussen het doel en het inkorten kregen de VM’s op dezelfde machine 26 GiB terug.
| CPU in cores, drie VM’s | Host bezet | OSD’s | Gasten | librbd en Ceph-client | QEMU |
|---|---|---|---|---|---|
| Drie boots van Fisher-Price OS (Windows) | 81 tot 89% | 3,4 tot 3,6 | 6,3 tot 7,9 | 0,4 tot 0,7 | 0,3 |
| Benchmark | 42 tot 73% | 3,7 tot 4,5 | 1,2 tot 4,0 | 0,4 tot 1,6 | 0,2 tot 0,4 |
| Idle daarna | 20 tot 24% | 3,3 | 0,3 | 0 | 0 |
Drie gasten booten belastte de CPU zwaarder dan ze benchmarken. De storage eronder kwam er nooit bij in de buurt, en dat is de mini-pc die de grens bepaalt, zoals vanaf het begin vaststond.
Alles In Eén Script
Alles hierboven zit in één script. Geef het de PCI-adressen van de schijven die OSD’s moeten worden en het doet de rest, in de volgorde van deze post, met de twee Proxmox-fixes ingebouwd.
flashstore-pve-setup.sh: FlashStore-OSD's op een Proxmox VE-nodelspci -D -d ::0108 # find the drives
bash flashstore-pve-setup.sh --dry-run 0000:05:00.0 # show the plan, change nothing
bash flashstore-pve-setup.sh 0000:05:00.0 0000:06:00.0
| Het controleert | Het schrijft | Het voert uit |
|---|---|---|
| Proxmox VE 9 en Ceph 21.2.0 Umbrella | de bootstrap-osd-keyring | een passthrough-read als ceph, om kernel-cmd of kernel te kiezen |
| elke schijf: NVMe, geen schrijfcache, niet gemount, gepartitioneerd of in gebruik | de drop-in die als root start en dan --setuser gebruikt | prepare en systemctl enable --now per schijf |
| geen data in de gebieden die FlashStores eigen controle leest | een udev-regel per schijf, op serienummer | de hostcheck, die alleen stopt op wat de OSD’s nodig hebben |
| blokken van 4 KiB | één [osd.N]-sectie per schijf, elk één fysieke core | de pakketdownload, gecontroleerd tegen de SHA-256 van de release |
Er wordt niets vernietigd tenzij je erom vraagt.
--format-4k formatteert een schijf die niet op 4 KiB staat opnieuw, één tegelijk in een eigen unit zodat niets hem onderbreekt, en --wipe laat het een schijf met data overschrijven.
--single-node voegt de regel replicated_osd toe, en een tweede run slaat schijven over die al OSD’s zijn.
Het is hier getest, niet alleen geschreven.
Het weigerde de SN750 vanwege zijn schrijfcache, weigerde de schijf van osd.7 zolang daar nog een store op stond, en bouwde osd.7 daarna, gepurged en met zijn device nodes terug bij root, vanaf niets opnieuw op in 10,5 seconden, waarbij het zelf de backend kernel koos.
Wat het niet doet, is Ceph installeren.
Die stap vraagt je een Technology Preview te accepteren, en dat is jouw beslissing, niet die van een script.
Wat Gerepareerd Moet Worden
Niets hiervan houdt een vastberaden beheerder tegen, en alles hiervan houdt een drukke tegen. Elk punt is een uitspraak die croit doet aan iedereen die het pakket downloadt, en op elk ervan liep ik bij de eerste poging.
| Waar | Wat er gebeurt | Wat het zou oplossen |
|---|---|---|
| systemd-unit | User=ceph kan pmxcfs niet lezen, dus de OSD start nooit op een pveceph-node | de start als root met daarna --setuser meeleveren, of een drop-in voor Proxmox |
| terugval van kernel-cmd | valt alleen terug als Identify geweigerd wordt; op de PVE-kernel wordt Read geweigerd en stopt de OSD | terugvallen op directe I/O bij elke geweigerde passthrough-I/O |
| udev | docs eisen een regel die ceph de namespace-nodes geeft; er wordt er geen meegeleverd | er een meeleveren die op de geconfigureerde devices gericht is |
samenvatting van --check | zegt dat kernel-NVMe “compiled out” is terwijl het het enige ingecompileerde store-pad is | het label corrigeren |
exitcode van --check | de boot-SSD zakt voor de PLP-test, dus exit 0 is onbereikbaar | alleen geconfigureerde of kandidaat-devices meetellen |
| hugepages | rekent 2048 MiB per OSD, en prep wil dat bij elke start vrij hebben; de kernel-backend gebruikt 512 | de kernel-backend dimensioneren op wat hij gebruikt, en prep hetzelfde laten vragen |
sha256sums.txt | bestandsnamen komen niet overeen met de release-assets | ze noemen zoals ze gepubliceerd zijn |
| pakketnaam | docs zeggen apt remove flashstore; het pakket is croit-flashstore-osd | één naam, of de juiste in de docs |
referentie voor flashstore_dev | noemt alleen spdk: en file: | kernel: documenteren, en spdk: met een kernel-backend |
Niets hiervan is nieuw werk. De daemon heeft de privilege drop, de directe backend en de terugvallogica al. Ze zijn alleen nog niet aan elkaar geknoopt voor het platform waar de meeste mensen hem als eerste op zullen proberen.
Een Preview Is Waar Je Dit Ontdekt
Een preview is de juiste plek voor al die bevindingen, en de verkeerde plek om ze te laten liggen. Daar is een preview voor: iemand neemt hem mee naar huis, zet hem op de hardware die hij echt heeft, en schrijft op waar het omvalt. De onderdelen die ertoe doen, hielden stand. De store kwam in milliseconden op, de OSD’s gingen een cluster in dat met de tooling van een ander gebouwd was, en de installatie van een besturingssysteem ging erop zonder fout.
Wat het liet struikelen, was alles rond de daemon. Een configbestand op een bestandssysteem dat de unit niet kon lezen, een kernel die nee zegt tegen een aanroep die upstream toestaat, een bootschijf die de check niet ophield mee te tellen. Niets daarvan is moeilijk. Alles daarvan is het verschil tussen software die werkt en software die op jouw machine werkt, en de enige manier om dat te dichten, is testen op de machines die mensen hebben in plaats van op de machines die je ervoor gebouwd hebt.
Ondanks dat alles is dit een veelbelovend begin. Op een brakke mini-pc, met aan de clientkant nog de klassieke librbd en alle acht schijven op één PCIe 3.0-link, worden de Optanes hier harder aan het werk gezet dan onder BlueStore. Naarmate dit zich ontwikkelt, kom ik erop terug en graaf ik dieper, naarmate meer van de stack vervangen wordt, en met ook een blik op CephFS2.
“Drop-in” is een belofte aan een beheerder die geen tijd heeft om de broncode te lezen. De monitors van Proxmox, de GUI van Proxmox, de kernel van Proxmox en een pakket van iemand anders: dat is precies de situatie waar die belofte voor bedoeld is. Hij houdt hem nu bijna. Negen kleine fixes en hij houdt hem wel, en ik ben liever degene die ze op een woensdagochtend vond dan een klant die ze op een vrijdagavond vindt.
croit/ceph-rust README — public preview sinds 9 november 2026, “not yet recommended for production data”, eisen, quick start, productie-featureset, geteste Ceph-commit. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
croit/ceph-rust release snapshot-2026-11-10 — de hier gebruikte pakketten, waaronder
flashstore_…_debian-trixie_amd64.debensha256sums.txt. ↩︎ ↩︎croit/ceph-rust — hardware requirements — controle op vluchtige schrijfcache, hugepages, opmerkingen over kernelversies. ↩︎
croit/ceph-rust — branches and versions —
mainmikt op v21.2.0,v20.2.4op v20.2.4; “The daemon refuses a cluster release outside its supported window.” ↩︎ ↩︎Proxmox pve-manager, PVE/Ceph/Releases.pm —
umbrellavermeld metrelease => '21.2'enunsupported => 1. ↩︎croit/ceph-rust — build and install packages — distributies, glibc 2.34, omgang met
ceph-osd.target, de regel metapt remove. ↩︎ ↩︎ ↩︎croit/ceph-rust — configuration reference —
flashstore_dev,flashstore_lcores,flashstore_report_objectstoreen waarom die standaard opbluestorestaat. ↩︎ ↩︎croit-flashstore-osd Cargo.toml — regel 29,
knet = [… "kernel-nvme"]. ↩︎croit/ceph-rust — first OSD tutorial — de alleen-lezen hostcheck; “Exit 0 means no FAIL.” ↩︎ ↩︎
croit/ceph-rust — ADR 0169, kernel NVMe backend — de twee kernelmodi, de gemeten vergelijking, het budget van de payload-allocator, de adresresolutie van
spdk:en de terugval die alleen op Identify reageert (amendement 6). Op de avond van de release aan de repository toegevoegd. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎Proxmox VE — Proxmox Cluster File System (pmxcfs) — het clusterbestandssysteem onder
/etc/pveen zijn vaste eigenaar en rechten. ↩︎croit-flashstore-osd@.service —
User=ceph,ExecStartPre=… activate, en eenCapabilityBoundingSetzonderCAP_DAC_OVERRIDE. ↩︎ ↩︎croit-flashstore-osd privdrop.rs — de klassieke privilege drop via
--setuser/--setgroup. ↩︎croit/ceph-rust — prepare the host — “the namespace node must be readable and writable by user
ceph(udev rule)”. ↩︎Linux v7.0, drivers/nvme/host/ioctl.c —
nvme_cmd_allowed(), de regel voor NVMe-passthrough zonder rechten. ↩︎croit/ceph-rust — security — “
preparedefaults--keyringto/var/lib/ceph/bootstrap-osd/<cluster>.keyring”. ↩︎croit/ceph-rust — prepare, activate and list — de probe op niet-lege devices en
--wipe. ↩︎Proxmox pve-manager, PVE/API2/Ceph/OSD.pm —
osdtypeis alleenbluestoreals de metadatabluefsbevat, andersfilestore. ↩︎Proxmox pve-manager, PVE/Ceph/Services.pm —
ceph_service_cmd()koppeltosd.Naan de systemd-unitceph-osd@N. ↩︎Ceph documentation — CRUSH maps — replicated rules, failure domains en device classes. ↩︎
CrystalDiskMark — Crystal Dew World’s disk benchmark; “Various measure mode (Peak/Real World/Demo)”. ↩︎
Proxmox VE wiki — Performance Tweaks — the disk cache modes: “cache=none seems to be the best performance and is the default since Proxmox 2.X”. ↩︎