使用libvirt 管理 qemu虚拟主机
kvm qemu 使用命令行的方式 较为简单明了,但是有几个问题 有一些麻烦。所以最好还是搞一下virt 不然还是不好处理
- 开机启动虚拟主机(非管理员权限)
- 虚拟机内引导顺序
- usb sata 等设备的热拔插
- 以及一些sudo权限的处理上
#安装
sudo pacman -S libvirt #服务端 自带命令行客户端 virsh
#服务
sudo systemctl enable libvirtd
sudo systemctl start libvirtd
#用已经存在的虚拟磁盘文件创建一个虚拟机
sudo pacman -S virt-install
virt-install 不是必须的工具,可在 /home/yanhui/.config/libvirt/qemu/ 或者 /etc/libvirt/qemu 手动创建xml 来新建虚拟机
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的配置
<graphics type='vnc' port='5908' autoport='yes' listen='0.0.0.0' keymap='en-us'/>
<listen type='address' address='0.0.0.0'/>
</graphics>
#图形工具 安装
sudo pacman -S virt-manager
sudo pacman -S dnsmasq
#打开x11 转发
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
#配置普通用户权限
/etc/libvirt/libvirtd.conf
找到这里两行 取消注释
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
sudo systemctl restart libvirtd
#使用 virt-manager 来管虚拟机
直接在支持x11 server的ssh客户端上登录,然后运行 virt-manager 即可
#端口转发
端口转发 可以直接在宿主机上用iptables 来处理
也可以用 /etc/libvirt/hooks/ 来处理
#静态ip
先查看网络情况
sudo virsh net-list
有一个 名称为network 是配置的nat 的网络
处理一下 vi,我用nano替代
sudo ln -s /bin/nano /bin/vi
编辑 dhcp 这段
sudo virsh net-edit network
添加几行
<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地址
#重新创建同名网络
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
#开启转发
# 添加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
#保存 重启后有效
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 序号 # 删除
#### 更多需要的规则
#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
## 其他
sudo mkdir /etc/libvirt/hooks
sudo nano /etc/libvirt/hooks/qemu
#!/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