LFCS — Linux Foundation認定システム管理者
VM は XML 一枚で、アカウントは nsswitch が決める — libvirt と LDAP
一言でいうと
LFCSのOperationsドメインには「libvirtで仮想マシンを作成し管理せよ」が、Users and Groupsドメインには「LDAPアカウントを構成せよ」があります。どちらも、このプラットフォームのVMの中で実際に行うには重い(ネステッド仮想化、LDAPサーバー)ものです。そのため、このモジュールは概念だけを扱います。核心は2つです。libvirtでは、VMはXML文書1枚で、virshはその文書を扱うツールです。LDAPアカウントは、/etc/passwdの代わりではなく、nsswitchが決めた順序の1つの位置です。
なぜ必要なのか
ノードのLinuxを扱っていると、2つの状況に出会います。1つは「このサーバー上でVMがいくつか動いているが、1つが起動しない」で、もう1つは「このアカウントは/etc/passwdにないのに、ログインできる」です。前者はlibvirt、後者はLDAP/sssdの領域です。どちらも試験範囲で、どちらも「どこに何が書かれているか」を知っていれば、半分は解決します。
このラボ環境はKubeVirtの上のVMです。その中でさらにKVMを有効にするには、ネステッド仮想化(vm_nested)が必要で、LDAPサーバーを立ててクライアントをつなぐのは、1つのラボに収めるには大きすぎます。そのため、ここでは、ドキュメントで確認した構造を整理して、クイズで点検します。
どう動くのか
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を扱うシェルです。よく使う動詞を状態遷移として見ると、覚えやすいです。
| やること | コマンド | 備考 |
|---|---|---|
| 定義だけ(停止状態で登録) | 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 |
表の最初の2行のプレースホルダーは、XMLファイルの名前です。
destroyという名前が罠です。削除するのではなく、電源を引き抜くことで、定義は残ります。定義を削除するのはundefineで、それもディスクイメージは削除しません。
スナップショットは2種類です。libvirtのスナップショット案内は、内部(internal)スナップショットと外部(external)スナップショットを区別します。内部スナップショットは、qcow2イメージの中に状態を入れ、外部スナップショットは、新しいオーバーレイファイルを作って、元を読み取り専用のバッキングにします。スナップショットXML形式が<domainsnapshot>文書を定義し、virsh snapshot-create-asで作成します。ディスクだけを入れるスナップショットと、メモリ状態まで入れるスナップショットが違うこと、そして、外部スナップショットのチェーンは管理(ブロックコミット)が必要なことが、実務でぶつかるところです。
LDAPアカウントは、nsswitchの1行から始まります。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のドメイン節に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の列に対応します。sssdが見つけられないアカウントを、ldapsearchで直接探してみるのが、診断の基本です。
現場での姿
「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とフィルター。クイズは、この読み物で説明したことだけを問います。