Linuxスクリプトに仮想マシンで実行されていることを検出させる方法

公開: 2022-06-27
2つの手、1つは赤い錠剤を持ち、もう1つは青い錠剤を持っています。
diy13 / Shutterstock.com

仮想マシンは、物理ハードウェア上で実行されていることをオペレーティングシステムに納得させるために非常に懸命に努力します。 では、Linuxコマンドラインから、コンピューターが物理的か仮想的かを判断できますか?

仮想マシンとハイパーバイザー

従来のコンピューターは物理的なオブジェクトです。 これは、オペレーティングシステムのロード、アプリケーションのインストール、起動、および使用を可能にするために、プラグとボルトで固定されたさまざまなハードウェアのコレクションです。

ハードウェアは高価です。 物理コンピューターごとに1つのオペレーティングシステムに制限されるということは、複数のオペレーティングシステムを実行するコストがすぐに法外に高くなることを意味します。 より良い解決策は、単一の物理コンピューターが選択したオペレーティングシステムを同時に実行できるようにすることであり、各コンピューターは独自の固有のハードウェアで実行されていると考えます。

仮想マシンハイパーバイザーとは何ですか?
関連仮想マシンハイパーバイザーとは何ですか?

ハイパーバイザーはこれを可能にします。 ハイパーバイザー(仮想マシンマネージャーまたは仮想マシンモニターとも呼ばれます)は、仮想マシンを作成できるソフトウェアです。 これらは、同じ物理ホスト上で実行され、ハードドライブのスペース、メモリ、およびCPUコアを共有しているにもかかわらず、個別の物理コンピューターであるかのように動作します。

もちろん、ホストコンピュータは、仮想マシンのコレクションの要求に対応するのに十分強力である必要がありますが、ホストに十分なRAMと処理能力があれば、仮想マシンはほぼベアメタル速度で実行できます。

2007年に2.6.20カーネルがリリースされて以来、Linuxにはカーネルベースの仮想マシンサポートが組み込まれています。Linuxには、VirtualBox、GNOME Boxes、QEMU-KVMなどのいくつかのハイパーバイザーがあります。 LinuxのネイティブKVM機能を利用し、ユーザーインターフェイスと、仮想マシンのスナップショットを取得できるなどの機能を追加することで、ネイティブカーネル機能を構築します。

仮想マシンは、コストの節約、効率、展開の簡素化、および(正しくプロビジョニングされた)セキュリティ上の利点をもたらします。 また、スケーラビリティを促進します。 サービスの需要が増加すると新しいサーバーを自動的に起動し、需要が減少するとシャットダウンすることができます。 これにより、クラウドとオンプレミスインフラストラクチャの両方で非常に人気があります。

おそらく、Linuxサーバーをリモートで管理していて、それが仮想マシンなのか物理ボックスなのかを知る必要があります。 または、実行しているプラ​​ットフォームのタイプを知る必要があるスクリプトがあります。 作業しているコンピューターが物理的であるか仮想的であるかを検出する方法はいくつかあります。

dmidecodeコマンド

dmidecodeコマンドは、多数のオプションと修飾子をサポートしています。 デスクトップ管理インターフェイス(DMI)テーブルに問い合わせ、ターミナルウィンドウに情報を出力します。

Linuxターミナルからコンピュータのデバイスを一覧表示する方法
Linuxターミナルからコンピュータのデバイスを一覧表示する関連

-s (単一の文字列を表示)オプションとともに使用し、システム製品名を尋ねます。 sudoを使用する必要があることに注意してください。

Ubuntu22.04を実行しているVirtualBoxVMでコマンドを実行します。

 sudo dmidecode -s system-product-name 

VirtualBoxVMを正しく識別するdmidecodeコマンド

プラットフォームはVirtualBoxとして正しく識別されます。

Fedora35を実行しているQEMU-KVMVMでは、この出力が得られます。

 sudo dmidecode -s system-product-name 

GNOMEBoxesVMを正しく識別するdmidecodeコマンド

これは標準PCとして報告されていますが、タイプQ35の標準QEMU仮想PCです。 そのため、プラットフォームは仮想マシンとして正しく認識されます。

物理コンピューターで同じコマンドを実行すると、製造元に関する情報が得られます。

 sudo dmidecode -s system-product-name 

物理コンピューターに関する情報を返すdmidecodeコマンド

このコンピューターは、Micro-Star International Company Limitedのマザーボードをベースにしたカスタムビルドで、製品コードはMS-7B86です。

lshwコマンド

lshwコマンドは、さまざまなコンピューターハードウェアの詳細を一覧表示します。 lshwがレポートするハードウェアのクラスを選択できます。

Linuxでlshwを使用する方法(実際の例を使用)
関連するLinuxでのlshwの使用方法(実際の例を使用)

system修飾子とともに-classオプションを使用します。 このコマンドでsudoを使用すると、すべての詳細が表示されます。

このコマンドは、UbuntuVirtualBoxVMで実行します。

 sudolshwクラスのシステム

VirtualBoxVMでレポートするlshwコマンド

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

Fedoraにlshwをインストールする必要がありました。

 sudo dnf install lshw 

dnfコマンドを使用してFedoraにlshwをインストールする

GNOMEBoxesで実行されているFedoraVMでそのコマンドを試してみましょう。

 sudolshwクラスのシステム

GNOMEBoxesVMでレポートするlshwコマンド

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

これは、物理コンピューターで同じコマンドを実行した結果です。

 sudolshwクラスのシステム

物理コンピューターでレポートするlshwコマンド

これは、Micro-Starマザーボードを搭載したハードウェアコンピュータであることがわかります。

  • ハードウェアはデスクトップコンピューターとして識別されます。
  • 「製品」フィールドには、マザーボードタイプMS-7B86が表示されます。
  • 「ベンダー」フィールドには、製造元の名前が含まれています。

hostnamectlコマンド

このコマンドには、実行するためにsudo権限が必要ないという利点があります。 ただし、 systemd対応のディストリビューションでのみ使用できます。 最新のディストリビューションの大部分はsystemdを使用しています。

これは、UbuntuVirtualBoxVMでコマンドを実行したときの応答です。

 hostnamectl 

仮想化ラインが強調表示されたVirtualBoxVMでのhostnamectlコマンドからの出力

  • 「icon-name」フィールドには「-vm」が追加されています。
  • 「Chassis」フィールドには「vm」が含まれています。
  • 「仮想化」フィールドには「oracle」が含まれています。
  • 「ハードウェアベンダー」フィールドには「innotekGmbH」が含まれています。
  • 「ハードウェアモデル」フィールドには「VirtualBox」が含まれています。

GNOMEBoxes内のFedoraVMの出力は非常に似ています。

 hostnamectl 

仮想化ラインが強調表示されたGNOMEBoxesVMのhostnamectlコマンドからの出力

  • 「icon-name」フィールドには「-vm」が追加されています。
  • 「Chassis」フィールドには「vm」が含まれています。
  • 「仮想化」フィールドには「kvm」が含まれています。
  • 「ハードウェアベンダー」フィールドには「QEMU」が含まれています
  • 「ハードウェアモデル」フィールドには、「標準PC(Q35 + ICH9、2009)」が含まれています。

物理デスクトップでhostnamectlコマンドを使用する場合、出力には「仮想化」行が含まれていません。

 hostnamectl 

「仮想化」情報のない、物理コンピューターでのhostnamectlコマンドからの出力

「仮想化」フィールドがない場合は、ベアメタルで実行している必要があります。

systemd-detect-virtコマンド

できるだけ短い答えを取得したい場合は、 systemd-detect-virtがおそらくあなたが探しているものです。 繰り返しますが、これにはsystemdを備えたディストリビューションが必要ですが、 sudo特権は必要ありません。 これ(およびその簡潔な出力)により、スクリプトでの使用に適しています。

これは、UbuntuVirtualBoxVMでコマンドを実行した結果です。

 systemd-detect-virt 

systemd-detect-virtを使用したVirtualBoxVMの識別

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

 systemd-detect-virt 

systemd-detect-virtを使用したGNOMEBoxesVMの識別

ハードウェアマシンで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句と比較されます。 一致しないものはすべて、「*)」デフォルト句によってキャプチャされます。

Bashスクリプトでケースステートメントを使用する方法
関連するBashスクリプトでのケースステートメントの使用方法

最も簡単な方法は、 systemd-detect-virtからの応答が「なし」であるかどうかをテストすることです。 そうである場合、スクリプトは物理ハードウェアで実行されています。 他のすべての場合、スクリプトは仮想マシンで実行されている必要があります。

スクリプトを実行する前に、 chmodを使用してスクリプトを実行可能にする必要があります。

 chmod + x platform.sh 

chmodを使用してプラットフォームスクリプトを実行可能にする

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

 ./platform.sh 

VirtualBoxVMでplatform.shスクリプトを使用する

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

 ./platform.sh 

GNOMEBoxesVMでplatform.shスクリプトを使用する

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

 ./platform.sh 

物理コンピューターでplatform.shスクリプトを使用する

さまざまなcase句は、スクリプトの他の場所でチェックされた変数を設定してさまざまなタイプの処理を実行したり、スクリプト内の特定の関数を呼び出したりすることができます。

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

 systemd-detect-virt --list | 桁

systemd-detect-virtが返すことができる応答の完全なセット

赤いピルを取る

これらの手法により、スクリプトがネイキッドハードウェアで実行されている場合、および仮想マシン内にある場合にスクリプトに通知されます。

マトリックスのネオのように、彼らは何が本当で何がそうでないかを知っています。