如何在 RAID 1 模式下使用 BTRFS 将 Debian Jessie 正确安装到多个设备上?

如何在 RAID 1 模式下使用 BTRFS 将 Debian Jessie 正确安装到多个设备上?

作为简短的介绍,我将告诉您我有什么样的设置以及我想要实现什么。之后我尝试解释我的问题。因为这是我关于 U&L 的第一个问题,所以我必须为它可能很奇怪而道歉。它相当长,所以也许 BTRFS 或 Debian 的新用户可以从我的经验中受益,甚至可以将其用作某种教程。

基本硬件设置

我有一个主板和一个 Haswell 代 CPU,还有一些 RAM 和两个 SSD。

(注:为了做出正确的诊断,除了这些部件之外,我没有任何其他连接。如果您需要有关这些部件的更多信息,请随时询问更多详细信息。)

去做

我想将 Debian Jessie 安装到两个 SSD 上,并在 RAID 1 模式下使用 BTRFS 镜像两个驱动器,这样,如果一个驱动器失败,我仍然可以在降级模式下继续使用另一个驱动器。

我还取得了什么成就

由于 Jessie 目前正在进行测试,因此我开始使用其前身 Wheezy 进行全新安装,因为我过去在安装测试分支时遇到了问题。在安装过程中,我对第一个驱动器进行了分区(例如A)手动方式如下:

  • 只有一个分区(包含使用驱动器上所有可用空间的所有未来安装点),
  • BTRFS 中的格式和
  • 留下交换分区。

安装成功于A正如预期的那样,之后我升级到 Jessie(通过编辑/etc/apt/sources.list和执行apt-get update && dist-upgrade. 我执行了重新启动。它显示现在内核 3.14-2-amd64 很好。

之后我开始准备另一个驱动器(比如说)。我复制了分区表A并将sfdisk -d /dev/sda > /tmp/sda.pt其转储回sfdisk /dev/sdb < /tmp/sda.pt

现在我已准备好添加设备并使用以下命令执行到 RAID 1 的转换:

mount /dev/sda1 /mnt
btrfs device add /dev/sdb1 /mnt
btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt

btrfs filesystem show直到这里一切都成功了,因为我看到包含/dev/sda1别名的RAID 1A/dev/sdb1别名。另外blkid列出了具有相同 UUID 和不同 UUID_SUB 的两个驱动器。

/etc/fstab我只添加了一些与 SSD 相关的挂载选项,使挂载点几乎保持不变:

UUID=01234567-89ab-cdef-0123-456789abcdef / btrfs  defaults,noatime,nodiratime,discard  0   1

重新启动后,系统完全启动进入操作系统。上面的命令btrfs filesystem show仍然blkid显示相同的结果。 RAID 1 似乎正在运行。

我的问题和我的疑问

在系统冷启动之前我拔掉了电源插头(模拟一个完整的设备错误),这样只有A可用,并且认为 BTRFS 仍在降级模式下启动。但事实并非如此。我收到 initramfs 无法找到设备的错误。

  1. 这是 BTRFS 的预期行为还是我的 initramfs 有问题? (也许这就是 BTRFS 告诉我一个驱动器在离线时被损坏的方式。)

    A。是否可以仅用一个驱动器启动?A,插入(热插拔)新驱动器C并在线重新同步?

    b.在btrfs.wiki.kernel.org提到首先以降级模式安装故障设备,然后添加新设备。这是唯一的方法吗?

    (对自己说:我将测试插入另一个裸设备C看看会发生什么。也许我可以在研究完德国资料后自己回答这些问题wiki.ubuntuusers.de.)

  2. 我该如何做驱动也变得可引导(以防万一驱动器A被摧毁)?是否/boot同步?我只需要在设备上安装 GRUB 吗还是grub-install /dev/sdb我必须做更多的事情?

  3. 在 fstab 中使用挂载选项是否有用ssd,因为它似乎并不像btrfs.wiki.kernel.org说明它是自动启用的?对我来说,似乎只有当操作系统无法正确检测到 SSD 时才需要这样做。

答案1

问题 1 的回答 - 一个驱动器发生故障后如何启动

我可以通过执行以下步骤来恢复 RAID 1:

  1. 我拿了一个以某种方式格式化的驱动器(比如说C)并将其插入同一 SATA 端口有缺陷的驾驶是之前。

  2. 之后,我启动了计算机,并在启动菜单中按下了e启动前编辑命令wiki.ubuntuusers.de通过以下方式:

    A。我滚动到相关的开始条目并找到以下行:

    set root='hd0,msdos1'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  01234567-89ab-cdef-0123-456789abcdef
    else
      search --no-floppy --fs-uuid --set=root 01234567-89ab-cdef-0123-456789abcdef
    fi
    echo    'Loading Linux 3.14-2-amd64...'
    linux   /boot/vmlinuz-3.14-2-amd64 root=UUID=01234567-89ab-cdef-0123-456789abcdef ro  quiet
    

    b.然后我编辑了第 1 行并将驱动器编号更改为工作硬盘(在我的情况下,它仍然存在hd0,如果仍然插入多个驱动器,则可能是hd1):

    set root='hd0,msdos1'
    

    C。我通过添加前导字符使其成为注释来停用第 2 行至第 6 行#

    #if [ x$feature_platform_search_hint = xy ]; then
    #  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  01234567-89ab-cdef-0123-456789abcdef
    #else
    #  search --no-floppy --fs-uuid --set=root 01234567-89ab-cdef-0123-456789abcdef
    #fi
    

    d.之后,我编辑了第 8 行并插入了一个根标志以降低 RAID ( rootflags=degraded):

    linux   /boot/vmlinuz-3.14-2-amd64 root=UUID=01234567-89ab-cdef-0123-456789abcdef ro rootflags=degraded quiet
    

    e.通过按该键,F10我选择了刚刚编辑的条目。系统正在启动。

  3. 完全启动操作系统后,我必须添加新驱动器C到我的 RAID 1。我按照上面提到的那样做了btrfs.wiki.kernel.org:

    A。我安装了仍在工作的驱动器A:

    mount -o degraded /dev/sda1 /mnt
    

    b.我添加了新驱动器C:

    btrfs device add /dev/sdb1 /mnt
    

    C。之后我删除了旧设备(在我的例子中驱动器):

    btrfs device delete missing /mnt
    
  4. 最后,我检查了命令是否一切顺利btrfs filesystem showblkid正如btrfs fi df /mnt上面问题中提到的。两个驱动器具有相同的 UUID 但不同的 UUID_SUB,并且报告处于 RAID 1 模式。

    恭喜,成功了!

个人笔记

我按照预期对待失败的 initramfs 所描述的行为,直到其他人证明我错了。也许这是一种告诉我的方式,我现在应该小心地做出反应,因为我的磁盘崩溃得很厉害 - 但这只是猜测。

关于需要手动降级的说明

与此同时,我发现了一个与该主题相关的有趣讨论Linux 内核开发者邮件列表。由于它的相关性,我想引用邓肯写的一段话,我认为了解这段话非常重要,特别是对于新用户:

您应该能够使用降级挂载选项仅使用一个设备来挂载两个设备的 btrfs raid1 文件系统,但我相信当前内核在这种情况下拒绝读写挂载,因此您将具有只读访问权限,直到您btrfs 设备添加第二个设备,因此它可以再次执行正常的 raid1 模式。 [...] 同时,由于如果 btrfs 实际上可以找到文件系统的所有组件,则降级的 mount-opt 实际上是无操作的,因此有些人选择简单地将降级添加到他们的标准挂载选项中(编辑 grub 配置以添加每次启动时都会出现),因此他们不必担心这一点。但是,不建议这样做,因为公认的观点是,未能降级安装会向系统管理员发出警告,表明发生了非常错误的事情,他们需要修复它。然后,如果他们愿意,他们可以临时添加 degraded ,以便安装文件系统,从而能够启动,但是在每次启动时定期添加该选项会绕过这个重要的警告,并且管理员很可能会因此忽略问题(或者根本不知道)直到为时已晚。

(来源:https://www.mail-archive.com/[电子邮件受保护]/msg31265.html

附加说明:虽然我的示例计算机上没有交换分区,但我想鼓励愿意拥有交换分区的人阅读我提供链接的这封非常有趣的邮件,因为它解释了在 RAID 模式下与 BTRFS 交换。


问题 2 的回答 - 如何使其他驱动器可启动

就我目前所知,使用grub-install /dev/sdb(甚至额外的 update-grub)似乎还不够。我会解释为什么我这么认为。

当我通过离线拔掉驱动器尝试相反的方式时A并且仅使用驱动器启动发生了以下情况。引导加载程序 GRUB 出现,我执行了与问题 1 的第 2 点相同的步骤。在确认F10引导过程后,引导过程立即停止并显示空白屏幕(我说的是活动监视器,黑色背景,没有光标)。很明显,驱动器上的引导加载程序出了问题。 (请记住:我有一个 RAID 1,并且在第一个驱动器“出现故障”后无法从第二个驱动器启动。)

我通过硬重置来帮助自己,插入驱动器A再次(所以A两者再次出现)并启动进入操作系统。因为我的驱动器A绝对相同 我从工作驱动器复制了整个 MBR(包含引导加载程序)A在原始模式下与dd if=/dev/sda of=/dev/sdb bs=512 count=1.我关闭计算机,拔掉驱动器A像以前一样,猜猜发生了什么?再次执行降级步骤后,我终于可以仅从驱动器启动操作系统

我必须总结一下,我仍然不知道这是否与我的分区表(MSDOS - 不是 GPT)或grub-install与 BTRFS 结合的命令或其他东西有关。我也没有意识到我的原始副本与grub-install. (也许有人可以在这个答案下面的评论中澄清这一点。)

请注意,我仍在这方面进行研究,我将再次更新这个答案。我想清理更多内容,但我需要更多时间来研究原始代码MBR的扇区布局两个驱动器,并找出问题是否来自引导加载程序,甚至是来自磁盘标识


问题 3 的回答 - 如何处理挂载选项 ssd

这取决于主板是否能够正确通过驱动情况。如上所述btrfs.wiki.kernel.orgBTRFS 本身依赖于操作系统的值。由于操作系统中的其他模块也可能依赖于这些值,因此通常最好检查/sys/block/sdX/queue/rotational其适当的值(0:SSD,1:HDD)。如果值合适,则保留 ssd 选项。

相关内容