]>
git.proxmox.com Git - qemu-server.git/blob - qm
60b1add0708c41e935d4381a2bb1e760dd1852ae
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 qmigrate - do not use manually.",
200 additionalProperties
=> 0,
203 returns
=> { type
=> 'null'},
207 if (!PVE
::Cluster
::check_cfs_quorum
(1)) {
212 print "tunnel online\n";
215 while (my $line = <>) {
217 last if $line =~ m/^quit$/;
223 __PACKAGE__-
>register_method ({
227 description
=> "Start all virtual machines (when onboot=1).",
229 additionalProperties
=> 0,
232 returns
=> { type
=> 'null'},
236 my $vzlist = PVE
::QemuServer
::vzlist
();
237 my $storecfg = PVE
::Storage
::config
();
240 foreach my $vmid (keys %$vzlist) {
241 next if $vzlist->{$vmid}->{pid
}; # already running
243 sleep(2) if $count != 0; # reduce load
247 my $conf = PVE
::QemuServer
::load_config
($vmid);
248 if ($conf->{onboot
}) {
249 print STDERR
"Starting Qemu VM $vmid\n";
250 PVE
::QemuServer
::vm_start
($storecfg, $vmid);
253 print STDERR
$@ if $@;
259 __PACKAGE__-
>register_method ({
263 description
=> "Stop all virtual machines.",
265 additionalProperties
=> 0,
268 description
=> "Timeout in seconds. Default is to wait 3 minutes.",
275 returns
=> { type
=> 'null'},
279 my $timeout = $param->{timeout
};
281 PVE
::QemuServer
::vm_stopall
($timeout);
286 __PACKAGE__-
>register_method ({
290 description
=> "Wait until the VM is stopped.",
292 additionalProperties
=> 0,
294 vmid
=> get_standard_option
('pve-vmid'),
296 description
=> "Timeout in seconds. Default is to wait forever.",
303 returns
=> { type
=> 'null'},
307 my $vmid = $param->{vmid
};
308 my $timeout = $param->{timeout
};
310 my $pid = PVE
::QemuServer
::check_running
($vmid);
313 print "waiting until VM $vmid stopps (PID $pid)\n";
316 while ((!$timeout || ($count < $timeout)) && PVE
::QemuServer
::check_running
($vmid)) {
321 die "wait failed - got timeout\n" if PVE
::QemuServer
::check_running
($vmid);
326 __PACKAGE__-
>register_method ({
330 description
=> "Enter Qemu Monitor interface.",
332 additionalProperties
=> 0,
334 vmid
=> get_standard_option
('pve-vmid'),
337 returns
=> { type
=> 'null'},
341 my $vmid = $param->{vmid
};
343 my $conf = PVE
::QemuServer
::load_config
($vmid); # check if VM exists
345 print "Entering Qemu Monitor for VM $vmid - type 'help' for help\n";
347 my $term = new Term
::ReadLine
('qm');
350 while (defined ($input = $term->readline('qm> '))) {
353 next if $input =~ m/^\s*$/;
355 last if $input =~ m/^\s*q(uit)?\s*$/;
358 print PVE
::QemuServer
::vm_monitor_command
($vmid, $input);
360 print "ERROR: $@" if $@;
368 list
=> [ "PVE::API2::Qemu", 'vmlist', [],
369 { node
=> $nodename }, sub {
372 exit 0 if (!scalar(@$vmlist));
374 printf "%10s %-20s %-10s %-10s %12s %-10s\n",
375 qw(VMID NAME STATUS MEM(MB) BOOTDISK
(GB
) PID
);
377 foreach my $rec (sort { $a->{vmid
} <=> $b->{vmid
} } @$vmlist) {
378 printf "%10s %-20s %-10s %-10s %12.2f %-10s\n", $rec->{vmid
}, $rec->{name
},
380 ($rec->{maxmem
} || 0)/(1024*1024),
381 ($rec->{maxdisk
} || 0)/(1024*1024*1024),
388 create
=> [ "PVE::API2::Qemu", 'create_vm', ['vmid'], { node
=> $nodename } ],
390 destroy
=> [ "PVE::API2::Qemu", 'destroy_vm', ['vmid'], { node
=> $nodename } ],
392 set
=> [ "PVE::API2::Qemu", 'update_vm', ['vmid'], { node
=> $nodename } ],
394 unlink => [ "PVE::API2::Qemu", 'unlink', ['vmid', 'idlist'], { node
=> $nodename } ],
396 config
=> [ "PVE::API2::Qemu", 'vm_config', ['vmid'],
397 { node
=> $nodename }, sub {
399 foreach my $k (sort (keys %$config)) {
400 next if $k eq 'digest';
401 my $v = $config->{$k};
402 if ($k eq 'description') {
403 $v = PVE
::Tools
::encode_text
($v);
409 showcmd
=> [ __PACKAGE__
, 'showcmd', ['vmid']],
411 status
=> [ __PACKAGE__
, 'status', ['vmid']],
413 vncproxy
=> [ __PACKAGE__
, 'vncproxy', ['vmid']],
415 wait => [ __PACKAGE__
, 'wait', ['vmid']],
417 unlock
=> [ __PACKAGE__
, 'unlock', ['vmid']],
419 monitor
=> [ __PACKAGE__
, 'monitor', ['vmid']],
421 startall
=> [ __PACKAGE__
, 'startall', []],
423 stopall
=> [ __PACKAGE__
, 'stopall', []],
425 mtunnel
=> [ __PACKAGE__
, 'mtunnel', []],
428 sub register_vm_command
{
429 my ($cmd, $descr) = @_;
431 # we create a wrapper, because we want one 'description' per command
432 __PACKAGE__-
>register_method ({
436 description
=> $descr,
438 additionalProperties
=> 0,
440 vmid
=> get_standard_option
('pve-vmid'),
441 skiplock
=> get_standard_option
('skiplock'),
444 returns
=> { type
=> 'null'},
448 $param->{command
} = $cmd;
449 $param->{node
} = $nodename;
451 return PVE
::API2
::Qemu-
>vm_command($param);
454 $cmddef->{$cmd} = [ __PACKAGE__
, $cmd, ['vmid']];
457 register_vm_command
('start', "Start virtual machine.");
458 register_vm_command
('stop', "Stop virtual machine.");
459 register_vm_command
('reset', "Reset virtual machine.");
460 register_vm_command
('shutdown', "Shutdown virtual machine (send ACPI showdown request)");
461 register_vm_command
('suspend', "Suspend virtual machine.");
462 register_vm_command
('resume', "Resume virtual machine.");
463 register_vm_command
('cad', "Send CTRL-ALT-DELETE keys.");
467 PVE
::CLIHandler
::handle_cmd
($cmddef, "qm", $cmd, \
@ARGV, undef, $0);
475 qm - qemu/kvm virtual machine manager
483 qm is a script to manage virtual machines with qemu/kvm. You can
484 create and destroy virtual machines, and control execution
485 (start/stop/suspend/resume). Besides that, you can use qm to set
486 parameters in the associated config file. It is also possible to
487 create and delete virtual disks.
491 All configuration files consists of lines in the form
495 See L<vm.conf|vm.conf> for a complete list of options.
497 Configuration files are stored inside the Proxmox configuration file system, and can be access at F</etc/pve/qemu-server/C<VMID>.conf>.
499 The default for option 'keyboard' is read from
500 F</etc/pve/datacenter.conf>.
504 Online migration and backups (vzdump) set a lock to prevent
505 unintentional action on such VMs. Sometimes you need remove such lock
506 manually (power failure).
512 # create a new VM with 4 GB ide disk
513 qm create 300 -ide0 4 -net0 e1000 -cdrom proxmox-mailgateway_2.1.iso
518 # send shutdown, then wait until VM is stopped
519 qm shutdown 300 && qm wait 300
521 # same as above, but only wait for 40 seconds
522 qm shutdown 300 && qm wait 300 -timeout 40
525 =include pve_copyright