2013-05-30

Windows要件を満たしたPCで、Microsoftの屈辱的なライセンスに同意せず別OSを使うのが困難な状況

[Phoronix] Windows 8 Hardware Has Another Problem For Linux

mjg59 | Secure Boot isn't the only problem facing Linux on Windows 8 hardware

マイクロソフトの不自由なライセンスへの同意を強要するWindows 8を動作させるハードウェア要件として、セキュアブート(Secure Boot)とファーストブート(Fast Boot)がある。

マザーボードのファームウェアがブートローダーの署名を検証し、ブートローダーはそこから先のOSやらドライバーやらの署名を検証し、未署名のコードが特権モードで実行されないようにするというのが、セキュアブートの仕組みだ。セキュアブート自体は技術的、暗号理論的に正しい設計である。設計的にはSSLと同じだ。DRMのように間違った設計ではない。ただし、マイクロソフトを唯一の認証局とし、マイクロソフトのバイナリ形式しか署名しない。これは各GNU/Linuxベースのディストロ、特に小規模なディストロにとっては、手間と費用がかかり難しい問題だ。

GNU/Linuxでは対応が進み、セキュアブートに関しては、後はディストロ毎で認証局たるマイクロソフトから署名を入手する問題ぐらいしか残っていない。

今回Matthew Garrettが取り上げたもうひとつのWindows要件の問題は、ファーストブート(高速起動)だ。これはGNU/Linuxインストールの技術的な妨げにはならないが、GNU/Linuxをインストールしようとすると、まずMicrosoftのライセンスに同意して、不自由なWindowsを利用しなければならなくなる問題が発生する。その理由については、まずファーストブートについて解説する必要がある。

コンピューターの電源を入れると、まずマザーボードのファームウェア(BIOSやEFIと呼ばれている)が実行され、デバイス(マザーボード内蔵とマザーボードにつながっているデバイス)が初期化される。ただし、この初期化について、明確な標準規格は存在しない。とりあえず実装依存の方法で、実装依存の状態に初期化される。その後、ファームウェアはOSに制御を移す。近代的なOSは、ファームウェアによる初期化を信用しない。そもそも、どのように初期化されているかという規格が存在しないのだから、信用できない。そこで、近代的なOS(Windows、Linuxカーネルも含む)は、自前でハードウェアを再び初期化する。

これをみると、まずマザーボードのファームウェアにより初期化され、そのあとOSにより再初期化されるという二度手間を踏んでいる。これは非効率的である。どうせ近代的なOSは自前で初期化するのだ。ファームウェアはできるだけ初期化をせず、電源投入後、すみやかにOSに処理を引き渡すべきである。ファーストブート要件とは、まさにこれだ。ファームウェアによる初期化をできるだけ回避して、OSにすばやく処理を引き渡すという要件だ。

より正確にいうと、ファーストブートとは、ファームウェアがOSに制御を渡すまでの時間を規定している。この時間はとても短く、ファームウェアは到底、全デバイスを初期化完了するほどの猶予がない。そこで、ファームウェアは時間要件を満たすため、ほとんど初期化をせずにOSに制御を移す実装となる。

ファーストブート自体はいい。この仕組みは、corebootという自由なファームウェアを実装するプロジェクトでも使われている。真に自由なコンピューターを求める人間は、マザーボードがcorebootに対応しているかどうかを調べ、corebootを利用すべきだが、残念ながら、利用者が自力でマザーボードのファームウェアを書き換えるというのは難しい作業であり、ハードルが高い。corebootのようなものは、マザーボードの出荷時にベンダーの手で焼きこまれているべきなのだ。

多くのデバイスの初期化は、ファーストブート要件を満たすよりも長い初期化時間がかかる。USBはもちろんのことだし、マウスとキーボードに使われているPS/2の初期化もすっとばさなければならない。これらのデバイスを利用可能な状態に初期化するには、秒単位の時間がかかるため、ファーストブート要件を満たせない。つまり、ファームウェアはキーボードからの入力を処理しているような時間すら与えられていないのだ。したがって、ファームウェアの設定でブート先を変更するという事はできない。

もちろん、設定によりファームウェアに初期化をさせて、ファームウェア設定画面を表示するモードで起動させることができる。これは、UEFI変数に書き込むことで、次回起動の際にファームウェアに初期化をするよう伝えるのだ。ファームウェアに初期化をさせるようUEFI変数に書き込むためには、ファームウェアが制御を移すOSから行わなければならない。OSとは、例えばMicrosoftの不自由なライセンスへの同意を強要するWindowsだ。

多くのPCは、ベンダー側で、Microsoftの不自由なライセンスに同意しなければ使えないWindowsという不自由OSがあらかじめインストールされた上で、出荷されている。利用者がPCを購入して、初回起動した時、キーボードのどのキーを押し続けようと、USBポートやCD/DVDドライブにGNU/Linuxのインストール用のストレージを突っ込もうと、ファームウェアは反応しない。ファーストブート要件により、ファームウェアには反応するだけの時間的猶予が与えられていないのだ。

そこで不自由なOSであるWindowsが起動する。不自由なWindowsはハードウェアを初期化して起動し、利用者に対して、Microsoftのライセンスに同意するよう求める画面を表示する。ここでの選択肢は、同意するか、電源を落とすかだ。

この画面では、ファームウェアによる初期化を伴う再起動をさせる選択肢が提供されていない。そこで、このような不自由なWindowsインストール済みで出荷されたPCにGNU/Linuxをインストールするには、まずMicrosoft Windowsの不自由なライセンスに同意して、Windowsを操作できる状態にした上で、Windowsからファームウェア初期化を伴う再起動をさせなければならない。

これにより、Windowsインストール済みで出荷されたPCにGNU/Linuxをインストールするには、Microsoftの不自由なライセンスに同意しなければならないという屈辱的な問題が発生する。

もちろん、不自由なOSであるWindowsは最初から必要がないのだから、そのようなOSで汚染されたPCを購入しなければよい。しかし、現実的に、普通の利用者が最も入手しやすいPCが、Windowsインストール済みである以上、そう理想ばかりもいっていられない。

運悪くこのような制限的なWindows汚染されたPCを所有している場合、まずPCを分解して、不自由なWindowsがインストールされたストレージ(HDDあるいはSSD)を取り外して起動するという手がある。そうすれば、ファームウェアは起動すべきOSが存在しないわけだから、エラーを利用者に伝えるためにも初期化を行う。あとは設定を変更して、GNU/Linuxのインストール用ストレージをブートさせるようにすれば良い。

残念ながら、今時の不自由なWindowsがインストール済みの状態で出荷されるPCとは、大抵の場合、薄く小さくするために相当複雑で、このような分解は、メーカー保証を無効にしてしまうほどの作業であることが多い。ましてや、もっと極端に小型化を追い求めたPCの場合、マザーボードに直接SSDをハンダ付けしていたりなどして、分解は極めて難しくなる。

もっと多くの利用者が、私のように各パーツを組み立てる自作PC、あるいは汎用パーツを組み立てて販売されているPC(もちろん不自由なWindows汚染されていない)を利用すべきだと思うのだが、現実はなかなか難しい。

利用者が購入したコンピューター上では、利用者の選択したOSが実行されるべきである。しかし、利用者の選択したOSをインストールするのに、まずMicrosoft WindowsのEULAに同意しなければならないというのは間違っている。

4 comments:

Anonymous said...

自由主義なのに不自由な思いをされてますね

Anonymous said...

個人的にタイムリーな話題に感じました。

現在MacBookにLubuntuをインストールして使っていますが、MacBook起動時の「ジャーン」という音量を小さくする(または消す)にも、起動すべきパーティションがどれであるのか指定するにも、Mac OS Xのインストールメディアからターミナルを起動してファームウェアの変数を書き換える必要があります。

私はiPhoneもAndroidも好きですが、自由に使える余地を残してもらえると良いですね。

江添亮 said...

この場合は、「不自由」ではなく、「不都合」とか「不具合」というべきです。

Anonymous said...

簡単にできるようにツールでも作って頂かないと大半のユーザーにはどうしようもないですね。