QNAPのLVMは拡張してあり普通のLinuxで扱えない場合があるっぽい

プログラミングor技術
QNAPでRAID1を組みシックボリュームを選択すると、QTSはLinux Software RAIDを使いRAIDを組み、LVMでボリュームを管理します。それをPCに直接繋いでもマウントできず使えなかったという話です。LVMのせいでした。

原因

QNAPの作るLVMのボリュームの segment type というのが、通常のlvm2が扱えない 「thick」 または他のQNAPオリジナルのものになっているケースがあるようです。そのため通常のLinuxでは扱えないみたいでした。 QNAP公式フォーラムの2015年のスレッドに、以下のように 「thick」はQNAP独自拡張みたいという書き込みがあります。
Now I’m stuck with the vg1 not being activated due to the invalid “thick” segment type, which appears to be unique to QNAP, since there is no LVM documentation supporting such a segment type. Reviewed the segtype.h file in the lvm2 project found here: https://git.fedorahosted.org/cgit/lvm2.git

https://forum.qnap.com/viewtopic.php?t=93862#p448002
また2019年のスレッドで、TS-453Proという新しめな機種の人も同じ症状で苦しんでいます。ここでもQNAPは segment typeを独自拡張しており公開されてないと書かれています。
QNAP MD for RAID, and then uses a segment type, on LVM2, named tier_thin_pool. On top of all that, you’ll find an ext4 filesystem. This segment type was created by QNAP and never released to the public as the license GPLv2 demands. https://forum.qnap.com/viewtopic.php?t=147495#p718385
しかし価格comの口コミには、LVMを使用しているようなのにPCにマウントできている書き込みがあります。つまり特定の条件のときはできるようです。 公式フォーラムのこのスレッドでは、静的ボリュームだといけるみたいな書き込みがありました。また別なスレッドによれば以下のように静的ボリュームでもLVMは使うけど普通の(QNAP独自拡張でない)segment typeになるらしいです。
First of all, it looks like “static volumes” use “traditional” LVM. Logical volume on a volume group of physical volumes. The limitation (I think it’s just QNAP’s, not LVM’s) is that there is only one volume per group of disks. When storage pools are used, LVM is configured differently, in a way that allows thin or thick volumes to be created. https://forum.qnap.com/viewtopic.php?t=102299#p460052
つまりQNAPでシックボリュームとかにするとPCでは読み書きできない、静的ボリュームはOK、ってことのようです。

QNAP内蔵HDDをPCのLinuxでマウントを試みた手順

以下はこうやったけどこう失敗しましたという手順です。 問題の再現に私が使ったのは、QTS4.3.4を動かしているTS-269ProとUbuntu20.04LTSのPCです。 Synologyのサポートページにやり方があります。(PC を使って Synology NAS でデータを復元するには?:Synologyサポートセンター)調べるとQNAPでも似たような手順でやるようです。なおサポートページではRAIDアレイに使うHDD全てを繋いでますが、今回はRAID1を構成するもののうち1台しか繋ぎません。

HDDをPCに繋ぐ

HDDをPCに繋いでディスク一覧から見て見ると、Linux RAID Memberとなっています。そのままではマウントできません。(下の画像は後から撮ったのでデバイス名が違ってます)
GUIでなくコマンドでデバイス名調べたい場合はlsblkを使います。下の例だと/dev/sda3がマウントしたいパーティションです。サイズが一番大きいのですぐわかります。
$ lsblk

NAME            MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
(略)
sda               8:0    0   3.7T  0 disk    # <-- 繋いだHDD
├─sda1            8:1    0 517.7M  0 part  
├─sda2            8:2    0 517.7M  0 part  
├─sda3            8:3    0   3.6T  0 part    # <-- これ!!
├─sda4            8:4    0 517.7M  0 part  
└─sda5            8:5    0     8G  0 part  
(略)

RAIDを組み直す

RAIDの状態を見てみます。Stateがcleanになっており正常ですね。
$ sudo apt install -y mdadm
$ sudo mdadm --examine /dev/sda3

/dev/sda3:
          Magic : a92b4efc
        Version : 1.0
    Feature Map : 0x0
     Array UUID : 4a18bc95:84599db5:49607830:3b0bbe0a
           Name : 1
  Creation Time : Sun Aug 18 08:08:42 2019
     Raid Level : raid1
   Raid Devices : 2

 Avail Dev Size : 3887118464 (1853.52 GiB 1990.20 GB)
     Array Size : 1943559232 (1853.52 GiB 1990.20 GB)
   Super Offset : 7794127504 sectors
   Unused Space : before=0 sectors, after=3907009032 sectors
          State : clean
    Device UUID : d6d0ac69:3afea8d7:cb5e8393:cdfd1714

    Update Time : Tue Oct 20 14:16:53 2020
  Bad Block Log : 512 entries available at offset -8 sectors
       Checksum : 758cb924 - correct
         Events : 293


   Device Role : Active device 1
   Array State : AA.............................. ('A' == active, '.' == missing, 'R' == replacing)
RAID1の片方1台だけで動かせるようにします。
$ sudo mdadm --assemble --run /dev/md1 /dev/sda3

LVMのVGを有効化する

RAID1の上でLVMが使われています。そのためLVMのVGをアクティブにしなくてはなりません。LVMのことよくわかってないので用語の使い方おかしいかも。
$ sudo apt install -y lvm2 
$ sudo vgchange -ay

  WARNING: Unrecognised segment type thick
  WARNING: PV /dev/md1 in VG vg1 is using an old PV header, modify the VG to update.
  Check of pool vg1/tp1 failed (status:1). Manual repair required!
  Refusing activation of LV vg1/lv1 containing an unrecognised segment.
thick」なんていうsegment type知らんわ!とエラーが出てますね。状態を見てみると、ACTIVEにしたい /dev/vg1/tp1 というLVがinactiveのままです。
$ sudo pvscan
  WARNING: Unrecognised segment type thick
  PV /dev/md1   VG vg1             lvm2 [1.81 TiB / 0    free]
  Total: 1 [1.81 TiB] / in use: 1 [1.81 TiB] / in no VG: 0 [0   ]

$ sudo vgscan
  WARNING: Unrecognised segment type thick
  Found volume group "vg1" using metadata type lvm2

$ sudo lvscan
  WARNING: Unrecognised segment type thick
  ACTIVE            '/dev/vg1/lv544' [<18.54 GiB] inherit
  inactive          '/dev/vg1/tp1' [<1.78 TiB] inherit
  inactive          '/dev/vg1/lv1' [1.50 TiB] inherit
コマンドでそのLVをACTIVEにしようとしても、やはりダメです。 「WARNING: Unrecognised segment type thick」というエラーがやっぱり出ます。
$ sudo  lvchange -ay /dev/vg1/tp1
  WARNING: Unrecognised segment type thick
  Check of pool vg1/tp1 failed (status:1). Manual repair required!
これは、冒頭で述べたように普通のLVM2では扱えない(QNAPの独自拡張らしい) thick が使われているからのようです。

じゃあどうすればいいの

上のような症状でマウントできない場合、QNAPのHDDをPCで直接読み出す方法は以下の2つです。正直、バックアップが取ってあるならそっちを使った方が良いと思います。

頑張ってQNAP拡張版のLVM2を使う

さっきのQNAP公式フォーラムのスレッドに以下の書き込みがあります。つまり自力でカーネルやLVMツールをコンパイルして使うことができるようです。
Having said that, the QNAP GPL tarball at http://sourceforge.net/projects/qosgpl/ contains all the relevant sources, so I was able to build a working recovery environment by compiling and installing QNAP’s kernel and LVM tools on a standard system. https://forum.qnap.com/viewtopic.php?t=93862#p500354
詳しい手順はこの書き込み で親切にも詳しく説明されています。私は試してませんが、書き込みした人は成功したそうです。

有料ソフトを使う

復旧天使というソフトを使います。有料です。これならQNAPのNASに入ってるHDDからもデータを吸い出せるらしいです。 私は買いませんでしたが、本当に追い詰められたときは有料ソフトに頼るしかなさそうです。 おしまい。

コメント