libvirt 相关 sock 整理

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交互的接口。
    • 权限极为宽松,允许任何用户操作虚拟机。
  • 用途:

    • 一般情况下,方便普通用户和工具使用,比如通过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

libvirtadmin-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。
相关推荐
Super Rookie22 分钟前
Spring Boot 企业项目技术选型
java·spring boot·后端
来自宇宙的曹先生24 分钟前
用 Spring Boot + Redis 实现哔哩哔哩弹幕系统(上篇博客改进版)
spring boot·redis·后端
expect7g1 小时前
Flink-Checkpoint-1.源码流程
后端·flink
00后程序员1 小时前
Fiddler中文版如何提升API调试效率:本地化优势与开发者实战体验汇总
后端
用户8122199367221 小时前
C# .Net Core零基础从入门到精通实战教程全集【190课】
后端
bobz9651 小时前
FROM scratch: docker 构建方式分析
后端
lzzy_lx_20892 小时前
Spring Boot登录认证实现学习心得:从皮肤信息系统项目中学到的经验
java·spring boot·后端
前端付豪2 小时前
21、用 Python + Pillow 实现「朋友圈海报图生成器」📸(图文合成 + 多模板 + 自动换行)
后端·python
MaxHua3 小时前
以 AI 之力重塑 Java 研发,解锁高效开发新范式
后端