我正在尝试测试实现过滤器方案的IO套件示例应用程序。有关上下文,请参见此处的10.7.10部分。作为来源,很难剪切和粘贴(当我尝试时遇到错误),我使用的是here构建的来源。
在该页面的最后一个图(1038)中,它具有创建和安装新HFS卷的一系列步骤。这样做的目的是看到KEXT正在工作并且正在进行加密。我已经构建了示例KEXT并对其进行了测试,但是当我进行“打开”调用时,总是收到“无可挂载文件系统”错误。我已验证KEXT是否正确加载。
如果删除“ -partitionType”,则可以正常操作该卷(尽管这不涉及KEXT)。
有人可以建议这里出什么问题吗?
在图1038的脚本中,我感到困惑的部分原因是在打开之前运行的“ detach”命令。对于我来说,它失败了,但是我不确定这是导致“打开”失败还是与之无关的原因。
$ 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的情况,无论如何这都更为重要。
UPDATE2:看来最终kext会被卸载(可能崩溃)。有时似乎在“开放”的时间左右,有时在之后。我尝试添加诸如IOLog(“ CSD:init”)之类的语句,但是它们都未显示在系统日志或控制台日志中。寻找其他方法(不需要单独的机器)可以对此进行分类。
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" }
UPDATE4:我调整了plist中的包ID,使其匹配,现在它没有给出“名称找不到的kext”错误:
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" }
UPDATE5:
现在,每次加载KEXT并执行“ hdiutil attach -nomount /tmp/crypto.dmg”(创建/tmp/crypto.dmg之后)后,我的操作系统始终崩溃。
似乎我的KEXT现在正在运行,但是由于某些原因,我仍然看不到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
...
UPDATE7:我放弃了尝试使用SimpleCryptoDisk.cpp测试应用程序的工作,从头开始,一次添加了一些代码。我取得了一些成功(驱动程序启动了,我可以看到日志记录),尽管我实际上还没有任何工作。
如果我对此卡住了,我可能会发布另一个问题,但是我会继续并将pmdj的答案标记为正确,因为他回答了我的原始问题。
但是,如果有人知道可以在High Sierra上运行的SimpleCryptoDisk的修改版本,那么我仍然想知道。
答案 0 :(得分:1)
要回答您的原始问题:
[为什么不加载kext并使用分区类型“ osxbook_HFS”时会显示“无可挂载文件系统”]
如您所见,Apple分区方案使用任意文本字符串来标识分区类型。 macOS将此字符串原样用作“内容提示”,该内容选择尝试在该卷上自动挂载的文件系统类型。 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 Registry有关的预期。使用IORegistryExplorer或ioreg
检查它是否与具有特殊分区类型的卷匹配,以及是否正在创建和注册带有Apple_HFS
内容提示的虚拟(解密)卷。如果不确定,请将ioreg
输出(ioreg -w 0 -lirc YOUR_DRIVERS_CLASSNAME
)添加到您的问题中。