许多运维人员和Linux新手在使用服务器时,都会遇到一个让人头疼的问题:明明用fdisk -l看不到的磁盘,或者系统里没挂载的分区,却总能在某些地方看到它的影子。这种“幽灵盘”现象,在Linux系统里通常被称为Ghost Disk。它不占空间,不存数据,但会干扰系统识别,甚至导致一些自动化脚本报错。

Ghost Disk本质上并不是一个真实存在的物理磁盘。它往往是系统在启动过程中,由于硬件扫描残留、驱动加载异常、或者某些特殊存储协议(比如iSCSI、光纤通道)的链路未彻底断开,导致内核保留了某个存储设备的缓存信息。当你执行lsblk或者cat /proc/partitions时,这些“死掉”的盘符依然列在那里,但你去读写它,系统却报“输入/输出错误”。

Ghost Disk是怎么凭空冒出来的

系统功能_linuxghost_ghost disk linux系统

最常见的原因是热插拔操作不规范。在生产环境中,运维人员拔掉一块SAS或SATA硬盘后,如果没有提前执行设备注销命令,内核里对应的设备节点并不会自动消失。它就像一根拔掉的充电线,系统依然记得它的“身份证号”。当你重启机器或者重新扫描SCSI总线时,这块已经物理移除的盘又会以另一种形式出现在/dev目录下,名字可能变了,但内核保留的旧信息还在。

另一种情况是虚拟化环境中的残留。比如你在KVM或VMware里给虚拟机热添加了一块磁盘,之后又通过管理界面删除了这个磁盘,但虚拟机内部的操作系统并没有感知到“移除”事件。结果就是,你在系统里用fdisk -l还能看到这块盘,但实际操作时会失败。这种情况在云服务器里也频繁发生,尤其是使用多云盘或临时盘的场景。

如何准确识别哪些盘是Ghost Disk

linuxghost_ghost disk linux系统_系统功能

识别它们不能光靠看盘符。很多Ghost Disk的盘符是正常的,比如/dev/sdb、/dev/sdc,但你去执行df -h或者mount时ghost disk linux系统,它们根本没挂载。更关键的是,用smartctl工具去读取这块盘的健康状态时ghost disk linux系统,系统会直接返回“设备不存在”或“权限不足”的错误。此时你再用dmesg查看内核日志,往往会看到大量的“end_request: I/O error”或者“device offline”之类的警告。

还有一个更直接的办法:执行cat /proc/partitions,看看那些没有对应磁盘大小的“零长度”分区。真正的物理盘,哪怕没有被分区格式化,它的总容量也一定是非零的正整数。而Ghost Disk的主分区表往往是空的,或者显示的大小为0。你再执行lsscsi,如果某个设备的状态显示为“removed”或者“failed”,那基本可以判定它就是幽灵盘。

安全移除Ghost Disk的正确操作流程

linuxghost_ghost disk linux系统_系统功能

最稳妥的办法是不要碰系统文件,而是通过内核层面的命令去清理。首先确认你要移除的设备名称,比如/dev/sdx。然后执行echo 1 > /sys/block/sdx/device/delete。这个命令会通知内核断开与这个设备的所有连接,并删除对应的设备节点。整个操作不需要重启,也不会影响其他正在运行的磁盘。

如果这种方式无效,说明内核对这个设备的引用非常顽固。这时候可以尝试重新扫描SCSI总线。执行echo “- -- -” > /sys/class/scsi_host/host0/scan之前,先确认你的主机适配器编号。通常可以通过ls /sys/class/scsi_host/查看编号列表。扫描完成后,有些Ghost Disk会自动被覆盖掉。如果还是不行,最后的手段是重启机器,并且在BIOS里检查是否启用了不必要的存储控制器接口。

为什么不能直接删除/dev下的节点

linuxghost_系统功能_ghost disk linux系统

很多人想当然地认为,既然这个盘是假的linux ftp,那我直接用rm命令把/dev/sdx删掉不就完事了。这是一个非常危险的误解。/dev目录下的设备文件只是内核提供的接口,删除它并不会让内核忘记这个设备。就像你撕掉了电话本上的一个号码红帽子linux,但电话局那边依然保留着这个号码的线路。你删除节点后,系统可能依然会尝试读写这个设备,导致内核崩溃或者系统卡死。

更严重的是,如果你删除了一个正常设备的节点,而这个设备正好是系统盘或者数据盘,那么系统会立刻失去对它的访问能力。导致数据丢失或者系统无法启动。所以在操作之前,一定要用lsblk -o NAME,SIZE,TYPE,MOUNTPOINT仔细核对设备信息,确保你指向的不是正在使用的分区。

如何预防Ghost Disk反复出现

linuxghost_系统功能_ghost disk linux系统

做好设备管理流程是根本。生产环境下,每次热插拔硬盘之前,一定要先执行echo 1 > /sys/block/sdx/device/delete来安全移除。如果是通过存储网络连接的iSCSI盘,卸载时要用iscsiadm -m node -T target_name -u来注销。在虚拟化平台里,给虚拟机增减磁盘时,尽量通过操作系统内部的存储管理工具来操作,而不是直接在hypervisor层面强加或强删。

定期检查内核日志也是一个好习惯。用dmesg | grep -i error可以快速发现那些已经掉线但依然被系统认着的设备。另外,在/etc/udev/rules.d/目录下,可以写一些规则来自动过滤掉那些状态异常的磁盘设备,防止它们在每次重启后都冒出来。

Ghost Disk虽然不会直接破坏数据,但它像一根卡在系统里的刺,迟早会引发其他问题。无论是监控告警误报,还是备份脚本报错,都是它带来的麻烦。掌握了识别和清理的方法之后,再遇到这种事,你就能从容应对了。

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复