13 releases
Uses new Rust 2024
| 0.0.2-rc.6 | May 10, 2026 |
|---|---|
| 0.0.2-rc.5 | May 9, 2026 |
| 0.0.2-rc.3 | Apr 19, 2026 |
| 0.0.1 | Mar 28, 2026 |
| 0.0.1-rc.2 | Feb 26, 2026 |
#2342 in Hardware support
79KB
2K
SLoC
smoo
smoo is an inverted mass‑storage USB protocol. The device sees a block device whose data comes from the host.
It uses the ublk driver and FunctionFS to implement the device side of the protocol in user-space. It can make use of FunctionFS DMA-BUF support for a (nearly) zero-copy data path.
The host implementation supports rusb (for CLI and desktop apps) and WebUSB (for WASM + web targets).
It is implemented in async-first Rust, mostly by robots.
"UMS" backwards is "SMU". Which sounds like smoo. So there you go.
Quickstart
# This project does not yet have a tagged release.
# You must build it from source. Twice.
# Once on the host computer, and once on the device connected over USB.
# (you might be missing some dependencies, see below)
cargo build
# On the device side:
sudo modprobe ublk-drv
sudo ./target/debug/smoo-gadget --no-dma-buf
# on the host side
dd if=/dev/urandom of=random.img bs=4096 count=512
sudo ./target/debug/smoo-host --file random.img
# the device will now see a /dev/ublkb0 device
# it will return data matching the contents of random.img on the host.
# you can confirm this easily:
# from host: sha256sum random.img
# from gadget: dd if=/dev/ublkb0 | sha256sum
Development prerequisites
- Alpine:
apk add linux-headers clang-dev - Debian:
sudo apt build-dep ./ - Fedora:
sudo dnf build-dep --spec ./smoo.spec - Others: idk pls expand here
Status
This is an early prototype. The gadget side requires Linux 6.16 or newer with FunctionFS, and ublk support enabled.
It should work on any device with a UDC, and is tested primarily on SDM670/SDM845 pocket computers.
Development
See HACKING.md for architecture and implementation details.
Dependencies
~8–18MB
~269K SLoC