当使用 Finder 中的 GUI 弹出 USB 设备时,底层究竟发生了什么?是否有某些信号发送到设备?
我之所以问这个问题,是因为我想通过运行嵌入式 Linux 的设备的控制台添加和删除文件存储模块来模拟手动弹出设备。在 PC 上删除模块就可以了,但在 Mac 上却会出现“未正确弹出”的错误,Linux 内核会“崩溃”并出现内核空指针错误。
以下是一些额外的信息:
我正在使用运行嵌入式 Linux 的 USB Gumstix COM 设备。该设备插入主机(Windows 或 Mac),我通过删除设备 Linux 内核中的大容量存储模块来模拟物理移除它,从而使主机不再将其视为存储设备。我使用 来实现这一点modprobe -r g_file_storage
。
这在 Windows 上没有问题。但在 Mac 上却不行,因为我在 Mac 主机上收到一条错误消息,提示设备未正确弹出。这会导致设备的 Linux 内核出现空指针错误,并导致设备崩溃。
这使我相信,只有 Mac 在正确弹出 USB 设备时才会执行某些操作,而我需要在设备上的脚本中模拟这些操作。
基本上,我想知道是否需要在设备上进行一些信号处理或其他操作才能正确模拟 Mac 主机上的弹出。
答案1
用户级的“弹出”概念可以有几种不同的含义,而卸载始终意味着卸载。
对于光学媒体,卸载后弹出会导致光盘物理弹出。
对于某些介质,例如可移动闪存介质(USB 记忆棒;在 Finder 中显示为白色插槽式驱动器的任何事物),弹出会卸载设备的所有卷,然后阻止与该设备的任何进一步交互,直到物理移除该设备 — — 该设备仍保留在 USB 设备树中,但块设备将/dev
被移除,并且不再列在“磁盘工具”或 中diskutil list
。
对于其他媒体类型,例如可移动硬盘(在 Finder 中显示为黄色塑料外壳的任何事物),弹出只会卸载该卷并使其可供重新安装或写入块设备。
我不太清楚哪种行为适用于哪种设备的标准是什么。我用一堆 CoreStorage/FileVault 2 加密的硬盘和一堆 USB 闪存驱动器进行了测试。相关设备上的卷数似乎影响不大,但交互块可能由 CoreStorage 或介质类型的差异决定。
如果您拔下尚未弹出但已卸载所有卷的设备,OS X 不会发出任何抱怨。
答案2
当您使用 Mac 和 Linux 上的 GUI 工具“弹出” USB 设备时,GUI 通常会检查设备是否忙,如果不忙,则从文件系统中卸载 USB 设备。
大多数 Unix/Linux 系统都有一个卸载命令,这是 GUI 工具在您“弹出” USB 设备时执行的操作。此命令应该在物理移除设备之前运行(但是有一些选项可以强制它移除对设备的引用,但它们并不总是有效)。
请查看 的手册页umount
。可以找到一份副本这里。