Pve虚拟机中添加外部已有硬盘

一、QM命令

这是创建和设置pve虚拟机配置的命令

因为参数差不多,所以就一起列出来。

首先看一个创建虚拟机的例子。

1
2
3
4
5
6
7
8
9
qm create 114 \
--agent 1 \
--machine q35 \
--ostype l26 \
--scsihw virtio-scsi-pci \
--serial0 socket \
--cores 2 --sockets 1 --cpu host \
--bios seabios --boot cdn \
--net0 virtio,bridge=vmbr0

可以看到qm create命令格式是这样的

1
2
qm create <vmid> --<option> <value>
qm set <vmid> --<option> <value>

如果一个

1
qm set 100 --net0 virtio,bridge=vmbr0,firewall=0

本篇文章也就是列出来 这个

(一)qm网络部分

1
qm set/create 100 --net[n] [model] [,bridge=<bridge>] [,firewall=<1|0>] [,link_down=<1|0>] [,macaddr=<XX:XX:XX:XX:XX:XX>] [,queues=<integer>] [,rate=<number>] [,tag=<integer>] [,trunks=<vlanid[;vlanid...]>] [,<model>=<macaddr>]

举例

1
2
qm set 100 --net0 virtio,bridge=vmbr0,firewall=0
意思是设置网卡0,类型为virtio,桥街道vmbr0。关闭防火墙。

参数说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
--net[N] 
这是一个option。N是整数,一般用序列。代表网卡序列

model
网卡类型。e1000 | e1000-82540em | e1000-82544gc | e1000-82545em | i82551 | i82557b | i82559er | ne2k_isa | ne2k_pci | pcnet | rtl8139 | virtio | vmxnet3

bridge=<bridge>
bridge=vmbr[N].N代表桥接网卡的序号。

firewall=<1|0>
防火墙是否开启。值为1则开启,0为关闭

link_down=<1|0>
是否连接网卡,1为连接,0为端口。默认值为连接,所以一般不指定此项。

macaddr=<XX:XX:XX:XX:XX:XX>
指定网卡的MAC地址

rate=<number>
限速。单位mbps。一般不指定这项

tag=<integer>]
VLAN 标签

trunks=<vlanid[;vlanid...]>
trunk选项

<model>=<macaddr>
此项是model和mac的合集。可以不用上面的两个选项。直接这样设置。

在添加cloudinit之后,可以利用qm set命令指定ip

1
2
3
4
5
6
7
qm set 100 --ipconfig0 ip=10.0.10.123/24,gw=10.0.10.1,ip6=dhcp
或者
qm set 100 --ipconfig0 ip=dhcp,ip6=dhcp
其中 ipconig<N>N为网卡编号
设置dns
qm set 100 --nameserver 114.114.114.114
qm set 100 --searchdomain 114.114.114.114

(二) create/set命令介绍

1、基本硬件环境

2.1 主板类型

1
2
3
4
简化
--machine q35|i440fx
完整
--machine (pc|pc(-i440fx)?-\d+(\.\d+)+(\+pve\d+)?(\.pxe)?|q35|pc-q35-\d+(\.\d+)+(\+pve\d+)?(\.pxe)?|virt(?:-\d+(\.\d+)+)?(\+pve\d+)?)

2.2 CPU

1
2
3
4
5
--sockets <N>    //几个物理插槽
--vcpus <N> //几个核心
--cpu <string> //CPU类型 host | kvm64 | qemu64 等等
--cpulimit <0-128> //CPU限制
--cpuunits <2-262144> //CPU权重

2.3 其他信息

1
2
3
4
5
6
7
8
--bios seabios|ovmf  //选择是哪种bios类型
--boot cdn //启动顺序。cdrom disk network
--ostype //l24 | l26 | other | solaris | w2k | w2k3 | w2k8 | win10 | win7 | win8 | wvista | wxp
(注意前两个 一个是linux 2.4内核 一个是linux2.6内核以上,所以是字母小写L,不是1)
--agent 1 //开启qemu-guest-agent
--name vmname //虚拟机名称
--scsihw virtio-scsi-pci | virtio-scsi-single | megasas | pvscsi | lsi53c810 |lsi //磁盘控制器类型
--serial<N> (/dev/.+|socket) //增加串口,N=0-3。一般指定串口0,类型为socket。此项对于需要串口情况非常有用,例如cloudinit。

2、硬盘参数

1
2
3
4
5
--scsi<N> [pool]:[size]       //其中N为scsi序号,从0开始。pool为储存池名称,例如local-lvm,[size]是硬盘大小,不需要指定磁盘名,系统创建。
例: qm create 100 --scsi0 local-lvm:40
创建虚拟机100,并且在local-lvm上创建一个40G的scsi磁盘。
--ide<N> [pool]:[size] //ide磁盘
--sata<N> [pool]:[size] //sata磁盘
1
2
3
例如:
qm set 300 -virtio1 (或者-ide1、 -sata1 、-scsi1) test:300/vm-300-disk-0.qcow2
qm set 211 -scsi2 (或者-ide1、 -sata1 、-scsi1) ExtDisk:211/vm-211-disk-1.qcow2,size=300G
1
2
3
4
5
6
导入硬盘:
qm importdisk 300 /root/test.img local-lvm --format raw
qm importovf 300 /root/ros.ovf local-lvm --format qcow2

以上添加ros.ovf文件后,需要在gui后者cli命令行中将磁盘attch为ide,然后还需要降入mode以及serial参数,如下:
,model=VMware%20Virtual%20IDE%20Hard%20Drive,serial=00000000000000000001 这样做的目的是为了破解ros

如果只有vmdk文件没有ovf文件,那么只能先创建虚拟机,然后通过qm importdisk 300 /root/test.vmdk local-lvm来将vmdk磁盘导入到虚拟机中。qm importdisk后,在/etc/pve/qemu-server/vmidx.conf配置文件下-unused0:local-lvm:vm-300-disk-4这样的方式呈现,需要在web gui中attach下,或者干脆在命令行中直接指定qm set 300 -virtio3:local-lvm/vm-300-disk-4,size=100M

3、cloud-init

cloudinit常用于公有云中。

需要虚拟机有cloud drive

1
2
#创建cloud drive
qm set 100 --ide2 local-lvm:cloudinit //注意,cloudinit的ide必须大于2。应该是bug吧。

设置cloudinit基本属性

1
2
3
qm set 100 --sshkey ~/.ssh/id_rsa.pub               //设置ssh
qm set 100 --ipconfig0 ip=10.0.10.123/24,gw=10.0.10.1 //设置ip
qm set 100 --cipassword:foxi123456 --ciuser:root //设置用户和密码。注意密码在设置之后,会自动隐藏。

当然既然是cloudinit,就和openstak接轨。

同样支持自定义cloudinit参数。

1
2
3
4
5
6
引号里的,可以单独指定一项。指定了哪个部分就会覆盖上面的基本属性。
qm set 9000 --cicustom "user=<volume>,network=<volume>,meta=<volume>"
例如指定了user环节的参数,那么上面的user属性就失效,根据自定义参数来。
qm set 9000 --cicustom "user=local:snippets/userconfig.yaml"
这里官方是建议用户把yaml文件放在snippets文件夹下。
yaml必须符合cloudinit规范和语法规范

官方提供的cloud-init,user模块只有用户账密模块。可以自己修改脚本文件,添加新的选项,例如package-Update-Upgrade-Install模块。让cloudinit开机自动安装升级程序。

1
2
3
4
5
6
7
8
9
10
11
12
z修改脚本文件
cp /usr/share/perl5/PVE/QemuServer/Cloudinit.pm /usr/share/perl5/PVE/QemuServer/Cloudinit.pm_backup
nano /usr/share/perl5/PVE/QemuServer/Cloudinit.pm

在cloudinit_userdata部分,return $content;之前
添加内容

$content .= "packages: \n";
$content .= " - qemu-guest-agent\n";
return $content;
}
修改之后,重启服务器。即可生效

暂时就这些内容。建议参照vm的配置文件自己研究下。

下面贴出一个样式,。

1
2
3
4
5
6
7
8
9
10
11
12
qm create 110 \
--agent 1 \
--machine q35 \
--ostype l26 \
--scsihw virtio-scsi-pci \
--serial0 socket \
--cores 2 --sockets 1 --cpu host \
--bios seabios --boot cdn \
--net0 virtio,bridge=vmbr0 \
--ide2 nvme1:cloudinit \
--name qmcreate \
--cipassword foxi123456 --ciuser root

在官方wiki。可以查看更多的详细内容。

https://pve.proxmox.com/pve-docs/qm.1.html

关于cloudinit模块,可以参考。注意切换版本号。

https://cloudinit.readthedocs.io/en/latest/index.html