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
先查看网络情况
有一个 名称为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
|