我有点不清楚到底发生了什么,以及如何在 Ubuntu 18.04 上继续最近扩展的 zfs 配置。
我有一台使用 ZFS 的存储服务器,运行顺畅多年,有 2 个池,每个池包含 10 多个驱动器。一切都很顺利,直到……我们决定通过添加一个包含 10 个磁盘的新 vdev 来扩展一个池。插入后,一切正常。这是我添加设备的方法(我现在知道我应该按磁盘 ID 进行添加 :-( )):
~$ sudo modprobe zfs
~$ dmesg|grep ZFS
[ 17.948569] ZFS: Loaded module v0.6.5.6-0ubuntu26, ZFS pool version 5000, ZFS filesystem version 5
~$ lsscsi
[0:0:0:0] disk HGST HUS724020ALS640 A1C4 /dev/sda
[0:0:1:0] disk HGST HUS724020ALS640 A1C4 /dev/sdb
[0:0:2:0] disk HGST HUS726040AL5210 A7J0 /dev/sdc
[0:0:3:0] enclosu LSI SAS2X28 0e12 -
[1:0:0:0] disk HGST HUS726040AL5210 A7J0 /dev/sdd
[1:0:1:0] disk HGST HUS726040AL5210 A7J0 /dev/sde
[1:0:2:0] disk HGST HUS726040AL5210 A7J0 /dev/sdf
[1:0:3:0] disk HGST HUS726040AL5210 A7J0 /dev/sdg
[1:0:4:0] disk HGST HUS726040AL5210 A7J0 /dev/sdh
[1:0:5:0] disk HGST HUS726040AL5210 A7J0 /dev/sdi
[1:0:6:0] disk HGST HUS726040AL5210 A7J0 /dev/sdj
[1:0:7:0] disk HGST HUS726040AL5210 A7J0 /dev/sdk
[1:0:8:0] disk HGST HUS726040AL5210 A7J0 /dev/sdl
[1:0:9:0] disk HGST HUS726040AL5210 A7J0 /dev/sdm
[1:0:10:0] disk HGST HUS726040AL5210 A7J0 /dev/sdn
[1:0:11:0] disk HGST HUS726040AL5210 A7J0 /dev/sdo
[1:0:12:0] disk HGST HUS726040AL5210 A7J0 /dev/sdp
[1:0:13:0] disk HGST HUS726040AL5210 A7J0 /dev/sdq
[1:0:14:0] disk HGST HUS726040AL5210 A7J0 /dev/sdr
[1:0:15:0] disk HGST HUS726060AL5210 A519 /dev/sds
[1:0:16:0] disk HGST HUS726040AL5210 A7J0 /dev/sdt
[1:0:17:0] disk HGST HUS726040AL5210 A7J0 /dev/sdu
[1:0:18:0] disk HGST HUS726040AL5210 A7J0 /dev/sdv
[1:0:19:0] disk HGST HUS726040AL5210 A7J0 /dev/sdw
[1:0:20:0] disk HGST HUS726040AL5210 A7J0 /dev/sdx
[1:0:21:0] disk HGST HUS726040AL5210 A7J0 /dev/sdy
[1:0:22:0] disk HGST HUS726040AL5210 A7J0 /dev/sdz
[1:0:23:0] disk HGST HUS726040AL5210 A7J0 /dev/sdaa
[1:0:24:0] enclosu LSI CORP SAS2X36 0717 -
[1:0:25:0] disk HGST HUS726040AL5210 A7J0 /dev/sdab
[1:0:26:0] enclosu LSI CORP SAS2X36 0717 -
[1:0:27:0] disk HGST HUH721010AL4200 A384 /dev/sdac ===>from here below the new plugged disks
[1:0:28:0] disk HGST HUH721010AL4200 A384 /dev/sdad
[1:0:30:0] disk HGST HUH721010AL4200 A384 /dev/sdae
[1:0:31:0] disk HGST HUH721010AL4200 A384 /dev/sdaf
[1:0:32:0] disk HGST HUH721010AL4200 A384 /dev/sdag
[1:0:33:0] disk HGST HUH721010AL4200 A384 /dev/sdah
[1:0:34:0] disk HGST HUH721010AL4200 A384 /dev/sdai
[1:0:35:0] disk HGST HUH721010AL4200 A384 /dev/sdaj
[1:0:36:0] disk HGST HUH721010AL4200 A384 /dev/sdak
[1:0:37:0] disk HGST HUH721010AL4200 A384 /dev/sdal
接下来,我将驱动器作为新的 raidz2 vdev 添加到现有存档池。之后似乎运行顺利:
~$ sudo zpool add -f archive raidz2 sdac sdad sdae sdaf sdag sdah sdai sdaj sdak sdal
~$ sudo zpool status
pool: archive
state: ONLINE
scan: scrub repaired 0 in 17h18m with 0 errors on Sun Dec 8 17:42:17 2019
config:
NAME STATE READ WRITE CKSUM
archive ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
scsi-35000cca24311c340 ONLINE 0 0 0
scsi-35000cca24311ecbc ONLINE 0 0 0
scsi-35000cca24d019248 ONLINE 0 0 0
scsi-35000cca24311e30c ONLINE 0 0 0
scsi-35000cca243113ab0 ONLINE 0 0 0
scsi-35000cca24311c188 ONLINE 0 0 0
scsi-35000cca24311e7c8 ONLINE 0 0 0
scsi-35000cca24311e3f0 ONLINE 0 0 0
scsi-35000cca24311e7bc ONLINE 0 0 0
scsi-35000cca24311e40c ONLINE 0 0 0
scsi-35000cca243118054 ONLINE 0 0 0
scsi-35000cca243115cb8 ONLINE 0 0 0
raidz2-1 ONLINE 0 0 0
sdac ONLINE 0 0 0
sdad ONLINE 0 0 0
sdae ONLINE 0 0 0
sdaf ONLINE 0 0 0
sdag ONLINE 0 0 0
sdah ONLINE 0 0 0
sdai ONLINE 0 0 0
sdaj ONLINE 0 0 0
sdak ONLINE 0 0 0
sdal ONLINE 0 0 0
errors: No known data errors
pool: scratch
state: ONLINE
scan: scrub repaired 0 in 9h8m with 0 errors on Sun Dec 8 09:32:15 2019
config:
NAME STATE READ WRITE CKSUM
scratch ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
scsi-35000cca24311e2e8 ONLINE 0 0 0
scsi-35000cca24311e858 ONLINE 0 0 0
scsi-35000cca24311ea5c ONLINE 0 0 0
scsi-35000cca24311c344 ONLINE 0 0 0
scsi-35000cca24311e7ec ONLINE 0 0 0
scsi-35000cca24311bcb8 ONLINE 0 0 0
scsi-35000cca24311e8a8 ONLINE 0 0 0
scsi-35000cca2440b4f98 ONLINE 0 0 0
scsi-35000cca24311e8f0 ONLINE 0 0 0
scsi-35000cca2440b4ff0 ONLINE 0 0 0
scsi-35000cca243113e30 ONLINE 0 0 0
scsi-35000cca24311e9b4 ONLINE 0 0 0
scsi-35000cca243137e80 ONLINE 0 0 0
errors: No known data errors
但是,重新启动很可能弄乱了磁盘驱动器的顺序(设备分配;不确定是否困难,但似乎很有可能)。至少这是我在阅读了大量文档和问题后目前能得出的结论。当前状态如下。暂存池运行良好。存档池不:
~$ sudo zpool status -v
pool: archive
state: UNAVAIL
status: One or more devices could not be used because the label is missing
or invalid. There are insufficient replicas for the pool to continue
functioning.
action: Destroy and re-create the pool from
a backup source.
see: http://zfsonlinux.org/msg/ZFS-8000-5E
scan: none requested
config:
NAME STATE READ WRITE CKSUM
archive UNAVAIL 0 0 0 insufficient replicas
raidz2-0 ONLINE 0 0 0
scsi-35000cca24311c340 ONLINE 0 0 0
scsi-35000cca24311ecbc ONLINE 0 0 0
scsi-35000cca24d019248 ONLINE 0 0 0
scsi-35000cca24311e30c ONLINE 0 0 0
scsi-35000cca243113ab0 ONLINE 0 0 0
scsi-35000cca24311c188 ONLINE 0 0 0
scsi-35000cca24311e7c8 ONLINE 0 0 0
scsi-35000cca24311e3f0 ONLINE 0 0 0
scsi-35000cca24311e7bc ONLINE 0 0 0
scsi-35000cca24311e40c ONLINE 0 0 0
scsi-35000cca243118054 ONLINE 0 0 0
scsi-35000cca243115cb8 ONLINE 0 0 0
raidz2-1 UNAVAIL 0 0 0 insufficient replicas
sdac FAULTED 0 0 0 corrupted data
sdad FAULTED 0 0 0 corrupted data
sdae FAULTED 0 0 0 corrupted data
sdaf FAULTED 0 0 0 corrupted data
sdag FAULTED 0 0 0 corrupted data
sdah FAULTED 0 0 0 corrupted data
sdai FAULTED 0 0 0 corrupted data
sdaj FAULTED 0 0 0 corrupted data
sdak FAULTED 0 0 0 corrupted data
sdal FAULTED 0 0 0 corrupted data
pool: scratch
state: ONLINE
scan: scrub repaired 0 in 16h36m with 0 errors on Sun Feb 9 17:00:25 2020
config:
NAME STATE READ WRITE CKSUM
scratch ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
scsi-35000cca24311e2e8 ONLINE 0 0 0
scsi-35000cca24311e858 ONLINE 0 0 0
scsi-35000cca24311ea5c ONLINE 0 0 0
scsi-35000cca24311c344 ONLINE 0 0 0
scsi-35000cca24311e7ec ONLINE 0 0 0
scsi-35000cca24311bcb8 ONLINE 0 0 0
scsi-35000cca24311e8a8 ONLINE 0 0 0
scsi-35000cca2440b4f98 ONLINE 0 0 0
scsi-35000cca24311e8f0 ONLINE 0 0 0
scsi-35000cca2440b4ff0 ONLINE 0 0 0
scsi-35000cca243113e30 ONLINE 0 0 0
scsi-35000cca24311e9b4 ONLINE 0 0 0
scsi-35000cca243137e80 ONLINE 0 0 0
errors: No known data errors
我尝试了 zpool export archive(也使用 -f),但它抱怨设备丢失。
~$ sudo zpool export -f archive
cannot export 'archive': one or more devices is currently unavailable
显然导入也失败了....
还能尝试什么?我简直不敢相信“简单”的磁盘重新排序会弄乱存档池中的所有数据。
3月23日编辑
问题确实是驱动器顺序发生了变化。
如果我在池上运行 zdb,它会向我显示标签中存储的所有信息,并且错误的 /dev/sdxx 设备引用了大型新磁盘。我通过列出驱动器的 guid 以及实际分配的 /dev/sdxx 设备及其 ID 来确定这一点。它给了我以下映射:
但如何解决这个问题呢?理论上,将更正后的 zdb 数据重写到磁盘应该可以解决这个问题。
答案1
好吧,我又开心了。我能够解决/修复该问题重新洗牌的磁盘!发布此答案作为与我有相同感受的人的参考。
请注意这是高风险工作,只适合胆小的人!按照这些说明操作,风险自负,并做好系统彻底崩溃的准备!
简而言之我如何修复它我们的情况;
1) 检索故障池的原始驱动器路径布局 ( zdb
)
fdisk
2)通过列出所有分区和设备,创建原始和当前的磁盘/分区ID到路径的映射。
3a)mv
将 /dev/sdxx 设备和分区移至 ORIGINAL 之外的 TEMPORARY 范围(位于 1)
3b)mv
将临时范围内的设备移至原始布局
4)池已被识别(仅直到重新启动!)并且您可以移动/复制您的数据。
5) 挽救数据后,我从池中移除了所有磁盘并销毁了该池。仅在重新启动后重建池(注意移动设备名称)。
我将在下面发布每个点的一些详细信息(全部使用 sudo 或 as su);
1)zdb
这将返回每个池的 zdb 驱动器和分区标签的长转储。在受影响的故障池中查找子池的 guid 和路径对。在我的例子中,举个例子:
guid: 16862548186473937209
path: '/dev/sdac1'
2) 创建当前和原始 ID 到路径的映射列表。这允许将当前设备/分区路径重命名为原始布局(非其他原始设备当前由故障池中不存在的另一个新驱动器使用!)请参阅上面问题更新中的映射!关联
3) 移动/重命名设备;例如,首先将当前名称移动到高临时范围,然后从临时范围移动到原始布局。我编写了一个 bash 脚本来快速处理它,并允许双重检查和半自动生成“脚本”。示例;
#!/bin/bash
# move CURRENT TO TEMPORARY
mv /dev/sdac /dev/sdap
mv /dev/sdad /dev/sdaq
mv /dev/sdae /dev/sdar
mv /dev/sdaf /dev/sdas
mv /dev/sdag /dev/sdat
mv /dev/sdah /dev/sdau
mv /dev/sdai /dev/sdav
mv /dev/sdaj /dev/sdaw
mv /dev/sdak /dev/sdax
mv /dev/sdal /dev/sday
mv /dev/sdac1 /dev/sdap1
mv /dev/sdad1 /dev/sdaq1
mv /dev/sdae1 /dev/sdar1
mv /dev/sdaf1 /dev/sdas1
mv /dev/sdag1 /dev/sdat1
mv /dev/sdah1 /dev/sdau1
mv /dev/sdai1 /dev/sdav1
mv /dev/sdaj1 /dev/sdaw1
mv /dev/sdak1 /dev/sdax1
mv /dev/sdal1 /dev/sday1
mv /dev/sdac9 /dev/sdap9
mv /dev/sdad9 /dev/sdaq9
mv /dev/sdae9 /dev/sdar9
mv /dev/sdaf9 /dev/sdas9
mv /dev/sdag9 /dev/sdat9
mv /dev/sdah9 /dev/sdau9
mv /dev/sdai9 /dev/sdav9
mv /dev/sdaj9 /dev/sdaw9
mv /dev/sdak9 /dev/sdax9
mv /dev/sdal9 /dev/sday9
#final move TEMPORARY to ORIGINAL = new CURRENT
mv /dev/sdap /dev/sdai
mv /dev/sdaq /dev/sdaj
mv /dev/sdar /dev/sdak
mv /dev/sdas /dev/sdal
mv /dev/sdat /dev/sdah
mv /dev/sdau /dev/sdag
mv /dev/sdav /dev/sdaf
mv /dev/sdaw /dev/sdae
mv /dev/sdax /dev/sdad
mv /dev/sday /dev/sdac
mv /dev/sdap1 /dev/sdai1
mv /dev/sdaq1 /dev/sdaj1
mv /dev/sdar1 /dev/sdak1
mv /dev/sdas1 /dev/sdal1
mv /dev/sdat1 /dev/sdah1
mv /dev/sdau1 /dev/sdag1
mv /dev/sdav1 /dev/sdaf1
mv /dev/sdaw1 /dev/sdae1
mv /dev/sdax1 /dev/sdad1
mv /dev/sday1 /dev/sdac1
mv /dev/sdap9 /dev/sdai9
mv /dev/sdaq9 /dev/sdaj9
mv /dev/sdar9 /dev/sdak9
mv /dev/sdas9 /dev/sdal9
mv /dev/sdat9 /dev/sdah9
mv /dev/sdau9 /dev/sdag9
mv /dev/sdav9 /dev/sdaf9
mv /dev/sdaw9 /dev/sdae9
mv /dev/sdax9 /dev/sdad9
mv /dev/sday9 /dev/sdac9
4 和 5) 数据恢复后继续重建。有很多工具和优秀的教程演示了导出池、销毁和重建池的最佳实践(确保使用磁盘按标识符重建池,而不是按路径重建池 :-D)。