首先让我们从我正在运行的东西开始。这是一个运行 Ubuntu 16.10 的家庭媒体服务器。我有一个大约半满的镜像 6 TB 驱动器池。我大约一个月前构建了这个系统,它运行良好。它使用 SSD 作为引导驱动器,使用上述池作为存储。我已经能够用这个游泳池做我需要的一切,一切看起来都很棒。
大约一个月前我构建系统时,这两个驱动器都是新的,我对其中一个的一些额外振动有点好奇。没什么不好,但供应商说他会免费更换它,所以我打算运行一个擦洗并将它拉出来送进来,在我等待时以降级状态运行。上面没有非备份数据,所以我并不十分担心,但显然,与杀死池并从备份中恢复相比,这样做会更容易。
我目前真正想做的就是运行擦洗并安全地从镜像中分离一个驱动器。我跑
zpool scrub tank
Run Code Online (Sandbox Code Playgroud)
然后立即运行
zpool status
Run Code Online (Sandbox Code Playgroud)
我可以看到擦洗正在发生。我可以每隔几秒钟运行一次更新,并看到它更新状态就好了。它运行了大约 30 秒,然后状态不再显示它正在运行。此外,除了从状态开始在 0 小时 0 分钟内完成的最后一次擦洗之外,我从未见过任何其他东西。对我来说,这意味着擦洗不会完成,因为擦洗不应该至少需要几个小时才能完成两个半 TB 的信息。
我错过了什么?
pool: Tank
state: ONLINE
scan: scrub repaired 0 in 0h0m with 0 errors on Sun Feb 5 00:31:42 2017
config:
NAME STATE READ WRITE CKSUM
Tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdb2 ONLINE 0 0 0
sdc2 ONLINE 0 0 0
errors: No known data errors
Run Code Online (Sandbox Code Playgroud)
我现在再次尝试擦洗,以确保问题仍然存在。这是我开始后大约 20 秒的状态...
pool: Tank
state: ONLINE
scan: scrub in progress since Fri Feb 10 14:25:12 2017
62.5M scanned out of 2.97T at 1.08M/s, (scan is slow, no estimated time)
0 repaired, 0.00% done
config:
NAME STATE READ WRITE CKSUM
Tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdb2 ONLINE 0 0 0
sdc2 ONLINE 0 0 0
errors: No known data errors
Run Code Online (Sandbox Code Playgroud)
大约一分钟后又来了……
pool: Tank
state: ONLINE
scan: scrub repaired 0 in 0h1m with 0 errors on Fri Feb 10 14:27:01 2017
config:
NAME STATE READ WRITE CKSUM
Tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdb2 ONLINE 0 0 0
sdc2 ONLINE 0 0 0
errors: No known data errors
Run Code Online (Sandbox Code Playgroud)
我没时间把“嘈杂”的驱动器送回去,所以我把它拉了出来。我什么也没做,只是拔掉它(当系统启动时)。目前一切都继续正常运行,尽管如预期的那样处于降级状态。我想我会继续在这里记录我的经历,因为我已经开始这样做了。听起来没有其他人有这个问题。我似乎无法在网上找到与此情况相同的其他人。幸运的我。当我拿到替换驱动器和重新同步器时,我们会看到会发生什么。谁知道……也许数据之神会怜悯我,简单地更换驱动器将迫使问题自行解决。:/以下是我断开驱动器后的输出。
pool: Tank
state: DEGRADED
status: One or more devices could not be used because the label is missing or
invalid. Sufficient replicas exist for the pool to continue
functioning in a degraded state.
action: Replace the device using 'zpool replace'.
see: http://zfsonlinux.org/msg/ZFS-8000-4J
scan: scrub repaired 0 in 0h1m with 0 errors on Sun Feb 12 00:24:38 2017
config:
NAME STATE READ WRITE CKSUM
Tank DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
sdb2 ONLINE 0 0 0
sdc2 UNAVAIL 0 0 0
errors: No known data errors
Run Code Online (Sandbox Code Playgroud)
root@NAS:~# zpool status
pool: Tank
state: ONLINE
status: One or more devices has experienced an unrecoverable error. An
attempt was made to correct the error. Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
using 'zpool clear' or replace the device with 'zpool replace'.
see: http://zfsonlinux.org/msg/ZFS-8000-9P
scan: resilvered 525M in 0h3m with 0 errors on Wed Mar 29 14:28:46 2017
config:
NAME STATE READ WRITE CKSUM
Tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdb2 ONLINE 0 0 0
sdc ONLINE 0 0 732
errors: No known data errors
Run Code Online (Sandbox Code Playgroud)
也许问题的另一个线索?看看sdc的分区...
root@NAS:/dev# parted --list
Model: ATA Samsung SSD 850 (scsi)
Disk /dev/sda: 250GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 538MB 537MB fat32 EFI System Partition boot, esp
2 538MB 233GB 232GB ext4
3 233GB 250GB 17.1GB linux-swap(v1)
Warning: Not all of the space available to /dev/sdb appears to be used, you can
fix the GPT to use all of the space (an extra 7 blocks) or continue with the
current setting?
Fix/Ignore? i
Model: ATA HGST HUH728060AL (scsi)
Disk /dev/sdb: 6001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 2097kB 2150MB 2147MB
2 2150MB 6001GB 5999GB zfs
Model: ATA HGST HUH728060AL (scsi)
Disk /dev/sdc: 6001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 6001GB 6001GB zfs zfs-802af6a53a6d8383
9 6001GB 6001GB 8389kB
Run Code Online (Sandbox Code Playgroud)
是的,几个月来我一直在努力解决这个问题:/
首先,在导出/导入驱动器号更改后,请注意 sdb 变为 sdc,sdc 变为 sdd。
我想我发现了这个问题,我想获得有关如何解决它的建议。当我运行“sudo fdisk -l”时终于发现了这个问题。下面是相关的剪辑...
Disk /dev/sdc: 5.5 TiB, 6001175126016 bytes, 11721045168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 7127FE7D-E061-11E6-BD1F-3497F600DDAF
Device Start End Sectors Size Type
/dev/sdc1 4096 4198399 4194304 2G FreeBSD swap
/dev/sdc2 4198400 11721043967 11716845568 5.5T FreeBSD ZFS
...
Disk /dev/sdd: 5.5 TiB, 6001175126016 bytes, 11721045168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: E799A1D5-F9B7-C843-AB62-AADC9B0A2180
Device Start End Sectors Size Type
/dev/sdd1 2048 11721027583 11721025536 5.5T Solaris /usr & Apple ZFS
/dev/sdd9 11721027584 11721043967 16384 8M Solaris reserved 1
Run Code Online (Sandbox Code Playgroud)
请注意:镜像最初是在 FreeNAS (FreeBSD) 中创建的。sdc 在驱动器的开头有一个 2G 交换。sdd 是在 Ubuntu 中创建的,无论出于何种原因,在驱动器的末尾都获得了 8M 的交换空间。
现在,担心问题是驱动器坏了,我离线 sdd 并在其上运行坏块。这会擦除所有信息。好消息是驱动器很好,没有坏块。这也会将分区重置为空。
我有两个选择。1.) 尝试手动将 sdd 的分区与工作驱动器 (sdc) 匹配。尽管我认为 zfs 应该通过仅执行 zpool 替换来自动执行此操作,所以这可能是在浪费时间。2.) 我备份了数据,所以我可以擦除两个驱动器并从头开始,创建一个新镜像,并让它成为本机 Ubuntu 池。
也许这是多虑了,但我认为我会冒更大的破坏和恢复风险。我不得不销毁仅备份在非镜像磁盘上的好数据,然后将其同步回新创建的池。仅供参考,我使用 rsync 创建备份,它在同一台电脑上。我不得不在没有冗余的情况下将 3 个驱动器条带化以容纳其中的所有数据。我也担心像这样移动数据而无法清理它可能会给我带来一些损坏,我永远不会知道。
有人有什么建议吗?谢谢!