VirtualBoxで実パーティションにあるwindows7にアクセスする

# 背景
業務で主にlinuxを使っているのですが、業務の都合上どうしてもwindowsに入れてあるソフトを使わないとならない行けない場面があります。残念ながら自分に与えられたリソースは６年前に買ってもらったPC一台のみで、必要になった時にいちいち再起動してOSを選びなおしていました。もういい加減煩雑になってきたのと、いちいちlinux上の走っているプロセスを止めるわけにも行かなくなってきたので、Linux上から必要なプログラムだけ立ちあげられないかと思い、試してみました。

# 環境

- host os:ubuntu 16.04LTS
- guest os: windows 7 professional
- cpu:intel core i7 4770K

fdisk -lの結果

```bash:fdisk-l
デバイス   起動    Start 最後から セクタ   Size Id タイプ
/dev/sda1  *        2048   1005567   1003520   490M  7 HPFS/NTFS/exFAT
/dev/sda2        1005568  21977087  20971520    10G 27 Hidden NTFS WinRE
/dev/sda3       21977088 250066943 228089856 108.8G  7 HPFS/NTFS/exFAT

(中略）
デバイス   起動      Start 最後から  セクタ   Size Id タイプ
/dev/sdb1             4094 3570374655 3570370562   1.7T  f W95 拡張領域 (LBA)
/dev/sdb2       3570374656 3907028991  336654336 160.5G 83 Linux
/dev/sdb5             4096 3503408881 3503404786   1.6T  7 HPFS/NTFS/exFAT
/dev/sdb6       3503409152 3570374655   66965504    32G 82 Linux スワップ / Sola

(中略）
デバイス   起動 Start 最後から セクタ  Size Id タイプ
/dev/sdc1        8192 15523839 15515648  7.4G  b W95 FAT32
```

# 結果
できた。（途中でかなり紆余曲折あったけど）

# 試行錯誤の流れ
## 単純にvirtualBoxを試す
まず試してみた。
参考にしたのは全部メモってないけど主だったのは以下
https://qiita.com/akegashi/items/73f97e176624553045bf
http://tsuredsurehako.blogspot.com/2016/05/virtualboxubuntuwindows.html

↓ここからVirtualBoxをダウンロード・インストールして、
https://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp
次に仮想ディスクを作る

```bash
VBoxManage internalcommands createrawvmdk -filename win1.vmdk -rawdisk /dev/sda
```

そしてVirtualBoxで仮想イメージを作る。名前やらメモリやら聞かれるので適当に設定した後、ハードディスクをどうするのか聞かれるので、ひとまず"仮想ハードディスクを作成しない"でイメージの作成を一旦終える。
その後、作ったイメージを選択して"設定"＞"システム"でチップセットをPIIX3、同じく"プロセッサー"タブで"PAE/NXを有効化"にチェック、"アクセラレーター"タブで順仮想化インターフェースを"KVM"を選択する。ついでにポインティングデバイスはps2にしておく。
次に"ストレージ"ペーンでに先ほど作ったvmdkをぶら下げる。
これで設定を抜けて、起動すればうまく動くはず、、、
が、ダメ。
grub rescueが出て止まる。
lsで出てきたデバイスを片っ端から叩いてみるも全てFile system unknownになって取り付くしまがない。
それもそのはず、ネット上に散らばっているgrub rescueの解決策って、linuxのbootをしたいのが前提にあるんだよね。今回はwindowsを立ち上げたいのにwindowsしかないハードドライブで/bootとか探してもないはずなので当然のことなんだけどそれに気づくのに暫しかかってしまう。

なので気づくまで回避するためにいろいろなことを試してみた。
仮想ディスクの構成をいろいろいじってみる：
VBoxManageで仮想ディスクを作る際にsda1-3を明示的にやってみる、

```bash
VBoxManage internalcommands createrawvmdk -filename win1.vmdk -rawdisk /dev/sda -partitions 1,2,3
```

部分的に指定する。

```
VBoxManage internalcommands createrawvmdk -filename win1.vmdk -rawdisk /dev/sda
```

mbrも明示してみる

```
VBoxManage internalcommands createrawvmdk -filename win1.vmdk -rawdisk /dev/sda -mbr sda.mbr
```
さらにパーティションも明示してみる（8通り試してみた）

```bash
VBoxManage internalcommands createrawvmdk -filename win1.vmdk -rawdisk /dev/sda -partitions 1,2,3 -mbr sda.mbr

```

VirtualBoxの設定をいろいろ変える：

- チップセットをいじったり
- ハードディスクの方式をかえたり
- 仮想化方式を変えたり
- 権限を変えたり

いろいろ試したけど全部ダメ。。


## kvm(qemu)に逃げる
そういえばqemuがあったことを思い出しトライしてみる。結果だけ言うとさっきと同じことになった。

```bash
sudo qemu-system-x86_64 -enable-kvm -hda /dev/sda
```

ただここまで同じなので、エミュレーター側の対応などの問題ではなく自分がしている設定がおかしいのではないかと思った。
（それと、とりあえず権限はdiskグループに自分を追加してアクセスできるようにしてしまえばあまり関係ないようだったので以降sudoは使ったり使わなかったりします）


## 仮想HDDの構成を変えてみる
もしかしてbootはsda1になっているけど、bootに関する情報が他のディスクにあるのでは？と思い危ないのは知りつつもsdbもqemuでhdbに指定してやると、windowsの起動画面が！

```
sudo qemu-system-x86_64 -enable-kvm -hda /dev/sda -hdb /dev/sdb
```

VirtualBoxでも同じことができるかなと思い、sdbの仮想ディスクを作成し突っ込んでみた。動く！

```
VBoxManage internalcommands createrawvmdk -filename sda.vmdk -rawdisk /dev/sda
VBoxManage internalcommands createrawvmdk -filename sdb.vmdk -rawdisk /dev/sdb
```

しかし起動中に出てくるアニメーションが表示されず、プログレスバーだけ表示され、すぐブルーバックで落ちてしまう。
https://www.nexia.jp/laboratory/1738/
これは↑こちらの記事を参考にレジストリを変更し再起動。
またブルーバックになるが先ほどとメッセージの長さが明らかに違う（一瞬しか出てこないためなんと書かれていたかは記録が取れてません（汗）
どうもメモリが足りないと言っているようなので、仮想マシンのリソースを少し増やし、ハードディスクをIDE接続に直して再トライ。すると、、、

ログインできた！

# 結語
今までwindowsのソフトをたまに使うけど基本linux環境という形だったのでかなり生産性が上がったのではないかと思います。
webで探していると、トライして途中で積んでる方が結構いらっしゃったので、こんなbootの仕組みがよく分かってない奴の悪戦苦闘の様などでももしご参考になれば、と思い記録に残します。

ただ、~~usb機器の接続に成功していないので、そこが残課題。extension入れたんだけどデバイスの候補すら出ないんだよね。まだ調べてる途中だから分かったら追記するかも~~追記しました。あとsdbでも不必要なところはイメージから外しておいたほうがいいよな、、今のは危険だよなきっと。こちらも修正したら追記するかも

（追記）
グループに追加しないといけなかった。
```bash
$ sudo gpasswd -a YOUR_USERNAME vboxusers
```

参考：https://qiita.com/civic/items/684c4b82428feb0c4ae1