libvirt 相关 sock 整理

94 阅读4分钟

libvirt 业务设计上,可以基于本地 sockt 进行交互,这里整理 socket 相关信息


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 所在目录


# 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 查看服务控制文件,和 上述目录一致


▶ 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 路径。例如:
virsh -c qemu:///system --connect=qemu:///system

但实际上,virsh 会在默认路径或环境变量中查找 Socket。

其他连接方式:

  • 命令中可以使用-c参数指定连接 URI 或 Socket 路径,例如:
virsh -c unix:///run/libvirt/libvirt-sock
  • 如果想用只读 Socket(libvirt-sock-ro),可以:
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

具体做法:

virsh -c unix:///run/libvirt/libvirt-admin-sock

权限要求:

  • 必须是root(或具有相应权限) 才能成功连接。

  • 如果你不是以root权限运行,连接会失败,提示权限不足。

小结:

  • 默认连接: /run/libvirt/libvirt-sock(权限宽广)
  • 指定连接: 使用-c参数指定 Socket 路径或 URI
  • 只读连接: 指定libvirt-sock-ro路径