Linuxスクリプトに仮想マシンで実行されていることを検出させる方法
公開: 2022-06-27
仮想マシンは、物理ハードウェア上で実行されていることをオペレーティングシステムに納得させるために非常に懸命に努力します。 では、Linuxコマンドラインから、コンピューターが物理的か仮想的かを判断できますか?
仮想マシンとハイパーバイザー
従来のコンピューターは物理的なオブジェクトです。 これは、オペレーティングシステムのロード、アプリケーションのインストール、起動、および使用を可能にするために、プラグとボルトで固定されたさまざまなハードウェアのコレクションです。
ハードウェアは高価です。 物理コンピューターごとに1つのオペレーティングシステムに制限されるということは、複数のオペレーティングシステムを実行するコストがすぐに法外に高くなることを意味します。 より良い解決策は、単一の物理コンピューターが選択したオペレーティングシステムを同時に実行できるようにすることであり、各コンピューターは独自の固有のハードウェアで実行されていると考えます。
ハイパーバイザーはこれを可能にします。 ハイパーバイザー(仮想マシンマネージャーまたは仮想マシンモニターとも呼ばれます)は、仮想マシンを作成できるソフトウェアです。 これらは、同じ物理ホスト上で実行され、ハードドライブのスペース、メモリ、およびCPUコアを共有しているにもかかわらず、個別の物理コンピューターであるかのように動作します。
もちろん、ホストコンピュータは、仮想マシンのコレクションの要求に対応するのに十分強力である必要がありますが、ホストに十分なRAMと処理能力があれば、仮想マシンはほぼベアメタル速度で実行できます。
2007年に2.6.20カーネルがリリースされて以来、Linuxにはカーネルベースの仮想マシンサポートが組み込まれています。Linuxには、VirtualBox、GNOME Boxes、QEMU-KVMなどのいくつかのハイパーバイザーがあります。 LinuxのネイティブKVM機能を利用し、ユーザーインターフェイスと、仮想マシンのスナップショットを取得できるなどの機能を追加することで、ネイティブカーネル機能を構築します。
仮想マシンは、コストの節約、効率、展開の簡素化、および(正しくプロビジョニングされた)セキュリティ上の利点をもたらします。 また、スケーラビリティを促進します。 サービスの需要が増加すると新しいサーバーを自動的に起動し、需要が減少するとシャットダウンすることができます。 これにより、クラウドとオンプレミスインフラストラクチャの両方で非常に人気があります。
おそらく、Linuxサーバーをリモートで管理していて、それが仮想マシンなのか物理ボックスなのかを知る必要があります。 または、実行しているプラットフォームのタイプを知る必要があるスクリプトがあります。 作業しているコンピューターが物理的であるか仮想的であるかを検出する方法はいくつかあります。
dmidecodeコマンド
dmidecodeコマンドは、多数のオプションと修飾子をサポートしています。 デスクトップ管理インターフェイス(DMI)テーブルに問い合わせ、ターミナルウィンドウに情報を出力します。
-s (単一の文字列を表示)オプションとともに使用し、システム製品名を尋ねます。 sudoを使用する必要があることに注意してください。
Ubuntu22.04を実行しているVirtualBoxVMでコマンドを実行します。
sudo dmidecode -s system-product-name

プラットフォームはVirtualBoxとして正しく識別されます。
Fedora35を実行しているQEMU-KVMVMでは、この出力が得られます。
sudo dmidecode -s system-product-name

これは標準PCとして報告されていますが、タイプQ35の標準QEMU仮想PCです。 そのため、プラットフォームは仮想マシンとして正しく認識されます。
物理コンピューターで同じコマンドを実行すると、製造元に関する情報が得られます。
sudo dmidecode -s system-product-name

このコンピューターは、Micro-Star International Company Limitedのマザーボードをベースにしたカスタムビルドで、製品コードはMS-7B86です。
lshwコマンド
lshwコマンドは、さまざまなコンピューターハードウェアの詳細を一覧表示します。 lshwがレポートするハードウェアのクラスを選択できます。
system修飾子とともに-classオプションを使用します。 このコマンドでsudoを使用すると、すべての詳細が表示されます。
このコマンドは、UbuntuVirtualBoxVMで実行します。
sudolshwクラスのシステム

- 「description」フィールドには、「computer」の一般的なエントリがあります。
- 「product」フィールドは、これがVirtualBoxで実行されている仮想マシンであることを示しています。
- 「ベンダー」フィールドには、VirtualBoxを作成したドイツの会社InnotekGmbHの名前が含まれています。 Innotekは、Sun Microsystems、Incの買収の一環として、2010年にOracleCorporationに買収されました。
Fedoraにlshwをインストールする必要がありました。
sudo dnf install lshw

GNOMEBoxesで実行されているFedoraVMでそのコマンドを試してみましょう。
sudolshwクラスのシステム

- ここでも、「説明」フィールドには「コンピューター」という一般的なエントリがあります。
- 「product」フィールドには、
dmidecodeコマンドで表示したものと同じ標準のQEMUPC情報が表示されます。 - 「ベンダー」フィールドには「QEMU」が含まれています。これは、これが仮想マシンであることを明確に示しています。
これは、物理コンピューターで同じコマンドを実行した結果です。
sudolshwクラスのシステム


これは、Micro-Starマザーボードを搭載したハードウェアコンピュータであることがわかります。
- ハードウェアはデスクトップコンピューターとして識別されます。
- 「製品」フィールドには、マザーボードタイプMS-7B86が表示されます。
- 「ベンダー」フィールドには、製造元の名前が含まれています。
hostnamectlコマンド
このコマンドには、実行するためにsudo権限が必要ないという利点があります。 ただし、 systemd対応のディストリビューションでのみ使用できます。 最新のディストリビューションの大部分はsystemdを使用しています。
これは、UbuntuVirtualBoxVMでコマンドを実行したときの応答です。
hostnamectl

- 「icon-name」フィールドには「-vm」が追加されています。
- 「Chassis」フィールドには「vm」が含まれています。
- 「仮想化」フィールドには「oracle」が含まれています。
- 「ハードウェアベンダー」フィールドには「innotekGmbH」が含まれています。
- 「ハードウェアモデル」フィールドには「VirtualBox」が含まれています。
GNOMEBoxes内のFedoraVMの出力は非常に似ています。
hostnamectl

- 「icon-name」フィールドには「-vm」が追加されています。
- 「Chassis」フィールドには「vm」が含まれています。
- 「仮想化」フィールドには「kvm」が含まれています。
- 「ハードウェアベンダー」フィールドには「QEMU」が含まれています
- 「ハードウェアモデル」フィールドには、「標準PC(Q35 + ICH9、2009)」が含まれています。
物理デスクトップでhostnamectlコマンドを使用する場合、出力には「仮想化」行が含まれていません。
hostnamectl

「仮想化」フィールドがない場合は、ベアメタルで実行している必要があります。
systemd-detect-virtコマンド
できるだけ短い答えを取得したい場合は、 systemd-detect-virtがおそらくあなたが探しているものです。 繰り返しますが、これにはsystemdを備えたディストリビューションが必要ですが、 sudo特権は必要ありません。 これ(およびその簡潔な出力)により、スクリプトでの使用に適しています。
これは、UbuntuVirtualBoxVMでコマンドを実行した結果です。
systemd-detect-virt

GNOME Boxesで実行されているFedoraのコピーは、KVM仮想化を使用していると報告されています。
systemd-detect-virt

ハードウェアマシンでsystemd-detect-virtを実行すると、端末に「none」が出力されます。
systemd-detect-virt

プラットフォームに敏感なスクリプト
スクリプトが仮想化環境で実行されているか物理ハードウェアで実行されているかを検出する機能をスクリプトに与えるために、 systemd-detect-virtコマンドを使用し、 caseステートメントを使用してオプションを処理できます。
これが使用するスクリプトです。 このテキストをコピーして、「platform.sh」というファイルに保存します。
#!/ bin / bash
shopt -s nocasematch
ケース$(systemd-detect-virt)in
なし)
エコー「物理ハードウェア」
;;
*)
エコー「仮想マシン」
;;
esac スクリプトはshoptを使用して、大文字と小文字を区別しないマッチングを選択します。 systemd-detect-virtコマンドがcaseステートメントで使用されます。 このコマンドからの出力は、一致するものが見つかるまで、 caseステートメントの本文にある各case句と比較されます。 一致しないものはすべて、「*)」デフォルト句によってキャプチャされます。
最も簡単な方法は、 systemd-detect-virtからの応答が「なし」であるかどうかをテストすることです。 そうである場合、スクリプトは物理ハードウェアで実行されています。 他のすべての場合、スクリプトは仮想マシンで実行されている必要があります。
スクリプトを実行する前に、 chmodを使用してスクリプトを実行可能にする必要があります。
chmod + x platform.sh

UbuntuVirtualBoxVMを仮想マシンとして正しく識別します。
./platform.sh

また、Fedoraを実行しているGNOMEBoxesVMを正しく検出します。
./platform.sh

スクリプトは、物理マシンで実行されていることも正しく検出します。
./platform.sh

さまざまなcase句は、スクリプトの他の場所でチェックされた変数を設定してさまざまなタイプの処理を実行したり、スクリプト内の特定の関数を呼び出したりすることができます。
スクリプトでさまざまなタイプの仮想環境を検出して対応する必要がある場合は、 case句を追加して、 systemd-detect-virtが返すことができるさまざまな文字列を探すことができます。 --listオプションを使用すると、可能な応答の完全なリストを確認できます。 それらすべてを一度に見やすくするために、 columnコマンドを使用して出力をパイプ処理します。
systemd-detect-virt --list | 桁

赤いピルを取る
これらの手法により、スクリプトがネイキッドハードウェアで実行されている場合、および仮想マシン内にある場合にスクリプトに通知されます。
マトリックスのネオのように、彼らは何が本当で何がそうでないかを知っています。




