Ошибка при попытке создать и смонтировать новый том HFS (для проверки драйвера схемы фильтра)
Я пытаюсь протестировать пример приложения IO kit, в котором реализована схема фильтрации. См. Раздел 10.7.10 здесь для контекста. Поскольку источник трудно вырезать и вставить (и когда я попытался, я получил ошибки), я использую источник, который собирает.
На последнем рисунке на этой странице (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, который в любом случае важнее.
ОБНОВЛЕНИЕ 2: Кажется, что в конечном итоге kext выгружается (возможно, происходит сбой). Иногда кажется, что во время "открытия", иногда после. Я попытался добавить операторы типа IOLog("CSD: init"), но ни один из них не появился в системном журнале или журнале консоли. Ищете, как еще я могу сортировать это (без необходимости отдельной машины).
ОБНОВЛЕНИЕ 3: Ниже вывод, когда я пытаюсь запустить KEXT. Есть множество предупреждений, но так как у меня отключена проверка подписи, я думаю, что она все еще загружается. Также я вижу, что он загружается через kextstat.
Другая странная вещь - я не вижу никаких признаков этого KEXT в выводе "ioreg", и при этом я не вижу никаких операторов печати из 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: Я изменил идентификатор пакета в листе, чтобы он совпадал, и теперь он не выдает ошибку "имена не найдены":
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(). Придется просматривать системные журналы и видеть, есть ли какие-либо признаки, почему он дает сбой.
ОБНОВЛЕНИЕ 6: Я был в состоянии получить символическую панику ядра, но это указывает на другой KEXT (который я не думаю, что у меня также есть источник). Ниже приведена соответствующая часть.
Я попытался использовать другую версию того же самого теста KEXT ( здесь) без каких-либо изменений (пока я удалил операторы 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 и начал с нуля, добавляя немного кода за раз. У меня был некоторый успех (драйвер запускается, и я вижу журнал), хотя у меня пока ничего не работает.
Если я застряну в этом, я могу опубликовать еще один вопрос, но я продолжу и отмечу ответ pmdj как правильный, так как он ответил на мой первоначальный вопрос.
Если кто-нибудь знает модифицированную версию SimpleCryptoDisk, которая работает на High Sierra, я все же хотел бы знать, однако.
1 ответ
Чтобы ответить на ваши оригинальные вопросы:
[Почему "Нет монтируемых файловых систем", когда не загружается kext и не используется тип раздела "osxbook_HFS"]
Как видите, схема разделов Apple использует произвольные текстовые строки для определения типа раздела. macOS дословно использует эту строку в качестве "подсказки содержимого", которая выбирает тип файловой системы, который будет пытаться автоматически смонтировать этот том. Файловая система HFS+ ищет только Apple_HFS
(а также Apple_HFSX
с учетом регистра)
Идея, стоящая за kext, заключается в том, что он сам соответствует вновь определенной подсказке содержимого и публикует новый объект-хранилище, который, в свою очередь, содержит подсказку содержимого 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 RegistryExplorer или ioreg
соответствует ли он тому типу специального раздела, и создает ли он и регистрирует виртуальный (расшифрованный) том с помощью Apple_HFS
Содержание подсказки. Добавить ioreg
выход (ioreg -w 0 -lirc YOUR_DRIVERS_CLASSNAME
) на ваш вопрос, если не уверены.