技術・開発

【ZFSマウント】TrueNASのHDDデータをWindows+VMware上のUbuntuで抽出する方法

2021年7月5日

長年愛用していた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の場合は「簡易インストール」機能が使えるため、ユーザー名とパスワードを設定するだけでサクッと全自動でインストールが進みます(詳細は割愛します)。

Ubuntu簡易インストール画面
VMware上の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         3000590369280

SATAで直接接続していればHDDの型番が表示されますが、今回使用したUSB接続のスタンド(KURO-DACHI/ONE)の場合は「JMicron Generic SCSI Disk Device」として認識されました。 この横にある \\.\PHYSICALDRIVE5 という値(DeviceID)をメモしておきます。

② VMware Workstation PlayerにHDDをマウント

ここからの作業は、**VMware Workstation Playerを「管理者として実行」**して起動する必要があります。(※物理ディスクを扱うため、管理者権限がないとエラーになります)

該当する仮想マシン(Ubuntu)の「仮想マシンの設定の編集」を開き、ハードディスクを追加します。

  1. 仮想ディスクタイプは「SCSI」でも「SATA」でも構いません。
  2. ディスクの選択画面で**「物理ディスクを使用する」**にチェックを入れます。
物理ディスクを使用するの選択画面
  1. 次の画面で、先ほど確認した 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が見失われ、仮想マシン自体がハングアップしてしまう事象に遭遇しました。取り外しの手順には少し注意したほうが良さそうです。

参考リンク

-技術・開発
-, , , , , , ,