BIOS/UEFIが機能しなくなる問題、修復方法が見つかる
先日一部のPCで「Ubuntu 17.10」をインストールすると、BIOS/UEFIが機能しなくなる問題を紹介しました。- BIOS/UEFIが機能しなくなる問題、Insyde Software製のBIOS/UEFI採用モデルで要注意
- 一部のPCでUbuntu 17.10をインストールすると、BIOS/UEFIが機能しなくなる問題
- Ubuntu 17.10 corrupting BIOS - many LENOVO laptops models
影響を受けたPC(問題が起きているPC)で、BIOS/UEFIを修復する方法が見つかりました。
ポイントは「Linux Kernel 4.14.9」をインストールし、PCを再起動することです。
これでロックされたBIOS/UEFIが再び機能するようになり、ロックが解除され設定の変更やライブUSBメモリーから「Ubuntu」の起動等が可能になります。
修復方法
修復方法です。1.Ubuntuの起動
HDD/SSDなど「Ubuntu」をインストールしたストレージから「Ubuntu」を起動します。2.ukuuのインストール
「端末」から以下のコマンドを1行ずつ実行し、「Mainline Kernel」のインストールを支援する「ukuu」をインストールします。
sudo apt-add-repository -y ppa:teejee2008/ppa
sudo apt-get update
sudo apt-get install ukuu
sudo apt-get update
sudo apt-get install ukuu
3.Linux Kernel 4.14.9のインストール
「ukuu」を起動し、「kernel 4.14.9」を選択して「Install」ボタンをクリックします。これで「Linux Kernel 4.14.9」がインストールされます。
「Status」が「Installed」になっていることを確認してください。
インストールが完了したらPCを再起動します。
4.Linux Kernel 4.14.9でUbuntuを起動
「GRUB」のブートメニューを表示し、「Advanced options for ubuntu」を選択して「エンター」キーを押します。以下のように「Linux Kernel」を選択する画面が表示されるので、「Linux 4.14.9-****-generic」を選択し、「エンター」キーを押します。
5.PCの再起動
「Ubuntu」が起動したらPCを再起動し、「BIOS/UEFI」の画面を表示します。「BIOS/UEFI」の画面の表示方法は、PCの説明書を参照してください。
「BIOS/UEFI」の画面を表示したら、設定を変更し設定が保存されるか確認します。
またライブUSBメモリーから「Ubuntu 16.04」が起動できるか確認します。
なぜLinux Kernel 4.14でこの問題が解消されるのか
「Comment - #330」によると、以下の「Linux Kernel」の不具合の修正が、この問題の解消に繋がっているのではないかとのことです。現在の理論において「drivers/mtd/spi-nor/spi-nor.c」で「SPI_NOR_HAS_LOCK」を設定するシリアルフラッシュでは、Linux SPI-NORコアはチップの「JEDEC ID」の読み込みに加え、ステータスレジスター(SR)をクリアする必要がある。
これは保護ビット(BP0/BP1/BP2)がクリアされていることを確認するために行われる。
この時処理の流れは、以下のようになる。
- WREN (write enable)
- WRSR with 0 (write status register)
しかし「intel-spi」ドライバーにoff-by-oneバグ(1つずれるの意)があり、この不具合により1バイト書き込むところを2バイト書き込んでいる。
つまり上記の処理の流れが、実際には以下のようになっている。
- WREN (write enable)
- WRSR with 0, X (write status register)
「2.」の「X」の値は、FDATA[1] FIFOにある値である。
多くの状況でこの値は、読み込んだ「JEDEC ID」の値の一部である。
さて、ステータスレジスターとコントロールレジスターの値を読み込むコマンドは、それぞれ異なるコマンドであるにも関わらず、「WRSR」はステータスレジスターとコントロールレジスター(CR)の双方に値を書き込めるという点で奇妙に思う。
もし「X」の値がビット6がセットされた値だった場合、結果的にドライバーはコントロールレジスターに0x40を書き込むことになる。
つまり上記の「2.」の処理では、以下の値を書き込む。
SR=0x00 CR=0x40
ステータスレジスターの保護ビット(BP0/BP1/BP2)が「0」にセットされ、コントロールレジスターの「CMP」が「1」にセットされるため、チップ全体が読み込み専用になる。
(CMPはBP0/BP1/BPを補完する役割を持つ)
そのためBIOS/UEFIから設定の保存や変更ができなくなる。
このoff-by-oneバグは2017年9月にすでに修正された不具合である。
Ubuntu 17.10の配布停止
この不具合のため、現在「Ubuntu 17.10」(Ubuntu 17.10 日本語 Remix含む)は配布停止になっています。不具合修正後、再度「Ubuntu 17.10」が提供される予定です。
この問題は致命的な問題であり、この問題に影響を受け修理に約€100(約1.4万円)かかったと報告しているユーザーもいます。
「Ubuntu」の評判に大きく影響する問題であるため、配布停止もやむなしでしょう。
他のLinuxディストリビューションも注意
この問題は「Ubuntu」に限定された問題ではなく、「Antergos」で発生したとの報告もあります。そのため他のLinuxディストリビューションでも注意が必要です。