]>
git.proxmox.com Git - qemu-server.git/blob - qm
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');
40 my $status = PVE
::Tools
::upid_read_status
($upid);
41 exit($status eq 'OK' ?
0 : -1);
44 my $nodename = PVE
::INotify
::nodename
();
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
();
239 PVE
::Cluster
::check_cfs_quorum
();
242 foreach my $vmid (keys %$vzlist) {
243 next if $vzlist->{$vmid}->{pid
}; # already running
245 sleep(2) if $count != 0; # reduce load
248 PVE
::Cluster
::check_cfs_quorum
(); # abort when we loose quorum
251 my $conf = PVE
::QemuServer
::load_config
($vmid);
252 if ($conf->{onboot
}) {
253 print STDERR
"Starting Qemu VM $vmid\n";
254 PVE
::QemuServer
::vm_start
($storecfg, $vmid);
257 print STDERR
$@ if $@;
263 __PACKAGE__-
>register_method ({
267 description
=> "Stop all virtual machines.",
269 additionalProperties
=> 0,
272 description
=> "Timeout in seconds. Default is to wait 3 minutes.",
279 returns
=> { type
=> 'null'},
283 my $timeout = $param->{timeout
};
285 my $storecfg = PVE
::Storage
::config
();
287 PVE
::QemuServer
::vm_stopall
($storecfg, $timeout);
292 __PACKAGE__-
>register_method ({
296 description
=> "Wait until the VM is stopped.",
298 additionalProperties
=> 0,
300 vmid
=> get_standard_option
('pve-vmid'),
302 description
=> "Timeout in seconds. Default is to wait forever.",
309 returns
=> { type
=> 'null'},
313 my $vmid = $param->{vmid
};
314 my $timeout = $param->{timeout
};
316 my $pid = PVE
::QemuServer
::check_running
($vmid);
319 print "waiting until VM $vmid stopps (PID $pid)\n";
322 while ((!$timeout || ($count < $timeout)) && PVE
::QemuServer
::check_running
($vmid)) {
327 die "wait failed - got timeout\n" if PVE
::QemuServer
::check_running
($vmid);
332 __PACKAGE__-
>register_method ({
336 description
=> "Enter Qemu Monitor interface.",
338 additionalProperties
=> 0,
340 vmid
=> get_standard_option
('pve-vmid'),
343 returns
=> { type
=> 'null'},
347 my $vmid = $param->{vmid
};
349 my $conf = PVE
::QemuServer
::load_config
($vmid); # check if VM exists
351 print "Entering Qemu Monitor for VM $vmid - type 'help' for help\n";
353 my $term = new Term
::ReadLine
('qm');
356 while (defined ($input = $term->readline('qm> '))) {
359 next if $input =~ m/^\s*$/;
361 last if $input =~ m/^\s*q(uit)?\s*$/;
364 print PVE
::QemuServer
::vm_monitor_command
($vmid, $input);
366 print "ERROR: $@" if $@;
374 list
=> [ "PVE::API2::Qemu", 'vmlist', [],
375 { node
=> $nodename }, sub {
378 exit 0 if (!scalar(@$vmlist));
380 printf "%10s %-20s %-10s %-10s %12s %-10s\n",
381 qw(VMID NAME STATUS MEM(MB) BOOTDISK
(GB
) PID
);
383 foreach my $rec (sort { $a->{vmid
} <=> $b->{vmid
} } @$vmlist) {
384 printf "%10s %-20s %-10s %-10s %12.2f %-10s\n", $rec->{vmid
}, $rec->{name
},
386 ($rec->{maxmem
} || 0)/(1024*1024),
387 ($rec->{maxdisk
} || 0)/(1024*1024*1024),
394 create
=> [ "PVE::API2::Qemu", 'create_vm', ['vmid'], { node
=> $nodename }, $upid_exit ],
396 destroy
=> [ "PVE::API2::Qemu", 'destroy_vm', ['vmid'], { node
=> $nodename }, $upid_exit ],
398 migrate
=> [ "PVE::API2::Qemu", 'migrate_vm', ['vmid', 'target'], { node
=> $nodename }, $upid_exit ],
400 set
=> [ "PVE::API2::Qemu", 'update_vm', ['vmid'], { node
=> $nodename } ],
402 unlink => [ "PVE::API2::Qemu", 'unlink', ['vmid', 'idlist'], { node
=> $nodename } ],
404 config
=> [ "PVE::API2::Qemu", 'vm_config', ['vmid'],
405 { node
=> $nodename }, sub {
407 foreach my $k (sort (keys %$config)) {
408 next if $k eq 'digest';
409 my $v = $config->{$k};
410 if ($k eq 'description') {
411 $v = PVE
::Tools
::encode_text
($v);
417 showcmd
=> [ __PACKAGE__
, 'showcmd', ['vmid']],
419 status
=> [ __PACKAGE__
, 'status', ['vmid']],
421 start
=> [ "PVE::API2::Qemu", 'vm_start', ['vmid'], { node
=> $nodename } , $upid_exit ],
423 stop
=> [ "PVE::API2::Qemu", 'vm_stop', ['vmid'], { node
=> $nodename }, $upid_exit ],
425 reset => [ "PVE::API2::Qemu", 'vm_reset', ['vmid'], { node
=> $nodename }, $upid_exit ],
427 shutdown => [ "PVE::API2::Qemu", 'vm_shutdown', ['vmid'], { node
=> $nodename }, $upid_exit ],
429 suspend
=> [ "PVE::API2::Qemu", 'vm_suspend', ['vmid'], { node
=> $nodename }, $upid_exit ],
431 resume
=> [ "PVE::API2::Qemu", 'vm_resume', ['vmid'], { node
=> $nodename }, $upid_exit ],
433 sendkey
=> [ "PVE::API2::Qemu", 'vm_sendkey', ['vmid', 'key'], { node
=> $nodename } ],
435 vncproxy
=> [ __PACKAGE__
, 'vncproxy', ['vmid']],
437 wait => [ __PACKAGE__
, 'wait', ['vmid']],
439 unlock
=> [ __PACKAGE__
, 'unlock', ['vmid']],
441 monitor
=> [ __PACKAGE__
, 'monitor', ['vmid']],
443 startall
=> [ __PACKAGE__
, 'startall', []],
445 stopall
=> [ __PACKAGE__
, 'stopall', []],
447 mtunnel
=> [ __PACKAGE__
, 'mtunnel', []],
452 PVE
::CLIHandler
::handle_cmd
($cmddef, "qm", $cmd, \
@ARGV, undef, $0);
460 qm - qemu/kvm virtual machine manager
468 qm is a script to manage virtual machines with qemu/kvm. You can
469 create and destroy virtual machines, and control execution
470 (start/stop/suspend/resume). Besides that, you can use qm to set
471 parameters in the associated config file. It is also possible to
472 create and delete virtual disks.
476 All configuration files consists of lines in the form
480 See L<vm.conf|vm.conf> for a complete list of options.
482 Configuration files are stored inside the Proxmox configuration file system, and can be access at F</etc/pve/qemu-server/C<VMID>.conf>.
484 The default for option 'keyboard' is read from
485 F</etc/pve/datacenter.conf>.
489 Online migration and backups (vzdump) set a lock to prevent
490 unintentional action on such VMs. Sometimes you need remove such lock
491 manually (power failure).
497 # create a new VM with 4 GB ide disk
498 qm create 300 -ide0 4 -net0 e1000 -cdrom proxmox-mailgateway_2.1.iso
503 # send shutdown, then wait until VM is stopped
504 qm shutdown 300 && qm wait 300
506 # same as above, but only wait for 40 seconds
507 qm shutdown 300 && qm wait 300 -timeout 40
510 =include pve_copyright