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。
相关推荐
翻滚吧键盘29 分钟前
Spring Boot,两种配置文件
java·spring boot·后端
GoGeekBaird6 小时前
69天探索操作系统-第66天:为现代操作系统设计高级实时进程间通信机制
后端·操作系统
还是鼠鼠7 小时前
单元测试-概述&入门
java·开发语言·后端·单元测试·log4j·maven
我最厉害。,。8 小时前
接口安全&SOAP&OpenAPI&RESTful&分类特征导入&项目联动检测
后端·restful
AntBlack10 小时前
计算机视觉 : 端午无事 ,图像处理入门案例一文速通
后端·python·计算机视觉
福大大架构师每日一题11 小时前
2025-06-02:最小可整除数位乘积Ⅱ。用go语言,给定一个表示正整数的字符串 num 和一个整数 t。 定义:如果一个整数的每一位都不是 0,则称该整数为
后端
Code_Artist12 小时前
[Mybatis] 因 0 != null and 0 != '' 酿成的事故,害得我又过点啦!
java·后端·mybatis
程序员博博12 小时前
看到这种代码,我直接气到想打人
后端
南雨北斗12 小时前
php 图片压缩函数
后端
L2ncE12 小时前
ES101系列08 | 数据建模和索引重建
java·后端·elasticsearch