hiroの長い冒険日記

主にコンピュータ周辺の興味を持った内容を綴ります

Ubuntu18.04 cifs mount と物理SSD の仮想ディスク化

Hyper-V Path through 物理SSD の中身を仮想ディスクにするために、disk image を取り出す必要がある。DD for Windows を使おうかとも考えたが、仮想マシンlinux を活用しようと思い、Ubuntu18.04 の cifs で Windows10 の data 用 1TB HDD を mount し、こちらに dd で記録してみた。

NAS のフォルダを mount

cifs mount が正常に動作するか確認する為に、Synology DS218+ の共有フォルダを Ubuntu で mount してみた。
qiita.com
qiita.com
Synology DS218+ の SMBサービスと Ubuntu18.04 の cifs の SMB version が合っていないと mount に失敗する。Ubuntu18.04 の標準では、明示的に指定しないと vers=1.0 で接続しない。

Synology DS218+ のコントロールパネル -> ファイルサービス -> SMB の詳細設定 -> 最大 SMB プロトコルを "SMB3"に、最小 SMBプロトコルを "SMB2 と Large MTU" に設定すれば SMB2 以上となるので、Ubuntu cifs で SMB version を指定しなくても繋がるようになった。

WindowsXPWindows7Windows8.1 を使うこともないので、SMB3 のみで問題ないと思う。

Windows10 のフォルダを mount

data 用 1TB HDD にフォルダ VirtualHDD を作成した上で共有して Ubuntu18.04 で mount してみた。
www.fmworld.net
再起動は必要ないが、上記の手順で Windows10側の共有を設定できた。

後は、Ubuntu側で

$ sudo mount -t cifs -o username=hogehuga //192.168.n.n/VirtualHDD /mnt/windows
Password for hogehuga@//192.168.n.n/VirtualHDD:  ********

とすれば、指定したフォルダが /mnt/windows に mount できた。

dd で disk image の取り出し (失敗)

Hyper-V Path through で物理SSD を仮想 Ubuntu に接続(起動中じゃないとダメ)し、どの device name として認識したか確認する。今回は /dev/sdb として認識していた。
tech.clickyourstyle.com
後は dd で image を取り出す。

$ sudo dd if=/dev/sdb of=/mnt/windows/sdb.img
dd: 出力ファイル '/mnt/windows/sdb.img' を閉じています: 入力/出力エラーです

128GB なのでそこそこの時間を要する。進捗状況等は表示されないので気長に待つ。最後に入力/出力エラーが出るが、とりあえず進めてみる。

kpartx で確認

oplern.hatenablog.com

$ sudo kpartx -av /mnt/windows/sdb.img
add map loop15p1 (253:3): 0 241680384 linear 7:15 2048
add map loop15p2 (253:4): 0 2 linear 7:15 241684478
add map loop15p5 (253:5): 0 8384512 linear 7:15 241684480
$ ls /dev/mapper/
control  loop15p1  loop15p2  loop15p5
$ sudo mount /dev/mapper/loop15p1 /mnt/SSD
$ ls /mnt/SSD/
bin  boot  dev  etc  home  initrd.img  initrd.img.old  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  vmlinuz  vmlinuz.old
$ sudo umount /mnt/SSD
$ sudo kpartx -d /mnt/windows/sdb.img
loop deleted : /dev/loop15
$

loopback device で mount 出来る事を確認した。

disk image の変換 (raw -> vhd)

www.virtualbox.org
WindowsVirtualbox 6.0 の VBoxManage.exe コマンドで変換できる。WSL Ubuntubash から

$ /mnt/c/Program\ Files/Oracle/VirtualBox/VBoxManage.exe convertfromraw ./sdb.img ./debian.vhd --format VHD
Converting from raw image file="./sdb.img" to file="./debian.vhd"...
Creating dynamic image with size 128035676160 bytes (122105MB)...
VBoxManage.exe: error: Failed to write to disk image "./debian.vhd": VERR_INVALID_PARAMETER

残念ながら、最後の最後で error を出していた...ちゃんと image が出来ていないのかなぁ。cifs 経由で dd するのは難しいのか...WSL Ubuntu を使っている為か...

PowerShell からやってみても、同様に error で停止した。という事は、image がちゃんと出来ていない。

dd で disk image の取り出しテスト

読込と書込のどちらが悪さしているのか確認するために、/dev/null に書き込んで試してみた。

$ sudo dd if=/dev/sdb of=/dev/null
250069680+0 レコード入力
250069680+0 レコード出力
128035676160 bytes (128 GB, 119 GiB) copied, 1164.95 s, 110 MB/s

読込OK、書込NG、という事か。書き込み方法を工夫しないとダメ。

  • 仮想マシン Ubuntu の仮想ディスク容量を増やして or 別の仮想ディスクを取り付けして、仮想マシン内で dd を終わらせるようにする
  • cifs ではなく nfs を使う。(Synology DS218+を使う)

の回避方法が考えられる。

新しい仮想ディスクに dd で disk image の取り出し

ホスト側の Windows10 Hyper-V で 300GB の仮想ディスクを data 用 1TB HDD に作成し、仮想マシン Ubuntu に接続、/mnt/datahdd に mount して、dd で取り出してみた。

$ sudo dd if=/dev/sdb of=/mnt/datahdd/sdb.img
250069680+0 レコード入力
250069680+0 レコード出力
128035676160 bytes (128 GB, 119 GiB) copied,
...略...

今度は正常に取り出せた。

結果

  • Hyper-V 仮想マシン Ubuntu18.04 から、ホスト側の Windows10 のフォルダ を cifs で mount した。SMB version に注意。
  • ただし、cifs で mount したフォルダに dd で書き込むと IO error が発生して異常終了した。仮想ディスクなら正常。cifs は連続した書き込みで不安定なのかも。
  • Hyper-V 仮想マシン Ubuntu18.04 に Path through 物理SSD (Debian install 済) を接続し、dd コマンドで disk image を取り出した。
  • (未) 取り出した image を kpartx で loopback device として Ubuntu18.04 へ接続し、読み込める事を確認する。
  • (未) Virtualbox の VBoxManage コマンドで、取り出した disk image を仮想ディスク (vhd or vhdx) へ変換する。

今後、(未) の項目を確認してみる。