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


64

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

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

justsumdood写道:

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

hdparm -Y /dev/sdX

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

这将使驱动器掉电,从而可以移除驱动器而没有电压浪涌的危险。

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

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

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

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

echo 0 - 0 > /sys/class/scsi_host/hostX/scan

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

我怀疑这样做是否正确,但我也找不到任何证明。

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

Answers:


82
  1. 卸载磁盘上的所有文件系统。(umount ...
  2. 停用所有LVM组。(vgchange -an
  3. 确保没有任何东西在使用磁盘。
  4. 完成此操作后,应可以安全拔出电源。

如果要格外小心,echo 1 > /sys/block/(whatever)/device/delete请先执行。这会从内核注销设备,让你知道什么是使用它,当你拔掉它。当我使用eSATA机箱中的驱动器执行此操作时,我可以听到驱动器的磁头停泊了,因此内核显然告诉驱动器准备断电。

如果您使用的是AHCI控制器,则该控制器应能与拔出的设备配合使用。如果您使用其他类型的SATA控制器,则驱动程序可能会因热插拔而感到困惑。

以我的经验,SATA热插拔(与AHCI一起使用)在Linux中工作得很好。我已拔出光盘驱动器,插入硬盘驱动器,对其进行扫描以检查是否有错误,制作了文件系统并将其复制到其中,卸载并拔出了它,插入了不同的DVD驱动器并刻录了光盘,所有这些都在机器启动的情况下进行了和运行。


我需要拔出要完全擦除的硬盘。将磁盘从托架中拉出后,/ dev / sdXY仍然显示。进行写1操作delete使其消失,我可以听到磁盘旋转的声音。仅仅hdparm -Y还不够,因为/dev/条目仍然存在。谢谢!
Lekensteyn

16
我强烈建议始终发出echo 1 > /sys/block/(whatever)/device/delete命令,因为驱动器将停放磁头,完全停止磁盘并禁用总线电源。如果未停放的磁头碰到旋转的盘,则驱动器可能会永久损坏。
drumfire

2
另外-如果smartd恰好正在运行,则最好向该进程发出SIGHUP,以便它重新加载驱动器信息。如果要更换驱动器,则尤其重要,因为smartd会重新加载该驱动器和所有其他驱动器的信息。
drumfire

1
只需提及一个便笺,在该注释echo 1 > /sys/block/(whatever)/device/delete下将无法使用sudo,将引发“权限被拒绝”错误。您需要成为一个真正的根,所以请使用普通的old su
TranslucentCloud

11
@TranslucentCloud您可以通过管道将其sudo tee模拟为根用户重定向:echo 1 | sudo tee /sys/block/(whatever)/device/delete
Oli

5

这两部分是针对不同的事情。

首先是拔掉插头。第二个是用于堵塞

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

对于插入,应自动识别该设备。如果没有,您可以执行该命令来触发总线扫描。识别设备后,即可安装它。

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


感谢您的答复,但我仍然不相信正确的行动将是什么。SSD有一个“不安全关机计数” SMART字段,只是不做任何事情就拔掉它对我来说并不安全。
Lekensteyn

3
如果有帮助,我通常会热插拔SATA硬盘驱动器作为我的工作的一部分,无非是要确保先将其卸载,而我从来没有遇到任何问题。那是轶事,所以不要把它当作福音,但是至少有一些证据表明它可能是安全的。无论如何,如果操作系统不能确保在卸载操作结束时已完全写入数据,尤其是在热插拔环境中,我将其视为内核错误。
詹德(Jander)2012年

1
@Lekensteyn,hdparm -Y将负责该工作。基本上,这就是每次您暂停或关闭系统时所做的工作。
psusi

5

那又如何eject /dev/sdX呢?在我的设置中,该命令将卸载,同步驱动器并关闭驱动器。


4
我使用通过eSATA连接的磁盘尝试了此操作,但是命令失败,并显示“ not hotpluggable”或其他内容。
Lekensteyn

1
Afaik弹出会插入可插入磁盘而不是设备。取决于块设备驱动程序是否支持ioctl()eject工具使用的操作。Esata硬盘驱动器不支持它,但是光学设备,软盘甚至可能是闪存驱动器。
user259412

2

我有一对基于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

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

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

#!/bin/bash

exec tee /sys/class/scsi_host/host*/scan <<<'- - -' >/dev/null

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


0

实际上,断电时,SATA驱动器会自动停放磁头。在驱动器仍在旋转时拉动驱动器,不会造成问题。但是,旋转的磁盘如果碰到就容易叮叮作响。当您遇到片状电源或太阳耀斑时,您会听到此声音。

大多数损坏通常是由于缓存未清除和缓冲区中未提交的写入等引起的。这就是为什么在卸下驱动器之前必须先卸载驱动器。SCSI命令是一个很好的措施,并且可以达到相同的目的。

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.