如何安全地从正在运行的系统中移除 SATA 磁盘?

Lek*_*eyn 75 ssd sata hot-plug disk

我有时需要将磁盘插入磁盘托架。在其他时候,我有一个非常奇怪的设置,即使用笔记本电脑上的 SATA-eSATA 电缆连接 SSD,同时从台式机上取电。

如何安全地从系统中移除 SATA 磁盘?这个Phoronix论坛帖子有一些建议:

justsumdood 写道:

An(noymous)droid 写道:
那么在拔掉插头之前你在软件方面做了什么?它是一个简单的“umount /dev/sd”[驱动器号]吗?卸载设备后,要“关闭”(或休眠)设备:

hdparm -Y /dev/sdX
Run Code Online (Sandbox Code Playgroud)

(其中 X 代表您要关闭的设备。例如:/dev/sdb)

这将使驱动器断电,以便在没有电压浪涌风险的情况下将其移除。

这是否意味着磁盘缓存会在此后正确刷新并关闭电源?

来自同一线程的另一个建议:

chithanh 写道:
所有 SATA 和 eSATA 硬件都可以在物理上进行热插拔(即如果插入/拔出插头不会损坏)。

芯片组和驱动程序如何处理这是另一个问题。某些驱动程序/芯片组组合不能正确处理热插拔,需要一个热插拔命令,例如以下命令:

echo 0 - 0 > /sys/class/scsi_host/hostX/scan
Run Code Online (Sandbox Code Playgroud)

将 X 替换为适合您的 SATA/eSATA 端口的编号。

我怀疑这样做是否正确,但我也找不到一些证据来反对它。

那么,从系统中删除附加磁盘的正确方法是什么?假设我已经卸载了磁盘上的每个分区并运行了sync. 如果可能,请指向一些官方文档,我在 Linux 文档树或Linux ATA wiki 中找不到任何内容。

Wyz*_*ard 96

  1. 卸载磁盘上的所有文件系统。( umount ...)
  2. 停用任何 LVM 组。( vgchange -an)
  3. 确保没有任何东西在使用磁盘。
    • 你可以在这里拔掉硬盘,但建议也做最后两步
  4. 降低硬盘转速。(与 SSD 无关) ( sudo hdparm -Y /dev/(whatever))
  5. 告诉系统,我们正在拔下 HDD,以便它可以自行准备。( echo 1 | sudo tee /sys/block/(whatever)/device/delete)

如果您想格外小心,echo 1 | sudo tee /sys/block/(whatever)/device/delete请先做。这将从内核中注销设备,所以当你拔掉它时你知道没有任何东西在使用它。当我使用 eSATA 机箱中的驱动器执行此操作时,我可以听到驱动器的磁头自行停放,因此内核显然告诉驱动器准备断电。

如果您使用的是 AHCI 控制器,它应该可以处理被拔掉的设备。如果您使用其他类型的 SATA 控制器,驱动程序可能会被热插拔混淆。

根据我的经验,SATA 热插拔(使用 AHCI)在 Linux 中运行良好。我拔下光驱,插入硬盘,扫描错误,制作文件系统并将数据复制到其中,卸载并拔下它,插入不同的 DVD 驱动器,并刻录光盘,所有这些都与机器一起运行和运行。

  • 我强烈建议 ** 始终** 发出 `echo 1 > /sys/block/(whatever)/device/delete` 命令,因为驱动器将停放磁头,完全停止磁盘并禁用总线上的电源。如果未停放的磁头接触旋转板,则驱动器可能会永久损坏。 (21认同)
  • @TranslucentCloud 您可以通过`sudo tee` 将其通过管道模拟以root 身份进行重定向:`echo 1 | 须藤 tee /sys/block/(whatever)/device/delete` (15认同)
  • 在我看来, hdparm -Y 和 /sys/block/sdX/device/delete 的技巧是互斥的。因为如果您使用 hdparm 将驱动器旋转下来,“块层删除”可能必须无论如何都将其旋转起来,以便刷新缓存并告别它 - 然后*然后无论如何将其旋转*。而且,一旦执行“块层删除”,设备节点将从 /dev/ 中消失,因此您不再可以运行 hdparm。所以我同意@drumfire - 只需执行“块层删除”即可。现在经过测试,效果非常好。赞成这个答案和主题:-) (4认同)
  • 此外 - 如果 smartd 碰巧正在运行,最好向进程发出 SIGHUP 以便它重新加载驱动器信息。如果您正在*更换*驱动器,则尤其重要,因为 smartd 将重新加载该驱动器和所有其他驱动器的信息。 (2认同)
  • 值得一提的是,`echo 1 > /sys/block/(whatever)/device/delete` 在 `sudo` 下将不起作用,将抛出“权限被拒绝”错误。你需要成为一个真正的 root,所以使用简单的旧 `su` 代替。 (2认同)

bah*_*mat 5

这两个部分用于不同的事情。

第一个是拔掉插头。二是用于堵漏。

对于拔出,操作系统将在卸载操作期间同步数据。因此,如果磁盘已卸载(假设您确实有完整的硬件支持),您可以关闭磁盘电源,然后将其拔下,而不会有数据丢失或损坏的风险。

对于插拔,应自动识别设备。如果没有,您可以执行该命令以触发总线扫描。一旦识别出设备,您就可以安装它。

让我警告一下,我只用 USB 驱动器做过这种事情。

  • 如果有帮助,我会经常热插拔 SATA 硬盘驱动器作为我工作的一部分,只是确保先卸载它,而且我从未遇到过问题。这是轶事,所以不要把它当作福音,但至少有一些证据表明它可能是安全的。无论如何,如果操作系统不能确保在卸载操作结束时完全写入数据,尤其是在热插拔世界中,我会将其视为内核错误。 (3认同)
  • @Lekensteyn,“hdparm -Y”会处理这个问题。这基本上就是每次挂起或关闭时系统都会执行的操作。 (2认同)

小智 5

怎么样eject /dev/sdX?在我的设置中,此命令会卸载、同步和关闭驱动器。

  • 我尝试使用通过 eSATA 连接的磁盘进行此操作,但该命令因“不可热插拔”或其他原因而失败。 (6认同)
  • Afaik 弹出可插拔磁盘而不是设备。这取决于块设备驱动程序支持 `eject` 工具使用的 `ioctl()` 操作。Esata 硬盘驱动器不支持它,但是光学设备、软盘和可能的闪存驱动器,是的。 (2认同)

Tob*_*ght 5

我有两个基于Wyzard 答案的脚本。第一个scsi-drop是安全地分离单个磁盘:

#!/bin/sh

if test -h "$1"
then
    disk=$(chase "$1")
else
    disk="$1"
fi

if test -b "$disk"
then
    echo 1 >/sys/block/$(basename "$disk")/device/delete
else
    echo "$0: not a block device: $1" >&2
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

它的主要好处是您可以向它传递一个符号链接,例如在中找到的符号链接/dev/disk/by-id/,它会将其解析为真实设备。它确实需要chase安装;您也许能够使用 得到相同的结果readlink -e。

第二个脚本scsi-rescan是在热插拔新设备后使用的:

#!/bin/bash

exec tee /sys/class/scsi_host/host*/scan <<<'- - -' >/dev/null
Run Code Online (Sandbox Code Playgroud)

这使得所有适配器重新扫描设备。这是我设法读取新容量和分区表的唯一方法。