[pve-devel] [PATCH] qemu-server: add support for unsecure migration (setting in datacenter.cfg)
Stefan Priebe - Profihost AG
s.priebe at profihost.ag
Fri Jul 26 10:11:56 CEST 2013
Am 26.07.2013 09:56, schrieb Dietmar Maurer:
>> diff --git a/PVE/QemuMigrate.pm b/PVE/QemuMigrate.pm
>> index dd48f78..be7df23 100644
>> --- a/PVE/QemuMigrate.pm
>> +++ b/PVE/QemuMigrate.pm
>> @@ -306,8 +306,8 @@ sub phase2 {
>>
>> $self->log('info', "starting VM $vmid on remote node '$self->{node}'");
>>
>> + my $raddr;
>> my $rport;
>> -
>> my $nodename = PVE::INotify::nodename();
>>
>> ## start on remote node
>> @@ -320,27 +320,28 @@ sub phase2 {
>>
>> PVE::Tools::run_command($cmd, outfunc => sub {
>> my $line = shift;
>> -
>> - if ($line =~ m/^migration listens on port (\d+)$/) {
>> - $rport = $1;
>> + if ($line =~ m/^migration listens on tcp:([\d\.]+|localhost):(\d+)$/) {
>> + $raddr = $1;
>> + $rport = $2;
>
> please can you allow both formats?
Will do.
>> }
>> }, errfunc => sub {
>> my $line = shift;
>> $self->log('info', $line);
>> });
>>
>> - die "unable to detect remote migration port\n" if !$rport;
>> -
>> - $self->log('info', "starting migration tunnel");
>> + die "unable to detect remote migration address\n" if !$raddr;
>>
>> - ## create tunnel to remote port
>> - my $lport = PVE::Tools::next_migrate_port();
>> - $self->{tunnel} = $self->fork_tunnel($self->{nodeip}, $lport, $rport);
>
> I would prefer to always start "qm mtunnel" on the other side, because it
> does some additional checks (quorum - maybe other tests in future),
OK
> (just remove ssh parameters '-L', "$lport:localhost:$rport" if !$rport in fork_tunnel)
That makes no sense to me as $rport is always set. Or do you mean if
$raddr ne "localhost"?
>> + if ($raddr eq "localhost") {
>> + $self->log('info', "starting ssh migration tunnel");
>>
>> - $self->log('info', "starting online/live migration on port $lport");
>> - # start migration
>> + ## create tunnel to remote port
>> + my $lport = PVE::Tools::next_migrate_port();
>> + $self->{tunnel} = $self->fork_tunnel($self->{nodeip}, $lport, $rport);
>> + }
>>
>> my $start = time();
>> + $self->log('info', "starting online/live migration on $raddr:$rport");
>> + $self->{livemigration} = 1;
>
> no need to change if we start the tunnel anyways?
Most probably but maybe still nicer than relying on tunnel variable?
>>
>> # load_defaults
>> my $defaults = PVE::QemuServer::load_defaults();
>> @@ -381,9 +382,10 @@ sub phase2 {
>> };
>>
>> eval {
>> - PVE::QemuServer::vm_mon_cmd_nocheck($vmid, "migrate", uri =>
>> "tcp:localhost:$lport");
>> + PVE::QemuServer::vm_mon_cmd_nocheck($vmid, "migrate", uri =>
>> "tcp:$raddr:$rport");
>> };
>> my $merr = $@;
>> + $self->log('info', "migrate uri => tcp:$raddr:$rport failed: $merr") if $merr;
>>
>> my $lstat = 0;
>> my $usleep = 2000000;
>> @@ -535,8 +537,8 @@ sub phase3_cleanup {
>> die "Failed to move config to node '$self->{node}' - rename failed: $!\n"
>> if !rename($conffile, $newconffile);
>>
>> - # now that config file is move, we can resume vm on target if livemigrate
>> - if ($self->{tunnel}) {
>> + if ($self->{livemigration}) {
>> + # now that config file is move, we can resume vm on target if
>> livemigrate
>> my $cmd = [@{$self->{rem_ssh}}, 'qm', 'resume', $vmid, '--skiplock'];
>> eval{ PVE::Tools::run_command($cmd, outfunc => sub {},
>> errfunc => sub {
>> diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
>> index 94d63fe..edb6ce4 100644
>> --- a/PVE/QemuServer.pm
>> +++ b/PVE/QemuServer.pm
>> @@ -3059,11 +3059,17 @@ sub vm_start {
>> my ($cmd, $vollist) = config_to_command($storecfg, $vmid, $conf,
>> $defaults, $forcemachine);
>>
>> my $migrate_port = 0;
>> -
>> + my $migrate_uri;
>> if ($statefile) {
>> if ($statefile eq 'tcp') {
>> + my $localip = "localhost";
>> + my $datacenterconf =
>> PVE::Cluster::cfs_read_file('datacenter.cfg');
>> + if ($datacenterconf->{migration_unsecure}) {
>> + my $nodename = PVE::INotify::nodename();
>> + $localip =
>> PVE::Cluster::remote_node_ip($nodename, 1);
>> + }
>> $migrate_port = PVE::Tools::next_migrate_port();
>> - my $migrate_uri = "tcp:localhost:${migrate_port}";
>> + $migrate_uri = "tcp:${localip}:${migrate_port}";
>> push @$cmd, '-incoming', $migrate_uri;
>> push @$cmd, '-S';
>> } else {
>> @@ -3091,7 +3097,7 @@ sub vm_start {
>> my $err = $@;
>> die "start failed: $err" if $err;
>>
>> - print "migration listens on port $migrate_port\n" if $migrate_port;
>> + print "migration listens on $migrate_uri\n" if $migrate_uri;
>>
>> if ($statefile && $statefile ne 'tcp') {
>> eval { vm_mon_cmd_nocheck($vmid, "cont"); };
>> --
>> 1.7.10.4
>>
>> _______________________________________________
>> pve-devel mailing list
>> pve-devel at pve.proxmox.com
>> http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
>
>
More information about the pve-devel
mailing list