使用libvirt 管理 qemu虚拟主机

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

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

安装

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

服务

1
2
sudo systemctl enable libvirtd
sudo systemctl start libvirtd

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

1
sudo pacman -S virt-install

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

1
2
3
4
5
6
7
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

关闭虚拟机

virsh shutdown alpine-dockers 

编辑虚拟机

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

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

vnc配置

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

这段修改为vnc的配置

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

图形工具 安装

1
2
sudo pacman -S virt-manager
sudo pacman -S dnsmasq

打开x11 转发

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
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

配置普通用户权限

1
/etc/libvirt/libvirtd.conf

找到这里两行 取消注释

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

当前用户添加到libvirt 组

sudo usermod -a -G libvirt $(whoami)

重启libvirtd

1
sudo systemctl restart libvirtd

使用 virt-manager 来管虚拟机

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

端口转发

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

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

静态ip

先查看网络情况

1
sudo virsh  net-list

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

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

编辑 dhcp 这段

1
sudo virsh  net-edit network

添加几行

1
2
3
4
    <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地址

重新创建同名网络

1
2
sudo virsh  net-destroy network
sudo virsh  net-start network

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

配置转发规则

查看本地网卡

ifconfig

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

/proc/sys/net/ipv4/ip_forward

cat /proc/sys/net/ipv4/ip_forward

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

开启转发

1
2
3
4
5
#  添加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

保存 重启后有效

1
2
3
4
su
iptables-save > /etc/iptables/iptables.rules
systemctl reload iptables
iptables-restore < /etc/iptables/iptables.rules

查看和删除

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

更多需要的规则

1
2
3
4
5
6
7
8
# 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

其他

1
2
sudo mkdir /etc/libvirt/hooks
sudo nano /etc/libvirt/hooks/qemu
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/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
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计