强制zpool在Ubuntu Xenial中使用/ dev / disk / by-id


16

我正在尝试在Ubuntu 16.04 Xenial上捆绑的OpenZFS。

创建池时,我总是按/dev/disk/by-id/(或/dev/disk/gpt在FreeBSD上)它们的序列号引用驱动器,以提高弹性。/dev重新引导计算机时,驱动器的顺序并不总是相同的,并且如果计算机中还有其他驱动器,则池可能无法正确安装。

例如,zpool status在14.04盒子上运行,我得到以下信息:

NAME                                  STATE     READ WRITE CKSUM
tank                                  ONLINE       0     0     0
  raidz1-0                            ONLINE       0     0     0
    ata-Hitachi_HDS722020ALA330_[..]  ONLINE       0     0     0
    ata-Hitachi_HDS722020ALA330_[..]  ONLINE       0     0     0
    ata-Hitachi_HDS722020ALA330_[..]  ONLINE       0     0     0
    ata-Hitachi_HUA722020ALA330_[..]  ONLINE       0     0     0

但是当我在16.04上用这个(缩写)创建一个新池时:

zpool create pool raidz \
    /dev/disk/by-id/ata-Hitachi_HDS723030ALA640_[..] \
    /dev/disk/by-id/ata-Hitachi_HDS723030ALA640_[..] \
    /dev/disk/by-id/ata-Hitachi_HDS723030ALA640_[..] \
    /dev/disk/by-id/ata-Hitachi_HDS723030ALA640_[..]

我得到这个zpool status

NAME        STATE     READ WRITE CKSUM
tank        ONLINE       0     0     0
  raidz1-0  ONLINE       0     0     0
    sdf     ONLINE       0     0     0
    sde     ONLINE       0     0     0
    sdd     ONLINE       0     0     0
    sda     ONLINE       0     0     0

看起来zpool遵循了符号链接,而不是引用它们。

有没有办法在创建池时强制16.04上的zpool尊重我的驱动器引用?或者,我是否对其在这里所做的事情感到担忧?

更新:解决方法

我在Github上找到了用于zfsonlinux 的线程该线程建议了一种解决方法。/dev/sdX首先使用设备创建zpool ,然后执行以下操作:

$ sudo zpool export tank
$ sudo zpool import -d /dev/disk/by-id -aN

我仍然希望能够在开始时做到这一点,zpool create如果可能的话。


创建它们的方式无关紧要。如果恢复为/ dev / sd?设备名称,zfs exportzfs import -d仍然可以使用。顺便说一句,除非您真的需要每个字节的空间,否则请使用两个镜像对而不是raidz。raidz的性能优于raid-5,但仍比raid-10或zfs镜像对差很多。扩展由镜像对组成的池也更容易,一次只添加两个磁盘...使用raidz,您必须将每个驱动器替换为更大的驱动器,只有更换了所有驱动器后,游泳池有更多可用空间。
cas

我仍然有一些raid-z池,对此感到遗憾。当我有能力购买替换磁盘时,我将创建具有镜像对的新池,并用于zfs send将数据复制到新池中。实际上,对于我的mythtv盒来说raid-z可以,其中的性能并不关键,除非我一次运行6或8个转码作业。在我的/home 目录所在的池上,更改为镜像对将非常明显。
cas

2
ZIL的镜像使您可以避免使用普通的廉价SSD,而不必使用带有大电容器的昂贵SSD来防止功耗。IMO,无论您拥有哪种SSD,ZIL的镜像都不是可选的-如果您的ZIL死了,则会丢失其中所有尚未写入的数据,并有可能损坏您的池。至于L2ARC,我特别说过不要镜像它们……镜像L2ARC缓存是浪费时间,金钱和良好的SSD空间(并且不能做任何事情来防止丢失缓存-您从何处得到这个主意?)
cas

1
:)顺便说一句,当我解释镜像ZIL的原因时,我的大脑工作不正常。这不是要防止功率损耗,这完全是胡说八道,我不应该这么说。这是为了防止ZIL驱动器发生故障。即RAID 1的ZIL镜像。通常,两个价格合理的固态硬盘要比一个极其昂贵的固态硬盘好(除非更昂贵的固态硬盘具有更快的接口,如PCI-e与SATA)。UPS是必不可少的……便宜的电力损耗保护。
cas

1
@cas镜像ZIL可意外关闭的同时防止SLOG设备故障。在正常操作下,ZIL是只写的,并且从RAM(ARC)写入持久性存储。如果系统意外关闭,则使用意图日志(ZIL,SLOG)来完成被中断的写入。仅当意外关闭与SLOG设备故障同时发生时,才需要冗余SLOG来恢复中断的写入。对于大多数非服务器(和许多服务器)工作负载,SLOG是过大的,因为ZIL实际上仅在同步写入中起作用。
CVn

Answers:


1

一阵子zpool import -d /dev/disk/by-id不起作用。

我已经在多个环境中注意到了这一点。我有一个导入脚本,除了执行一些不可思议的逻辑并显示物理连接的ZFS设备以外,基本上还可以执行以下操作:

zpool import -d /dev/disk/by-id POOL
zpool export POOL
zpool import POOL

即使没有-d切换,第二次(即使没有切换)也将通过设备ID导入,即使不是第一次使用显式命令也是如此。

这可能是由于几周或一个月的时间间隔(一年或两年前)中的ZFS错误导致的,不再需要。我想我应该提交一个错误报告,但是解决这个问题很简单。


1

我知道这个线程有些陈旧,但是有一个答案。导入后,您需要更新缓存文件。本示例显示了缓存文件的默认位置。

$> sudo zpool export POOL
$> sudo zpool import -d /dev/disk/by-id POOL
$> sudo zpool import -c /etc/zfs/zpool.cache
$> sudo zpool status POOL
NAME                                  STATE     READ WRITE CKSUM
POOL                                  ONLINE       0     0     0
  raidz1-0                            ONLINE       0     0     0
    ata-Hitachi_HDS722020ALA330_[..]  ONLINE       0     0     0
    ata-Hitachi_HDS722020ALA330_[..]  ONLINE       0     0     0
    ata-Hitachi_HDS722020ALA330_[..]  ONLINE       0     0     0
    ata-Hitachi_HUA722020ALA330_[..]  ONLINE       0     0     0
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.