diff --git a/perl-xCAT/xCAT/Schema.pm b/perl-xCAT/xCAT/Schema.pm
index d965e3293..5a900e6c6 100644
--- a/perl-xCAT/xCAT/Schema.pm
+++ b/perl-xCAT/xCAT/Schema.pm
@@ -191,7 +191,7 @@ vmmaster => {
}
},
vm => {
- cols => [qw(node mgr host migrationdest storage storagemodel cfgstore memory cpus nics nicmodel bootorder clockoffset virtflags master vncport textconsole powerstate beacon datacenter cluster guestostype othersettings vidmodel vidproto vidpassword comments disable)],
+ cols => [qw(node mgr host migrationdest storage storagemodel storagecache storageformat cfgstore memory cpus nics nicmodel bootorder clockoffset virtflags master vncport textconsole powerstate beacon datacenter cluster guestostype othersettings vidmodel vidproto vidpassword comments disable)],
keys => [qw(node)],
tablespace =>'XCATTBS32K',
table_desc => 'Virtualization parameters',
@@ -230,6 +230,8 @@ vm => {
'vidproto' => "Request a specific protocol for remote video access be set up. For example, spice in KVM.",
'vidmodel' => "Model of video adapter to provide to guest. For example, qxl in KVM",
'vidpassword' => "Password to use instead of temporary random tokens for VNC and SPICE access",
+ 'storagecache' => "Select caching scheme to employ. E.g. KVM understands 'none', 'writethrough' and 'writeback'",
+ 'storageformat' => "Select disk format to use by default (e.g. raw versus qcow2)",
}
},
hypervisor => {
@@ -2237,6 +2239,14 @@ my @nodeattrs = (
tabentry => 'vm.storagemodel',
access_tabentry => 'vm.node=attr:node',
},
+ {attr_name => 'vmstoragecache',
+ tabentry => 'vm.storagecache',
+ access_tabentry => 'vm.node=attr:node',
+ },
+ {attr_name => 'vmstorageformat',
+ tabentry => 'vm.storageformat',
+ access_tabentry => 'vm.node=attr:node',
+ },
{attr_name => 'vmcfgstore',
tabentry => 'vm.cfgstore',
access_tabentry => 'vm.node=attr:node',
diff --git a/perl-xCAT/xCAT/VMCommon.pm b/perl-xCAT/xCAT/VMCommon.pm
index 96dc6367f..ab657b47d 100644
--- a/perl-xCAT/xCAT/VMCommon.pm
+++ b/perl-xCAT/xCAT/VMCommon.pm
@@ -26,7 +26,7 @@ sub grab_table_data{ #grab table data relevent to VM guest nodes
if ($vpdtab) {
$cfghash->{vpd} = $vpdtab->getNodesAttribs($noderange,['uuid']);
}
- $cfghash->{vm} = $vmtab->getNodesAttribs($noderange,['node','host','migrationdest','cfgstore','storage','vidmodel','vidproto','vidpassword','storagemodel','memory','cpus','nics','nicmodel','bootorder','virtflags','datacenter','guestostype','othersettings','master']);
+ $cfghash->{vm} = $vmtab->getNodesAttribs($noderange,['node','host','migrationdest','cfgstore','storage','storagecache','storageformat','vidmodel','vidproto','vidpassword','storagemodel','memory','cpus','nics','nicmodel','bootorder','virtflags','datacenter','guestostype','othersettings','master']);
my $mactab = xCAT::Table->new("mac",-create=>1);
my $nrtab= xCAT::Table->new("noderes",-create=>1);
$cfghash->{mac} = $mactab->getAllNodeAttribs(['mac'],1);
diff --git a/xCAT-server/lib/xcat/plugins/kvm.pm b/xCAT-server/lib/xcat/plugins/kvm.pm
index fc3880957..2c52ffb1e 100644
--- a/xCAT-server/lib/xcat/plugins/kvm.pm
+++ b/xCAT-server/lib/xcat/plugins/kvm.pm
@@ -488,6 +488,10 @@ sub build_diskstruct {
$cdhash->{target}->{dev}='hdc';
push @returns,$cdhash;
}
+ my $cachemethod = "none";
+ if ( $confdata->{vm}->{$node}->[0]->{storagecache}) {
+ $cachemethod = $confdata->{vm}->{$node}->[0]->{storagecache};
+ }
if (defined $confdata->{vm}->{$node}->[0]->{storage}) {
@@ -530,8 +534,7 @@ sub build_diskstruct {
$tdiskhash->{device}='disk';
$tdiskhash->{driver}->{name}='qemu';
$tdiskhash->{driver}->{type}=$disks{$_}->{format};
- $tdiskhash->{driver}->{cache}="none"; #in this scenario, making a brand new vm, there is not much the hypervisor cache can do for us that the
- #guest cannot do for itself
+ $tdiskhash->{driver}->{cache}=$cachemethod;
$tdiskhash->{source}->{file}=$_;
$tdiskhash->{target}->{dev} = $disks{$_}->{device};
if ($disks{$_} =~ /^vd/) {
@@ -1209,13 +1212,17 @@ sub createstorage {
#my $diskstruct = shift;
my $node = $cfginfo->{node};
my @flags = split /,/,$cfginfo->{virtflags};
+ my $format;
foreach (@flags) {
if (/^imageformat=(.*)\z/) {
- $imgfmt=$1;
+ $format=$1;
} elsif (/^clonemethod=(.*)\z/) {
$clonemethod=$1;
}
}
+ if ($cfginfo->{storageformat}) {
+ $format = $cfginfo->{storageformat};
+ }
my $mountpath;
my $pathappend;
@@ -1242,7 +1249,7 @@ sub createstorage {
if ($filename =~ /^nfs:/ or $filename =~ /^dir:/ or $filename =~ /^lvm:/) { #libvirt storage pool to be used for this
my @sizes = split /,/,$size;
foreach (@sizes) {
- get_filepath_by_url(url=>$filename,dev=>$prefix.shift(@suffixes),create=>$_, force=>$force);
+ get_filepath_by_url(url=>$filename,dev=>$prefix.shift(@suffixes),create=>$_, force=>$force, format=>$format);
}
}else{
oldCreateStorage($filename, $mastername, $size, $cfginfo, $force);
@@ -1653,6 +1660,15 @@ sub chvm {
$suffix=$1;
$format='raw';
}
+ if ($confdata->{vm}->{$node}->[0]->{storageformat}) {
+ $format = $confdata->{vm}->{$node}->[0]->{storageformat};
+ }
+ #when creating a new disk not cloned from anything, disable cache as copy on write content similarity is a lost cause...
+ my $cachemode = 'none';
+ #unless user knows better
+ if ($confdata->{vm}->{$node}->[0]->{storagecache}) {
+ $cachemode = $confdata->{vm}->{$node}->[0]->{storagecache};
+ }
my $bus;
if ($suffix =~ /^sd/) {
$bus='scsi';
@@ -1661,8 +1677,7 @@ sub chvm {
} elsif ($suffix =~ /vd/) {
$bus='virtio';
}
- #when creating a new disk not cloned from anything, disable cache as copy on write content similarity is a lost cause...
- my $xml = "";
+ my $xml = "";
if ($currstate eq 'on') { #attempt live attach
eval {
$dom->attach_device($xml);