PCのROMに組み込まれているBIOSは、PCの起動直後に実行され、OSのブートローダーを呼び出す役割を持ちます。BIOSの種類には、古い(旧、レガシー)BIOSと新しいUEFIの2つがあります。エンドユーザーの多くは、BIOSなのか、UEFIなのかを気にすることなく、PCを使っていると思いますが、知る必要がある場面も出てくるでしょう。その方法を幾つかピックアップしてみました。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
Windowsのインストールをカスタマイズしたり、OSイメージ展開をしたり、起動問題をトラブルシューティングするようなITプロフェッショナルにとっては、そのPCが古い(旧、レガシー)BIOS(Basic Input/Output System)ベースなのか、新しいUEFI(Unified Extensible Firmware Interface) BIOSベースなのかを知ることは重要です(以降、本稿では古いBIOSを「BIOS」、新しいUEFI BIOSを「UEFI」と表現します)。
しかし、ほとんどのエンドユーザーさんにとっては、日常的なPCの利用において、どちら(BIOS/UEFI)であるかを気にすることはほとんどないし、両者の違いを知らなくても不自由はないでしょう。
一般的に古いPCはBIOSベース、最近の新しいPCはUEFIベースのものが主流です。UEFIは、Windows(特にWindows 10)のセキュリティ機能のシステム要件になっていたり、起動や再開が高速という利点があったりします。
UEFIは、より大きなディスクと多数のパーティションをサポートしているという利点もあります(BIOS/MBR《Master Boot Record》システムは最大4パーティション、最大2TBまで。UEFI/GPT《GUID Partition Table》システムは最大128パーティション、最大18E《エクサ》B)。
WindowsにおけるUEFIの利点について詳しく知りたければ、以下の公式ドキュメントをご覧ください。
そのPCで既にWindowsが動いている場合は、BIOSまたはUEFIのいずれか適切な方に対応した方法でWindowsがセットアップされています。通常、ユーザーが変更するものではありません。UEFI対応のシステムを意図的にBIOSモードにすることも可能ですが、それはWindowsのインストール前に行うことであり、後から変更するとWindowsが起動できなくなるはずです。何らかの理由(OSが対応していなかったなど)で現状、BIOSモードで利用している場合に、新しいOSを新規インストールするタイミングで本来のUEFIモードに戻すということはあるかもしれません。
いずれにしろ、まずはBIOSかUEFIかを知ることが必要になる場合があります。今回はBIOSかUEFIかを知る方法を幾つかピックアップして紹介します。
「Windows 8」以降および「Windows Server 2012」以降では、Windowsの標準ツールである「システム情報」(%Windir%\System32\Msinfo32.exe:以下、Msinfo32)を起動すると、「システムの要約」の「BIOSモード」という項目で、BIOSかUEFIかを確認できます。
BIOSの場合は「レガシ」、UEFIの場合は「UEFI」と表示されます(画面1の左と中央)。なお、「Windows 7」以前および「Windows Server 2008 R2」以前の「システム情報」には、「BIOSモード」という項目は存在しません(画面1の右)。
Msinfo32が利用できる場合はこれが最も簡単な方法ですが、古いバージョンのWindowsや、Server CoreインストールのWindows Serverでは利用できません。
コマンドプロンプト(またはWindows PowerShellウィンドウ)で、次のいずれかのコマンドラインを実行すると、BIOSのバージョン情報を取得することができます。
WMIC BIOS GET BIOSVersion
または
Systeminfo |findstr /i "BIOS"
「WMIC」はWindows Management Instrumentation(WMI)から情報を取得するコマンド、「Systeminfo」(%Windir%\System32\Systeminfo.exe)はMsinfo32のコマンドライン版のようなものです。取得したBIOSのバージョン情報に「BIOS」または「UEFI」という文字列が含まれていれば、それがヒントになるかもしれません(画面2)。しかしながら、得られる情報はあくまでもヒントであり、決定的なものではありません。
Windowsでファームウェアの種類を確認する方法としては、プログラム的にWin32 APIを利用する方法が用意されています。Windows 8およびWindows Server 2012以降は「GetFirmwareType」、Windows 7およびWindows Server 2008 R2以前は「GetFirmwareEnvironmentVariable」が用意されています。Msinfo32の「BIOSモード」項目は、GetFirmwareTypeが利用可能になったことにより追加されたのでしょう。
プログラマーではない一般ユーザーがWin32 APIを呼び出すのは容易なことではなく、現実的な方法ではありません。「PowerShell Gallery」で公開されている「GetFirmwareBIOSorUEFI」モジュールを導入し、「Get-FirmwareType」というコマンドレットを実行することで、GetFirmwareTypeまたはGetFirmwareEnvironmentVariableの適切なAPIを使用してBIOSまたはUEFIを識別することができます(画面3)。
BIOSかUEFIかを識別するためだけに、第三者が作成したPowerShellモジュールを導入するのはちょっと気が引ける、あるいは大げさ過ぎると思うかもしれません。モジュールをインストールするには管理者権限も必要です。筆者自身、Windows標準のコマンドやツールで確認できた方がよいと思います。
Windows PowerShell 5.1では、Msinfo32のPowerShell版ともいえる「Get-ComputerInfo」コマンドレット(Microsoft.PowerShell.Managementモジュールに含まれる)が利用可能になりました。
「Windows 10 バージョン1607」および「Windows Server 2016」以降はWindows PowerShell 5.1を標準搭載しています。Windows 8.1およびWindows Server 2012 R2以前の場合は、Windows Management Framework(WMF)5.1をインストールすることで、Windows PowerShell 6.1が利用可能になります。また、Get-ComputerInfoコマンドレットは、オープンソース、クロスプラットフォームのPowerShell Core 6以降でも利用可能です。
Get-ComputerInfoコマンドレットはシステム情報に関する大量のプロパティを出力しますが、BIOSとUEFIを識別する目的のプロパティは「BiosFirmwareType」です。以下のいずれかのコマンドラインを実行することで、BiosFirmwareTypeプロパティだけを取得することができます。
Get-ComputerInfo -Property BiosFirmwareType
Get-ComputerInfo | Select BiosFirmwareType
(Get-ComputerInfo).BiosFirmwareType
BIOSの場合は「Bios」、UEFIの場合は「Uefi」という値を返します(画面4)。空の値が返される場合は、「Windows Remote Management(WinRM)」サービスを有効化(管理者権限で「winrm -qc」コマンドレットを実行)してから再実行してください。
先ほどWindows 8.1およびWindows Server 2012 R2以前にWMF 5.1をインストールすることでWindows PowerShell 5.1が利用可能になると言いましたが、実は、Windows 7およびWindows Server 2008 R2の場合、Get-ComputerInfoコマンドレットが以下のエラーを出力して失敗するという既知の問題があります。
Get-ComputerInfo : DLL 'kernel32.dll' の 'GetFirmwareType' というエントリ ポイントが見つかりません。
エラーの内容から想像できるように、Get-ComputerInfoコマンドレットはWindows 8およびWindows Server 2012から利用可能になったGetFirmwareType APIが利用できることを想定して作成されているようです。恐らく、製品サポートのライフサイクル終了が目前に迫っているWindows 7やWindows Server 2008 R2に対して、Get-ComputerInfoコマンドレットのこの問題が修正されることは期待できません。
Windows 7やWindows Server 2008 R2でも、PowerShell Core 6のGet-ComputerInfoコマンドレットはエラーなしで実行できます。ただし、単にGetFirmwareType APIを利用できないエラーを無視しているようで、残念ながらBiosFirmwareTypeプロパティは空の値を返します(画面5)。
この方法は管理者権限を必要としますが、Windowsのブート構成データを参照することでBIOSかUEFIかを簡単に識別することができます。管理者権限で開いたコマンドプロンプト(またはWindows PowerShellウィンドウ)で「ブート構成データストアエディター」(%Windir%\System32\Bcdedit.exe)である「BCDEDIT」コマンドを実行し、「Windowsブートローダー」の「path」を確認します。パスが「……\winload.exe」であればBIOS、「……\winload.efi」であればUEFIです。
次のように実行結果から「winload」を検索すれば、目的の行だけを出力させることができます(画面6)。
Bcdedit |findstr /i "winload"
Windows 8以降およびWindows Server 2012以降の「Windows回復環境(WinRE)」のコマンドプロンプトで利用可能な「WPEUTIL」コマンドには、現在のブート環境(WinREのブート環境)のファームウェアの種類を現在のレジストリ(WinREのレジストリ、再起動で失われる)に登録する「UpdateBootInfo」オプションが用意されています。この機能を利用すると、「HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control」キーに「PEFirmwareType」値が作成されます。
WinREのコマンドプロンプトを起動したら、次のコマンドラインを実行してください。BIOSの場合は「PEFirmwareType」値に「1(0x1)」が、UEFIの場合は「PEFirmwareType」値に「2(0x2)」が設定されます。なお、Windows 7以前およびWindows Server 2008 R2以前の「UpdateBootInfo」オプションは、「PEFirmwareType」値を作成しません。
WPEUTIL UpdateBootInfo REG QUERY "HKLM\System\CurrentControlSet\Control" /v PEFirmwareType
この方法は、WindowsがまだインストールされていないベアメタルPCでも利用可能です。それには、Windows 8以降のインストールメディアでベアメタルPCを起動し、WinREのコマンドプロンプトを起動して操作します。「Windowsセットアップ」の画面で[Shift]+[F10]キーを押すと、WinREのコマンドプロンプトを開始する操作を省略して、直接コマンドプロンプトを開くことができます(画面7)。
このテクニックは、以下のOEMやシステムビルダー向けの公式ドキュメントの中で説明されています。
岩手県花巻市在住。Microsoft MVP:Cloud and Datacenter Management(2019-2020)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。Microsoft製品、テクノロジーを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。近著は『ITプロフェッショナル向けWindowsトラブル解決 コマンド&テクニック集』(日経BP社)。
Copyright © ITmedia, Inc. All Rights Reserved.