== 部署相关 ==
支持虚拟化VT-d,VT-x的CPU即可部署Proxmox


== 功能挖掘 ==
本章旨在挖掘Proxmox已有但未放到WEB控制台的功能。


===无状态虚拟机 ===
Proxmox无状态虚拟机是指某台虚拟机重启后自动恢复到初始状态。由于Proxmox基于KVM内核,所以KVM下“无敌模式”照样在Proxmox上可以使用([http://wiki.ubuntu.org.cn/Kvm%E6%95%99%E7%A8%8B#.E5.BF.AB.E7.85.A7.E6.A8.A1.E5.BC.8F.EF.BC.88-snapshot.EF.BC.89 无敌模式])。
基于这种判断,我们启动一台虚拟机,并查看虚拟机的进程:


 ps aux|grep 104
得到关于104虚拟机的调用命令:

/usr/bin/kvm -id 104 -chardev socket,id=qmp,path=/var/run/qemu-server/104.qmp,server,nowait -mon chardev=qmp,mode=control -vnc unix:/var/run/qemu-<br>server/104.vnc,x509,password -pidfile /var/run/qemu-server/104.pid -daemonize -name win7-test -smp sockets=2,cores=2 -nodefaults -boot menu=on -vga std -no-hpet -<br>cpu kvm64,hv_spinlocks=0xffff,hv_relaxed,+x2apic,+sep -k en-us -m 4048 -device piix3-usb-uhci,id=uhci,bus=pci.0,addr=0x1.0x2 -device usb-<br>tablet,id=tablet,bus=uhci.0,port=1 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 -drive if=none,id=drive-ide0,media=cdrom,aio=native -device ide-<br>cd,bus=ide.0,unit=0,drive=drive-ide0,id=ide0,bootindex=100 -drive file=/var/lib/vz/images/104/vm-104-disk-2.qcow2,if=none,id=drive-<br>ide1,format=qcow2,aio=native,cache=none -device ide-hd,bus=ide.0,unit=1,drive=drive-ide1,id=ide1 -drive file=/var/lib/vz/images/104/vm-104-disk-<br>1.qcow2,if=none,id=drive-virtio0,format=qcow2,aio=native,cache=none -device virtio-blk-pci,drive=drive-virtio0,id=virtio0,bus=pci.0,addr=0xa,bootindex=201 -netdev <br>type=tap,id=net0,ifname=tap104i0,script=/var/lib/qemu-server/pve-bridge,vhost=on -device virtio-net-<br>pci,mac=52:FC:91:CC:D4:1D,netdev=net0,bus=pci.0,addr=0x12,id=net0,bootindex=300 -rtc driftfix=slew,base=localtime -machine type=pc-i440fx-1.4 -global kvm-<br>pit.lost_tick_policy=discard




关闭虚拟机后,我们直接在Putty中输入上述命令,成功启动虚拟机。
现在进一步测试,在上述命令末尾加入-snapshot参数,运行命令启动虚拟机,如下所示:

/usr/bin/kvm -id 104 -chardev socket,id=qmp,path=/var/run/qemu-server/104.qmp,server,nowait -mon chardev=qmp,mode=control -vnc unix:/var/run/qemu-<br>server/104.vnc,x509,password -pidfile /var/run/qemu-server/104.pid -daemonize -name win7-test -smp sockets=2,cores=2 -nodefaults -boot menu=on -vga std -no-hpet -<br>cpu kvm64,hv_spinlocks=0xffff,hv_relaxed,+x2apic,+sep -k en-us -m 4048 -device piix3-usb-uhci,id=uhci,bus=pci.0,addr=0x1.0x2 -device usb-<br>tablet,id=tablet,bus=uhci.0,port=1 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 -drive if=none,id=drive-ide0,media=cdrom,aio=native -device ide-<br>cd,bus=ide.0,unit=0,drive=drive-ide0,id=ide0,bootindex=100 -drive file=/var/lib/vz/images/104/vm-104-disk-2.qcow2,if=none,id=drive-<br>ide1,format=qcow2,aio=native,cache=none -device ide-hd,bus=ide.0,unit=1,drive=drive-ide1,id=ide1 -drive file=/var/lib/vz/images/104/vm-104-disk-<br>1.qcow2,if=none,id=drive-virtio0,format=qcow2,aio=native,cache=none -device virtio-blk-pci,drive=drive-virtio0,id=virtio0,bus=pci.0,addr=0xa,bootindex=201 -netdev <br>type=tap,id=net0,ifname=tap104i0,script=/var/lib/qemu-server/pve-bridge,vhost=on -device virtio-net-<br>pci,mac=52:FC:91:CC:D4:1D,netdev=net0,bus=pci.0,addr=0x12,id=net0,bootindex=300 -rtc driftfix=slew,base=localtime -machine type=pc-i440fx-1.4 -global kvm-<br>pit.lost_tick_policy=discard -snapshot




虚拟机成功启动后,新建一个txt文档,写入内容,然后在WEB控制台重启虚拟机,发现测试成功——新建的txt文档消失,系统回到初始状态,这证明-snapshot参数可行。


实验到这里,我们已经成功实现了无状态虚拟机功能,但是操作起来较为繁琐,于是我们可否进一步,使得直接在WEB控制台直接启动一台无状态虚拟机?


如果我们能把-snapshot写入到虚拟机配置文件中(Proxmox虚拟机配置文件在/etc/pve/qemu-server/vmid.conf),将能实现控制台启动无状态虚拟机。


官方wiki查找[http://pve.proxmox.com/wiki/Manual:_vm.conf vm.conf文档]、[http://pve.proxmox.com/wiki/Qm_manual Qm文档]各项参数,找到args选项:

<pre>qm set <vmid> -args string 

 Note: this option is for experts only. It allows you to pass 

 arbitrary arguments to kvm, for example: 

 args: -no-reboot -no-hpet</pre>




于是使用
 qm set 104 -args -snapshot
启动虚拟机后查看进程中已经有-snapshot选项,然后写入文档并重启操作发现:


'''1、虚拟机直接重启,状态保持——应该是内存没有释放,所有内存中资料还存在'''


'''2、虚拟机关机,然后启动,恢复初始状态——无状态虚拟机模式'''


使用cat /etc/pve/qemu-server/104.conf可以看到里面有一项
 args: -snapshot
以后需要无状态虚拟机,只需在虚拟机配置文件中添加这条参数即可。


===虚拟机自动挂载USB===
使用以下命令可以让ID为100的虚拟机自动挂载USB,USB代码使用info usbhost得知
 qm set 100 -usb0 host=064f:03e9


== 疑难解决 ==
针对proxmox出现的各种问题,整理出来的解决方案,不断补充中...
[[PVE虚拟机内部文件系统识别修改]]
[[PVE虚拟机中挂载外部USB设备]]
[[USB相关命令文件说明]]
=== 更改IP集群失效 ===
在一个Proxmox集群创建完毕后,因网络环境变更,所以需要修改每个节点的IP地址,如从原来的192.168.1.1网段改成10.10.1.1网段,这时重启将造成集群失效,表现如下几个方面:
1、web控制台只能看到一个节点虚拟机情况
2、无法创建、删除、修改虚拟机(集群文件系统成只读模式)
3、通过pvecm nodes命令看到集群成员状态都是 X 模式
4、无法通过pvecm delnode无法删除集群成员(在官网上询问后,发现可以先暂停pve-cluster服务,然后删除节点,经测试发现可行。)
……


通过分析,发现集群创建后,会有相应的认证机制,改IP导致了认证机制失效,所以群集失效。再次分析,正常集群页面服务器列表都是显示服务器名,而非IP地址,所以hosts设置肯定是问题原因之一,所以尝试如下操作:


1、停止pve-cluster服务
 /etc/init.d/pve-cluster stop
2、修改/etc/hosts中的IP地址
 nano /etc/hosts
找格式类似如下内容的,修改其IP(如将192.168.1.100改成10.10.1.100)
 192.168.1.100 anjing.me anjing pvelocalhost
3、将所有集群节点的hosts文件均做修改,然后删除known_hosts中所有的信息
 nano /root/.ssh/known_hosts
4、重启所有服务器(也可以先尝试重启cman和pve-cluster)
 init 6
5、如果不出意外,集群将恢复正常


=== 删除日志后无法访问WEB控制台 ===


产生原因:


1、/目录占用100%,然后重启发现内存报错


 EDAC sbridge:lost memory errors


2、再次启动,使用
 rm -fr /var/log/*
命令删除日志,然后使用
 lsof |grep delete
找到该路径下已经被删除的文件,再次
 kill -9 pid 
3、于是无法访问web界面


解决方法:


连外网,
 apt-get update&apt-get upgrade&apt-get dist-upgrade
不行


查看syslog
 vim /var/log/syslog
显示无法访问到
 /var/log/pveproxy/access.log
 mkdir pveproxy
目录后,
 vim access.log
文件,然后
 chmod -R 7777 pveproxy
(中房公司出现类似情况,有集群,还需恢复一个cluster文件夹以及其中含有文件rorosync.log,具体看syslog)


=== 集群节点失效 ===
创建好集群后,除了主节点K1可以访问外,其他节点K2/K3无法通过浏览器访问(但所有节点都显示绿色正常)。通过修改hosts文件、重启pve-cluster、cman服务器等操作均无效。系统日志显示:
<pre>Feb 12 16:17:10 K1 pveproxy[2993]: WARNING: proxy detected vanished client connection
Feb 12 16:17:40 K1 pveproxy[2995]: WARNING: proxy detected vanished client connection
Feb 12 16:18:10 K1 pveproxy[2995]: WARNING: proxy detected vanished client connection
Feb 12 16:18:40 K1 pveproxy[2994]: WARNING: proxy detected vanished client connection
Feb 12 16:19:10 K1 pveproxy[2995]: WARNING: proxy detected vanished client connection</pre>
经过搜索发现是认证的问题,执行下面命令可以使集群节点生效
<pre>
root@K1:/etc/pve/local# scp pve-ssl.* root@K2:$PWD/
pve-ssl.key 100% 1679 1.6KB/s 00:00 
pve-ssl.pem 100% 1359 1.3KB/s 00:00 
</pre>
=== 虚拟机无法启动 ===
加入HA的虚拟机一旦死机,无法启动;必须先将虚拟机踢出HA,启动后再加入HA。


=== 禁止虚拟机进入修复模式 ===
服务器意外断电时,win7系统虚拟机自动启动后可能会进入修复模式,导致虚拟机无法连接,可以在虚拟机cmd(管理员模式)中输入如下命令,解决这个问题:
<pre>bcdedit /set {default} bootstatuspolicy ignoreallfailures
bcdedit /set {current} recoveryenabled No</pre>


== Proxmox个性化定制 ==
定制proxmox个性化界面,如logo修改,默认中文语言等。


===批量修改脚本=== 

 <pre>#!/bin/sh 

 ###update logo### 

 wget http://jst-cn.com/proxmox_logo.png 

 rm -fr /usr/share/pve-manager/images/proxmox_logo.png 

 mv proxmox_logo.png /usr/share/pve-manager/images 

 ###update pvemanagerlib.js### 

 cd /usr/share/pve-manager/ext4 

 cp pvemanagerlib.js pvemanagerlib.js.bak 

 sed -i -e 's/proxmox.com/kinsuncloud.com/g' pvemanagerlib.js 

 sed -i -e 's/(English)/(Chinese)/g' pvemanagerlib.js 

 sed -i -e 's/Proxmox/KSCLOUD/g' pvemanagerlib.js 

 sed -i -e 's/This is not a valid DNS name/这不是一个有效的DNS名/g' pvemanagerlib.js 

 sed -i -e 's/No valid subscription/技术支持/g' pvemanagerlib.js 

 sed -i -e 's/You do not have a valid subscription for this server. Please visit/请访问/g' pvemanagerlib.js 

 sed -i -e 's/to get a list of available options/获取技术支持/g' pvemanagerlib.js 

 ###update issue### 

 sed -i -e 's/Proxmox/KSCLOUD/g' /etc/issue 

 sed -i -e 's/Proxmox/KSCLOUD/g' /boot/grub/grub.cfg 

 sed -i -e 's/Proxmox/KSCLOUD/g' /usr/bin/pvebanner 

 ###update Proxmox VE authentication server### 

 sed -i -e 's/Proxmox/KSCLOUD/g' /usr/share/perl5/PVE/Auth/Plugin.pm 

 sed -i -e 's/Proxmox/KSCLOUD/g' /usr/share/pve-manager/root/index.pl 

 sed -i -e 's/Proxmox/KSCLOUD/g' /usr/share/doc/pve-manager/aplinfo.dat 

 ###title### 

 sed -i -e 's/Proxmox/KSCLOUD/g' /usr/bin/pveproxy 

 </pre>




===弹出对话框删除===
删除/usr/share/pve-manager/ext4/pvemanagerlib.js文件第110行和第452行
<pre>noSubKeyHtml: '请访问 <a target="_blank" href="http://www.fucloud.com/products/proxmox-ve/subscription-service-plans">www.fucloud.com</a> 获取技术支持.',</pre>

<pre>if (data.status !== 'Active') { 

               Ext.Msg.show({ 

                title: '技术支持', 

                icon: Ext.Msg.WARNING, 

                msg: PVE.Utils.noSubKeyHtml, 

                buttons: Ext.Msg.OK, 

                callback: function(btn) { 

                    if (btn !== 'ok') { 

                     return; 

                    } 

                    orig_cmd(); 

                } 

               }); 

           } else { 

               orig_cmd(); 

           } 

 </pre>


===删除权限说明=== 

 删除/usr/share/pve-manager/ext4/pvemanagerlib.js文件第20785行开始的代码 

 <pre>{ 

     xtype: 'pveRoleView', 

     title: gettext('Roles'), 

     itemId: 'roles' 

 },   

 </pre>




== 虚拟机模板 ==
简单做了一个虚拟机常用模板的制作流程:
[[文件:Template.jpg]]