第二個硬碟驅動器上的雙啟動視窗,UEFI/GPT 系統
我想安裝 linux,但我不想冒險損壞我目前的 Windows 安裝,因為我聽說過很多恐怖故事。幸運的是,我有一個額外的硬碟。我可以在上面安裝 linux 然後雙啟動視窗而無需修改 Windows 驅動器嗎?
另外,我有一個 UEFI“BIOS”,Windows 驅動器是 GPT 格式。
當提到新的 UEFI 系統和傳統 BIOS 系統的相同概念時,我將在下面使用術語BIOS,因為雖然這是一個面向 UEFI 的問題,但使案例如 GRUB 文件來談論“BIOS”更好,並且“BIOS/UEFI”太笨重了。GRUB(實際上是 GRUB 2 ——這經常被含糊地使用)是 linux 安裝的引導載入程序,用於雙引導 Windows。
首先,關於驅動順序和引導順序。 驅動順序是指驅動器物理連接到主機板上匯流排的順序(第一驅動、第二驅動等);此資訊由 BIOS 報告。 引導順序是指 BIOS 檢查可引導驅動器的順序。這不一定與驅動器順序相同,通常可通過 BIOS 設置螢幕進行配置。驅動器順序不應該是可配置的或受引導順序影響,因為這對作業系統來說是非常不友好的事情(但理論上鈍的 BIOS 可以)。此外,如果您拔下第一個驅動器,則第二個驅動器可能會成為第一個驅動器。我們將在配置引導載入程序時使用 UUID 來嘗試避免此類問題(當代 linux 安裝程序也這樣做)。
獲得所需內容的理想方法是按照驅動器順序將 linux 安裝到第二個驅動器上,然後使用 UEFI 設置按照*引導順序首先選擇它。*這樣做的另一個好處是,您可以使用 BIOS/UEFI 引導順序來選擇 Windows 驅動器並根據需要繞過 grub。我在第二個驅動器上推薦 linux 的原因是因為 GRUB 必須“鍊式載入”Windows 本機引導載入程序,而 Windows 引導載入程序總是假定它在第一個驅動器上。但是,如果您更喜歡或需要它,有一種方法可以欺騙它。
希望您可以繼續使用 Live CD 或其他任何東西,然後使用 GUI 安裝程序完成此操作。但是,並非所有安裝程序都是平等的,如果這搞砸了,您會遇到以下問題:
- 我將 linux 安裝到第一個磁碟上,現在我無法啟動 Windows,或者
- 我將 linux 安裝到第二個磁碟上,但使用第一個磁碟作為引導載入程序,現在我無法啟動任何東西!
然後繼續閱讀。在第二種情況下,您應該首先嘗試將 linux 重新安裝到第二個磁碟上,這次確保引導載入程序所在的位置。最簡單和最簡單的方法是暫時從機器上移除 Windows 驅動器,因為我們將假設它沒有安裝任何額外的東西,無論驅動器順序如何。
一旦你安裝了 linux 並確保它可以啟動,重新插入 Windows 驅動器(如果你刪除了它 - 請記住,理想情況下,我們希望它首先在驅動器順序方面,第二個驅動器在啟動方面首先訂單)並繼續下一步。
訪問 GRUB 配置
啟動linux,打開終端,然後
> su root
系統將要求您輸入 root 的密碼。從現在開始,您是該終端的超級使用者(檢查,嘗試
whoami
),所以不要做任何愚蠢的事情。但是,您仍然是 GUI 中的普通使用者,並且由於我們將編輯文本文件,如果您更喜歡 GUI 編輯器,我們將不得不臨時更改該文件的所有權和它所在的目錄:> chown -R yourusername /etc/grub.d/
如果您收到“不允許操作”,則說明您沒有
su
正確操作。如果你得到chown: invalid user: ‘yourusername’
了 ,你就太從字面上理解了最後一個命令。您現在可以在文件瀏覽器
/etc/grub.d
中導航並查找名為40_custom
. 它應該如下所示:#!/bin/sh exec tail -n +3 $0 # This file provides an easy way to add custom menu entries. Simply type the # menu entries you want to add after this comment. Be careful not to change # the 'exec tail' line above.
如果找不到,請在根終端輸入以下命令:
> touch /etc/grub.d/40_custom > chmod 755 /etc/grub.d/40_custom > chown yourusername /etc/grub.d/40_custom
在文本編輯器中打開它,複製粘貼上面的部分(以 w/ 開頭
#!/bin/sh
)並繼續下一步。添加 Windows 啟動選項
使用文本編輯器將其複制粘貼到文件末尾:
menuentry "MS Windows" { insmod part_gpt insmod search_fs_uuid insmod ntfs insmod chain }
這是 GRUB 完成任務所需的模組列表(
ntfs
可能是多餘的,但也不應該傷害任何東西)。 請注意,這是一個不完整的條目——我們需要添加一些關鍵命令。查找 Windows 第二階段引導載入程序
您的 linux 安裝可能已經自動掛載了您的 Windows 分區,您應該能夠在文件瀏覽器中找到它。如果沒有,請想辦法做到這一點(如果您不確定如何,請在本網站上提問)。完成後,我們需要知道掛載點——這在文件瀏覽器中應該很明顯,例如
/media/ASDF23SF23/
. 為了節省一些輸入,我們將把它放入一個 shell 變數中:win="/whatever/the/path/is"
等號兩邊不應該有空格。 不要在此處包含 Windows 路徑的任何元素。這應該指向 Windows 分區上的頂級文件夾。現在:
cd $win find . -name bootmgfw.efi
如果您有一個大分區,這可能需要幾分鐘,但它最有可能吐出的第一件事就是我們正在尋找的東西;在包含長 gobbledygook 字元串的文件系統中可能還有更多引用 - 不是這樣。
Ctrl-c
一旦你看到一些簡短而簡單的東西,比如./Windows/Boot/EFI/bootmgfw.efi
or ,使用它來停止查找./EFI/HP/boot/bootmgfw.efi
。除了
.
一開始,記住這條路徑以備後用;您可以將其複製到文本編輯器底部的空白行中,因為我們將在那裡使用它。如果您現在想返回之前的目錄,請使用cd -
,儘管從這裡開始您在 shell 中的位置並不重要。設置正確的參數
GRUB 需要能夠找到引導過程並將其移交給第二階段的 Windows 引導載入程序。我們已經有了 Windows 分區上的路徑,但是我們還需要一些參數來告訴 GRUB 那個分區在哪裡。您的系統上應該安裝了一個名為
grub-probe
or (on, eg, Fedora)的工具grub2-probe
。打字grub
再敲Tab
兩三下;您應該看到一個列表,其中包括一個或另一個。> grub-probe --target=hints_string $win
您應該看到一個字元串,例如:
--hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1
返回到帶有 GRUB 配置的文本編輯器,並在所有
insmod
命令之後(但在右花括號之前)添加一行,如下所示:insmod chain search --fs-uuid --set=root [the complete "hint bios" string] }
不要打破那條線或讓你的文本編輯器這樣做。它可能會在顯示中環繞——一個簡單的區分方法是設置行號。下一個:
> grub-probe --target=fs_uuid $win
這應該返回一個較短的字母、數字和可能的破折號字元串,例如“123A456B789X6X”或“b942fb5c-2573-4222-acc8-bbb883f19043”。將其添加到
search --fs-uuid
提示 bios 字元串之後的行尾,用空格分隔。接下來,如果*(且僅當) Windows 在驅動***器順序**方面位於第二個驅動器上,則在該行之後添加
search --fs-uuid
一行:drivemap -s hd0 hd1
這就是前面提到的“訣竅”。請注意,它不能保證有效,但嘗試也無妨。
最後,最後一行應該是:
chainloader (${root})[the Windows path to the bootloader] }
為了清楚起見,例如:
chainloader (${root})/Windows/Boot/EFI/bootmgfw.efi
就是這樣。保存文件並在文件瀏覽器中檢查以確保它確實已保存並且看起來應有的樣子。
將新菜單選項添加到 GRUB
這是通過一個名為
grub-mkconfig
or的工具完成的grub2-mkconfig
;它會在您Tab
之前找到的列表中。您可能還有一個名為update-grub
. 要檢查它,只需在根終端中鍵入它。如果出現“找不到命令”,則需要grub-mkconfig
直接使用。如果沒有(包括出現更長的錯誤),您剛剛設置了配置並且可以略略略讀一下。要
grub-mkconfig
直接使用,我們首先需要找到grub.cfg
:> find /boot -name grub.cfg
這可能是
/boot/grub/grub.cfg
或/boot/grub2/grub.cfg
。> grub-mkconfig -o /boot/grub/grub.cfg
update-grub
將自動掃描配置以查找錯誤。grub-mkconfig
不會,但這樣做很重要,因為現在處理它們比嘗試引導機器時容易得多。為此,請使用grub-script-check
(或grub2-script-check
):> grub-script-check /boot/grub/grub.cfg
如果這個(或
update-grub
)產生一個錯誤,指出一個行號,那就是 grub.cfg 中的行號,但是您需要修復/etc/grub.d/40_custom
(文本編輯器中的文件)中的相應部分。不過,您可能需要成為 root 才能查看前一個文件,因此請嘗試less /boot/grub/grub.cfg
在終端中,點擊:
,然後輸入行號。您應該看到您的菜單條目。找到錯字,在文本編輯器中更正它,然後執行update-grub
或grub-mkconfig
再次執行。完成後,您可以關閉文本編輯器並
exit
在終端中輸入以退出超級使用者模式。重啟!
當您進入 grub 菜單時,快速向下滾動(在超時到期之前,通常為 5 秒)到“Windows”選項並對其進行測試。如果您從 grub 收到文本消息錯誤,則說明配置有問題。如果您從 Windows收到錯誤消息,則該問題在您和 Microsoft 之間。不過不用擔心,您的 Windows 驅動器尚未修改,您可以通過 BIOS 設置將其放在首位(按照啟動順序)直接啟動。
當您再次返回 linux 時,將
/etc/grub.d
目錄的所有權及其內容恢復為原始狀態:sudo chmod 755 /etc/grub.d/40_custom
參考
Arch 有一些最好的文件,其中大部分(包括該頁面)主要適用於任何 GNU/Linux 發行版。