hdiutil附加/分离/将结果转换为"资源暂时不可用"

时间:2018-01-21 15:25:34

标签: macos terminal macos-high-sierra

自MacOS 10.13起,我遇到以下问题。

  1. /usr/bin/hdiutil attach "target/MyDrive-tmp.dmg" -mountroot /tmp
  2. / dev / disk3 GUID_partition_scheme

    / dev / disk3s1 Apple_APFS

    / dev / disk4 EF57347C-0000-11AA-AA11-0030654

    / dev / disk4s1 41504653-0000-11AA-AA11-0030654 / private / tmp / MyDrive

    1. /usr/bin/hdiutil detach -force -debug "/tmp/MyDrive"diskutil eject "/tmp/MyDrive"
    2. process_detach:带" / tmp / MyDrive"

      的条目

      util_verify_dev_entry:带" disk4s1"的条目。

      process_detach_deventry:即将unmount_and_eject disk4s1

      unmount_and_eject(disk4s1)

      LetDIDriverSettleDown:调用IOServiceWaitQuiet ...

      DI_kextWaitQuiet:即将调用IOServiceWaitQuiet ......

      DI_kextWaitQuiet:IOServiceWaitQuiet耗时0.000005秒

      LetDiskImageDriverSettleDown:等待耗时0.000066秒

      _unmountCallback:disk4

      "磁盘4"卸载。

      "磁盘4"喷出。

      1. /usr/bin/hdiutil convert "target/MyDrive-tmp.dmg" -format UDZO -o "target/MyDrive.dmg" -debug
      2. DIIsInitialized:返回YES

        DIIsInitialized:返回YES

        DIBackingStoreNewWithCFURL:带

        的条目

        文件:///Users/xxxx/Documents/git/Midi%20Automator/Midi%20Automator/target/MyDrive-tmp.dmg

        可写:false

        DIBackingStoreInstantiatorProbe:条目

        文件:///Users/xxxx/Documents/git/Midi%20Automator/Midi%20Automator/target/MyDrive-tmp.dmg

        可写:false

        DIBackingStoreInstantiatorProbe:探测接口0 CBSDBackingStore

        CBSDBackingStore :: newProbe为

        得分100

        文件:///Users/xxxx/Documents/git/Midi%20Automator/Midi%20Automator/target/MyDrive-tmp.dmg

        DIBackingStoreInstantiatorProbe:接口0,得分100,CBSDBackingStore

        DIBackingStoreInstantiatorProbe:探测接口1 CBundleBackingStore

        CBundleBackingStore :: newProbe得分-1000

        文件:///Users/xxxx/Documents/git/Midi%20Automator/Midi%20Automator/target/MyDrive-tmp.dmg

        DIBackingStoreInstantiatorProbe:接口1,得分-1000,

        CBundleBackingStore

        DIBackingStoreInstantiatorProbe:探测接口2 CRAMBackingStore

        CRAMBackingStore :: probe:scheme" file":not ram:或ramdisk:scheme。

        CRAMBackingStore :: probe:

        得分-1000

        文件:///Users/xxxx/Documents/git/Midi%20Automator/Midi%20Automator/target/MyDrive-tmp.dmg

        DIBackingStoreInstantiatorProbe:接口2,得分-1000,CRAMBackingStore

        DIBackingStoreInstantiatorProbe:探测接口3 CCarbonBackingStore

        CCarbonBackingStore :: newProbe:将初始rval设置为+100

        CCarbonBackingStore :: newProbe得分100

        文件:///Users/xxxx/Documents/git/Midi%20Automator/Midi%20Automator/target/MyDrive-tmp.dmg

        DIBackingStoreInstantiatorProbe:接口3,得分100,

        CCarbonBackingStore

        DIBackingStoreInstantiatorProbe:探测接口4 CDevBackingStore

        CDevBackingStore :: newProbe:不是/ dev / disk或/ dev / rdisk(/ Users / xxxx / Documents / git / Midi Automator / Midi Automator / target / MyDrive-tmp.dmg).CDevBackingStore :: newProbe score -1000 for file:///Users/aguelle/Documents/git/Midi%20Automator/Midi%20Automator/target/MyDrive-tmp.dmg

        DIBackingStoreInstantiatorProbe:接口4,得分-1000,CDevBackingStore

        DIBackingStoreInstantiatorProbe:探测接口5 CCURLBackingStore

        CCURLBackingStore :: probe:scheme是:file

        CCURLBackingStore :: probe:无法识别的URL方案。

        CCURLBackingStore :: probe:得分-1000 文件:///Users/xxxx/Documents/git/Midi%20Automator/Midi%20Automator/target/MyDrive-tmp.dmg

        DIBackingStoreInstantiatorProbe:接口5,得分-1000,CCURLBackingStore

        DIBackingStoreInstantiatorProbe:探测接口6 CVectoredBackingStore

        CVectoredBackingStore :: newProbe not" vectored"方案

        CVectoredBackingStore :: newProbe得分-1000为file:///Users/xxxx/Documents/git/Midi%20Automator/Midi%20Automator/target/MyDrive-tmp.dmg

        DIBackingStoreInstantiatorProbe:接口6,得分-1000,

        CVectoredBackingStore

        DIBackingStoreInstantiatorProbe:选择CBSDBackingStore

        DIBackingStoreNewWithCFURL:CBSDBackingStore

        CBSDBackingStore :: setPermission:opening / Users / xxxx / Documents / git / Midi Automator / Midi Automator / target / MIDI Automator-tmp.dmg

        CBSDBackingStore :: OpenLockFriendly:映射标志0x00000000 - > 0x00000014(锁是MANDATORY)

        CBSDBackingStore:OpenLockFriendly:无法使用锁35打开

        DIBackingStoreNewWithCFURL:instantiator返回35

        DIBackingStoreNewWithCFURL:返回35

        DIResolveURLToBackingStore:无法解析为任何后备存储类。 35.

        DIResolveURLToDiskImage:解析后备存储/文件编码失败。 35.

        转换:无法识别" target / MyDrive-tmp.dmg":

        资源暂时不可用.hdiutil:convert:result:35`

        1. /usr/bin/hdiutil attach "target/MyDrive-tmp.dmg" -mountroot /tmp
        2. 通过在Finder中单击鼠标弹出MyDrive
        3. /usr/bin/hdiutil convert "target/MyDrive-tmp.dmg" -format UDZO -o "target/MyDrive.dmg"
        4. - >结果:转换工作正常

          那么hdiutil detachdiskutil eject和从Finder中弹出的区别是什么?

          分析: 由于lsof [device]至少hdiutil detach没有显示任何设备,因此mount未提供任何输出。

          diskutil info "disk4s1"diskutil info /tmp/MyDrive

          设备标识符:disk4s1

          设备节点:/ dev / disk4s1

          整体:否

          整体的一部分:disk4

          卷名:MyDrive

          已装:是

          挂载点:/ private / tmp / MyDrive

          分区类型:41504653-0000-11AA-AA11-00306543ECAC

          文件系统个性:APFS

          Type(Bundle):apfs

          名称(用户可见):APFS

          所有者:已禁用

          可安装操作系统:是

          媒体类型:通用

          协议:磁盘映像

          SMART状态:不支持

          卷UUID:A3EE0B42-A021-47AA-B424-E494B75049D3

          磁盘/分区UUID:A3EE0B42-A021-47AA-B424-E494B75049D3

          磁盘大小:212.5 MB(212471808字节)(正好是414984 512字节)

          设备块大小:4096字节

          卷总空间:212.5 MB(212471808字节)(正好是414984 512字节)

          卷使用空间:184.7 MB(184709120字节)(正好是360760 512字节)(86.9%)

          卷可用空间:27.8 MB(27762688字节)(正好为54224 512字节)(13.1%)

          分配块大小:4096字节

          只读媒体:否

          只读卷:否

          设备位置:外部

          可移动媒体:可移动

          媒体删除:软件激活

2 个答案:

答案 0 :(得分:2)

hdiutil非常适合处理磁盘映像。取景器中的弹出基本上是diskutil eject [device]hdutil detach是“分离磁盘映像并终止任何关联的进程”(来自手册页)。其中diskutil用于“操作本地磁盘的结构”(来自手册页)。在功能上,hdiutil detachdiskutil eject相同。它的工作原理取决于Disk Arbitration是否正在运行。

磁盘仲裁是框架,正在进行diskarbitrationd,由launchd启动,默认情况下始终打开。它处理通过USB,Firewire,Thunderbolt等连接的磁盘的安装和卸载。

根据hdutil上的手册页,当Disk Arbitration正在运行时。 hdutil detach将使用它来卸载任何文件系统并分离图像。但是如果diskarbitrationd没有运行,那么它将尝试卸载文件系统,并通过对ioctl的系统调用直接分离映像。我不记得肯定diskutil -eject是否使用磁盘仲裁框架,但我想说它确实如此。

尝试找出导致错误的原因可能会很有趣。它通常意味着无法获得独占访问权限。您可以试验lsof [device]这将显示所有操作文件和PID以及设备的更多内容,这可以为您提供有关[EBUSY]错误(资源暂时不可用)的线索。如果您不知道它是什么设备,您可以使用不带参数的mount列出所有设备和挂载点。我相信你也可以做lsof [mount/point]。 lsof的手册页是你的朋友,而且很长。

另一种诊断是将-verbose选项与hdiutil一起使用。它适用于所有动词。所以,/usr/bin/hdiutil -verbose convert "target/MyDrive-tmp.dmg" -format UDZO -o "target/MyDrive.dmg"可能会提供一些启示。

当您尝试导致错误的步骤时,另一个可能的线索来源将打开一个额外的Terminal.app窗口,并运行命令diskutil activity。此命令会持续报告所有磁盘仲裁框架活动。 Ctrl-C停止进程。

您有一个适合您的解决方法,因此可能会查看为什么它给出错误对您来说并不重要或有趣。此外,如果您不想使用Finder,您始终可以使用终端中的diskutil eject [device]。我已经注意到很多事情都不是很正确,因为我已经升级到High Sierra并且基于网络上的博客,似乎Apple正在以安全性和新文件系统的名义破坏事物。我怀疑在这种情况下它是安全相关的,但如果他们引入了一个改变命令和框架来处理APFS的错误,我不会感到惊讶。

答案 1 :(得分:1)

我还观察到以下问题:在hdiutil detach之后的较新OS X版本上,DMG仍然被diskimage-helper占用,由于出现错误消息,我无法执行hdiutil convert。 / p>

我的解决方案只是先复制源文件,因为这样可以正常工作,然后对副本进行转换。到目前为止,对我来说这没有问题。