長年愛用していたTrueNAS(旧 FreeNAS)のHDD稼働時間がついに67,000時間を超えたため、安全を考慮してディスクを交換することにしました。
私のTrueNAS環境ではHDDを単体(ストライプ等なし)で動かしていたため、「取り外した古いHDDを別のPCに繋いで、そこから新しい環境へデータを直接移行しよう」と考えました。
しかし、ここで一つ問題が。
TrueNASで採用されているファイルシステムは「ZFS」という特殊な形式です。Windows(NTFSやFAT32)や一般的なLinux(ext4など)とは異なるため、Windows PCに直接USB接続しても中身を見ることはできません。
そこで今回は、Windows環境に「VMware Workstation Player」でUbuntu(仮想マシン)を立ち上げ、そこにZFSのHDDを物理マウントしてデータを抽出・移行する方法をご紹介します。
※本記事は、Ubuntuのインストールから「ZFSのマウント」までの手順を解説しています(NFSやSMB等を用いたネットワーク経由でのファイル転送手順は省略しています)。
必要なもの
- VMware Workstation Player(Windowsにインストール)
- UbuntuのISOイメージ(公式サイトからダウンロード)
- TrueNASから取り出したHDD(ZFSフォーマット)
- HDDをPCにUSB等で接続するスタンドやケース
今回はHDDの接続に、玄人志向のHDDスタンド「KURO-DACHI/ONE」を使用しました。挿すだけで簡単に認識してくれるので非常に便利です。
1. 事前準備(Ubuntu環境の構築とSSH設定)
① VMwareとUbuntuのインストール
まずはWindowsにVMware Workstation Playerをインストールし、ダウンロードしたUbuntuのISOイメージをセットして仮想マシンを作成します。
Ubuntuの場合は「簡易インストール」機能が使えるため、ユーザー名とパスワードを設定するだけでサクッと全自動でインストールが進みます(詳細は割愛します)。


② SSHサーバーの導入とIPアドレスの確認
VMwareのコンソール画面から直接操作しても良いのですが、キーボード配列の違い(USキーボード判定になる等)や、Windowsホスト側からのコピペができないなど不便な点も多いため、TeraTermなどからSSHで接続できるように設定しておきます。
Ubuntuインストール後、端末(ターミナル)を開き、以下のコマンドでSSHサーバーをインストールします。
sudo apt-get install openssh-serverインストールが完了したら、ip addr コマンドでUbuntuのIPアドレスを確認します。 (※ifconfig コマンドを使いたい場合は、別途 net-tools のインストールが必要です)
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ensxx: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:XX:XX:xx brd ff:ff:ff:ff:ff:ff
altname enp2s1
inet 192.168.0.X/24 brd 192.168.0.255 scope global dynamic noprefixroute ens33
valid_lft 1266sec preferred_lft 1266sec
inet6 fe80::0/64 scope link noprefixroute
valid_lft forever preferred_lft forever上記出力例の11行目付近、inet 192.168.0.X の部分がSSHで接続できるIPアドレスになります。
ここまで設定できたら、物理HDDをマウントするために一度Ubuntuをシャットダウンしてください。
2. 物理HDD(ZFS)のDeviceID確認とVMwareへのマウント
① Windows上でHDDのDeviceIDを確認する
VMwareに物理HDDを直接認識させるためには、Windows側で割り当てられている「DeviceID」を把握する必要があります。
HDDスタンド等でZFSのHDDをWindows PCに接続し、PowerShellを起動して以下のコマンドを実行します。
wmic diskdrive list brief実行結果は以下のようになります。
PS C:\Users\xxxx> wmic diskdrive list brief
Caption DeviceID Model Partitions Size
JMicron Generic SCSI Disk Device \\.\PHYSICALDRIVE5 JMicron Generic SCSI Disk Device 2 3000590369280SATAで直接接続していればHDDの型番が表示されますが、今回使用したUSB接続のスタンド(KURO-DACHI/ONE)の場合は「JMicron Generic SCSI Disk Device」として認識されました。 この横にある \\.\PHYSICALDRIVE5 という値(DeviceID)をメモしておきます。
② VMware Workstation PlayerにHDDをマウント
ここからの作業は、**VMware Workstation Playerを「管理者として実行」**して起動する必要があります。(※物理ディスクを扱うため、管理者権限がないとエラーになります)
該当する仮想マシン(Ubuntu)の「仮想マシンの設定の編集」を開き、ハードディスクを追加します。
- 仮想ディスクタイプは「SCSI」でも「SATA」でも構いません。
- ディスクの選択画面で**「物理ディスクを使用する」**にチェックを入れます。

- 次の画面で、先ほど確認した DeviceID(今回の例では
PhysicalDrive5)を選択します。使用方法は「ディスク全体を使用」で進みます。

あとは通常のHDD追加と同じようにvmdkファイル名を設定して完了です。
3. Ubuntu上でのZFSマウント手順
VMwareからUbuntuを起動し、SSHクライアント等でログインします。
① ディスクの認識確認
まずは fdisk -l コマンドで、追加した物理ディスク(ZFSパーティション)がUbuntu側から認識されているか確認します。
$ sudo fdisk -l
~~省略~~
Disk /dev/sdb: 2.75 TiB, 3000592982016 bytes, 5860533168 sectors
Disk model: VMware Virtual S
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier:
Device Start End Sectors Size Type
/dev/sdb1 128 4194431 4194304 2G FreeBSD swap
/dev/sdb2 4194432 5860533119 5856338688 2.7T FreeBSD ZFS
~~省略~~/dev/sdb2 に「FreeBSD ZFS」として認識されていることがわかります。
② ZFSプールのインポート(マウント)
次に zpool import コマンドを実行し、読み取り可能なZFSプール名を探します。
$ sudo zpool import
pool: strage3
id: 4035xxx
state: ONLINE
status: Some supported features are not enabled on the pool.
action: The pool can be imported using its name or numeric identifier, though
some features will not be available without an explicit 'zpool upgrade'.
config:
strage3 ONLINE
sdb ONLINEプール名が strage3 であることが確認できました。 プール名を指定して、実際にマウント(インポート)を実行します。
$ sudo zpool import strage3
# ※もし別のPCで適切に切り離し(エクスポート)がされておらずエラーが出る場合は、
# 以下の -f オプションをつけて強制的にマウントします。
$ sudo zpool import -f strage3最後に、mount コマンドでどこにZFSがマウントされたかを確認します。
$ mount | grep zfs
strage3 on /strage3 type zfs (rw,xattr,noacl)
strage3/jails on /strage3/jails type zfs (rw,xattr,noacl)これで、/strage3 などのディレクトリから無事にHDDの中身へアクセスできるようになりました! あとは、NFSやSMBなどを利用して、新しいNAS環境やWindows側へ必要なデータをコピーしていけば移行完了です。
余談・トラブルシューティング
最初は、ext4などのように単なる mount コマンドで繋げば良いのかと思い実行してみたところ、「mount: unknown filesystem type 'zfs_member'」 というエラーが出てしまい、少し泥沼にハマりました。ZFSの場合は必ず zpool import を使う必要があります。
【注意点:アンマウント時のハングアップ】 作業完了後に sudo zpool export strage3 を実行してアンマウント処理を行うと、Windowsのホスト側からも「デバイスが切断された」と判定されることがあるようです。 その結果、VMware上でHDDが見失われ、仮想マシン自体がハングアップしてしまう事象に遭遇しました。取り外しの手順には少し注意したほうが良さそうです。
