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。
相关推荐
野犬寒鸦5 小时前
从零起步学习并发编程 || 第一章:初步认识进程与线程
java·服务器·后端·学习
我爱娃哈哈5 小时前
SpringBoot + Flowable + 自定义节点:可视化工作流引擎,支持请假、报销、审批全场景
java·spring boot·后端
李梨同学丶7 小时前
0201好虫子周刊
后端
思想在飞肢体在追7 小时前
Springboot项目配置Nacos
java·spring boot·后端·nacos
Loo国昌10 小时前
【垂类模型数据工程】第四阶段:高性能 Embedding 实战:从双编码器架构到 InfoNCE 损失函数详解
人工智能·后端·深度学习·自然语言处理·架构·transformer·embedding
ONE_PUNCH_Ge11 小时前
Go 语言泛型
开发语言·后端·golang
良许Linux11 小时前
DSP的选型和应用
后端·stm32·单片机·程序员·嵌入式
不光头强11 小时前
spring boot项目欢迎页设置方式
java·spring boot·后端
怪兽毕设11 小时前
基于SpringBoot的选课调查系统
java·vue.js·spring boot·后端·node.js·选课调查系统
学IT的周星星11 小时前
Spring Boot Web 开发实战:第二天,从零搭个“会卖萌”的小项目
spring boot·后端·tomcat