Ошибка при попытке создать и смонтировать новый том HFS (для проверки драйвера схемы фильтра) - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь протестировать пример приложения 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" }

UPDATE4: я изменил идентификатор пакета в списке, чтобы он совпадал, и теперь он не выдает ошибку «names the kext not 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:

Теперь моя ОС постоянно дает сбой каждый раз, когда я загружаю 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 Ответ

0 голосов
/ 09 января 2019

Чтобы ответить на ваши оригинальные вопросы:

[Почему «Нет монтируемых файловых систем», когда не загружается kext и не используется тип раздела «osxbook_HFS»]

Как видите, схема разделов Apple использует произвольные текстовые строки для определения типа раздела. macOS дословно использует эту строку в качестве «подсказки содержимого», которая выбирает тип файловой системы, который будет пытаться автоматически смонтировать этот том. Файловая система HFS + ищет только Apple_HFSApple_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. Проверьте с помощью IORegistryExplorer или ioreg, соответствует ли он тому специальному типу раздела, и создает ли он и регистрирует виртуальный (расшифрованный) том с подсказкой Apple_HFS содержимого. Добавьте вывод ioreg (ioreg -w 0 -lirc YOUR_DRIVERS_CLASSNAME) к вашему вопросу, если не уверены.

...