]> git.proxmox.com Git - pve-storage.git/blobdiff - PVE/Storage/CephFSPlugin.pm
drbd: comment that the builtin plugin is depreacated
[pve-storage.git] / PVE / Storage / CephFSPlugin.pm
index 1bfdd01954373870c48a753879c2ba5a483b7ace..8eb7c70bc4086b6eff4d50039ce248402cd53c86 100644 (file)
@@ -7,29 +7,28 @@ use IO::File;
 use Net::IP;
 use File::Path;
 
-use PVE::Tools qw(run_command);
+use PVE::CephConfig;
+use PVE::JSONSchema qw(get_standard_option);
 use PVE::ProcFSTools;
 use PVE::Storage::Plugin;
-use PVE::JSONSchema qw(get_standard_option);
-use PVE::Storage::CephTools;
+use PVE::Systemd;
+use PVE::Tools qw(run_command file_set_contents);
 
 use base qw(PVE::Storage::Plugin);
 
 sub cephfs_is_mounted {
     my ($scfg, $storeid, $mountdata) = @_;
 
-    my $cmd_option = PVE::Storage::CephTools::ceph_connect_option($scfg, $storeid);
+    my $cmd_option = PVE::CephConfig::ceph_connect_option($scfg, $storeid);
     my $configfile = $cmd_option->{ceph_conf};
-    my $server = $cmd_option->{mon_host} // PVE::Storage::CephTools::get_monaddr_list($configfile);
 
     my $subdir = $scfg->{subdir} // '/';
     my $mountpoint = $scfg->{path};
-    my $source = "$server:$subdir";
 
     $mountdata = PVE::ProcFSTools::parse_proc_mounts() if !$mountdata;
     return $mountpoint if grep {
        $_->[2] =~ m#^ceph|fuse\.ceph-fuse# &&
-       $_->[0] =~ m#^\Q$source\E|ceph-fuse$# &&
+       $_->[0] =~ m#\Q:$subdir\E$|^ceph-fuse$# &&
        $_->[1] eq $mountpoint
     } @$mountdata;
 
@@ -39,43 +38,75 @@ sub cephfs_is_mounted {
     return undef;
 }
 
+# FIXME: remove in PVE 7.0 where systemd is recent enough to not have those
+#        local-fs/remote-fs dependency cycles generated for _netdev mounts...
+sub systemd_netmount {
+    my ($where, $type, $what, $opts) = @_;
+
+# don't do default deps, systemd v241 generator produces ordering deps on both
+# local-fs(-pre) and remote-fs(-pre) targets if we use the required _netdev
+# option. Over thre corners this gets us an ordering cycle on shutdown, which
+# may make shutdown hang if the random cycle breaking hits the "wrong" unit to
+# delete.
+    my $unit =  <<"EOF";
+[Unit]
+Description=${where}
+DefaultDependencies=no
+Requires=system.slice
+Wants=network-online.target
+Before=umount.target remote-fs.target
+After=systemd-journald.socket system.slice network.target -.mount remote-fs-pre.target network-online.target
+Conflicts=umount.target
+
+[Mount]
+Where=${where}
+What=${what}
+Type=${type}
+Options=${opts}
+EOF
+
+    my $unit_fn = PVE::Systemd::escape_unit($where, 1) . ".mount";
+    my $unit_path = "/run/systemd/system/$unit_fn";
+    my $daemon_needs_reload = -e $unit_path;
+
+    file_set_contents($unit_path, $unit);
+
+    run_command(['systemctl', 'daemon-reload'], errmsg => "daemon-reload error")
+       if $daemon_needs_reload;
+    run_command(['systemctl', 'start', $unit_fn], errmsg => "mount error");
+
+}
+
 sub cephfs_mount {
     my ($scfg, $storeid) = @_;
 
-    my $cmd;
     my $mountpoint = $scfg->{path};
     my $subdir = $scfg->{subdir} // '/';
 
-    my $cmd_option = PVE::Storage::CephTools::ceph_connect_option($scfg, $storeid);
+    my $cmd_option = PVE::CephConfig::ceph_connect_option($scfg, $storeid);
     my $configfile = $cmd_option->{ceph_conf};
     my $secretfile = $cmd_option->{keyring};
-    my $server = $cmd_option->{mon_host} // PVE::Storage::CephTools::get_monaddr_list($configfile);
+    my $server = $cmd_option->{mon_host} // PVE::CephConfig::get_monaddr_list($configfile);
+    my $type = 'ceph';
 
-    # fuse -> client-enforced quotas (kernel doesn't), updates w/ ceph-fuse pkg
-    # kernel -> better performance, less frequent updates
+    my @opts = ();
     if ($scfg->{fuse}) {
-           # FIXME: ceph-fuse client complains about missing ceph.conf or keyring if
-           # not provided on its default locations but still connects. Fix upstream??
-           $cmd = ['/usr/bin/ceph-fuse', '-n', "client.$cmd_option->{userid}", '-m', $server];
-           push @$cmd, '--keyfile', $secretfile if defined($secretfile);
-           push @$cmd, '-r', $subdir if !($subdir =~ m|^/$|);
-           push @$cmd, $mountpoint;
-           push @$cmd, '--conf', $configfile if defined($configfile);
+       $type = 'fuse.ceph';
+       push @opts, "ceph.id=$cmd_option->{userid}";
+       push @opts, "ceph.keyfile=$secretfile" if defined($secretfile);
+       push @opts, "ceph.conf=$configfile" if defined($configfile);
     } else {
-       my $source = "$server:$subdir";
-       $cmd = ['/bin/mount', '-t', 'ceph', $source, $mountpoint, '-o', "name=$cmd_option->{userid}"];
-       push @$cmd, '-o', "secretfile=$secretfile" if defined($secretfile);
-    }
-    # tell systemd that we're network dependent, else it umounts us to late on
-    # shutdown, when we couldn't connect to the active MDS and thus unmount
-    # hangs and delays shutdown/reboot (man systemd.mount)
-    push @$cmd, '-o', '_netdev';
+       push @opts, "name=$cmd_option->{userid}";
+       push @opts, "secretfile=$secretfile" if defined($secretfile);
 
-    if ($scfg->{options}) {
-       push @$cmd, '-o', $scfg->{options};
+       # FIXME: remove version check in PVE 7.0, only needed for Luminous -> Nautilus
+       my ($subversions) = PVE::CephConfig::local_ceph_version();
+       push @opts, "conf=$configfile" if defined($configfile) && @$subversions[0] > 12;
     }
 
-    run_command($cmd, errmsg => "mount error");
+    push @opts, $scfg->{options} if $scfg->{options};
+
+    systemd_netmount($mountpoint, $type, "$server:$subdir", join(',', @opts));
 }
 
 # Configuration
@@ -86,7 +117,7 @@ sub type {
 
 sub plugindata {
     return {
-       content => [ { vztmpl => 1, iso => 1, backup => 1},
+       content => [ { vztmpl => 1, iso => 1, backup => 1, snippets => 1},
                     { backup => 1 }],
     };
 }
@@ -118,6 +149,8 @@ sub options {
        mkdir => { optional => 1 },
        fuse => { optional => 1 },
        bwlimit => { optional => 1 },
+       maxfiles => { optional => 1 },
+       'prune-backups' => { optional => 1 },
     };
 }
 
@@ -136,7 +169,9 @@ sub on_add_hook {
 
     return if defined($scfg->{monhost}); # nothing to do if not pve managed ceph
 
-    PVE::Storage::CephTools::ceph_create_keyfile($scfg->{type}, $storeid);
+    PVE::CephConfig::ceph_create_keyfile($scfg->{type}, $storeid);
+
+    return;
 }
 
 sub on_delete_hook {
@@ -144,7 +179,9 @@ sub on_delete_hook {
 
     return if defined($scfg->{monhost}); # nothing to do if not pve managed ceph
 
-    PVE::Storage::CephTools::ceph_remove_keyfile($scfg->{type}, $storeid);
+    PVE::CephConfig::ceph_remove_keyfile($scfg->{type}, $storeid);
+
+    return;
 }
 
 sub status {