使用libvirt 管理 qemu虚拟主机

kvm

kvm qemu 使用命令行的方式 较为简单明了,但是有几个问题 有一些麻烦。所以最好还是搞一下virt 不然还是不好处理

  • 开机启动虚拟主机(非管理员权限)
  • 虚拟机内引导顺序
  • usb sata 等设备的热拔插
  • 以及一些sudo权限的处理上

#安装

plaintext
sudo pacman -S libvirt  #服务端 自带命令行客户端 virsh

#服务

plaintext
sudo systemctl enable libvirtd
sudo systemctl start libvirtd

#用已经存在的虚拟磁盘文件创建一个虚拟机

plaintext
sudo pacman -S virt-install

virt-install 不是必须的工具,可在 /home/yanhui/.config/libvirt/qemu/ 或者 /etc/libvirt/qemu 手动创建xml 来新建虚拟机

plaintext
virt-install  \
  --name alpine-dockers  \
  --vcpus=12 \
  --osinfo alpinelinux3.16  \
  --memory 1024 \
  --disk /mnt/ssd/alpinx-kvm/alpine-sys.qcow2 \
  --import

运行后 直接 ctrl+c 关闭,然后查看
virsh list --all

查看支持的操作系统 virt-install --osinfo list

#关闭虚拟机

plaintext
virsh shutdown alpine-dockers 

#编辑虚拟机

plaintext
nano /home/yanhui/.config/libvirt/qemu/alpine-dockers.xml

大部分内容很容易理解,和unraid下 以及shell下的写法 都接近
修改之前 传送门
我这里主要修改端口映射 以及 vnc 还有smb的处理

#vnc配置

plaintext
<graphics type='spice' autoport='yes'>
      <listen type='address'/>
      <image compression='off'/>
</graphics>

这段修改为vnc的配置

plaintext
<graphics type='vnc' port='5908' autoport='yes' listen='0.0.0.0' keymap='en-us'/>
   <listen type='address' address='0.0.0.0'/>
</graphics>

#图形工具 安装

plaintext
sudo pacman -S virt-manager
sudo pacman -S dnsmasq

#打开x11 转发

plaintext
yay -S xorg-xauth
cd ~
touch ~/.Xauthority && chmod 600 ~/.Xauthority
sudo nano /etc/ssh/sshd_config
----
AddressFamily inet
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes


sudo systemctl reload sshd
sudo systemctl restart sshd

#配置普通用户权限

plaintext
/etc/libvirt/libvirtd.conf

找到这里两行 取消注释

plaintext
unix_sock_group = "libvirt"
unix_sock_ro_perms = "0777"  # set to 0770 to deny non-group libvirt users

#当前用户添加到libvirt 组

plaintext
sudo usermod -a -G libvirt $(whoami)

#重启libvirtd

plaintext
sudo systemctl restart libvirtd

#使用 virt-manager 来管虚拟机

直接在支持x11 server的ssh客户端上登录,然后运行 virt-manager 即可

#端口转发

端口转发 可以直接在宿主机上用iptables 来处理

也可以用 /etc/libvirt/hooks/ 来处理

#静态ip

先查看网络情况

plaintext
sudo virsh  net-list

有一个 名称为network 是配置的nat 的网络
处理一下 vi,我用nano替代

plaintext
sudo ln -s /bin/nano /bin/vi

编辑 dhcp 这段

plaintext
sudo virsh  net-edit network

添加几行

plaintext
    <host mac='52:54:00:6d:77:46' name='alpine' ip='192.168.100.2'/>
    <host mac='52:54:00:6d:77:10' name='win10' ip='192.168.100.10'/>
    <host mac='52:54:00:6d:77:13' name='macos13' ip='192.168.100.13'/>
    <host mac='52:54:00:6d:77:08' name='archlinux' ip='192.168.100.8'/>

52:54:00:6d:77:46 是虚拟机的虚拟mac地址

#重新创建同名网络

plaintext
sudo virsh  net-destroy network
sudo virsh  net-start network

关闭虚拟机,然后再打开一次虚拟机,不是重启虚拟机,是关闭后重新打开

#配置转发规则

#查看本地网卡

plaintext
ifconfig

我这里是本地网卡是enp1s0 虚拟机用的网卡是virbr1

#/proc/sys/net/ipv4/ip_forward

plaintext
cat /proc/sys/net/ipv4/ip_forward

应该是1 ,如果不是修改成1,或者 编辑/etc/stsctl.conf文件,把其中的net.ipv4.ip_forward = 0修为net.ipv4.ip_forward = 1

#开启转发

plaintext
#  添加filter 表的forward链
sudo iptables -I FORWARD -m state -d 192.168.100.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT
# 规则
sudo iptables -t nat -A PREROUTING -p tcp -m tcp --dport 2222 -j DNAT --to-destination  192.168.100.2:22
sudo iptables -t nat -A PREROUTING  -p tcp -m tcp --dport 13389 -j DNAT --to-destination  192.168.100.10:3389

#保存 重启后有效

plaintext
su
iptables-save > /etc/iptables/iptables.rules
systemctl reload iptables
iptables-restore < /etc/iptables/iptables.rules

```	
#### 查看和删除

sudo iptables -t nat -nL --line # 查看
sudo iptables -t nat -D PREROUTING 序号 # 删除

plaintext
#### 更多需要的规则

#v2ray

sudo iptables -t nat -A PREROUTING -p tcp -m tcp --dport 2017 -j DNAT --to-destination 192.168.100.2:2017
sudo iptables -t nat -A PREROUTING -p tcp -m tcp --dport 20170 -j DNAT --to-destination 192.168.100.2:20170
sudo iptables -t nat -A PREROUTING -p tcp -m tcp --dport 20171 -j DNAT --to-destination 192.168.100.2:20171
sudo iptables -t nat -A PREROUTING -p tcp -m tcp --dport 20172 -j DNAT --to-destination 192.168.100.2:20172
sudo iptables -t nat -A PREROUTING -p tcp -m tcp --dport 20173 -j DNAT --to-destination 192.168.100.2:20173

#阿里云盘wedav

sudo iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8080 -j DNAT --to-destination 192.168.100.2:8080

plaintext

## 其他

sudo mkdir /etc/libvirt/hooks
sudo nano /etc/libvirt/hooks/qemu

plaintext

#!/bin/bash

if [ "${1}" = "alpinelinux" ]; then
GUEST_IP=192.168.100.2
GUEST_PORT=22
HOST_PORT=2222
if [ "${2}" = "stopped" ] || [ "${2}" = "reconnect" ]; then
/sbin/iptables -D FORWARD -o virbr0 -p tcp -d $GUEST_IP --dport $GUEST_PORT -j ACCEPT
/sbin/iptables -t nat -D PREROUTING -p tcp --dport $HOST_PORT -j DNAT --to $GUEST_IP:$GUEST_PORT
fi
if [ "${2}" = "start" ] || [ "${2}" = "reconnect" ]; then
/sbin/iptables -I FORWARD -o virbr0 -p tcp -d $GUEST_IP --dport $GUEST_PORT -j ACCEPT
/sbin/iptables -t nat -I PREROUTING -p tcp --dport $HOST_PORT -j DNAT --to $GUEST_IP:$GUEST_PORT
fi
fi

plaintext

评论