本文介绍如何在 Synology NAS 故障时,使用 PC(Ubuntu 18.04 环境)恢复硬盘数据。适用 DSM 6.2.x 及以上版本,支持 Btrfs 或 ext4 文件系统,但不适用于使用读写 SSD 缓存的存储空间。操作核心是将所有硬盘安装到 PC,通过终端安装 mdadmlvm2 工具,组装 RAID 并激活逻辑卷,最后将设备挂载为只读模式以访问数据。教程还特别说明了针对加密存储空间和加密共享文件夹的额外挂载步骤。整个过程需谨慎操作,以免造成数据二次损坏。

博主博客

目的

本文将指导您在 Synology NAS 出现故障时,如何在 PC 上恢复数据。
注意事项:

  • 硬盘迁移到新 NAS 后,可能无法再次挂载存储空间。

适用环境

适用于:

不适用于:

  • 使用读写 SSD 缓存的存储空间

解决方法

使用 PC 恢复数据

  1. 请确保您的 PC 有足够的硬盘插槽用于安装硬盘。
  2. 将硬盘从 Synology NAS 中取出并安装到您的 PC 上。对于 RAID 或 SHR 配置,您必须同时将所有硬盘(不包括 Hot Spare 硬盘)安装到 PC 上。
  3. 请按照本教程中的说明准备 Ubuntu 环境。
  4. 在左侧栏进入文件,然后选择Home
  5. 右键单击并选择新建文件夹,创建一个或多个文件夹作为挂载点以访问数据。1
  6. 右键单击新建的文件夹,点击属性,父文件夹加文件夹名称即为 ${mount_point}
    • 例如:如果父文件夹为 /home/ubuntu/,文件夹名称为 Test,则挂载点为 /home/ubuntu/Test/
  7. 在左下角进入显示应用程序 > 输入以搜索…
  8. 在搜索栏输入终端机并选择终端机
  9. 输入以下命令以获取 root 权限。
sudo -i
  1. 输入以下命令以安装 mdadmlvm2,这两者都是 RAID 管理工具。必须安装 lvm2,否则 vgchange 无法使用。
apt-get update  
apt-get install -y mdadm lvm2
  1. 输入以下命令以组装所有从 Synology NAS 移除的硬盘。根据您的 Synology NAS 上存储池的配置,结果可能会有所不同。
mdadm -AsfR && vgchange -ay
  1. 输入以下命令以获取 ${device_path} 的信息。
cat /proc/mdstat  
lvs

根据 pvs/vgs/lvs 的输出,设备路径如下:

${device_path}
无 lvs 输出 /dev/${md}2
有 lvs 输出 /dev/${VG}/${LV}3

以下是 md status 对应不同 RAID 和存储空间类型的示例:

设备路径 经典 RAID(单一存储空间)
cat /proc/mdstat root@ubuntu:~# cat /proc/mdstat
Personalities : [raid1]
md4: active raid1 sdc3[0]
73328704 blocks super 1.2 [1/1] [U]
unused devices:
lvs 无输出
${device_path} /dev/md4

设备路径 SHR(单一存储空间)
cat /proc/mdstat root@ubuntu:~# cat /proc/mdstat
Personalities : [raid1]
md3 : active raid1 sda5[0]
73319616 blocks super 1.2 [1/1] [U]
unused devices:
lvs root@ubuntu:~# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv vg1000 -wi-a----- 69.92g
${device_path} /dev/vg1000/lv

设备路径 经典 RAID/SHR(多存储空间)
cat /proc/mdstat Personalities : [raid1]
md3 : active raid1 sdc3[0] sdd3[1]
73328704 blocks super 1.2 [2/2] [UU]
unused devices:
lvs root@ubuntu:~# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy% Sync Convert
syno_vg_reserved_area vg1 -wi-a----- 12.00m
volume_1 vg1 -wi-a----- 30.00g
volume_3 vg1 -wi-a----- 30.00g
${device_path} /dev/vg1/volume_1
/dev/vg1/volume_3
  1. 输入以下命令,将所有硬盘以只读方式挂载以访问您的数据。在${device_path}中输入您的设备路径(根据步骤 12中的 RAID 和存储空间类型),在${mount_point}中输入挂载点(在步骤 6中创建)。您的数据将位于该挂载点下。
mount ${device_path} ${mount_point} -o ro
  1. 文件 > 主文件夹 > 您在步骤 5中创建的文件夹中检查数据。
  2. 针对加密存储空间和加密共享文件夹:

如果您仍无法通过上述步骤恢复数据,请不要尝试其他修复方法,因为这可能会对您的数据造成更大损坏。最后,建议您寻求本地数据救援公司的帮助。请理解,数据恢复并不能百分百保证成功。

在 PC 上挂载加密存储空间

请确保您拥有加密存储空间的恢复密钥。以下步骤仅在恢复密钥正确的情况下有效。

  1. 终端机中输入以下命令以安装cryptsetup
apt-get install cryptsetup
  1. 输入以下命令以解码您的恢复密钥。将${your_recovery_key_path}替换为恢复密钥的位置,将${base64_decode_output_path}替换为您想要的输出文件名和位置。
base64 --decode ${your_recovery_key_path} > ${base64_decode_output_path}
  • 示例:如果恢复密钥位于/mnt/volume1.rkey,且您希望输出文件命名为decode_output并存放在/mnt,则输入的命令为:base64 --decode /mnt/volume1.rkey > /mnt/decode_output
  1. 输入以下命令以测试恢复密钥是否正确。将${base64_decode_output_path}替换为输出文件名和位置。
cryptsetup open --test-passphrase /dev/vgX/volume_Y -S 1 -d ${base64_decode_output_path} -v
  • 示例:如果输出文件名为decode_output且位于/mnt,则输入的命令为:cryptsetup open --test-passphrase /dev/vgX/volume_Y -S 1 -d /mnt/decode_output -v
  1. 检查结果以确认恢复密钥是否正确:
  • 正确密钥:
Key slot 1 unlocked.  
Command successful.
  • 错误密钥:
No key available with this passphrase.  
Command failed with code -2 (no permission or bad passphrase).

请找到正确的密钥并返回上一步重新解码。
5. 输入以下命令,使用已解码的恢复密钥解密加密存储空间。

cryptsetup open --allow-discards /dev/vgX/volume_Y cryptvol_Y -S 1 -d ${base64_decode_output_path}
  1. 输入以下命令,将所有硬盘以只读方式挂载以访问您的数据。将${device_path}替换为您的设备路径/dev/mapper/cryptvol_Y${mount_point}替换为挂载点(在步骤 6中创建)。您的数据将位于该挂载点下。
mount ${device_path} ${mount_point} -o ro
  1. 请参阅步骤 14以恢复您的数据。

在 PC 上挂载加密共享文件夹

请确保您拥有加密共享文件夹的加密密钥。以下步骤仅在加密密钥正确的情况下有效。

  1. 终端机中,输入以下命令以获取 root 权限。
sudo -i
  1. 输入以下命令以启用universe repo并安装ecryptfs-utils
apt-add-repository universe  
apt-get update  
apt-get install ecryptfs-utils
  1. 输入以下命令以获取加密密钥的 FNEK(文件名加密密钥)值。
ecryptfs-add-passphrase --fnek

a. 当系统提示时,在Passphrase字段中输入您的加密密钥。
b. 您将看到类似如下的输出:

Inserted auth tok with sig [79d78a9afb5ebc95] into the user session keyring  
Inserted auth tok with sig [e4e4e8a3ca7d5d54] into the user session keyring

第二组方括号中的值即为您的 FNEK 值。请记录此值,后续步骤将会用到。

  1. 使用cd命令进入您在上一节步骤 6中创建的挂载点。
cd ${mount_point}
  • 示例:如果挂载点${mount_point}/home/ubuntu/Test/,则输入的命令为:cd /home/ubuntu/Test/
  1. 创建一个临时文件夹作为加密共享文件夹的挂载点。使用mkdir命令创建新文件夹。
mkdir folder_name

在上述命令中,将folder_name替换为您想要为该文件夹指定的名称。

  1. 输入以下命令以挂载您的加密共享文件夹。
mount -t ecryptfs  ${encrypted_shared_folder_mount_path} folder_name

变量说明如下:

  • ${encrypted_shared_folder_mount_path}:加密共享文件夹的挂载点(在步骤 6中创建)及文件夹名称。
  • folder_name:您在上一步创建的临时文件夹名称。
  • 示例:如果挂载路径为/home/ubuntu/Test/@enc_folder@,临时文件夹名称为enc_folder,则命令为:mount -t ecryptfs /home/ubuntu/Test/@enc_folder@ enc_folder

挂载过程中还需输入其他信息,请按照以下说明操作:
a. Passphrase:输入您的加密密钥。
b. Select cipher:输入1,选择aes作为加密算法。
c. Select key bytes:输入2,选择32作为密钥字节数。
d. Enable plaintext passthrough:输入n,禁用此选项。
e. Enable filename encryption:输入y,启用此选项。
f. Filename Encryption Key (FNEK) Signature:输入您在步骤 3获得的 FNEK 值。
g. 输入 FNEK 值后,您会看到类似如下的输出:

Attempting to mount with the following options:  
ecryptfs_unlink_sigs  
ecryptfs_fnek_sig=e4e4e8a3ca7d5d54  
ecryptfs_key_bytes=32  
ecryptfs_cipher=aes  
ecryptfs_sig=79d78a9afb5ebc95  

WARNING: Based on the contents of [/root/.ecryptfs/sig-cache.txt], it looks like you have never mounted with this key before. This could mean that you have typed your passphrase wrong.

此警告信息仅为提醒。如果您确认加密密钥无误,可以忽略该警告并继续操作。
h. Would you like to proceed with the mount:输入y,同意继续挂载。
i. Would you like to append sig … in order to avoid this warning in the future:输入n,继续操作。
j. 挂载成功后,您将看到如下输出:

Mounted eCryptfs

注意:

  1. 一个挂载点对应一个存储空间。如果需要恢复多个存储空间,请创建与存储空间数量相同的文件夹。
  2. md(阵列)的数量会在cat /proc/mdstat的结果中列出。
  3. syno_vg_reserved_area可以忽略,volume_x 的数量等于存储空间的数量。

参考文献