TT Lab
はじめる
学ぶ 学習パス コース

LFCS — Linux Foundation認定システム管理者

VM は XML 一枚で、アカウントは nsswitch が決める — libvirt と LDAP

TT Labで続きを見る

一言でいうと

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とフィルター。クイズは、この読み物で説明したことだけを問います。