enum => ['shell', 'console', 'tty'],
default => 'tty',
},
+ protection => {
+ optional => 1,
+ type => 'boolean',
+ description => "Sets the protection flag of the container. This will prevent the remove operation.",
+ default => 0,
+ },
};
my $valid_lxc_conf_keys = {
return int($size);
};
+my $format_size = sub {
+ my ($size) = @_;
+
+ $size = int($size);
+
+ my $kb = int($size/1024);
+ return $size if $kb*1024 != $size;
+
+ my $mb = int($kb/1024);
+ return "${kb}K" if $mb*1024 != $kb;
+
+ my $gb = int($mb/1024);
+ return "${mb}M" if $gb*1024 != $mb;
+
+ return "${gb}G";
+};
+
sub parse_ct_mountpoint {
my ($data) = @_;
die "missing volume\n" if !$info->{volume};
- foreach my $o ('size', 'backup') {
+ foreach my $o (qw(backup)) {
$opts .= ",$o=$info->{$o}" if defined($info->{$o});
}
+
+ if ($info->{size}) {
+ $opts .= ",size=" . &$format_size($info->{size});
+ }
+
$opts .= ",mp=$info->{mp}" if !$nomp;
return "$info->{volume}$opts";
next if !$running;
my $netid = $1;
PVE::Network::veth_delete("veth${vmid}i$netid");
+ } elsif ($opt eq 'protection') {
+ delete $conf->{$opt};
} elsif ($opt =~ m/^mp(\d+)$/) {
delete $conf->{$opt};
push @nohotplug, $opt;
} else {
update_net($vmid, $conf, $opt, $net, $netid, $rootdir);
}
+ } elsif ($opt eq 'protection') {
+ $conf->{$opt} = $value ? 1 : 0;
} elsif ($opt =~ m/^mp(\d+)$/) {
$conf->{$opt} = $value;
push @$new_disks, $opt;
foreach_mountpoint_full($conf, 1, $func);
}
-sub blockdevices_list {
-
- my $bdevs = {};
- dir_glob_foreach("/sys/dev/block/", '(\d+):(\d+)', sub {
- my (undef, $major, $minor) = @_;
- my $bdev = readlink("/sys/dev/block/$major:$minor");
- $bdev =~ s/\.\.\/\.\.\/devices\/virtual\/block\//\/dev\//;
- $bdevs->{$bdev}->{major} = $major;
- $bdevs->{$bdev}->{minor} = $minor;
- });
- return $bdevs;
-}
-
sub check_ct_modify_config_perm {
my ($rpcenv, $authuser, $vmid, $pool, $key_list) = @_;
my ($vmid, $storage_cfg, $conf, $mkdirs) = @_;
my $rootdir = "/var/lib/lxc/$vmid/rootfs";
+ File::Path::make_path($rootdir);
my $volid_list = get_vm_volumes($conf);
PVE::Storage::activate_volumes($storage_cfg, $volid_list);
die "cannot format volume '$volid' with no storage\n" if !$storage;
+ PVE::Storage::activate_volumes($storage_cfg, [$volid]);
+
my $path = PVE::Storage::path($storage_cfg, $volid);
my ($vtype, undef, undef, undef, undef, $isBase, $format) =
return if !$storage;
if ($volid =~ m/^([^:\s]+):(\d+(\.\d+)?)$/) {
- my ($storeid, $size) = ($1, $2);
+ my ($storeid, $size_gb) = ($1, $2);
- $size = int($size*1024) * 1024;
+ my $size_kb = int(${size_gb}*1024) * 1024;
my $scfg = PVE::Storage::storage_config($storecfg, $storage);
# fixme: use better naming ct-$vmid-disk-X.raw?
if ($scfg->{type} eq 'dir' || $scfg->{type} eq 'nfs') {
- if ($size > 0) {
+ if ($size_kb > 0) {
$volid = PVE::Storage::vdisk_alloc($storecfg, $storage, $vmid, 'raw',
- undef, $size);
+ undef, $size_kb);
format_disk($storecfg, $volid);
} else {
$volid = PVE::Storage::vdisk_alloc($storecfg, $storage, $vmid, 'subvol',
} elsif ($scfg->{type} eq 'zfspool') {
$volid = PVE::Storage::vdisk_alloc($storecfg, $storage, $vmid, 'subvol',
- undef, $size);
+ undef, $size_kb);
} elsif ($scfg->{type} eq 'drbd') {
- $volid = PVE::Storage::vdisk_alloc($storecfg, $storage, $vmid, 'raw', undef, $size);
+ $volid = PVE::Storage::vdisk_alloc($storecfg, $storage, $vmid, 'raw', undef, $size_kb);
format_disk($storecfg, $volid);
} elsif ($scfg->{type} eq 'rbd') {
die "krbd option must be enabled on storage type '$scfg->{type}'\n" if !$scfg->{krbd};
- $volid = PVE::Storage::vdisk_alloc($storecfg, $storage, $vmid, 'raw', undef, $size);
+ $volid = PVE::Storage::vdisk_alloc($storecfg, $storage, $vmid, 'raw', undef, $size_kb);
format_disk($storecfg, $volid);
} else {
die "unable to create containers on storage type '$scfg->{type}'\n";
}
push @$vollist, $volid;
- my $new_mountpoint = { volume => $volid, size => $size, mp => $mp };
+ my $new_mountpoint = { volume => $volid, size => $size_kb*1024, mp => $mp };
$conf->{$ms} = print_ct_mountpoint($new_mountpoint, $ms eq 'rootfs');
} else {
# use specified/existing volid