Ubuntu下SD卡卸载/弹出机制及相关异常问题的技术问询
Ubuntu下SD卡卸载/弹出机制及相关异常问题的技术问询
我正在研究Ubuntu系统里SD卡卸载/弹出的具体工作机制,目的是调试一个相关问题。目前我梳理出了大致的流程链:kernel/linux → sysfs → udev → udisks2 → GVolumeMonitor → 桌面管理器(通常和文件管理器是同一个)
其中udisks2是第一个通过DBUS提供API的守护进程。
现在我有两个核心疑问想请教:
一、命令行eject工具的异常行为
不管/dev/mmcblk0p1分区是否处于挂载状态,我执行eject /dev/mmcblk0都会返回错误码1。我用strace跟踪了这个命令,关键输出如下:
openat(AT_FDCWD, "/dev/mmcblk0", O_RDWR|O_EXCL|O_NONBLOCK) = 3 ioctl(3, CDROM_LOCKDOOR, 0) = -1 EINVAL (Invalid argument) ioctl(3, SG_GET_VERSION_NUM, 0x7ffd53f9b2e8) = -1 EINVAL (Invalid argument) ioctl(3, FDEJECT, 0x55874d4359d0) = -1 EINVAL (Invalid argument) ioctl(3, MTIOCTOP, 0x7ffd53f9b320) = -1 EINVAL (Invalid argument) write(2, "eject: ", 7eject: ) = 7 write(2, "unable to eject", 15unable to eject) = 15
我想知道:是不是只有CDROM这类既能物理弹出又支持编程触发弹出的设备,eject命令才会返回0?另外,Gnome相关服务是怎么解读这个命令的输出结果的?
二、udevadm monitor日志中的异常现象
我用udevadm monitor记录了SD卡整个生命周期的事件,重点是以下三个场景:
1. 卡片插入时的日志
KERNEL[49421.254375] add /devices/pci0000:00/0000:00:1d.0/0000:72:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:aaaa (mmc) KERNEL[49421.255242] add /devices/virtual/bdi/179:0 (bdi) UDEV [49421.256281] add /devices/pci0000:00/0000:00:1d.0/0000:72:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:aaaa (mmc) UDEV [49421.256354] add /devices/virtual/bdi/179:0 (bdi) KERNEL[49421.264022] add /devices/pci0000:00/0000:00:1d.0/0000:72:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0 (block) KERNEL[49421.264062] add /devices/pci0000:00/0000:00:1d.0/0000:72:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0/mmcblk0p1 (block) KERNEL[49421.264093] bind /devices/pci0000:00/0000:00:1d.0/0000:72:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:aaaa (mmc) UDEV [49421.321281] add /devices/pci0000:00/0000:00:1d.0/0000:72:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0 (block) UDEV [49421.409280] add /devices/pci0000:00/0000:00:1d.0/0000:72:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0/mmcblk0p1 (block) UDEV [49421.413271] bind /devices/pci0000:00/0000:00:1d.0/0000:72:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:aaaa (mmc)
2. 在Gnome中点击弹出按钮后的日志
KERNEL[49428.212348] remove /devices/pci0000:00/0000:00:1d.0/0000:72:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0/mmcblk0p1 (block) KERNEL[49428.213105] change /devices/pci0000:00/0000:00:1d.0/0000:72:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0 (block) KERNEL[49428.213189] add /devices/pci0000:00/0000:00:1d.0/0000:72:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0/mmcblk0p1 (block) UDEV [49428.215677] remove /devices/pci0000:00/0000:00:1d.0/0000:72:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0/mmcblk0p1 (block) UDEV [49428.242018] change /devices/pci0000:00/0000:00:1d.0/0000:72:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0 (block) UDEV [49428.310305] add /devices/pci0000:00/0000:00:1d.0/0000:72:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0/mmcblk0p1 (block)
这里我最困惑的是:点击弹出按钮后,内核为什么会重新添加设备(日志第3行)?
3. 物理移除卡片时的日志
KERNEL[49432.237855] remove /devices/pci0000:00/0000:00:1d.0/0000:72:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0/mmcblk0p1 (block) KERNEL[49432.238271] remove /devices/virtual/bdi/179:0 (bdi) KERNEL[49432.238678] remove /devices/pci0000:00/0000:00:1d.0/0000:72:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0 (block) UDEV [49432.241920] remove /devices/pci0000:00/0000:00:1d.0/0000:72:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0/mmcblk0p1 (block) UDEV [49432.242568] remove /devices/virtual/bdi/179:0 (bdi) UDEV [49432.245293] remove /devices/pci0000:00/0000:00:1d.0/0000:72:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0 (block) KERNEL[49432.269966] unbind /devices/pci0000:00/0000:00:1d.0/0000:72:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:aaaa (mmc) KERNEL[49432.270065] remove /devices/pci0000:00/0000:00:1d.0/0000:72:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:aaaa (mmc) UDEV [49432.271890] unbind /devices/pci0000:00/0000:00:1d.0/0000:72:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:aaaa (mmc) UDEV [49432.273292] remove /devices/pci0000:00/0000:00:1d.0/0000:72:00.0/rtsx_pci_sdmmc.0/mmc_host/mmc0/mmc0:aaaa (mmc)
备注:内容来源于stack exchange,提问作者nusch
相关产品推荐
相关产品推荐

