尝试创建和安装新的 HFS 卷时出错(为了测试过滤方案驱动程序)
Error when trying to create and mount a new HFS volume (in order to test filter scheme driver)
我正在尝试测试实现过滤方案的 IO 套件示例应用程序。请参阅构建的 10.7.10 here for context. As the source there is hard to cut and paste (and when I tried I got errors), I am using the source from here 部分。
在该页 (1038) 的最后一张图中,它包含创建和安装新 HFS 卷的一系列步骤。这个想法是为了看到 KEXT 正在工作并进行加密。我已经构建了示例 KEXT 并对其进行了测试,但是当我进行 "open" 调用时,我总是会收到 "No mountable file systems" 错误。我已验证 KEXT 已正确加载。
如果我删除“-partitionType”,我就可以正常操作音量(尽管这不涉及 KEXT)。
有人可以建议这里可能出了什么问题吗?
我对图 1038 的脚本感到困惑的部分原因是打开前 运行 的 "detach" 命令。它对我来说失败了,但我不确定这是导致 "open" 失败的原因,还是无关的。
$ sudo kextload /System/Library/Extensions/IOKitDriverTestApp.kext/
$ hdiutil create -size 32m -partitionType osxbook_HFS /tmp/crypto.dmg
created: /tmp/crypto.dmg
$ hdiutil attach -nomount /tmp/crypto.dmg
/dev/disk2 Apple_partition_scheme
/dev/disk2s1 Apple_partition_map
/dev/disk2s2 osxbook_HFS
$ diskutil list
/dev/disk0 (internal, physical):
[cut]
/dev/disk1 (synthesized):
[cut]
/dev/disk2 (disk image):
#: TYPE NAME SIZE IDENTIFIER
0: Apple_partition_scheme +33.6 MB disk2
1: Apple_partition_map 32.3 KB disk2s1
2: osxbook_HFS 33.5 MB disk2s2
$ newfs_hfs -v Crypto /dev/rdisk2s2
Initialized /dev/rdisk2s2 as a 32 MB case-insensitive HFS Plus volume
$ hdiutil detach /dev/disk2
hdiutil: detach failed - No such file or directory
$ open /tmp/crypto.dmg
==> Get popup window with error "crypto.dmg" "No mountable file systems"
更新:问题最初是针对未加载 KEXT 的情况。自从我让它工作后,我改变了它以反映 KEXT 的情况,无论如何这更重要。
更新 2:似乎最终 kext 被卸载了(可能崩溃)。有时似乎在 "open" 前后,有时在之后。我尝试添加像 IOLog("CSD: init") 这样的语句,但其中 none 出现在系统日志或控制台日志中。寻找我还能如何对此进行分类(不需要单独的机器)。
UPDATE3:以下是我尝试启动 KEXT 时的输出。有很多警告,但由于我禁用了签名检查,我认为它仍在加载。我还看到它是通过 kextstat 加载的。
另一件奇怪的事情是我在 "ioreg" 的输出中没有看到这个 KEXT 的任何迹象,也没有看到 IOLog() 的任何打印语句。
My-MacBook-Pro:Extensions myuser$ sudo kextutil -v /System/Library/Extensions/IOKitDriverTestApp.kext/
Defaulting to kernel file '/System/Library/Kernels/kernel'
Kext with invalid signatured (-67050) allowed: <OSKext 0x7fa53703ec70 [0x7fff8fe6faf0]> { URL = "file:///System/Library/Extensions/IOKitDriverTestApp.kext/", ID = "com.osxbook.driver.IOKitDriverTestApp" }
Code Signing Failure: code signature is invalid
Warnings:
Personality CFBundleIdentifier differs from containing kext's (not necessarily a mistake, but rarely done):
SimpleCryptoDisk
Personality CFBundleIdentifier names a kext that can't be found:
'SimpleCryptoDisk' -> 'com.osxbook.driver.SimpleCryptoDisk'
Warnings:
Personality CFBundleIdentifier differs from containing kext's (not necessarily a mistake, but rarely done):
SimpleCryptoDisk
Personality CFBundleIdentifier names a kext that can't be found:
'SimpleCryptoDisk' -> 'com.osxbook.driver.SimpleCryptoDisk'
/System/Library/Extensions/IOKitDriverTestApp.kext appears to be loadable (not including linkage for on-disk libraries).
Loading /System/Library/Extensions/IOKitDriverTestApp.kext.
/System/Library/Extensions/IOKitDriverTestApp.kext successfully loaded (or already loaded).
Invalid signature -67050 for kext <OSKext 0x7fa53703ec70 [0x7fff8fe6faf0]> { URL = "file:///System/Library/Extensions/IOKitDriverTestApp.kext/", ID = "com.osxbook.driver.IOKitDriverTestApp" }
更新 4:我调整了 plist 中的 bundle ID 使其匹配,现在它没有给出 "names a kext that can't be found" 错误:
My-MacBook-Pro:Debug myuser$ sudo kextutil -v /System/Library/Extensions/IOKitDriverTestApp.kext/
Password:
Defaulting to kernel file '/System/Library/Kernels/kernel'
Kext with invalid signatured (-67050) allowed: <OSKext 0x7f8be663ecf0 [0x7fff866bcaf0]> { URL = "file:///System/Library/Extensions/IOKitDriverTestApp.kext/", ID = "com.osxbook.driver.IOKitDriverTestApp" }
Code Signing Failure: code signature is invalid
/System/Library/Extensions/IOKitDriverTestApp.kext appears to be loadable (not including linkage for on-disk libraries).
Loading /System/Library/Extensions/IOKitDriverTestApp.kext.
/System/Library/Extensions/IOKitDriverTestApp.kext successfully loaded (or already loaded).
Invalid signature -67050 for kext <OSKext 0x7f8be663ecf0 [0x7fff866bcaf0]> { URL = "file:///System/Library/Extensions/IOKitDriverTestApp.kext/", ID = "com.osxbook.driver.IOKitDriverTestApp" }
更新 5:
现在我的 OS 每次加载 KEXT 然后执行 "hdiutil attach -nomount /tmp/crypto.dmg"(在创建 /tmp/crypto.dmg 之后)时都会崩溃。
很明显我的 KEXT 现在 运行ning,但出于某种原因,我仍然没有在任何地方看到 IOLog() 语句。将不得不查看系统日志,看看是否有任何迹象表明它崩溃的原因。
UPDATE6:我已经能够得到符号化的内核恐慌,但它指向不同的 KEXT(我认为我也没有源代码)。下面是它的相关部分。
我尝试使用相同测试 KEXT (here) 的另一个版本,没有任何更改(我暂时删除了 IOLog() 语句,因为它们没有出现)。
我看到一个注释,这是在 Mac OS 10.6 上测试的,但是有人让这个示例在 10.13.16 (High Sierra) 上运行吗?
...
0xffffff800c94f540 : 0xffffff800cb8776f mach_kernel : _kernel_trap + 0x70f
0xffffff800c94f6b0 : 0xffffff800ca1e1e0 mach_kernel : _return_from_trap + 0xe0
0xffffff800c94f6d0 : 0xffffff7f8d527251 com.apple.iokit.IOStorageFamily : __ZN9IOStorage8completeEP19IOStorageCompletioniy + 0x27
0xffffff81f7a4b980 : 0xffffff7f8d51a0c4 com.apple.iokit.IOStorageFamily : __ZN20IOBlockStorageDriver24prepareRequestCompletionEPvS0_iy + 0xc2
0xffffff81f7a4b9e0 : 0xffffff7f903afa7a com.apple.driver.DiskImages : __ZN13IOHDIXCommand8completeEiy + 0x26
0xffffff81f7a4ba00 : 0xffffff7f903adbfe com.apple.driver.DiskImages : __ZN22IOHDIXHDDriveOutKernel12processReplyEPK13HDIReplyOOL64P18IOMemoryDescriptor + 0x2be
0xffffff81f7a4ba60 : 0xffffff7f903aee9b com.apple.driver.DiskImages : __ZN32IOHDIXHDDriveOutKernelUserClient14processReply64EPK13HDIReplyOOL64 + 0xd3
0xffffff81f7a4bac0 : 0xffffff800d0c3959 mach_kernel : _shim_io_connect_method_structureI_structureO + 0x1c9
0xffffff81f7a4bb20 : 0xffffff800d0c1ae0 mach_kernel : __ZN12IOUserClient14externalMethodEjP25IOExternalMethodArgumentsP24IOExternalMethodDispatchP8OSObjectPv + 0x340
0xffffff81f7a4bb70 : 0xffffff800d0ca567 mach_kernel : _is_io_connect_method + 0x217
...
更新 7:我放弃了尝试使用 SimpleCryptoDisk.cpp 测试应用程序并从头开始,一次添加一点代码。我已经取得了一些成功(驱动程序启动并且我可以看到日志记录),但我还没有任何工作。
如果我卡在这个问题上,我可能会 post 另一个问题,但我会继续并将 pmdj 的回答标记为正确,因为他回答了我最初的问题。
但是,如果有人知道可以在 High Sierra 上运行的 SimpleCryptoDisk 的修改版本,我仍然很想知道。
回答您原来的问题:
[Why "No mountable file systems" when not loading the kext and using partition type "osxbook_HFS"]
如您所见,Apple 分区方案使用任意文本字符串来识别分区类型。 macOS 逐字使用此字符串作为 "content hint",它选择要尝试在该卷上自动挂载的文件系统类型。 HFS+ 文件系统只查找 Apple_HFS
(区分大小写的 Apple_HFSX
)
kext 背后的想法是它本身匹配新定义的内容提示并发布一个新的存储 nub 对象,该对象又具有 HFS+ 内容提示供文件系统获取。
为什么 hdiutil detach
失败了
$ hdiutil detach /dev/disk2
hdiutil: detach failed - No such file or directory
在当前版本的 macOS 上,您需要将命令重写为:
$ hdiutil detach disk2
要么
$ hdiutil detach /Volumes/VOLUMENAME
我无法立即回答您当前的问题,即为什么它无法使用 与 kext,但我可以建议您查看您的 kext 是否按预期运行IO 注册表。使用 IORegistryExplorer 或 ioreg
检查它是否将卷与特殊分区类型匹配,以及它是否正在创建和注册具有 Apple_HFS
内容提示的虚拟(解密)卷。如果不确定,请将 ioreg
输出 (ioreg -w 0 -lirc YOUR_DRIVERS_CLASSNAME
) 添加到您的问题中。
我正在尝试测试实现过滤方案的 IO 套件示例应用程序。请参阅构建的 10.7.10 here for context. As the source there is hard to cut and paste (and when I tried I got errors), I am using the source from here 部分。
在该页 (1038) 的最后一张图中,它包含创建和安装新 HFS 卷的一系列步骤。这个想法是为了看到 KEXT 正在工作并进行加密。我已经构建了示例 KEXT 并对其进行了测试,但是当我进行 "open" 调用时,我总是会收到 "No mountable file systems" 错误。我已验证 KEXT 已正确加载。
如果我删除“-partitionType”,我就可以正常操作音量(尽管这不涉及 KEXT)。
有人可以建议这里可能出了什么问题吗?
我对图 1038 的脚本感到困惑的部分原因是打开前 运行 的 "detach" 命令。它对我来说失败了,但我不确定这是导致 "open" 失败的原因,还是无关的。
$ sudo kextload /System/Library/Extensions/IOKitDriverTestApp.kext/
$ hdiutil create -size 32m -partitionType osxbook_HFS /tmp/crypto.dmg
created: /tmp/crypto.dmg
$ hdiutil attach -nomount /tmp/crypto.dmg
/dev/disk2 Apple_partition_scheme
/dev/disk2s1 Apple_partition_map
/dev/disk2s2 osxbook_HFS
$ diskutil list
/dev/disk0 (internal, physical):
[cut]
/dev/disk1 (synthesized):
[cut]
/dev/disk2 (disk image):
#: TYPE NAME SIZE IDENTIFIER
0: Apple_partition_scheme +33.6 MB disk2
1: Apple_partition_map 32.3 KB disk2s1
2: osxbook_HFS 33.5 MB disk2s2
$ newfs_hfs -v Crypto /dev/rdisk2s2
Initialized /dev/rdisk2s2 as a 32 MB case-insensitive HFS Plus volume
$ hdiutil detach /dev/disk2
hdiutil: detach failed - No such file or directory
$ open /tmp/crypto.dmg
==> Get popup window with error "crypto.dmg" "No mountable file systems"
更新:问题最初是针对未加载 KEXT 的情况。自从我让它工作后,我改变了它以反映 KEXT 的情况,无论如何这更重要。
更新 2:似乎最终 kext 被卸载了(可能崩溃)。有时似乎在 "open" 前后,有时在之后。我尝试添加像 IOLog("CSD: init") 这样的语句,但其中 none 出现在系统日志或控制台日志中。寻找我还能如何对此进行分类(不需要单独的机器)。
UPDATE3:以下是我尝试启动 KEXT 时的输出。有很多警告,但由于我禁用了签名检查,我认为它仍在加载。我还看到它是通过 kextstat 加载的。
另一件奇怪的事情是我在 "ioreg" 的输出中没有看到这个 KEXT 的任何迹象,也没有看到 IOLog() 的任何打印语句。
My-MacBook-Pro:Extensions myuser$ sudo kextutil -v /System/Library/Extensions/IOKitDriverTestApp.kext/
Defaulting to kernel file '/System/Library/Kernels/kernel'
Kext with invalid signatured (-67050) allowed: <OSKext 0x7fa53703ec70 [0x7fff8fe6faf0]> { URL = "file:///System/Library/Extensions/IOKitDriverTestApp.kext/", ID = "com.osxbook.driver.IOKitDriverTestApp" }
Code Signing Failure: code signature is invalid
Warnings:
Personality CFBundleIdentifier differs from containing kext's (not necessarily a mistake, but rarely done):
SimpleCryptoDisk
Personality CFBundleIdentifier names a kext that can't be found:
'SimpleCryptoDisk' -> 'com.osxbook.driver.SimpleCryptoDisk'
Warnings:
Personality CFBundleIdentifier differs from containing kext's (not necessarily a mistake, but rarely done):
SimpleCryptoDisk
Personality CFBundleIdentifier names a kext that can't be found:
'SimpleCryptoDisk' -> 'com.osxbook.driver.SimpleCryptoDisk'
/System/Library/Extensions/IOKitDriverTestApp.kext appears to be loadable (not including linkage for on-disk libraries).
Loading /System/Library/Extensions/IOKitDriverTestApp.kext.
/System/Library/Extensions/IOKitDriverTestApp.kext successfully loaded (or already loaded).
Invalid signature -67050 for kext <OSKext 0x7fa53703ec70 [0x7fff8fe6faf0]> { URL = "file:///System/Library/Extensions/IOKitDriverTestApp.kext/", ID = "com.osxbook.driver.IOKitDriverTestApp" }
更新 4:我调整了 plist 中的 bundle ID 使其匹配,现在它没有给出 "names a kext that can't be found" 错误:
My-MacBook-Pro:Debug myuser$ sudo kextutil -v /System/Library/Extensions/IOKitDriverTestApp.kext/
Password:
Defaulting to kernel file '/System/Library/Kernels/kernel'
Kext with invalid signatured (-67050) allowed: <OSKext 0x7f8be663ecf0 [0x7fff866bcaf0]> { URL = "file:///System/Library/Extensions/IOKitDriverTestApp.kext/", ID = "com.osxbook.driver.IOKitDriverTestApp" }
Code Signing Failure: code signature is invalid
/System/Library/Extensions/IOKitDriverTestApp.kext appears to be loadable (not including linkage for on-disk libraries).
Loading /System/Library/Extensions/IOKitDriverTestApp.kext.
/System/Library/Extensions/IOKitDriverTestApp.kext successfully loaded (or already loaded).
Invalid signature -67050 for kext <OSKext 0x7f8be663ecf0 [0x7fff866bcaf0]> { URL = "file:///System/Library/Extensions/IOKitDriverTestApp.kext/", ID = "com.osxbook.driver.IOKitDriverTestApp" }
更新 5:
现在我的 OS 每次加载 KEXT 然后执行 "hdiutil attach -nomount /tmp/crypto.dmg"(在创建 /tmp/crypto.dmg 之后)时都会崩溃。
很明显我的 KEXT 现在 运行ning,但出于某种原因,我仍然没有在任何地方看到 IOLog() 语句。将不得不查看系统日志,看看是否有任何迹象表明它崩溃的原因。
UPDATE6:我已经能够得到符号化的内核恐慌,但它指向不同的 KEXT(我认为我也没有源代码)。下面是它的相关部分。
我尝试使用相同测试 KEXT (here) 的另一个版本,没有任何更改(我暂时删除了 IOLog() 语句,因为它们没有出现)。
我看到一个注释,这是在 Mac OS 10.6 上测试的,但是有人让这个示例在 10.13.16 (High Sierra) 上运行吗?
...
0xffffff800c94f540 : 0xffffff800cb8776f mach_kernel : _kernel_trap + 0x70f
0xffffff800c94f6b0 : 0xffffff800ca1e1e0 mach_kernel : _return_from_trap + 0xe0
0xffffff800c94f6d0 : 0xffffff7f8d527251 com.apple.iokit.IOStorageFamily : __ZN9IOStorage8completeEP19IOStorageCompletioniy + 0x27
0xffffff81f7a4b980 : 0xffffff7f8d51a0c4 com.apple.iokit.IOStorageFamily : __ZN20IOBlockStorageDriver24prepareRequestCompletionEPvS0_iy + 0xc2
0xffffff81f7a4b9e0 : 0xffffff7f903afa7a com.apple.driver.DiskImages : __ZN13IOHDIXCommand8completeEiy + 0x26
0xffffff81f7a4ba00 : 0xffffff7f903adbfe com.apple.driver.DiskImages : __ZN22IOHDIXHDDriveOutKernel12processReplyEPK13HDIReplyOOL64P18IOMemoryDescriptor + 0x2be
0xffffff81f7a4ba60 : 0xffffff7f903aee9b com.apple.driver.DiskImages : __ZN32IOHDIXHDDriveOutKernelUserClient14processReply64EPK13HDIReplyOOL64 + 0xd3
0xffffff81f7a4bac0 : 0xffffff800d0c3959 mach_kernel : _shim_io_connect_method_structureI_structureO + 0x1c9
0xffffff81f7a4bb20 : 0xffffff800d0c1ae0 mach_kernel : __ZN12IOUserClient14externalMethodEjP25IOExternalMethodArgumentsP24IOExternalMethodDispatchP8OSObjectPv + 0x340
0xffffff81f7a4bb70 : 0xffffff800d0ca567 mach_kernel : _is_io_connect_method + 0x217
...
更新 7:我放弃了尝试使用 SimpleCryptoDisk.cpp 测试应用程序并从头开始,一次添加一点代码。我已经取得了一些成功(驱动程序启动并且我可以看到日志记录),但我还没有任何工作。
如果我卡在这个问题上,我可能会 post 另一个问题,但我会继续并将 pmdj 的回答标记为正确,因为他回答了我最初的问题。
但是,如果有人知道可以在 High Sierra 上运行的 SimpleCryptoDisk 的修改版本,我仍然很想知道。
回答您原来的问题:
[Why "No mountable file systems" when not loading the kext and using partition type "osxbook_HFS"]
如您所见,Apple 分区方案使用任意文本字符串来识别分区类型。 macOS 逐字使用此字符串作为 "content hint",它选择要尝试在该卷上自动挂载的文件系统类型。 HFS+ 文件系统只查找 Apple_HFS
(区分大小写的 Apple_HFSX
)
kext 背后的想法是它本身匹配新定义的内容提示并发布一个新的存储 nub 对象,该对象又具有 HFS+ 内容提示供文件系统获取。
为什么 hdiutil detach
失败了
$ hdiutil detach /dev/disk2 hdiutil: detach failed - No such file or directory
在当前版本的 macOS 上,您需要将命令重写为:
$ hdiutil detach disk2
要么
$ hdiutil detach /Volumes/VOLUMENAME
我无法立即回答您当前的问题,即为什么它无法使用 与 kext,但我可以建议您查看您的 kext 是否按预期运行IO 注册表。使用 IORegistryExplorer 或 ioreg
检查它是否将卷与特殊分区类型匹配,以及它是否正在创建和注册具有 Apple_HFS
内容提示的虚拟(解密)卷。如果不确定,请将 ioreg
输出 (ioreg -w 0 -lirc YOUR_DRIVERS_CLASSNAME
) 添加到您的问题中。