use PVE::API2::LXC;
use PVE::API2::Qemu;
use PVE::API2::Certificates;
+use PVE::API2::Cluster::Ceph;
use PVE::AccessControl;
use PVE::Ceph::Tools;
my $info = PVE::Storage::storage_info($cfg);
- foreach my $storeid (keys %$info) {
+ foreach my $storeid (sort keys %$info) {
my $d = $info->{$storeid};
if ($d->{enabled}) {
if ($d->{type} eq 'sheepdog') {
log_info("getting Ceph status/health information..");
my $ceph_status = eval { PVE::API2::Ceph->status({ node => $nodename }); };
- my $osd_flags = eval { PVE::API2::Ceph->get_flags({ node => $nodename }); };
+ my $noout = eval { PVE::API2::Cluster::Ceph->get_flag({ flag => "noout" }); };
+ if ($@) {
+ log_fail("failed to get 'noout' flag status - $@");
+ }
+
my $noout_wanted = 1;
- my $noout = $osd_flags && $osd_flags =~ m/noout/;
if (!$ceph_status || !$ceph_status->{health}) {
log_fail("unable to determine Ceph status!");
}
}
- log_info("getting Ceph OSD flags..");
- eval {
- if (!$osd_flags) {
- log_fail("unable to get Ceph OSD flags!");
- } else {
- if (!($osd_flags =~ m/recovery_deletes/ && $osd_flags =~ m/purged_snapdirs/)) {
- log_fail("missing 'recovery_deletes' and/or 'purged_snapdirs' flag, scrub of all PGs required before upgrading to Nautilus!");
- }
- }
- };
-
# TODO: check OSD min-required version, if to low it breaks stuff!
log_info("getting Ceph daemon versions..");
log_warn("unable to determine overall Ceph daemon versions!");
} elsif (keys %$overall_versions == 1) {
log_pass("single running overall version detected for all Ceph daemon types.");
- if ((keys %$overall_versions)[0] =~ /^ceph version 15\./) {
- $noout_wanted = 0;
- }
+ $noout_wanted = 0; # off post-upgrade, on pre-upgrade
} else {
log_warn("overall version mismatch detected, check 'ceph versions' output for details!");
}
my $global_monhost = $global->{mon_host} // $global->{"mon host"} // $global->{"mon-host"};
if (!defined($global_monhost)) {
log_warn("No 'mon_host' entry found in ceph config.\n It's recommended to add mon_host with all monitor addresses (without ports) to the global section.");
- } else {
- log_pass("Found 'mon_host' entry.");
}
my $ipv6 = $global->{ms_bind_ipv6} // $global->{"ms bind ipv6"} // $global->{"ms-bind-ipv6"};
my $ipv4 = $global->{ms_bind_ipv4} // $global->{"ms bind ipv4"} // $global->{"ms-bind-ipv4"};
if ($ipv6 eq 'true' && (!defined($ipv4) || $ipv4 ne 'false')) {
log_warn("'ms_bind_ipv6' is enabled but 'ms_bind_ipv4' is not disabled.\n Make sure to disable 'ms_bind_ipv4' for ipv6 only clusters, or add an ipv4 network to public/cluster network.");
- } else {
- log_pass("'ms_bind_ipv6' is enabled and 'ms_bind_ipv4' disabled");
}
- } else {
- log_pass("'ms_bind_ipv6' not enabled");
}
if (defined($global->{keyring})) {
log_warn("[global] config section contains 'keyring' option, which will prevent services from starting with Nautilus.\n Move 'keyring' option to [client] section instead.");
- } else {
- log_pass("no 'keyring' option in [global] section found.");
}
} else {
my $local_ceph_ver = PVE::Ceph::Tools::get_local_version(1);
if (defined($local_ceph_ver)) {
- if ($local_ceph_ver == 14) {
- my $ceph_volume_osds = PVE::Ceph::Tools::ceph_volume_list();
- my $scanned_osds = PVE::Tools::dir_glob_regex('/etc/ceph/osd', '^.*\.json$');
- if (-e '/var/lib/ceph/osd/' && !defined($scanned_osds) && !(keys %$ceph_volume_osds)) {
- log_warn("local Ceph version is Nautilus, local OSDs detected, but no conversion from ceph-disk to ceph-volume done (yet).");
- }
+ if ($local_ceph_ver <= 14) {
+ log_fail("local Ceph version too low, at least Octopus required..");
}
} else {
log_fail("unable to determine local Ceph version.");
my $potentially_affected = {};
my $referenced_volids = {};
- for my $storeid (keys $storage_cfg->{ids}->%*) {
+ for my $storeid (sort keys $storage_cfg->{ids}->%*) {
my $scfg = $storage_cfg->{ids}->{$storeid};
next if !PVE::Storage::storage_check_enabled($storage_cfg, $storeid, undef, 1);
}
my $supports_cgroupv2 = sub {
- my ($conf, $rootdir) = @_;
+ my ($conf, $rootdir, $ctid) = @_;
my $get_systemd_version = sub {
my ($self) = @_;
};
my $ostype = $conf->{ostype};
- if ($ostype eq 'devuan' || $ostype eq 'alpine') {
- return 1;
+ if (!defined($ostype)) {
+ log_warn("Found CT ($ctid) without 'ostype' set!");
+ } elsif ($ostype eq 'devuan' || $ostype eq 'alpine') {
+ return 1; # no systemd, no cgroup problems
}
my $lxc_setup = PVE::LXC::Setup->new($conf, $rootdir);
my $log_problem = sub {
my ($ctid) = @_;
- log_warn("Found at least one CT ($ctid) which does not support running in a unified " .
- "cgroup v2 layout - either upgrade it or set systemd.unified_cgroup_hierarchy=0 " .
- "in the kernel cmdline - skipping further checks"
+ log_warn("Found at least one CT ($ctid) which does not support running in a unified cgroup v2" .
+ " layout.\n Either upgrade the Container distro or set systemd.unified_cgroup_hierarchy=0 " .
+ "in the Proxmox VE hosts' kernel cmdline! Skipping further CT compat checks."
);
};
return;
}
- my @running_cts = grep { $_->{status} eq 'running' } @$cts;
- my @offline_cts = grep { $_->{status} ne 'running' } @$cts;
+ my @running_cts = sort { $a <=> $b } grep { $_->{status} eq 'running' } @$cts;
+ my @offline_cts = sort { $a <=> $b } grep { $_->{status} ne 'running' } @$cts;
for my $ct (@running_cts) {
my $ctid = $ct->{vmid};
my $rootdir = "/proc/$pid/root";
my $conf = PVE::LXC::Config->load_config($ctid);
- my $ret = eval { $supports_cgroupv2->($conf, $rootdir) };
+ my $ret = eval { $supports_cgroupv2->($conf, $rootdir, $ctid) };
if (my $err = $@) {
log_warn("Failed to get cgroup support status for CT $ctid - $err");
next;
eval {
$conf = PVE::LXC::Config->load_config($ctid);
$rootdir = PVE::LXC::mount_all($ctid, $storage_cfg, $conf);
- $ret = $supports_cgroupv2->($conf, $rootdir);
+ $ret = $supports_cgroupv2->($conf, $rootdir, $ctid);
};
if (my $err = $@) {
log_warn("Failed to load config and mount CT $ctid - $err");
parameters => {
additionalProperties => 0,
properties => {
+ full => {
+ description => 'perform additional, expensive checks.',
+ type => 'boolean',
+ optional => 1,
+ default => 0,
+ },
},
},
returns => { type => 'null' },
check_storage_health();
check_misc();
+ if ($param->{full}) {
+ check_containers_cgroup_compat();
+ } else {
+ log_skip("NOTE: Expensive checks, like CT cgroupv2 compat, not performed without '--full' parameter");
+ }
+
print_header("SUMMARY");
my $total = 0;
our $cmddef = [ __PACKAGE__, 'checklist', [], {}];
-# for now drop all unknown params and just check
-@ARGV = ();
-
1;