| Crates.io | duende-ublk |
| lib.rs | duende-ublk |
| version | 0.2.0 |
| created_at | 2026-01-06 18:34:51.77336+00 |
| updated_at | 2026-01-13 12:16:31.426579+00 |
| description | ublk device lifecycle management for swap-critical daemons |
| homepage | |
| repository | https://github.com/paiml/duende |
| max_upload_size | |
| id | 2026464 |
| size | 82,620 |
ublk device lifecycle management for swap-critical daemons.
When a ublk daemon crashes or is killed, the kernel may retain device state
even after the /dev/ublkbN block device disappears. This causes:
ERROR: Failed to add device 0: File exists (os error 17)
use duende_ublk::{cleanup_orphaned_devices, UblkControl};
fn main() -> Result<(), duende_ublk::Error> {
// Clean up any orphaned devices from previous crashes
let cleaned = cleanup_orphaned_devices()?;
println!("Cleaned {} orphaned devices", cleaned);
// Now safe to create new devices
Ok(())
}
use duende_ublk::{cleanup_orphaned_devices, detect_orphaned_devices, UblkControl};
// Detect orphaned devices
let orphans = detect_orphaned_devices()?;
println!("Found {} orphans: {:?}", orphans.len(), orphans);
// Clean up all orphaned devices
let cleaned = cleanup_orphaned_devices()?;
println!("Cleaned {} devices", cleaned);
use duende_ublk::UblkControl;
let mut ctrl = UblkControl::open()?;
// Stop then delete a specific device
ctrl.stop_device(0)?;
ctrl.delete_device(0)?;
// Or use force_delete (stop + delete)
ctrl.force_delete(1)?;
// Get device info
let info = ctrl.get_device_info(0)?;
println!("Device {} has {} queues", info.dev_id, info.nr_hw_queues);
This crate uses io_uring URING_CMD to communicate with the ublk kernel driver.
Requires Linux 6.0+.
ublk kernel module loadedCAP_SYS_ADMIN| Command | Description |
|---|---|
UBLK_U_CMD_DEL_DEV |
Delete a device |
UBLK_U_CMD_STOP_DEV |
Stop a running device |
UBLK_U_CMD_GET_DEV_INFO |
Get device information |
For swap-critical daemons, use with duende-mlock:
use duende_mlock::lock_all;
use duende_ublk::cleanup_orphaned_devices;
fn main() -> anyhow::Result<()> {
// 1. Lock memory first (DT-007)
lock_all()?;
// 2. Clean up orphaned devices
cleanup_orphaned_devices()?;
// 3. Create and run daemon
run_ublk_daemon()?;
Ok(())
}
MIT OR Apache-2.0