DellのPCでWindowsは起動するがLinuxは起動しない場合

いつも悩むのでメモ。

Dellと書いたが、どんなPCでも発生する可能性はある。Intel製CPUを搭載したメーカー製PC(=自作PCでないPC)だと多い気がする。

ストレージ設定をRAIDからAHCIにする

ストレージ設定がRAIDモードだとLinuxは起動しない(私が試した限り、起動することもあるのでややこしい)。AHCIモードにしなければならない。Linuxが起動失敗するときはrootファイルシステムがマウントできなかった、というようなメッセージが表示され、その後busyboxのプロンプトが表示される。だから、UEFIの設定(Dellの場合は起動時にF2キーを押す)からSATA OperationをRAID→AHCI(AHCI/NVMe)に変えれば動作する。

しかしながら、デュアルブート構成にしていてWindowsが一緒にインストールされていた場合はRAIDからAHCIに変更するとWindowsが起動しなくなる(設定変更時にOSの再インストールが必要になるかも、と警告が出るのはこのためだ)。起動中に「エラーが発生しました」とQRコードとともに青い画面が表示され、そこで止まってしまう。これはおそらくはWindows固有の問題(後述)だと思う。ググると再インストールが必要という説明がいくつか出てくるが、実は再インストールしなくてもAHCIモードでWindowsを動作させることができる。その手順は以下。

Switching between AHCI and RAID on the Dell XPS 15 (9560)

この手順はしっかりと一つ一つ守る必要がある。やりかたを日本語でも書いておこう:

1.まず通常通りWindowsを起動する(つまりRAIDモードで起動する)。その後、管理者権限のあるコマンドプロンプトから

bcdedit /set '{current}' safeboot minimal

と打つ。これで、セーフモードで立ち上がるようになる。

2.再起動してすぐにUEFIに入り、SATAモードをRAIDからAHCIにする。

3.設定後、Windowsを起動する。Windowsはセーフモードで立ち上がる。リカバリーモードではなくセーフモードであることに注意したい(私はこれを間違えた)。セーフモードは最小限のドライバで動いているが、通常のGUIが表示され、画面の角にセーフモードと表示される。

4.セーフモードで起動したらまた管理者コンソールを開き、

bcdedit /deletevalue '{current}' safeboot

と打つ。これで通常モードで起動するようになる。

5.再起動してWindowsを立ち上げる。すると今度は通常通りWindowsが起動されるはず。

切り替えるための必要十分条件は「AHCIモードの状態でセーフモードで一度でいいので正常に立ち上がること」だそうだ。これを満たすためには普通、上記のような手順になるだろう。

余談

ここから背景の考察。Googleである程度調べた上で、私の推測を多く含む。

まず、WindowsではソフトウェアRAIDがサポートされていない。なのでRAID構成を取ることが難しい。Intelはこの問題に対処するため(近年ではそれに加えて自社製品である高速不揮発性ストレージのOptaneや高速SSDを活用してもらうため)、Intelラピッドストレージテクノロジーというものを開発した。これはWindows上でソフトウェアRAIDを構成したり、あるいはOptaneやSSDをHDDアクセスのためのキャッシュとして使ったりといったことが可能になる製品だ。これを実現するためにIntel用チップセットには専用の機能が搭載され(具体的にこれが何をしているのかは知らない)、それを有効にするための設定項目がUEFIに組み込まれた。また、Windows上ではそれを構成するためのアプリケーションがインストールされる。

これを実現させるためにはチップセット側が何かしらの機能を提供しているのは事実であるが、これはいわゆるハードウェアRAID(RAID構成を管理するための各種処理がハードウェアで行われる)であることを意味しない。IntelラピッドストレージテクノロジーではRAID構成を維持するための処理はCPUで行われる。この機能はだいぶ昔(調べたら2010年からだそうで、しかもその前にはMatrix RAIDという名前で存在していたらしい)のチップセットから実装されていて、私は最初BIOSでこれを見たときついにチップセットにハードウェアRAIDが組み込まれたのか!?いやそんなはずはないな…などと考えていた記憶がある。ハードウェアRAIDカードは一般的にすごく高価だ。通常は5〜10万円くらいする。…と思ってぐぐったら玄人志向から4000円代でハードウェアミラーリングを実現するカードが登場していた。これ大丈夫なのか?だれかUbuntuで動くか試してほしい。

で、Intelの方はもう少し詳しく調べたところ、こういうものを一般的に「Firmware based RAID」と呼ぶらしい。Wikipedia(英語)の解説を読むと、ブート時にストレージコントローラに組み込まれた専用のファームウェアが複数のストレージがRAID構成になっているようにみせかけて、OSが制御を引き継いだ段階でソフトウェアRAIDに切り替わる、という仕組みらしい。

ハードウェアRAIDっぽくみせておいて実はソフトウェアRAIDであるので、FakeRAIDと俗に言われている。

FakeRAIDはできたその経緯から明らかなように、実質的にはWindowsのための機能と言える(私の理解が間違っていなければ)ので、当然、Linuxはサポートしていない。サポートするメリットがないからだ。

Linuxがサポートしているコントローラと、どれが「本物」のハードウェアRAIDなのかは以下を見ればわかる。

Serial ATA (SATA) chipsets — Linux support status

繰り返しになるが、FakeRAIDはOSレベルでソフトウェアRAIDをサポートしていないWindowsであれば有用であるが、Linuxでは普通にソフトウェアRAIDを利用可能であるので、FakeRAIDを利用する意味はない。というか、Windowsでも実際にRAIDを利用するまではIntelラピッドストレージテクノロジーなどを有効にする意味はないのだが、OSのインストール後にこの設定を変更しようとなると大変なので最初からほとんど使われないであろう機能を一応有効にしておいてある…というだけだろう。

というわけで、WindowsでソフトウェアRAIDを使用しないならば「RAID」から「AHCI」に変更して使うことで全く問題はない。「IDE」vs「AHCI」のときに見られたようなパフォーマンス上の優位点もない、と理解している。なぜならば「AHCI」と「RAID」の違いはブート時の挙動だけであるからだ。

というか、そもそもUEFIの設定項目名が分かりにくいような気がする。ハードウェア屋さん目線では当初この機能が提供されていたのはSATAコントローラだったのだからSATAの動作モード、という名前にしたかったのだろうが、Intel RSTを有効にするか否か、という名前にすべきだっただろうと思う。現在ではNVMe SSDが搭載されることが普通になったので、もはやSATAですらない。SATAを利用していないのにこの設定がストレージへのアクセスに大きく関わってくる重要なパラメータであるというのはちょっと変な気がする。