TT Lab
开始
学习 学习路径 课程

LFCS — Linux 基金会认证系统管理员

一台 VM 就是一份 XML,账号由 nsswitch 决定 — libvirt 与 LDAP

在 TT Lab 中继续学习

一句话总结

LFCS 的 Operations 领域中有“用 libvirt 创建和管理虚拟机”,Users and Groups 领域中有“配置 LDAP 账户”。这两项在这个平台的 VM 内真正去做都太重了(嵌套虚拟化、LDAP 服务器)。所以本模块只讲概念。要点有两个。在 libvirt 中,VM 就是一份 XML 文档,而 virsh 是操作这份文档的工具。LDAP 账户并不是用来替代 /etc/passwd 的,而是由 nsswitch 所定顺序中的一个位置。

为什么需要它

处理节点上的 Linux 时,会遇到两种情况。一种是“这台服务器上跑着几个 VM,其中一个起不来”,另一种是“这个账户不在 /etc/passwd 中,却能登录”。前者属于 libvirt,后者属于 LDAP/sssd 的范畴。两者都在考试范围内,而且只要知道“什么写在哪里”,就解决了一半。

这个实验环境是 KubeVirt 之上的 VM。要在其中再次启用 KVM,需要嵌套虚拟化(vm_nested),而搭建 LDAP 服务器并接入客户端,也大到一个实验装不下。所以这里整理的是从文档中确认的结构,再用测验来检验。

工作原理

libvirt 的 VM 称为域(domain),用 XML 定义。 libvirt 域 XML 格式文档就是它的全部语法。最上层的 <domain type='kvm'> 之下,依次是 <name>、<memory>、<vcpu>、<os>(启动方式)、<devices>(磁盘、网络、控制台)。磁盘通过 <disk type='file' device='disk'> 内的 <source file='…'/> 和 <target dev='vda' bus='virtio'/>,写明“把哪个文件作为客户机的哪个设备”。网络方面,<interface type='network'> 连接到由 libvirt 管理的虚拟网络(默认 default,NAT),<interface type='bridge'> 则连接到主机桥接。

virsh 是操作该 XML 的 shell。把常用的动词看作状态转换,就容易记住。

要做的事 命令 备注
仅定义(以停止状态登记) virsh define 파일.xml(占位符为文件名) 持久域
定义并立即启动 virsh create 파일.xml(占位符为文件名) 临时(transient)域
启动 / 正常关机 / 强制关机 virsh start / shutdown / destroy destroy 是切断电源
删除定义 virsh undefine 磁盘文件会保留
查看 / 编辑定义 virsh dumpxml / virsh edit edit 会在验证后保存
列表 virsh list --all 没有 --all 就只显示正在运行的
开机时自动启动 virsh autostart

destroy 这个名字是个陷阱。它不是删除,而是拔掉电源,定义依然保留。删除定义的是 undefine,而它同样不会删除磁盘镜像。

快照有两种。 libvirt 快照指南区分内部(internal)快照和外部(external)快照。内部快照把状态保存在 qcow2 镜像内部,外部快照则创建新的覆盖层文件,并把原文件作为只读后备。快照 XML 格式定义了 <domainsnapshot> 文档,用 virsh snapshot-create-as 创建。只保存磁盘的快照与连内存状态一起保存的快照是不同的,而外部快照的链需要管理(块提交),这是实际工作中会碰到的地方。

LDAP 账户从 nsswitch 的一行开始。 nsswitch.conf(5) 为 passwd、group、shadow 这样的每个数据库规定“以什么顺序使用哪个来源”。passwd: files sss 表示先查看 /etc/passwd,没有的话再去问 sssd。getent passwd 이름(占位符为账户名)完全按这个顺序执行,所以询问“这个账户来自哪里”的第一条命令就是 getent。

在它后面的是 SSSD。sssd 是位于 LDAP、Kerberos、AD 之类远程账户存储与本地系统之间的守护进程,为 NSS(账户查询)和 PAM(认证)两边都提供模块,并设有离线缓存。所以即使 LDAP 服务器暂时挂掉,已缓存的账户仍可登录。配置的形式是在 /etc/sssd/sssd.conf 的 domain 节中写入 id_provider = ldap、ldap_uri、ldap_search_base,而 RHEL 9 的认证与授权配置文档则说明了用 authselect 一并调整 nsswitch 和 PAM 的步骤。

直接查询 LDAP 本身的工具是 ldapsearch。-H ldap://서버(占位符为服务器)指定连接到哪里,-b "dc=example,dc=com" 指定在哪个分支之下,-x 表示使用简单认证,最后一个参数是过滤器((uid=alice))。结果以 LDIF 形式输出,uid、uidNumber、gidNumber、homeDirectory、loginShell 这样的 posixAccount 属性,正好对应 /etc/passwd 的各列。用 ldapsearch 直接查找 sssd 找不到的账户,是诊断的基本做法。

在现场相遇的样子

“VM 起不来”时,先用 virsh list --all 查看状态,再用 virsh dumpxml 查看磁盘 <source file> 指向的文件是否真的存在。迁移存储之后路径已经过时,是很常见的情况。把 virsh destroy 误解为“删除”,匆忙按下去而导致服务中断的事故,也并不少见。

“LDAP 用户无法登录”要按顺序缩小范围。如果 getent passwd 이름(占位符为账户名)没有内容,就是 NSS(nsswitch、sssd 查询)的问题;如果有内容却无法登录,就是 PAM(认证)的问题。由于 sssd 缓存,修复服务器之后仍可能残留旧结果,所以用 sss_cache -E 清除后再查看。最后的分支,是用 ldapsearch 直接确认服务器上能否查到该条目。

下一项测验要确认什么

virsh define 与 create 的区别、destroy 与 undefine 各自会留下什么、域 XML 中磁盘写在哪个元素里、内部与外部快照的区别、nsswitch.conf 的 passwd: files sss 所表示的顺序、sssd 在 NSS 和 PAM 中所做的事,以及 ldapsearch 的 -b 和过滤器。测验只会问本篇阅读材料中讲过的内容。