最近搞到了几台独立服务器(未经虚拟化过的独立CPU,内存等,下称独服),并且服务上分配了5个ip到此服务器上。在独服上只安装个ubuntu之类的单个操作系统感觉有点浪费了多了ip和性能,于是决定在独服基础上新建KVM虚拟机分别装系统来充分利用ip,同时便于资源的管理。

准备环境

网络:假设主ip为1.2.3.98,可用ip为1.2.3.99,1.2.3.100,1.2.3.101,1.2.3.102,网关为1.2.3.97,掩码为255.255.255.248(其他自己计算)。
独服环境:基础操作系统为Debian9。
虚拟化软件:Proxmox VE

Proxmox VE(英语:Proxmox Virtual Environment,通常简称为PVE、Proxmox),是一个开源的服务器虚拟化环境Linux发行版。Proxmox VE基于Debian,使用基于Ubuntu的定制内核,包含安装程序、网页控制台和命令行工具,并且向第三方工具提供了REST API,在Affero通用公共许可证第三版下发行。Proxmox VE支持两类虚拟化技术:基于容器的LXC(自4.0版开始,3.4版及以前使用OpenVZ技术)和硬件抽象层全虚拟化的KVM。
检查Bios是否开启了虚拟化(不然没法启动虚拟机系统):

1
2
3
4
5
6
7
8
9
lsmod |grep kvm
# 输出结果:
# 未开启
kvm 554609 0
irqbypass 13503 1 kvm
# 已开启
kvm_intel 170181 0
kvm 554609 1 kvm_intel
irqbypass 13503 1 kvm

安装PVE

安装pve官方文档

  • 设置hostname

    1
    hostnamectl set-hostname usdedi
  • 修改hosts

    1
    2
    3
    vim /etc/hosts
    # 修改为ip(公网) hostname,如
    1.2.3.98 usdedi
  • 检查名称

    1
    2
    hostname --ip-address
    # 需要输出你的ip地址
  • 安装
    如果上面都没有问题,那么可以开始安装了,安装完成重启系统。

    1
    2
    3
    4
    5
    echo "deb http://download.proxmox.com/debian/pve stretch pve-no-subscription" > /etc/apt/sources.list.d/pve-install-repo.list
    wget http://download.proxmox.com/debian/proxmox-ve-release-5.x.gpg -O /etc/apt/trusted.gpg.d/proxmox-ve-release-5.x.gpg
    chmod +r /etc/apt/trusted.gpg.d/proxmox-ve-release-5.x.gpg
    apt update && apt dist-upgrade
    apt install proxmox-ve postfix open-iscsi

设置网络

重要,如果网络设置不正确并且独服没有提供vnc功能,重启网络后会再也不能连上独服。可以编写脚本每次重启时自动恢复初始网络配置来避免设置出错导致的失联。
网络设置官方文档
重要,根据官方文档中的说法,如果不按服务商规定桥接网络会导致断网。

Most hosting providers do not support the above setup. For security reasons, they disable networking as soon as they detect multiple MAC addresses on a single interface.

由于我的服务商没有禁止多MAC桥接到同一端口,故采取默认方法,配置如下:

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
30
31
32
33
34
35
36
37
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
iface enp4s0 inet manual
# 这里是你的物理网卡

auto vmbr0
iface vmbr0 inet static
address 1.2.3.98/29
gateway 1.2.3.97
# 自己算
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 127.0.0.1
dns-search 32918
bridge_ports enp4s0
# 这里是你的物理网卡
bridge_stp off
bridge_fd 0

auto vmbr1
iface vmbr1 inet static
address 10.0.0.1
netmask 255.255.255.0
# 这里自己选个内网ip段吧
bridge_ports none
# 这里没有桥接到物理网卡
bridge_stp off
bridge_fd 0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '10.0.0.0/24' -o vmbr0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.0.0.0/24' -o vmbr0 -j MASQUERADE

上面的设置创建了如下的网络:

  1. 如果虚拟机连接到vmbr0,则需要为其分配公网ip地址则可以访问网络;
  2. 如果虚拟机连接到vmbr1,则需要为其分配内网ip地址通过独服宿主机访问网络。

最后重启主机。(单独重启网络需要手动停止和启动vmbr,停止后会导致ssh断开没法再连接上,还是直接重启机器吧)

创建虚拟机

将系统iso镜像下载到

1
/var/lib/vz/template/iso

目录中。之后在web管理界面https://ip:8006中创建虚拟机一步一步按流程来就行了,注意根据网卡选择不同需要手动设置不同的静态ip。

一些小问题

  • 如果是HDD磁盘,感觉创建后的虚拟机磁盘IO会进一步降低,这里创建时将其改为VirtIO Block和Write Back(不安全),可以提高io,具体区别和风险自行查阅。

  • CPU高级设置中勾选启用NUMA,虽然我感觉不到有什么用(

  • 如果要安装windows系统,需要下载VirtIO驱动并作为第二光驱挂载,安装时手动加载驱动程序便可找到磁盘并且在开机后安装网卡驱动。

    1
    wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
  • 禁止公网访问PVE控制页面

    1
    2
    iptables -A INPUT -s 127.0.0.1 -p tcp --dport 8006 -j ACCEPT
    iptables -A INPUT -p TCP --dport 8006 -j REJECT
  • 关闭登录后的订阅提醒

    1
    2
    vim /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
    # 搜索并修改if(data.status!=='Active') 为if(false)即可。