Phase 6d: systemd user unit for persistent FUSE mount #75
@@ -0,0 +1,43 @@
|
|||||||
|
# deploy/systemd
|
||||||
|
|
||||||
|
Systemd **user** units for clawstor.
|
||||||
|
|
||||||
|
## Units
|
||||||
|
|
||||||
|
| Unit | Purpose |
|
||||||
|
|---|---|
|
||||||
|
| `clawstor-cluster.service` | daemon (gossip + RPC + Prometheus + build cache). Not shipped here — deployed per-node from the fleet playbook. |
|
||||||
|
| `clawstor-fuse.service` | Phase 6 read-only FUSE mount at `~/clawstor-mount/`. Depends on `clawstor-cluster.service`. |
|
||||||
|
|
||||||
|
## Install `clawstor-fuse.service`
|
||||||
|
|
||||||
|
Prereqs: `libfuse3` installed, `claw-fuse` binary built with
|
||||||
|
`cargo build --release --features fuse --bin claw-fuse`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Copy the binary
|
||||||
|
cp target/release/claw-fuse ~/clawstor-deploy/claw-fuse
|
||||||
|
|
||||||
|
# 2. Install the unit
|
||||||
|
mkdir -p ~/.config/systemd/user
|
||||||
|
cp deploy/systemd/clawstor-fuse.service ~/.config/systemd/user/
|
||||||
|
|
||||||
|
# 3. Reload + enable
|
||||||
|
systemctl --user daemon-reload
|
||||||
|
systemctl --user enable --now clawstor-fuse.service
|
||||||
|
|
||||||
|
# 4. Verify
|
||||||
|
systemctl --user status clawstor-fuse.service
|
||||||
|
ls ~/clawstor-mount/ # blobs snapshots tags
|
||||||
|
```
|
||||||
|
|
||||||
|
Override the default paths with a drop-in:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
systemctl --user edit clawstor-fuse.service
|
||||||
|
```
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[Service]
|
||||||
|
Environment=CLAWSTOR_MOUNT=/mnt/clawstor
|
||||||
|
```
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Clawstor read-only FUSE mount (blobs / snapshots / tags)
|
||||||
|
Documentation=https://git.redclaw.dev/clawverse/clawstor
|
||||||
|
After=clawstor-cluster.service network-online.target
|
||||||
|
Wants=clawstor-cluster.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
# Override via `systemctl --user edit clawstor-fuse.service` when the
|
||||||
|
# install lives elsewhere.
|
||||||
|
Environment=CLAWSTOR_FUSE_BIN=%h/clawstor-deploy/claw-fuse
|
||||||
|
Environment=CLAWSTOR_DATA=%h/clawstor-deploy/data
|
||||||
|
Environment=CLAWSTOR_MOUNT=%h/clawstor-mount
|
||||||
|
# Create the mount point if missing (idempotent). ExecStartPre runs
|
||||||
|
# BEFORE the actual mount; fusermount3 needs an existing dir.
|
||||||
|
ExecStartPre=/bin/mkdir -p ${CLAWSTOR_MOUNT}
|
||||||
|
# Best-effort pre-unmount in case a prior instance left a stale
|
||||||
|
# mount (e.g. daemon SIGKILL). fusermount3's `-u -z` = lazy detach,
|
||||||
|
# harmless when nothing is mounted.
|
||||||
|
ExecStartPre=-/usr/bin/fusermount3 -u -z ${CLAWSTOR_MOUNT}
|
||||||
|
ExecStart=${CLAWSTOR_FUSE_BIN} --data-dir ${CLAWSTOR_DATA} --mount ${CLAWSTOR_MOUNT}
|
||||||
|
# The FUSE binary blocks until unmounted. On systemd stop, send
|
||||||
|
# SIGTERM which fuser translates to a clean unmount.
|
||||||
|
ExecStop=/usr/bin/fusermount3 -u ${CLAWSTOR_MOUNT}
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=default.target
|
||||||
Reference in New Issue
Block a user