虚拟机相关

常见问题?

VMware Workstation导出文件 ovf和ova的区别?

后缀是ovf,则会导出多个相关文件(.ovf .mf .vmdk .iso); 后缀是ova,则只会导出一个ova的压缩包。

QEMU是什么?

QEMU是一个主机上的VMM(virtual machine monitor),通过动态二进制转换来模拟CPU,并提供一系列的硬件模型,使guest os认为自己和硬件直接打交道,其实是同QEMU模拟出来的硬件打交道,QEMU再将这些指令翻译给真正硬件进行操作。 通过这种模式,guest os可以和主机上的硬盘,网卡,CPU,CD-ROM,音频设备和USB设备进行交互。但由于所有指令都需要经过QEMU来翻译,因而性能会比较差。

KVM是什么?

KVM实际是linux内核提供的虚拟化架构,可将内核直接充当hypervisor来使用。KVM需要处理器硬件本身支持虚拟化扩展,如intel VT 和AMD AMD-V技术。

QEMU-KVM是什么?

KVM负责cpu虚拟化+内存虚拟化,实现了cpu和内存的虚拟化,但kvm并不能模拟其他设备,还必须有个运行在用户空间的工具才行。 KVM的开发者选择了比较成熟的开源虚拟化软件QEMU来作为这个工具,QEMU模拟IO设备(网卡,磁盘等),对其进行了修改,最后形成了QEMU-KVM。

QEMU-KVM,是QEMU的一个特定于KVM加速模块的分支,里面包含了很多关于KVM的特定代码,与KVM模块一起配合使用。 目前QEMU-KVM已经与QEMU合二为一,所有特定于KVM的代码也都合入了QEMU,当需要与KVM模块配合使用的时候,只需要在QEMU命令行加上 --enable-kvm就可以。

ref: QEMU,KVM及QEMU-KVM介绍

常用虚拟机操作指令

KVM virsh命令

高频使用命令

1.使用centos-7.6.1810-20181204-x86_64.iso创建kvm虚拟机,图形化界面开vnc端口访问
size的单位是G,值为60表示:60G = 60*1024M

virt-install \
    --cdrom=/opt/iso/centos-7.6.1810-20181204-x86_64.iso \
    --virt-type kvm \
    --name saee \
    --ram 32768 \
    --vcpus=12 \
    --disk path=/opt/vm/saee.disk,size=60 \
    --network bridge=br0 \
    --graphics vnc,listen=0.0.0.0 \
    --noautoconsole

2.查看当前服务器有哪些虚拟机
virsh list --all

3.查看虚拟机的vnc端口:
virsh vncdisplay [vm_name]

:0 就用vnc访问宿主机ip:5900
:1 就用vnc访问宿主机ip:5901

3.创建快照
virsh snapshot-create-as [domain] [snapshot-name]
e.g.
virsh snapshot-create-as centos7 centos7_snapshot

4.查看指定虚拟机的快照列表
virsh snapshot-list [domain]
e.g.
virsh snapshot-list sabe

更多参考: - kvm 使用入门详解 - Centos7 kvm环境制作qcow2 格式镜像

virt-manager在图形化下操作kvm虚拟机,没有就只能通过命令来操作。

5.VM虚拟机转KVM虚拟机

(个人操作发现可能有兼容性问题,不推荐)

打开终端,进入VMware安装不目录 cd D:\Program Files (x86)\VMware\VMware Workstation\
vmware-vdiskmanager.exe -r "D:\VMs\kali-linux-2022.1-vmware-amd64.vmwarevm\"
(1)vmware-vdiskmanager.exe -r "F:\共享\VM\test\xxx.vmdk" -t 0 "F:\共享\VM\xxx.vmdk"
(2)qemu-img convert xxx.vmdk -O qcow2 xxx.img
(3)挂载qcow镜像创建虚拟机:
 virt-install \
    --virt-type kvm \
    --name viper \
    --ram 2048 \
    --vcpus=2 \
    --disk path=/opt/img/xxx.img,format=qcow2 \
    --network network=default \
    --graphics vnc,listen=0.0.0.0 \
    --force \
    --import \
    --autostart \
    --os-variant ubuntu18.04 \
    --noautoconsole

补充,经测试,KVM在2核2G配置下通过iso安装Kali速度很慢,建议酌情增加配置。

virt-install \
    --cdrom=/opt/iso/kali-linux-2022.1-installer-amd64.iso \
    --virt-type kvm \
    --name kali2022.1 \
    --ram 4096 \
    --vcpus=4 \
    --disk path=/opt/vm/kali2022.1,size=200 \
    --network bridge=br0 \
    --graphics vnc,listen=0.0.0.0 \
    --noautoconsole

ref: - 迁移VMWare虚拟机到KVM - ubuntu-kvm上面deploy qcow2格式虚拟机

查询系统是否开启虚拟化

[root@localhost vm]# LC_ALL=C lscpu| grep Virtualization
Virtualization:        VT-x

查询虚拟服务是否启动

[root@localhost vm]# systemctl status libvirtd
● libvirtd.service - Virtualization daemon
   Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2022-04-07 23:59:30 CST; 18h ago
     Docs: man:libvirtd(8)
           https://libvirt.org
 Main PID: 5418 (libvirtd)
    Tasks: 20 (limit: 32768)
   Memory: 8.1M
   CGroup: /system.slice/libvirtd.service
           ├─5418 /usr/sbin/libvirtd
           ├─8334 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
           └─8335 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper

virsh结合shell批量操作虚拟机

# 批量 软关机
for i in $(virsh list --name --autostart); do virsh shutdown $i; done

# 批量 硬关机
for i in $(virsh list --name --autostart); do virsh destroy $i; done

# 批量 开启
for i in $(virsh list --name --autostart); do virsh start $i; done

# 批量开启关闭状态的虚拟机
for i in $(virsh list --name --inactive); do virsh start $i; done
# 用这条命令来判断qemu的依赖是否完全,如果缺失会报错
/usr/libexec/qemu-kvm --version 

---- 安装虚拟机 ---------------------------------------------------------------------

# CentOS7 - 无桌面安装部署kvm虚拟机
# https://baijiahao.baidu.com/s?id=1612142653122584145&wfr=spider&for=pc



# 查询cpu是否支持虚拟化,硬件虚拟化为vmx(Inter)、svm(AMD),软件虚拟的效率非常低
cat /proc/cpuinfo |grep -E 'vmx|svm'

# 查询bios是否开启虚拟化,不支持的话会显示kvm:disabled by bios,正常无回显
dmesg |grep kvm

# 安装qemu和vir
yum -y install epel-release
yum -y install qemu-kvm libvirt virt-install

# 启动服务
systemctl start libvirtd && systemctl enable libvirtd

# --virt-type:默认先kvm再qemu,强制指定kvm
# -name:虚拟机的名字
# -ram:内存大小MB
# -vcpus:CPU个数
# -cdrom:ISO镜像位置
# -network:网络
# -graphics:Guest显示设置
# --noautoconsole:不连接到控制台,默认会直接从ssh连接vnc
# -disk path:磁盘位置,size磁盘大小G

# virt-install指令可以直接写到.sh文件来执行,以免命令行粘贴出错
virt-install \
    --virt-type kvm \
    --name centos7 \
    --ram 4096  \
    --vcpus=4 \
    --cdrom=/mnt/dvd/CentOS-7-x86_64-Minimal-1810.iso \
    --disk path=/opt/vm/centos7.disk,size=512 \
    --network bridge=br0 \
    --graphics vnc,listen=0.0.0.0 --noautoconsole

virt-install \
    --virt-type kvm \
    --name dtd \
    --ram 4096  \
    --vcpus=4 \
    --cdrom=/mnt/dvd/dtd.iso \
    --disk path=/opt/vm/dtd.disk,size=2048 \
    --network network=default \
    --graphics vnc,listen=0.0.0.0 --noautoconsole

# 虚拟机桥接
/etc/qemu-kvm/bridge.conf

# 虚拟机配置,所有的命令实际上都是修改这个文件
/etc/libvirt/qemu/*.xml

# 修改配置后,重启服务
systemctl restart libvirtd

# 关闭指定虚拟机
virsh shutdown centos7

# 运行指定的虚拟机
virsh start centos7


---- 桥接 -------------------------------------------------

# 实体机,桥接网卡配置,新建配置文件ifcfg-br0
/etc/sysconfig/network-scripts/ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
DEFROUTE=yes
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=10.0.0.100
NETMASK=255.255.255.0
GATEWAY=10.0.0.1
DNS1=114.114.114.114
ZONE=public

# 实体网卡配置,NM_CONTROLLED=no
/etc/sysconfig/network-scripts/ifcfg-enp4s0
TYPE=Ethernet
BOOTPROTO=none
NAME=enp4s0
DEVICE=enp4s0
ONBOOT=yes
BRIDGE=br0
NM_CONTROLLED=no

# 实体机,重启服务
systemctl restart network

# 虚拟机网卡桥接到br0
# 把虚拟机网卡vnet0从virbr0组删除
brctl delif virbr0 vnet0

# 把虚拟网卡vnet0添加到br0组
brctl addif br0 vnet0

brctl delif virbr0 virbr0-nic
brctl addif br0 virbr0-nic

brctl delif br0 vnet0
brctl addif br1 vnet0
brctl show

# 查看
brctl show 
    bridge name bridge id       STP enabled interfaces
    br0     8000.04d9f5888010   no          enp4s0
                                            vnet0


#  --network bridge=br0的配置
# 以network=default方式安装的虚拟机,需要修改虚拟机xml配置,否则虚拟机关闭后桥接失效
    <interface type='bridge'>
      <mac address='52:54:00:a2:84:89'/>
      <source bridge='br0'/>
      <model type='rtl8139'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>


# 虚拟机,网卡配置
/etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.101
NETMASK=255.255.255.0    #  我一般用255.255.0.0
GATEWAY=10.0.0.1
DNS1=114.114.114.114
ZONE=public


# 虚拟机,重启服务
# 【重要】调整网络配置前,请一定注意关闭所有虚拟机
systemctl restart network
or
systemctl restart network.service

# 查看指定虚拟机配置信息 mac address

virsh dumpxml tmp_frontend | grep "mac address"
      <mac address='52:54:00:c5:ac:5a'/>


vnet2  就是我新创建的虚拟机

输入命令nmcli con show 查看网卡连接信息

通过 virsh dumpxml tmp_frontend  查看虚拟机开放端口,vnet2这台的vnc是10.0.0.X:5901

然后用vnc连上vm,进行图形化安装centos,安装完成后,虚拟机会重启并关机,需要virsh start vm_name 重启虚拟机

然后用vnc连上vm,继续进行虚拟机内部网络配置,安装的什么系统就怎么配置


qemu虚拟机virsh指令

#### 查看所有虚拟机列表
virsh list --all

#### 查看开启的虚拟机列表
virsh list

#### 运行指定的虚拟机
virsh start centos7
virsh start dtd
virsh start tmp_frontend

#### 强制关闭指定虚拟机
virsh destroy centos7

#### 查看指定虚拟机的信息 
virsh dominfo 虚拟机名称
virsh dominfo sabe
virsh dominfo snort

#### 查看虚拟机网卡信息
```bash
[root@localhost ~]# virsh domiflist sabe
Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet0      bridge     br0        virtio      52:54:00:74:5e:94
vnet1      bridge     br1        virtio      52:54:00:89:8d:c5

[root@localhost ~]# virsh domiflist snort
Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet2      bridge     br0        virtio      52:54:00:e3:39:1b
vnet3      bridge     br1        rtl8139     52:54:00:f3:e8:39

查看虚拟机硬盘信息

virsh domblklist

创建快照

virsh snapshot-create-as centos7 centos7_snapshot

恢复快照

virsh snapshot-revert centos7 --current

查看指定虚拟机的快照列表

virsh snapshot-list sabe

删除快照

virsh snapshot-delete snort snort_snapshot

查看快照详细信息

virsh snapshot-info [domain] [snapshot-name]

sabe快照运维

virsh snapshot-delete sabe sabe_snapshot virsh snapshot-create-as sabe sabe_snapshot

virsh snapshot-delete snort snort_snapshot virsh snapshot-create-as snort snort_snapshot

FAQ

kvm网卡参数设置错误导致网卡不能承受过高流量问题排查

ovirt创建网卡的时候有3中选择,分别是:e1000rtl8139virtio

  • rtl8139 类型是 qemu-kvm 默认的模拟网卡类型, 10/100Mb/s
  • e1000 类型提供Intel e1000系的网卡模拟,纯QEMU(非qemu-kvm)默认就是提供Intel e1000系, 1Gb/s
  • virtio 类型是 qemu-kvm 对半虚拟化IO(virtio)驱动的支持,10Gb/s

rtl8139 issue


## Ubuntu18.04虚拟机配置

### 安装zsh

```shell
1.安装和切换zsh
cat /etc/shells  # 查看所有shell
echo $SHELL   # 查看当前shell

如果没有zsh,则需要现安装zsh
sudo apt install zsh

切换默认shell为zsh
chsh -s /bin/zsh
reboot

2.安装oh-my-zsh
ref: https://ohmyz.sh/#install

wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh

3.配置~/.zshrc
cd ~
git clone git://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

vim ~/.zshrc
修改这个配置
plugins=(git autojump zsh-syntax-highlighting zsh-autosuggestions)

在plugin = ()下面加这个:
setopt no_nomatch 
# 如果不加的话就不能使用*,比如:dpkg -l firefox*

安装ESC和:,输入wq!保存退出
用 source ~/.zshrc 命令更新配置文件,重启终端即可使用

4.修改主题
这里以更换主题为agnoster为例:
如果要更换默认的rubyshell,比如换成 agnoster主题 , 需要先安装相应字体
sudo apt install fonts-powerline
vim ~/.zshrc
修改 ZSH_THEME="robbyrussell" 为 ZSH_THEME="agnoster"

安装ESC和:,输入wq!保存退出
用 source ~/.zshrc 命令更新配置文件,重启终端即可

其他:
echo $HISTSIZE  # 检查历史记录数量 (可选)
HIST_STAMPS="yyyy-mm-dd"  # history信息增加时间戳展示

安装pyenv

ref: https://blog.csdn.net/wssywh/article/details/76143600

Ubuntu 18.04

$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(pyenv init --path)"' >> ~/.zshrc
$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc

然后,source ~/.zshrc使命令生效。

CentOS 7.6

CentOS 7.6 默认不带zsh,需要的自行安装

1. 安装依赖包:
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y

2. 安装pyenv包:
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
如果http访问要超时,可以换成ssh
git clone git@github.com:pyenv/pyenv.git ~/.pyenv

3. 设置环境变量:
vim ~/.bashrc 
export PYENV_ROOT="$HOME/.pyenv" 
export PATH="$PYENV_ROOT/bin:$PATH" 
eval "$(pyenv init --path)"

4. 激活修改的配置文件
source ~/.bashrc

不过pyenv国内源安装慢,需要使用本地安装方式。

pyenv 常用命令

pyenv versions # 查看所有安装的python版本

pyenv install --list  # 查询可安装的python版本

# ubuntu 18.04先安装一波依赖看看
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev

pyenv install 3.7.10 -v  # 加 -v参数可以看到安装进度情况
pyenv install 3.8.10 -v
pyenv install 3.9.5

如果放在~/.pyenv/cache/目录下
记得安装完成后删除
rm -rf "~/.pyenv/versions/X.Y.Z"
rm -rf "~/.pyenv/versions/3.7.10"

pyenv install太慢的解决方式

pyenv搜狐镜像源加速:http://mirrors.sohu.com/python/

下载需要的版本放到~/.pyenv/cache文件夹下面,没有目录的话就自行创建
mkdir ~/.pyenv/cache

将从官网下载的python官方安装包 Python-*.tar.xz 文件传到这个目录下

然后执行 pyenv install 版本号 安装对应的python版本

简介脚本如下,其中v表示要下载的版本号

但是sohu镜像已经不支持pyenv了
v=3.7.10|wget http://mirrors.sohu.com/python/$v/Python-$v.tar.xz -P ~/.pyenv/cache/;pyenv install $v

安装辅助插件 pyenv-virtualenv

ref: https://github.com/pyenv/pyenv-virtualenv (提及了各种python虚拟环境构建信息)

需要先安装pyenv

$ git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv

$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc

pyenv-virtualenv使用方式

# 创建虚拟环境
pyenv virtualenv 2.7.10 my-virtual-env-2.7.10
pyenv virtualenv 3.8.10 py38

# 激活虚拟环境
pyenv activate <name>
pyenv deactivate

# 删除已存在环境
pyenv uninstall my-virtual-env
pyenv virtualenv-delete my-virtual-env

virtualenv环境变量配置

CentOS 7.6

# virtualenv custom config
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv
export WORKON_HOME=$HOME/virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh

virtualenv wrapper + pyenv 使用方式

默认的python是python2,位于 /usr/bin/python pyenv 安装的python一般位于,/root/.pyenv/versions 的对应目录中

[root@localhost ~]# ls /root/.pyenv/versions
3.7.10  3.8.10  3.9.5

virtualenv wrapper + pyenv 创建虚拟环境

1.使用pyenv安装不同版本的python(参考前面的文档)

mkvirtualenv 、 workon 等命令要先安装virtualenv和virtualenv-wrapper才可用

2.使用virtualenv wrapper创建虚拟环境

mkvirtualenv py275 --python=/usr/bin/python

mkvirtualenv py3710 --python=/root/.pyenv/versions/3.7.10/bin/python

mkvirtualenv py3810 --python=/root/.pyenv/versions/3.8.10/bin/python

mkvirtualenv py395 --python=/root/.pyenv/versions/3.9.5/bin/python

创建完成后,执行命令 work on 查看所有 virtualenv wrapper 管理的虚拟环境。

执行workon on 虚拟环境名称,就会激活并进入相应的虚拟环境。

安装go

ref: https://golang.org/doc/install

先下载go的安装包
cd /tmp
wget https://golang.org/dl/go1.16.4.linux-amd64.tar.gz

上面的连接可能因为网络问题无法访问,可以用下面的镜像
wget https://studygolang.com/dl/golang/go1.16.4.linux-amd64.tar.gz

已安装过go的:
sudo rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.4.linux-amd64.tar.gz

go1.16.4是当前最新版,以后会变化

未安装过go的:
sudo tar -C /usr/local -xzf go1.16.4.linux-amd64.tar.gz

而配置环境变量
vim ~/.zshrc
export PATH=$PATH:/usr/local/go/bin
export GO111MODULE=on   # 可选,默认不设置为auto
保存退出并用 source ~/.zshrc 激活

验证安装
go version

安装ssh服务

desktop 18.04默认是没有装ssh service的,所以要先安装服务
sudo apt-get install openssh-server

启动ssh server服务
sudo service ssh start

检查是否启动成功
ps -e | grep ssh
返回结果包含 sshd表明启动成功

开机自动启动ssh命令
sudo systemctl enable ssh

查看ssh是否启动,看到Active: active (running)即表示成功
sudo systemctl status ssh

给网卡配置静态IP

vim /etc/netplan/01-network-manager-all.yaml

network:
  version: 2
  renderer: networkd    # 不能写错
  ethernets:
    ens33:   #配置的网卡名称
      dhcp4: no    #dhcp4关闭
      dhcp6: no    #dhcp6关闭
      addresses: [10.0.7.149/24]   #设置本机IP及掩码
      gateway4: 10.0.7.1   #设置网关
      nameservers:
          addresses: [114.114.114.114, 8.8.8.8]   #设置DNS


配置完成后:wq!保存退出
然后在命令行输入如下命令,应用新的Netplan更改
$ sudo netplan apply