web-dev-qa-db-ja.com

デュアルUbuntuブートハードウェアでブート修復なしでUbuntu BIOSインストールをEFI / UEFIに変換する方法

以前の構成:

  • / dev/sda上のUbuntu 12.04 [WD 2T HDD]
  • / dev/sdb上のUbuntu 14.04 [Hitachi 2T HDD]

BIOSモードの10年前のPC(2006年にはEFIにPCはありません!)、基本的なnVidiaグラフィックカード。 BIOSは、Grub2がインストールされている/ dev/sdbで起動するように設定され、/ dev/sdaにある14.04 + 12.04を指します。

新しい構成:

EFIモードに設定された最近のPC。コアi7 6700内の統合Intel GPUを使用するグラフィックカードなし。

/ dev/sda上のUbuntu 16.04(新規インストール)[Samsung 500G SDD]

Ubuntu 16.04はこの構成で正常に動作します。 EFIはSSDでの起動を指示します。

問題:

今、バックアップとして古いバージョンのUbuntuを持ちたいので、便利なTweakを再適用するのを忘れた場合、古いPCからHitachiドライブを引き出して新しいPCにインストールしました。

だから今私は持っています:

  • / dev/sda上のUbuntu 16.04 [Samsung 500G SDD]
  • / dev/sdb上のUbuntu 14.04 [Hitachi 2T HDD]

16.04でgrub-updateを実行して、14.04でグラブメニューを取得しました。マシンは、16.04でもgrubメニューが表示された状態で正常に起動します。

しかし、問題は、14.04でgrubメニューから選択すると、正しく起動しないことです。

何が起こるのですか:

Ubuntuが実行中のハードウェアをまったく見つけなかった場合、すべてが「デフォルト」であるように見えます。

14.04でnVidiaドライバーを削除してセッションに参加しましたが、次のようになります。

  • デフォルトの1024x768ビデオ(1920 LCDでは見苦しい!)
  • イーサネットなし
  • 無音

ディスク、キーボード、およびマウスは正常に機能します。

この14.04のインストールは最初はBIOSだったので、「普通の」ように見えますが、EFIはハードウェアをカーネルとは異なる方法で表示しているようです。

どのような修理が必要ですか:

最も近い質問はこれでした: 単一のブートハードウェアでブート修復なしでUbuntu BIOSインストールをEFI/UEFIに変換するコマンド?

しかし、この投稿では、(16.04に)動作しているマシンがなく、すでに動作しているEFIブートがインストールされていませんでした。

私は自動化されたブート修復を使用するのではなく、私もやっていることを理解することを好むでしょう(私の場合は巧妙なことをするでしょう).

上記の質問に対する答えは、修復するバージョンにgrub-efiをインストールすることを提案しました。私の場合、実際には機能しません:

  1. HDD(/ dev/sdb)にEFIパーティションを作成したくないのは、起動元のSSD(/ dev/sda)に既に動作しているパーティションがあるためです。
  2. 14.04でgrub-efi-updateを実行して、/ dev/sdaにgrubをインストールするように要求すると、おそらくefiパーティションの16.04が古い14.04のもので上書きされます。それは望ましくありません!

実際、14.04が上書きした後、/ dev/sdaの先頭を復元して復元することもできますが、そのような操作は「危険」であり、すべてを破壊するリスクがあります。

私がすでに試したこと

成功しました

  • 14.04で「最小」セッションを取得するために、nVidiaドライバを削除しました。 nVidiaドライバーを使用すると、lightdmに至るまで進みましたが、Unityセッションを開始できませんでした。

失敗した

  • modprobe e1000e(16.04で使用されるイーサネットIntelドライバ)とptpおよびpps_coreを試してみました。モジュールは正しくロードされましたが、イーサネットインターフェースを提供しませんでした
  • 16.04でマウントしたのと同じように、/ etc/fstabにefiパーティションをマウントします。変わりはない。
  • grubメニューをライブ編集(emacsスタイル)してinsmod efivarsを追加しようとしました:動作せず、14.04ブートモジュールリストにefivars.modがありません(16.04にもありません)

まだやっていなかったこと

将来使用するために予約したスペアパーティションに14.04をEFIモードでインストールします。可能な場合はgrub-efiをインストールせず(上記参照)、不可能な場合は破棄する必要のないUSBキーに入れます。次に、インストールされているバージョンとHDD上のバージョンとの違いを理解しようとします。

質問:

次に避けるべきステップは何ですか:14.04を完全に再インストールするか、16.04 efi grubを上書きしますか?

[編集]明確化:

BIOS/EFIの問題でドライバーを混乱させない場合にカーネルがドライバーを自動的に推測するようにします。

ここに、私が解決できない問題についての私の理解があります(明確なドキュメントがないため)。

ブートプロセス:(私が理解している限り)

  • 電源ボタン
  • EFI(またはBIOS)が起動し、ハードウェアをスキャンします
  • 「初期ローダー」(MBR、EFIローダーなど)用にパラメーター化されているストレージデバイスから読み取りを開始します。
  • EFIを使用すると、EFIパーティションを通過し、そこで実行可能ファイルの一部(たとえば、M $ -Secure-Lockdown機能を回避するshimx64.efi)を実行します。これは、ext2/3/4などのLinuxパーティションを最小限にマウントできます。そこにあるgrub.cfgを読んで、「実際の」grubローダーの場所を見つけます。
  • その「本物の」grubローダーを起動します(私の場合は/ dev/sda3にあります)。
  • この「実際の」grub-loader(16.04から)は、現在のバージョン(16.04)の行、リカバリー、および追加した古い14.04の行を含むメニューを読み取ります。
  • 14.04を選択すると、対応するinitrdイメージを使用して/ dev/sdb1で正しいvmlinuzが開始されます。
  • そこからカーネルがロードされ、マシン(モジュール)の正しいドライバーを取得しようとします。これは、/ etc/modules(「手動」方式)から、またはBIOS/EFIによって報告された構成(「自動」方式)を調べることで実行できます。
  • システムがEFIとして設定されている場合、カーネルが構成を確認する方法はefivarsであり、そのためのドキュメントがいくつかあります。 https://firmware.intel.com/blog/accessing -uefi-variables-linux 。基本的に、/ sys/firmware/efiには疑似ファイルシステムがあり、カーネルが構成を照会し、それに応じて動作できるようにします。

したがって、私の推測では、明らかにBIOSがインストールされたシステムはそうではないということです。カーネルがBIOSを照会し、システムをEFIとして起動する方法、カーネルは「ハードウェアなし」を検出するため、デフォルトマシンのみを初期化します。

だから、私が見つけようとしているのは、14.04の古いインストールを伝える方法です: "今、あなたはEFIを介してブートされました。efivarsを使用してハードウェアの詳細を取得してください"

...そして、ブートプロセスの(簡略化された)説明の仮定がひどく間違っていた場合は、遠慮なく修正してください。

2
Zakhar

私はあきらめます古いインストールをBIOSからEFIに変換するアイデア。

代わりに、@ oldfredの提案を使用して、必要なときにMotherBoardをデュアルブートします。

これには実際に利点があります:

  • 日常のシステム(16.04)で起動するのにGrub-Menuを待機させる必要はありません(3秒でも)。したがって、起動時間を節約できます。
  • 古いシステム(14.04)を起動したい場合、起動時にF8キーを押すのは矢印キーより難しくありません!
  • マザーボードはEFIとBIOSの両方を起動できるため、/ dev/sdbにBIOSインストールを保持できます。したがって、14.04を起動すると、BIOSモードになります。

とにかく、BIOSモードでもドライバーは読み込まれませんが、これは別の問題なので、これらのドライバーを試して修正するために別の質問をします。

したがって、Linux Boxの詳細なブートプロセスについて良いドキュメントを見つけた場合、この質問は閉じられます。それを読んでうれしいです!

1
Zakhar

要約すると、BIOSブート14.04ディスクをUEFI 16.04システムに移動し、update-grubを再実行し、14.04システムをブートできるようになりましたが、ビデオ/ドライバーの問題があります。解決策は、すべての(古いシステムの)専用ドライバーをアンインストールしてデフォルトのシステムに戻し、新しいドライバーをインストールすることです。

「ソフトウェアアップデーター」の「設定」ボタンをクリックし、「Ubuntuソフトウェア」タブの下で、「独自のドライバー...」ボタンをクリックし、「追加のドライバー」タブの下で、提供されている独自のドライバーを確認し、クリックします必要なもので(そしておそらく再起動)。自動的には何も起こりません。

また、バックポートを14.04システムにインストールして、6700の最新のカーネルを取得することもできます。それだけです。 「変換」は必要ありません。それで、移動した14.04更新がそのシステムの(未使用の)grub.cfgを変更した場合、16.04システムでupdate-grubを再実行するだけです。/boot/efiへの参照がない場合はどうでしょう(ただし、/ etc/fstabファイルの行で簡単に追加できます)。ブートの問題はまったくありません。

1
ubfan1