Общедоступного KPI для инициирования монтирования нет, и я даже не знаю о такой функции в com.apple.kpi.private
. Однако в пользовательском пространстве в вашем распоряжении гораздо больше, чем DiskImages.framework: есть DiskArbitration.framework
и, конечно же, системный вызов POSIX mount(2)
.
Я думаю, вы можете объединить здесь два понятия, которые на самом деле совершенно разные:
- Открытие образов дисков и создание виртуального блочного устройства для доступа к их содержимому
- Монтирование файловой системы на блочном устройстве.
Поддержка образов дисков не является неотъемлемой частью ядра xnu. Они реализованы в объекте IOHDIXController
(код для этого находится в kext), который вы найдете прикрепленным к IOResources
в IORegistry. Когда пользователь дважды щелкает файл .dmg или аналогичный, демон diskimages-helper
открывает и анализирует его и дает команду IOHDIXController создать новый экземпляр IODiskImageBlockStorageDeviceOutKernel
(подкласс IOBlockStorageDevice
). Это выглядит для ОС как физическое блочное устройство, и обычный стек объектов IOBlockStorageDriver
-> IOMedia
-> IOPartitionScheme
-> IOMedia
-> IOMediaBSDClient
настраивается поверх него. Затем это вызывает запуск событий обнаружения устройств в diskarbitrationd
, который переходит ко второй части процесса: вызову mount(2)
на вновь обнаруженных IOMedia
объектах /dev/diskXsY
узла (узлов) по мере необходимости.
Насколько мне известно, подсистема HDIX закрыта. Поэтому, если вы хотите реализовать свой собственный формат образа диска, вам нужно будет воссоздать что-то похожее на Apple diskimage-helper
и IOHDIXController.kext
. Возможно, вам сойдет с рук реализация его полностью в ядре, если вы предпочитаете, хотя это, вероятно, не очень хорошая идея.
Вторая часть, монтирование, выполняется diskarbitrationd автоматически, если вы используете стек IOStorage, но вы можете повлиять на него с помощью несогласного арбитража диска. Дополнительные сведения см. в разделе DiskArbitration.framework. Но это также позволяет вам влиять на монтирование образов дисков, обрабатываемых diskimages-helper
, поэтому, если вы используете поддерживаемый им формат образа, вам не нужно будет писать свой собственный, и вы можете просто перехватить монтирование и делать все, что хотите. сами.
Вероятно, вы также можете полностью обойти стек IOStorage и создать только узел разработки BSD в своем kext. В этом случае diskarbitrationd этого не заметит, и вам нужно будет вызвать mount()
явно из вашего демона.
Я надеюсь, что это проясняет ситуацию.
person
pmdj
schedule
01.03.2018