虚拟机相关
常见问题?
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中选择,分别是:e1000
,rtl8139
,virtio
。
- rtl8139 类型是 qemu-kvm 默认的模拟网卡类型, 10/100Mb/s
- e1000 类型提供Intel e1000系的网卡模拟,纯QEMU(非qemu-kvm)默认就是提供Intel e1000系, 1Gb/s
- virtio 类型是 qemu-kvm 对半虚拟化IO(virtio)驱动的支持,10Gb/s
## 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