在尝试向我的 Ubuntu 服务器设备添加更多磁盘后,我遇到了麻烦。作为一个完全的初学者,我关闭了服务器,添加了两个磁盘并重新启动系统,结果却发现现有镜像中的一个磁盘“有故障”。
matsojala@amatson:~$ zpool status -v
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 0B in 21h20m with 0 errors on Fri Feb 8 14:15:04 2019
config:
NAME STATE READ WRITE CKSUM
tank DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
sdb ONLINE 0 0 0
12086301109920570165 FAULTED 0 0 0 was /dev/sdb1
errors: No known data errors
我尝试根据这个答案进行导出和导入(ZFS 池在重启时降级)但导出失败
matsojala@amatson:~$ sudo zpool export -f tank
umount: /tank: target is busy.
cannot unmount '/tank': umount failed
我不确定应该尝试哪种方式来替换磁盘,因为系统上的磁盘是“活动池的一部分”。
matsojala@amatson:~$ sudo zpool replace -f tank 12086301109920570165 sdc1
invalid vdev specification
the following errors must be manually repaired:
/dev/sdc1 is part of active pool 'tank'
也尝试过这个。
matsojala@amatson:~$ sudo zpool replace tank sdb
/dev/sdb is in use and contains a unknown filesystem.
有什么帮助吗?关闭电源之前,磁盘完全正常工作,它在系统中名为 /dev/sdc1,ID 为“12086301109920570165”。我该怎么办?
谢谢。
答案1
看起来您一直在使用诸如 之类的名称来引用磁盘。这通常不是一个好主意,因为如果您的磁盘在重新启动或拔出-重新插入循环后被分配了不同的名称,那么 ZFS 可能会感到困惑。相反,您应该使用、或/dev/sda
中的设备文件来创建池。/dev/disk/by-id/
.../by-uuid/
.../by-label/
对于您的情况,我并不完全确定,但它看起来像是在重启后被/dev/sdb1
重新标记为,这就是为什么它看起来像是池的一部分,即使它没有出现在中。您可以尝试通过拔下您添加的额外磁盘来修复它——这可能会让标签恢复到原来的状态——然后执行 ,然后执行,以强制 ZFS 根据磁盘名称重新标记池。/dev/sdc1
/dev/sdc1
zpool status
export
zpool import -d /dev/disk/by-id tank
by-id
如果由于繁忙而导致导出失败,请确保没有进程正在访问池中的文件,然后重试。我不是 Linux 用户,但似乎还有一些配置文件可用于帮助您在重启期间执行此操作:Github 上的这篇文章建议设置USE_DISK_BY_ID='yes'
为/etc/default/zfs
在重启时强制执行。最坏的情况是您可以设置并重启——重启会自动运行导出/导入。
话虽如此,如果你还是想更换磁盘,Oracle 文档很好地解释了“更换镜像中的一个故障磁盘”用例。(只需忽略有关使用 取消磁盘配置的 Solaris 特定说明cfgadm
。)我认为您错过的主要步骤是zpool offline tank <faulted disk>
在运行 之前运行zpool replace tank <new disk>
。