[pbs-devel] [PATCH proxmox-backup v9 12/26] add auto-mounting for removable datastores

Hannes Laimer h.laimer at proxmox.com
Thu Apr 25 07:32:40 CEST 2024


On Wed Apr 24, 2024 at 3:18 PM CEST, Wolfgang Bumiller wrote:
> On Tue, Apr 23, 2024 at 10:29:46AM +0200, Hannes Laimer wrote:
> > Signed-off-by: Hannes Laimer <h.laimer at proxmox.com>
> > ---
> >  debian/proxmox-backup-server.install        |  1 +
> >  debian/proxmox-backup-server.udev           |  3 ++
> >  etc/Makefile                                |  3 +-
> >  etc/removable-device-attach at .service.in     |  8 +++
> >  src/bin/proxmox_backup_manager/datastore.rs | 56 ++++++++++++++++++++-
> >  5 files changed, 69 insertions(+), 2 deletions(-)
> >  create mode 100644 etc/removable-device-attach at .service.in
> > 
> > diff --git a/debian/proxmox-backup-server.install b/debian/proxmox-backup-server.install
> > index ee114ea3..cda01069 100644
> > --- a/debian/proxmox-backup-server.install
> > +++ b/debian/proxmox-backup-server.install
> > @@ -4,6 +4,7 @@ etc/proxmox-backup-daily-update.service /lib/systemd/system/
> >  etc/proxmox-backup-daily-update.timer /lib/systemd/system/
> >  etc/proxmox-backup-proxy.service /lib/systemd/system/
> >  etc/proxmox-backup.service /lib/systemd/system/
> > +etc/removable-device-attach at .service /lib/systemd/system/
> >  usr/bin/pmt
> >  usr/bin/pmtx
> >  usr/bin/proxmox-tape
> > diff --git a/debian/proxmox-backup-server.udev b/debian/proxmox-backup-server.udev
> > index afdfb2bc..e21b8bc7 100644
> > --- a/debian/proxmox-backup-server.udev
> > +++ b/debian/proxmox-backup-server.udev
> > @@ -16,3 +16,6 @@ SUBSYSTEM=="scsi_generic", SUBSYSTEMS=="scsi", ATTRS{type}=="1", ENV{ID_SCSI_SER
> >    SYMLINK+="tape/by-id/scsi-$env{ID_SCSI_SERIAL}-sg"
> >  
> >  LABEL="persistent_storage_tape_end"
> > +
> > +# triggers the mounting of a removable device
> > +ACTION=="add", SUBSYSTEM=="block", ENV{ID_FS_UUID}!="", TAG+="systemd", ENV{SYSTEMD_WANTS}="removable-device-attach@$env{ID_FS_UUID}"
> > \ No newline at end of file
> > diff --git a/etc/Makefile b/etc/Makefile
> > index 42f639f6..730de4f8 100644
> > --- a/etc/Makefile
> > +++ b/etc/Makefile
> > @@ -7,7 +7,8 @@ DYNAMIC_UNITS := \
> >  	proxmox-backup-banner.service \
> >  	proxmox-backup-daily-update.service \
> >  	proxmox-backup.service \
> > -	proxmox-backup-proxy.service
> > +	proxmox-backup-proxy.service \
> > +	removable-device-attach at .service
> >  
> >  all: $(UNITS) $(DYNAMIC_UNITS) pbs-enterprise.list
> >  
> > diff --git a/etc/removable-device-attach at .service.in b/etc/removable-device-attach at .service.in
> > new file mode 100644
> > index 00000000..e10d1ea3
> > --- /dev/null
> > +++ b/etc/removable-device-attach at .service.in
> > @@ -0,0 +1,8 @@
> > +[Unit]
> > +Description=Try to mount the removable device of a datastore with uuid '%i'.
> > +After=proxmox-backup-proxy.service
> > +Requires=proxmox-backup-proxy.service
> > +
> > +[Service]
> > +Type=simple
> > +ExecStart=/usr/sbin/proxmox-backup-manager datastore uuid-mount %i
> > diff --git a/src/bin/proxmox_backup_manager/datastore.rs b/src/bin/proxmox_backup_manager/datastore.rs
> > index f8462459..7575d0c5 100644
> > --- a/src/bin/proxmox_backup_manager/datastore.rs
> > +++ b/src/bin/proxmox_backup_manager/datastore.rs
> > @@ -1,4 +1,4 @@
> > -use anyhow::{format_err, Error};
> > +use anyhow::{bail, format_err, Error};
> >  use serde_json::Value;
> >  
> >  use proxmox_router::{cli::*, ApiHandler, RpcEnvironment};
> > @@ -195,6 +195,56 @@ async fn delete_datastore(mut param: Value, rpcenv: &mut dyn RpcEnvironment) ->
> >      Ok(())
> >  }
> >  
> > +#[api(
> > +    protected: true,
> > +    input: {
> > +        properties: {
> > +            uuid: {
> > +                type: String,
> > +                format: &proxmox_schema::api_types::UUID_FORMAT,
>
> ^ Don't use a format here. If we only accept "real" uuids we cannot use
> "weird" devices like FAT where UUIDs look different.
>
we currently already have it in our docs that we only "support" ext4,
xfs or zfs. Also AFAIK FSs that have not "weird" UUID formats tend to
also have no problems with permissions

> > +                description: "The UUID of the device that should be mounted",
> > +            },
> > +            "output-format": {
> > +                schema: OUTPUT_FORMAT,
> > +                optional: true,
> > +            },
> > +        },
> > +    },
> > +)]
> > +/// Try mounting a removable datastore given the UUID.
> > +async fn uuid_mount(param: Value, rpcenv: &mut dyn RpcEnvironment) -> Result<Value, Error> {
> > +    let uuid = param["uuid"]
> > +        .as_str()
> > +        .ok_or_else(|| format_err!("uuid has to be specified"))?;
> > +
> > +    let info = &api2::config::datastore::API_METHOD_LIST_DATASTORES;
> > +    let data: Value = match info.handler {
> > +        ApiHandler::Sync(handler) => (handler)(serde_json::json!({}), info, rpcenv)?,
> > +        _ => unreachable!(),
> > +    };
> > +
> > +    let store_name = data.as_array().and_then(|list| {
> > +        list.iter()
> > +            .filter_map(Value::as_object)
> > +            .find(|store| store.get("backing-device").map_or(false, |d| d.eq(&uuid)))
> > +            .and_then(|s| s.get("name").and_then(Value::as_str))
> > +    });
> > +
> > +    if let Some(store_name) = store_name {
> > +        let info = &api2::admin::datastore::API_METHOD_MOUNT;
> > +        let mount_param = serde_json::json!({
> > +            "store": store_name,
> > +        });
> > +        let result = match info.handler {
> > +            ApiHandler::Sync(handler) => (handler)(mount_param, info, rpcenv)?,
> > +            _ => unreachable!(),
> > +        };
> > +        crate::wait_for_local_worker(result.as_str().unwrap()).await?;
> > +        return Ok(Value::Null);
> > +    }
> > +    bail!("'{uuid}' is not associated with any datastore")
> > +}
> > +
> >  pub fn datastore_commands() -> CommandLineInterface {
> >      let cmd_def = CliCommandMap::new()
> >          .insert("list", CliCommand::new(&API_METHOD_LIST_DATASTORES))
> > @@ -240,6 +290,10 @@ pub fn datastore_commands() -> CommandLineInterface {
> >                      pbs_config::datastore::complete_calendar_event,
> >                  ),
> >          )
> > +        .insert(
> > +            "uuid-mount",
> > +            CliCommand::new(&API_METHOD_UUID_MOUNT).arg_param(&["uuid"]),
> > +        )
> >          .insert(
> >              "remove",
> >              CliCommand::new(&API_METHOD_DELETE_DATASTORE)
> > -- 
> > 2.39.2





More information about the pbs-devel mailing list