QA@IT

windows8とcentos7のデュアルブート

9203 PV

環境:Windows8.1 + centos7 + grub2 (bootモード:UEFI) windowsのリカバリーディスクを作り忘れました。
windows8が入っていたパソコンにcentosを入れました。centosを入れることには成功したのですが、windowsが起動しなくなってしまいました
(起動時のos選択画面にwindowsが出ない)。
色々調べて、grub.cfg/boot/efi/EFI/centos/grub.cfgにあることがわかり、
また、ブートの設定を変えるには/boot/efi/EFI/centos/custom.cfgを作って、

sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

をすれば設定を変えられることがわかり、実際、ブート時のリストにwindowsを出すことには成功しました。
ですが、menuentryの設定をどう変えても、windowsを起動させることはできませんでした。
windows8は/dev/sda4にあり、また、bootmgfw.efiはsda4の/Windows/Boot/EFI/bootmgfw.efiにあることがわかっています。
(findしてみると、他にも

/Windows/Panther/Rollback/EFI/Microsoft/Boot/bootmgfw.efi
/Windows 8/Windows/WinSxS/amd64_microsoft-windows-b..ore-bootmanager-efi_31bf3856ad364e35_6.3.9600.17109_none_789aaf207011a00a/bootmgfw.efi
/Windows 8/Windows/WinSxS/amd64_microsoft-windows-b..ore-bootmanager-efi_31bf3856ad364e35_6.3.9600.17211_none_7887deca7020ee6a/bootmgfw.efi

にあるみたいです)。

以下はblkidの結果です

/dev/sda1: LABEL="Windows RE" UUID="0AC81C2BC81C1791" TYPE="ntfs" PARTLABEL="Basic data partition" PARTUUID="204ac9b8-a6a7-4f98-a11f-7f1a5efcc95a" 
/dev/sda2: SEC_TYPE="msdos" UUID="1496-7977" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="beb6f606-9d26-4ff2-ac26-7da6cd769762" 
/dev/sda4: LABEL="Windows 8" UUID="947E20B67E209352" TYPE="ntfs" PARTLABEL="Basic data partition" PARTUUID="1155a247-c861-4418-9e91-32cec6ac60b2" 
/dev/sda5: UUID="DECC1DA7CC1D7B4B" TYPE="ntfs" PARTUUID="99e7a2cd-b067-4d3f-9a19-54db5bc96dde" 
/dev/sda7: LABEL="NEC-RESTORE" UUID="1A2E27C92E279CAF" TYPE="ntfs" PARTLABEL="Basic data partition" PARTUUID="3922c64f-f3c5-4777-a281-4e1057a16f0d" 
/dev/sda8: UUID="4121f0a6-7fb3-4f8c-abde-deb75664d9d7" TYPE="xfs" PARTUUID="b84081e3-da60-4c94-aecb-7686f401edba" 
/dev/sda9: UUID="viPlOK-VfpM-URnb-CVX3-XO8B-8Sic-dnJvuJ" TYPE="LVM2_member" PARTUUID="d10ae47c-3c89-4e7b-83ce-f88d147df35b" 
/dev/mapper/cl-root: UUID="577b0b24-a595-4c12-af7c-e81b5c3b44d8" TYPE="xfs" 
/dev/mapper/cl-swap: UUID="b6673bfe-7a6d-44da-9058-5dac837aa513" TYPE="swap" 
/dev/mapper/cl-home: UUID="5243120b-4a7b-4210-bcc3-14ea4b05eb04" TYPE="xfs" 

custom.cfgの内容は以下のようなものです(他にも色々試したのですが、メモを取っていなかったので、覚えていません)。

installed for UEFI booting
menuentry "windows8-1"{
    set root=(hd0,4)
    chainloader /efi/Microsoft/Boot/bootmgfw.efi
}
menuentry "windows8-2"{
    set root=(hd0,4)
    chainloader /Windows/Boot/EFI/bootmgfw.efi
}
menuentry "windows8-3"{
    set root=(hd0,4)
    chainloader +1
}
menuentry "Windows8−4"{
    search --set=root --file /Windows/Boot/EFI/bootmgfw.efi
    chainloader /Windows/Boot/EFI/bootmgfw.efi
}

上を試した時のエラーメッセージは以下

  1. error: unknown file system
  2. error: unknown file system
  3. invalid EFI file path
  4. no such device: /Windows/Boot/EFI/bootmgfw.efi unknown file system

どうすればwindowsが起動するようになるでしょうか?


追記
/dev/sda2にてbootmgfw.efiを探してみたところ、/EFI/Microsoft/EFI/bootmgfw.efiにあるという事がわかったので、以下をcustom.cfgに書いて、grub2-mkconfigしました。

menuentry "windows"{
    search --fs-uuid --no-floppy --set=root 1496-7977
    chainloader (${root})/EFI/Microsoft/EFI/bootmgfw.efi
}

ブート画面でこれを選択すると、以下のエラーが出ました

/EndEntire
file path:ACPI(a0341d0,0)/PCI(2,1f)/Sata(0,0,0)/HD(2,1dd0D0,64000,06f6be269df24f,2,2)/File(\efi\Microsoft\EFI)/File(bootmgfw.efi)/EndEntire
error: cannot load image

追記2
上の状態からsecure bootを無効にして、上のwindowsを選択すると以下のエラーメッセージが出ました。

Windows failed to start. A recent hardware or software change might be the cause. To fix the problem:
1. Insert your Windows installation disc and restart your computer.
2. Choose your language settings, and restart your computer.
3. Click "Repair your computer."
If you do not have this disc, contact your system administrator or computer manufacture for assistance
File: \EFI\Microsoft\Boot\BCD
status: 0xc000000f
Info: The Boot Configuration Data for your PC is missing or contains errors.
  • 回答に追記しました。 -
  • コメントを受けてさらに追記しました。 -

回答

お約束として書いておきますが、何も保証できませんので自己責任でお願いします。

UEFIだと高速スタートアップやメーカー製PCではセキュアブートなどの影響でブートセクタを書き換えると起動できなくなる場合がありますね。
回復ディスクも無いようですからそのまま起動させる方法はちょっとわかりません。
(手はあるかもしれませんが、掲示板越しなもあって私には思いつきません。)

ただパーティションとしてNECのリカバリ領域は残っているみたいですので、
以下の手順でPCを初期化できるか試してみてはどうでしょうか。
BIOS画面からリカバリアプリ起動するみたいなので同じであれば初期化可能かもしれません。
(初期化すると内容は削除されます)

http://121ware.com/qasearch/1007/app/servlet/qadoc?QID=014446

Windowsの起動が目的ではなくて、中身のデータを取り出したいのであれば、
NTFSがマウントできるようにして、Linux上でファイルを取り出してみてはどうでしょうか。
暗号化されていなければ取り出せるかもしれません。

マウントにあたっては現在のCentOSにNTFSマウント用のパッケージ導入でもいいですし、別途雑誌についてるKnoppixなどの LiveCDを試してみてもいいと思います。Ubuntuも今は標準でntfsマウントできるんですっけ?そのあたりは調べれば出てくると思います。


追記ここから

繰り返しになりますが、私が調べてみて書いているだけなので何が起きても保証はできません。(実施もしてません)
以下の実施の際は自己責任でお願いします。

あと、Windowsを起動できた場合には高速スタートアップはオフにしてないとシャットダウン後にUbuntuも起動できなくなるかもしれません。
起動した場合には念のため大事なファイルはUSBメモリやクラウドなど外部にバックアップした方がいいかと思います。

以下で起動しなかった場合は私にはわかりません。

  • grub以外の方から。

BIOSメニュー(起動時F2?)のEXIT ページにある boot managerから起動できないかどうかですね。(Windows boot managerではない方。私のLavieだとなにも起きませんでしたがWindowsしか入っていなかったからかもしれません。)

  • grubの方ですが

まず

findしてみると、他にも

/Windows/Panther/Rollback/EFI/Microsoft/Boot/bootmgfw.efi
/Windows 8/Windows/WinSxS/amd64_microsoft-windows-b..ore-bootmanager-efi_31bf3856ad364e35_6.3.9600.17109_none_789aaf207011a00a/bootmgfw.efi
/Windows 8/Windows/WinSxS/amd64_microsoft-windows-b..ore-bootmanager-efi_31bf3856ad364e35_6.3.9600.17211_none_7887deca7020ee6a/bootmgfw.efi

これはNTFSファイルシステム内のファイル群ですよね(つまりC:\Windows\Panther ~)。
findの範囲はわかりませんが、マウントしたntfsから探すのは違うんじゃないかと思います。

grubのcustom.confに記載するようなブートローダのパスは
/efi/Microsoft/Boot/bootmgfw.ef

というような「Microsoft」という単語が含まれる記述をよく見かけ、Windowsを含む指定はさっき調べた範囲では見かけませんでした。
( こことかこことかこことか )

これは
find /boot/efi -name "*efi"
で見つけられるみたいです。 参考
ファイル名が bootmgfw.ef であるパスを見つけてください。(64だとfw付き?32bitだとbootmgr.efかも?)

その後そのパーティションのuuidを取得します
上で見つけたファイルを指定してください。 参考

$ sudo grub-probe --target=fs_uuid /boot/~見つけたパス~/bootmgfw.efi

※ おそらく、質問者さんの環境では /boot/efi/efi/Microsoft/Boot/bootmgfw.efi1496-7977 になるのかなと思っています。

custom.conf の中身は以下の様にしてみてください。例1例2

menuentry "Windows x86_64 UEFI-GPT" {
    search --fs-uuid --no-floppy --set=root XXXX-XXXX
    chainloader (${root})/efi/Microsoft/Boot/bootmgfw.efi
}

set=root の所は求めたUUIDを設定し、例えば --set=root 1496-7977 としてください。

または以下の様にする例もありました

#This entry should work for any version of Windows installed for UEFI booting
menuentry "Windows (UEFI)" {
search --set=root --file /EFI/Microsoft/Boot/bootmgfw.efi
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

設定を更新してメニュー起動を確認してみてください。


追記2

こちらのサイトの中ほどに

注)
インストール時のカスタムパーティションの設定で、Windows8による既存のEFIパーティション(/dev/sda1)を/boot/efiにマウントするように設定しました。

とありますね。
こちらのサイトでは sda1 となっていますがおそらくあなたの環境では /dev/sda2 です
(そして私がこう出ると思うと言っていた 1496-7977はこのパーティションのUUIDです)。

どこか別の場所に /dev/sda2 をマウントしてみてその中にファイルが無いか確認してみてください。

grub-probe はOSが違うのでコマンドが違うのかもしれませんね。
求めたいUUIDはefiファイルのUUID(set=root対象のUUID)であれば良いと思うので、sda2に目的のファイルがみつかればsda2のUUIDを指定すればいいんじゃないかと思います(質問の中に書いてありますよね)。

編集 履歴 (4)
  • 回答ありがとうございます。BIOSからリカバリする方法なのですが、頂いたURLの3の4番めまでは行くのですが、"Execute Windows 8 Recovery?"でYesを選んでもそこから進みませんでした。
    ntfsでwindowsのデータを取り出すことは既に出来ています。ただ、例えばC#での開発とかするときにwindowsが立ち上がると便利なので、起動したいという感じです。
    -
  • 追記ありがとうございます。ですが、bootメニューのexitのところにboot managerはなく、find /boot/efi -name "*efi"でbootmgfw.efiを見つけることはできず、そもそもMicrosoftディレクトリもありませんでした。また、grub-probeはコマンドが見つかりませんでした。 -
  • 追記ありがとうございます。コメントに書ききれなかったので、質問に追記しました。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。