前回 は番外編として、メンテナの松木さんにオープンソースカンファレンス(OSC)2015 Tokyo/Fallに出展した模様をレポートしていただきましたが、お楽しみいただけたでしょうか?
「Plamo Linuxメンテナグループ」は、次回2016年2月26-27日 に開催されるOSC 2016 Tokyo/Spring にも出展する予定にしているので、Plamo Linuxや本連載に興味をお持ちの方は、ぜひご来訪ください。
さて、前回までに紹介してきたように、Plamo-6.0はOSCでの配布に合わせて急遽とりまとめたバージョンなものの、かなり大きな変更も取り込んでおり、その代表例がGPT/UEFI への対応です。そこで今回からPlamo LinuxにおけるGPT/UEFI対応について取りあげることにします。
GPT/UEFIとは
WindowsやMacintoshのユーザには「今さら何を」と言われそうですが、UEFI (Unified Extensible Firmware Interface)は、最初期のPC互換機から受け継がれてきたBIOS(System BIOS)に替わる、マザーボード上のFirmwareや周辺機器を管理するための新しい枠組みで、GPT (GUID Partition Table)はUEFIで制定されたHDDのパーティション管理システムです。
Macintoshの世界ではIntel CPUを採用した2006年のMac Book Proから全面的にUEFIを採用し、Windowsの世界でもWindows 7の世代から32ビット版、64ビット版ともにUEFIへ対応したので、最近発売されているメーカ製PCのほぼ全てはUEFI/GPTを採用しています。Linuxの世界でも、主要なディストリビューションはWindows7が普及する前後からUEFI/GPTへの対応を進めていました。
Plamo Linuxでも「いずれは対応しないといけないなぁ……」と思ってはいたものの、商用OSのような無駄なギミックのないLinuxの場合、数世代前のハードウェアでも快適に動作するので、新しいハードウェアへの対応はおろそかになりがちです。
今使っているマシンを組んだ時はこの連載の記事にしたよなぁ……と、過去の記事を調べてみたら、丸5年前の2010年10月 のことでした(苦笑) 。当時のPlamo Linuxのバージョンは4.73で、このマシンを使って64ビット化を本格的に始めたことを思いだしました。
UEFIやそれに関連してWindowsしか起動できなくなるSecure Boot の話題も耳にはしていたものの、「 自作PCじゃ関係ないしなぁ……」と他人事のように思っていました。一方、HDDの大容量化はどんどん進み、最近では3TBクラスのHDD が最もビットあたりの単価が安くなってきました。そこで増設用に3TBなHDDを買ってみたものの、fdiskでパーティションを切ろうとすると2TBまでしか取れません。「 あれ、何で?」と思ったのが、この問題に取り組むきっかけでした。
HDDのGPT形式
膨大な容量を誇るHDDは内部を複数の領域に分けて使うことができます。この領域を「パーティション」と呼び、HDDのどこからどこまでがどのパーティションに属するかという情報は「パーティション・テーブル」という部分に記録しています。GPTはGUID Partition Tableの名の通り、パーティションの管理にGUID を用いるようにしたパーティション・テーブルです。
GPT形式以前のパーティション・テーブルはMBR形式 、あるいはDOS形式と呼ばれ、基本設計はIBM PCが開発された1980年代前半 にまでさかのぼります。当時のHDDはずいぶん高価な記憶装置だったので、できるだけ無駄なく利用することが望まれました。その結果、パーティション・テーブルはOSの起動用コード(ブートローダ)と共にHDDの最初のブロック (このブロックをMBR:Master Boot Recordと呼びます)に収め、1HDDあたり最大4パーティション 、1パーティションあたり16バイト の管理情報を割り当てることになりました。当時のHDDは20MB程度だったので、この設計でも十分余裕があると思われていました。
図1 MBR形式のパーティションテーブル
しかし、その後のHDDの大容量化は設計者の予想を遙かに上まわり、HDDの内部構造を反映したCHS(Cylinder-Header-Sector)方式でのアクセスは早々に破綻し、HDD上の全セクタを連番で管理するLBA (Logical Block Access)方式に変更されました。しかし、16バイトのパーティション管理情報のうち8バイトはCHS用に割り当て済みだったのでLBA方式用には8バイトしか残っていません。そのためLBA方式のパーティション・テーブルでは4バイト を使ってパーティションの開始位置を、残りの4バイトでそのパーティションのサイズを指定することになりました。
HDDの1ブロック(セクタ)のサイズは512バイト、4バイト(32ビット)で管理できる最大のブロック数は2^32個なので、この方式で管理できる最大サイズは512バイト×2^32、およそ2TB になります。3TBのHDDはこの最大サイズを超えているので、MBR形式のパーティション・テーブルでは全体を管理することができないわけです。
GPT形式はMBR形式の限界を超えるように考案されたパーティション・テーブルで、HDDの先頭から34ブロックをパーティション管理用に使い、HDD全体では最大128パーティション を利用できるように設計されています。
1ブロックあたり4パーティション、すなわち1パーティションの管理用に128バイト が割り当てられ、その中からパーティションに属するブロックの先頭と末尾を示すために8バイト ずつ割り当てられているので、最大512バイト×2^64、すなわち9.4ZB (ゼタバイト)のパーティションまで管理可能になりました。
ややこしくなるのでテラバイト(TB)とテイビバイト(TiB)の違いを無視すると、1TB(テラバイト)のHDDを1000台集めたら1PB(ペタバイト)になり、1PBの1000倍が1EB(エグザバイト)で、さらにその1000倍が1ZBです。
図2 GPT形式のパーティションテーブル
実のところ、Linuxカーネルはずいぶん以前からGPT形式にも対応していて、GPT機能はデフォルトで組み込まれています。また、最近ではfdisk等の管理ツールもGPTに対応しているので、新しいHDDを使う際、ラベルのタイプをGPT にすれば2TBを超えるHDDも問題なく利用できます。
3TBのHDDが普及し始めた当初は、fdiskがGPTに未対応だったためパーティション・テーブル作成にはgpartedを使わなければならない時期がありました。しかし最近(2013年10月にリリースされたutil-linux-2.24以降)のfdiskはGPTに対応済みなので、util-linuxのfdiskやcfdiskのみでGPT HDDに対応できます。
UEFIブート
上述のように、GPT形式ではパーティション・テーブルの管理方式が大きく変更されると共に、OSのブートローダをHDDの先頭ブロックに置くという仕様も廃されました。GPT形式では、ブートローダ専用のパーティション が定義され、そのパーティション上ではさまざまなOS用のブートローダが共存でき、各ブートローダは通常のファイルと同じようにOSから操作できるようになりました。
ブートローダの置き場をHDDの先頭ブロックから専用のパーティションに変更するためには、ブートローダを呼び出すマザーボード側のソフトウェアも対応する必要があります。この機能を持った新しいソフトウェアがEFI (Extensible Firmware Interface)です。
従来のBIOS(System BIOS)は電源ON後にマザーボードの各種チェックを行い、必要なfirmware類を読み込んで周辺機器の初期化を行なった上で、その後の処理はOSを起動するためのブートローダが存在するはずのHDDの先頭ブロック(MBR)に丸投げしていました。
一方EFIでは、マザーボードの各種チェックや周辺機器の初期化はSystem BIOS同様に行うものの、それに加えてHDD上のパーティションやファイルシステムを操作する機能が追加され、指定されたパーティションのファイルシステムを辿ってブートローダを呼び出すことが可能になっています。EFIではそれ以外にもさまざまな機能がモジュール として提供され、GUIな操作画面やネットワーク機能、シンプルなシェルなど、いわばマザーボード上の小規模なOSとでも呼べるソフトウェアになっています。
EFIのルーツは,IntelがHPと共に開発した64ビットCPUであるItanium にまでさかのぼります。Itaniumはx86アーキテクチャと互換性が無いため従来のSystem BIOSを利用することはできません。そのために考案された新たなシステム起動用ソフトウェアがEFIで、そのEFIの規格の中で定義されたHDD管理システムがGPTというわけです。
しかしながらItanium(IA-64)はIntelの思惑通りには普及せず、64ビットCPUの主流はAMDが提唱しx86アーキテクチャと互換性を持つx86_64 になりました。x86_64アーキテクチャは従来のSystem BIOSを利用できるものの、System BIOSの限界は前節で紹介したHDDの大容量化などで目前に迫っていました。そのためIntelはIA-64以外のアーキテクチャでも使用できるように、EFIの諸権利をUnified EFI(UEFI)フォーラム という業界団体に移管してマザーボード・メーカやチップセット・メーカがEFIを採用しやすいようにしました。UEFIフォーラムが設置されたのが2005年、これ以降、EFIの機能を持ったマザーボードは「UEFI対応マザーボード 」として普及することになりました。
このような経緯からマザーボード・メーカーは「UEFI対応」をうたう一方、UEFIフォーラムが成立する前からItaniumにも対応していたLinuxカーネルでは"efivarfs"のようにEFIという名称を使い続けています。
GPT HDDからOSを起動するためにはUEFI対応マザーボードが必要なものの、LinuxのようなGPTに対応したOSは起動さえできればGPT HDDを問題なく操作できます。すなわち、起動用HDDさえ用意すれば、従来のSystem BIOSなマザーボードのマシンでも大容量なGPT HDDをデータ保存用に利用することは可能なわけです。このあたりの柔軟性が仇(あだ)になって、なかなか「UEFIブート」に対応する気にはなれなかったものの、Plamo-6.0のリリースという機会に合わせてこの問題に真面目に取り組むことにしたのでした(続く) 。