libvirt 业务设计上,可以基于本地 sockt 进行交互,这里整理 socket 相关信息
bash
systemctl disable libvirtd
systemctl stop libvirtd
# 禁用 libvirt 的 socket 拉起 libvirtd 服务
systemctl disable libvirtd.socket
systemctl disable libvirtd-ro.socket
systemctl disable libvirtd-admin.socket
systemctl stop libvirtd.socket
systemctl stop libvirtd-ro.socket
systemctl stop libvirtd-admin.socket
# 确认无进程
ps -aux | grep libvirt
systemctl cat libvirtd
systemctl cat libvirtd.socket
systemctl cat libvirtd-ro.socket
systemctl cat libvirtd-admin.socket
1. 三个 sock 所在目录
bash
# ls -l /run/libvirt
total 40
drwx------ 2 root root 4096 Jun 1 08:34 common
drwxr-xr-x 2 root root 4096 Jun 1 08:34 hostdevmgr
drwx------ 2 root root 4096 Jun 1 08:34 interface
srwx------ 1 root root 0 Jun 1 08:34 libvirt-admin-sock
srwxrwxrwx 1 root root 0 Jun 1 08:34 libvirt-sock
srwxrwxrwx 1 root root 0 Jun 1 08:34 libvirt-sock-ro
drwxr-xr-x 2 root root 4096 Jun 1 08:34 network
drwx------ 2 root root 4096 Jun 1 08:34 nodedev
drwx------ 2 root root 4096 Jun 1 08:34 nwfilter
drwx------ 2 root root 4096 Jun 1 08:34 nwfilter-binding
drwxr-xr-x 6 root root 4096 Jun 1 08:55 qemu
drwx------ 2 root root 4096 Jun 1 08:34 secrets
drwxr-xr-x 2 root root 4096 Jun 1 08:34 storage
通过 systemctl 查看服务控制文件,和 上述目录一致
bash
▶ systemctl cat libvirtd.socket
# /lib/systemd/system/libvirtd.socket
[Unit]
Description=Libvirt local socket
Before=libvirtd.service # 先于 libvirtd
[Socket]
ListenStream=/run/libvirt/libvirt-sock
Service=libvirtd.service
SocketMode=0666
RemoveOnStop=yes
[Install]
WantedBy=sockets.target
(v.v)
root@debian:/etc/kube-host-vm
▶ systemctl cat libvirtd-ro.socket
# /lib/systemd/system/libvirtd-ro.socket
[Unit]
Description=Libvirt local read-only socket
Before=libvirtd.service # 先于 libvirtd
BindsTo=libvirtd.socket
After=libvirtd.socket
[Socket]
ListenStream=/run/libvirt/libvirt-sock-ro
Service=libvirtd.service
SocketMode=0666
[Install]
WantedBy=sockets.target
(v.v)
root@debian:/etc/kube-host-vm
▶ systemctl cat libvirtd-admin.socket
# /lib/systemd/system/libvirtd-admin.socket
[Unit]
Description=Libvirt admin socket
Before=libvirtd.service # 先于 libvirtd
BindsTo=libvirtd.socket
After=libvirtd.socket
[Socket]
ListenStream=/run/libvirt/libvirt-admin-sock
Service=libvirtd.service
SocketMode=0600
[Install]
WantedBy=sockets.target
(v.v)
2. 这三个 socket 的作用
这三个 Socket 文件是 libvirt
用于不同权限和用途的通信接口,设计上的差异反映了安全性和功能需求。以下是详细的解释:
1. /run/libvirt/libvirt-admin-sock
-
作用:
- 这是libvirt的管理控制Socket,主要用于执行管理级命令(如启动、停止虚拟机、修改配置等)。
- 权限设置为只允许root访问,以确保只有超级用户可以进行敏感操作,确保安全性。
-
用途: 管理员或自动化脚本,通过此 Socket 使用
virsh
或 API(go python等) 接口进行虚拟机的高级管理操作。
2. /run/libvirt/libvirt-sock
-
作用:
- 这是 ** libvirt 的主通信 Socket **,提供了普通用户或应用程序与
libvirt
交互的接口。 - 权限极为宽松,允许任何用户操作虚拟机。
- 这是 ** libvirt 的主通信 Socket **,提供了普通用户或应用程序与
-
用途:
- 一般情况下,方便普通用户和工具使用,比如通过
virsh
命令、虚拟化管理面板等。 - 安全性较低,建议在受控环境中使用,或用权限控制加强安全。
- 一般情况下,方便普通用户和工具使用,比如通过
3. /run/libvirt/libvirt-sock-ro
-
作用:
- 这是**只读的 libvirt 接口 Socket **,允许用户读取虚拟机状态等信息。
- 主要用于监控或统计,提供只读访问权限。
-
用途:
- 避免误操作,限制用户不能修改配置,但可以查看当前状态和信息。
- 适合监控工具,通过这个Socket收集实时信息。
设计总结:
libvirt-sock
:方便普通用户操作)。libvirt-sock-ro
:提供只读接口,增强安全性,用于信息查询。libvirt-admin-sock
:仅超级用户使用,保证操作安全。
3. virsh 连接到默认 socket
virsh
二进制工具默认连接的是 /run/libvirt/libvirt-sock
这个Socket。
具体说明:
- 默认连接:
当你运行virsh
不带任何参数时,它会尝试连接到/run/libvirt/libvirt-sock
。 - 连接目标:
virsh
主要连接到 可读写 的主 Socket,以执行所有管理功能。
如果需要连接其他Socket:
- 连接到只读 Socket (
libvirt-sock-ro
):
你可以通过环境变量或命令参数指定Socket路径。例如:
perl
virsh -c qemu:///system
或直接指定Socket路径:
perl
virsh -c qemu:///system --connect=qemu:///system
但实际上,virsh
会在默认路径或环境变量中查找 Socket。
其他连接方式:
- 命令中可以使用
-c
参数指定连接 URI 或 Socket 路径,例如:
perl
virsh -c unix:///run/libvirt/libvirt-sock
- 如果想用只读 Socket(
libvirt-sock-ro
),可以:
perl
virsh -c unix:///run/libvirt/libvirt-sock-ro
4. 管理员 socket
libvirt
的admin-sock
(/run/libvirt/libvirt-admin-sock
)设计用于执行管理级操作 ,需要有更高权限(通常是root
权限)才能访问。
能否用virsh
连接admin-sock
?
- 默认情况下 ,
virsh
不会自动连接到这个admin-sock
,因为virsh
通常连接到libvirt-sock
(普通读写Socket)。 - 但是,你可以通过
-c
参数手动指定连接到这个admin-sock
。
具体做法:
perl
virsh -c unix:///run/libvirt/libvirt-admin-sock
权限要求:
-
必须是root(或具有相应权限) 才能成功连接,因为:
libvirt-admin-sock
权限为0600
- 只有拥有者(
root
)才能访问
-
如果你不是以root权限运行,连接会失败,提示权限不足。
小结:
- 默认连接:
/run/libvirt/libvirt-sock
(权限宽广) - 指定连接: 使用
-c
参数指定Socket路径或URI - 只读连接: 指定
libvirt-sock-ro
路径
如果你想限制virsh
连接到只读的Socket,可以用-c unix:///run/libvirt/libvirt-sock-ro
来实现。
可以用virsh
连接到admin-sock
:
markdown
- 只要用`-c`参数指定Socket路径
- 你有足够权限(比如用`sudo`)
示例:
perl
sudo virsh -c unix:///run/libvirt/libvirt-admin-sock
- 连接后,你可以进行几乎所有管理员操作,类似直接操作
libvirt
的管理 API。