]>
git.proxmox.com Git - qemu-server.git/blob - qm
d3210f902a4065072cdfa6efac50eced6d697e0d
10 use PVE
::Tools
qw(extract_param);
14 use PVE
::RPCEnvironment
;
17 use PVE
::JSONSchema
qw(get_standard_option);
22 use base
qw(PVE::CLIHandler);
24 $ENV{'PATH'} = '/sbin:/bin:/usr/sbin:/usr/bin';
28 die "please run as root\n" if $> != 0;
30 PVE
::INotify
::inotify_init
();
32 my $rpcenv = PVE
::RPCEnvironment-
>init('cli');
34 $rpcenv->init_request();
35 $rpcenv->set_language($ENV{LANG
});
36 $rpcenv->set_user('root@pam');
38 my $nodename = PVE
::INotify
::nodename
();
40 PVE
::JSONSchema
::register_standard_option
('skiplock', {
41 description
=> "Ignore locks - only root is allowed to use this option.",
49 my $path = PVE
::QemuServer
::vnc_socket
($vmid);
51 my $s = IO
::Socket
::UNIX-
>new(Peer
=> $path, Timeout
=> 120);
53 die "unable to connect to socket '$path' - $!" if !$s;
55 my $select = new IO
::Select
;
57 $select->add(\
*STDIN
);
60 my $timeout = 60*15; # 15 minutes
63 while ($select->count &&
64 scalar(@handles = $select->can_read ($timeout))) {
65 foreach my $h (@handles) {
67 my $n = $h->sysread($buf, 4096);
77 syswrite(\
*STDOUT
, $buf);
87 __PACKAGE__-
>register_method ({
91 description
=> "Show command line which is used to start the VM (debug info).",
93 additionalProperties
=> 0,
95 vmid
=> get_standard_option
('pve-vmid'),
98 returns
=> { type
=> 'null'},
102 my $storecfg = PVE
::Storage
::config
();
103 print PVE
::QemuServer
::vm_commandline
($storecfg, $param->{vmid
}) . "\n";
108 __PACKAGE__-
>register_method ({
112 description
=> "Show VM status.",
114 additionalProperties
=> 0,
116 vmid
=> get_standard_option
('pve-vmid'),
118 description
=> "Verbose output format",
124 returns
=> { type
=> 'null'},
129 my $conf = PVE
::QemuServer
::load_config
($param->{vmid
});
131 my $vmstatus = PVE
::QemuServer
::vmstatus
($param->{vmid
});
132 my $stat = $vmstatus->{$param->{vmid
}};
133 if ($param->{verbose
}) {
134 foreach my $k (sort (keys %$stat)) {
135 next if $k eq 'cpu' || $k eq 'relcpu'; # always 0
137 next if !defined($v);
141 my $status = $stat->{status
} || 'unknown';
142 print "status: $status\n";
148 __PACKAGE__-
>register_method ({
152 description
=> "Proxy VM VNC traffic to stdin/stdout",
154 additionalProperties
=> 0,
156 vmid
=> get_standard_option
('pve-vmid'),
159 returns
=> { type
=> 'null'},
163 my $vmid = $param->{vmid
};
165 run_vnc_proxy
($vmid);
170 __PACKAGE__-
>register_method ({
174 description
=> "Unlock the VM.",
176 additionalProperties
=> 0,
178 vmid
=> get_standard_option
('pve-vmid'),
181 returns
=> { type
=> 'null'},
185 my $vmid = $param->{vmid
};
187 PVE
::QemuServer
::lock_config
($vmid, sub {
188 PVE
::QemuServer
::change_config_nolock
($vmid, {}, { lock => 1 }, 1);
194 __PACKAGE__-
>register_method ({
198 description
=> "Used by vzmigrate - do not use manually.",
200 additionalProperties
=> 0,
203 returns
=> { type
=> 'null'},
207 print "tunnel online\n";
210 while (my $line = <>) {
212 last if $line =~ m/^quit$/;
218 __PACKAGE__-
>register_method ({
222 description
=> "Start all virtual machines (when onboot=1).",
224 additionalProperties
=> 0,
227 returns
=> { type
=> 'null'},
231 my $vzlist = PVE
::QemuServer
::vzlist
();
232 my $storecfg = PVE
::Storage
::config
();
234 foreach my $vmid (keys %$vzlist) {
235 next if $vzlist->{$vmid}->{pid
}; # already running
238 my $conf = PVE
::QemuServer
::load_config
($vmid);
239 if ($conf->{onboot
}) {
240 print STDERR
"Starting Qemu VM $vmid\n";
241 PVE
::QemuServer
::vm_start
($storecfg, $vmid);
244 print STDERR
$@ if $@;
250 __PACKAGE__-
>register_method ({
254 description
=> "Stop all virtual machines.",
256 additionalProperties
=> 0,
259 description
=> "Timeout in seconds. Default is to wait 3 minutes.",
266 returns
=> { type
=> 'null'},
270 my $timeout = $param->{timeout
};
272 PVE
::QemuServer
::vm_stopall
($timeout);
277 __PACKAGE__-
>register_method ({
281 description
=> "Wait until the VM is stopped.",
283 additionalProperties
=> 0,
285 vmid
=> get_standard_option
('pve-vmid'),
287 description
=> "Timeout in seconds. Default is to wait forever.",
294 returns
=> { type
=> 'null'},
298 my $vmid = $param->{vmid
};
299 my $timeout = $param->{timeout
};
301 my $pid = PVE
::QemuServer
::check_running
($vmid);
304 print "waiting until VM $vmid stopps (PID $pid)\n";
307 while ((!$timeout || ($count < $timeout)) && PVE
::QemuServer
::check_running
($vmid)) {
312 die "wait failed - got timeout\n" if PVE
::QemuServer
::check_running
($vmid);
317 __PACKAGE__-
>register_method ({
321 description
=> "Enter Qemu Monitor interface.",
323 additionalProperties
=> 0,
325 vmid
=> get_standard_option
('pve-vmid'),
328 returns
=> { type
=> 'null'},
332 my $vmid = $param->{vmid
};
334 my $conf = PVE
::QemuServer
::load_config
($vmid); # check if VM exists
336 print "Entering Qemu Monitor for VM $vmid - type 'help' for help\n";
338 my $term = new Term
::ReadLine
('qm');
341 while (defined ($input = $term->readline('qm> '))) {
344 next if $input =~ m/^\s*$/;
346 last if $input =~ m/^\s*q(uit)?\s*$/;
349 print PVE
::QemuServer
::vm_monitor_command
($vmid, $input);
351 print "ERROR: $@" if $@;
359 list
=> [ "PVE::API2::Qemu", 'vmlist', [],
360 { node
=> $nodename }, sub {
363 exit 0 if (!scalar(@$vmlist));
365 printf "%10s %-20s %-10s %-10s %12s %-10s\n",
366 qw(VMID NAME STATUS MEM(MB) BOOTDISK
(GB
) PID
);
368 foreach my $rec (sort { $a->{vmid
} <=> $b->{vmid
} } @$vmlist) {
369 printf "%10s %-20s %-10s %-10s %12.2f %-10s\n", $rec->{vmid
}, $rec->{name
},
371 ($rec->{maxmem
} || 0)/(1024*1024),
372 ($rec->{maxdisk
} || 0)/(1024*1024*1024),
379 create
=> [ "PVE::API2::Qemu", 'create_vm', ['vmid'], { node
=> $nodename } ],
381 destroy
=> [ "PVE::API2::Qemu", 'destroy_vm', ['vmid'], { node
=> $nodename } ],
383 set
=> [ "PVE::API2::Qemu", 'update_vm', ['vmid'], { node
=> $nodename } ],
385 unlink => [ "PVE::API2::Qemu", 'unlink', ['vmid', 'idlist'], { node
=> $nodename } ],
387 config
=> [ "PVE::API2::Qemu", 'vm_config', ['vmid'],
388 { node
=> $nodename }, sub {
390 foreach my $k (sort (keys %$config)) {
391 my $v = $config->{$k};
392 if ($k eq 'description') {
393 $v = PVE
::Tools
::encode_text
($v);
399 showcmd
=> [ __PACKAGE__
, 'showcmd', ['vmid']],
401 status
=> [ __PACKAGE__
, 'status', ['vmid']],
403 vncproxy
=> [ __PACKAGE__
, 'vncproxy', ['vmid']],
405 wait => [ __PACKAGE__
, 'wait', ['vmid']],
407 unlock
=> [ __PACKAGE__
, 'unlock', ['vmid']],
409 monitor
=> [ __PACKAGE__
, 'monitor', ['vmid']],
411 startall
=> [ __PACKAGE__
, 'startall', []],
413 stopall
=> [ __PACKAGE__
, 'stopall', []],
415 mtunnel
=> [ __PACKAGE__
, 'mtunnel', []],
418 sub register_vm_command
{
419 my ($cmd, $descr) = @_;
421 # we create a wrapper, because we want one 'description' per command
422 __PACKAGE__-
>register_method ({
426 description
=> $descr,
428 additionalProperties
=> 0,
430 vmid
=> get_standard_option
('pve-vmid'),
431 skiplock
=> get_standard_option
('skiplock'),
434 returns
=> { type
=> 'null'},
438 $param->{command
} = $cmd;
439 $param->{node
} = $nodename;
441 return PVE
::API2
::Qemu-
>vm_command($param);
444 $cmddef->{$cmd} = [ __PACKAGE__
, $cmd, ['vmid']];
447 register_vm_command
('start', "Start virtual machine.");
448 register_vm_command
('stop', "Stop virtual machine.");
449 register_vm_command
('reset', "Reset virtual machine.");
450 register_vm_command
('shutdown', "Shutdown virtual machine (send ACPI showdown request)");
451 register_vm_command
('suspend', "Suspend virtual machine.");
452 register_vm_command
('resume', "Resume virtual machine.");
453 register_vm_command
('cad', "Send CTRL-ALT-DELETE keys.");
457 PVE
::CLIHandler
::handle_cmd
($cmddef, "qm", $cmd, \
@ARGV, undef, $0);
465 qm - qemu/kvm virtual machine manager
473 qm is a script to manage virtual machines with qemu/kvm. You can
474 create and destroy virtual machines, and control execution
475 (start/stop/suspend/resume). Besides that, you can use qm to set
476 parameters in the associated config file. It is also possible to
477 create and delete virtual disks.
481 All configuration files consists of lines in the form
485 See L<vm.conf|vm.conf> for a complete list of options.
487 Configuration files are stored inside the Proxmox configuration file system, and can be access at F</etc/pve/qemu-server/C<VMID>.conf>.
489 The default for option 'keyboard' is read from
490 F</etc/pve/datacenter.conf>.
494 Online migration and backups (vzdump) set a lock to prevent
495 unintentional action on such VMs. Sometimes you need remove such lock
496 manually (power failure).
502 # create a new VM with 4 GB ide disk
503 qm create 300 -ide0 4 -net0 e1000 -cdrom proxmox-mailgateway_2.1.iso
508 # send shutdown, then wait until VM is stopped
509 qm shutdown 300 && qm wait 300
511 # same as above, but only wait for 40 seconds
512 qm shutdown 300 && qm wait 300 -timeout 40
515 =include pve_copyright