Смонтировать/размонтировать файловую систему из расширения ядра macOS

hdiutil может прикреплять и отсоединять файл DMG, содержащий раздел HFS+, в выбранную точку монтирования. Однако он использует частный API DiskImages.framework. Моя цель состоит в том, чтобы сделать эту задачу полностью программной, поэтому я ищу альтернативу в области драйверов ядра.

копаясь в KPI, представленном <sys/mount.h>, я нашел полезный метод для размонтирования файловой системы в соответствии с ее соответствующим fsid:

int vfs_unmountbyfsid(fsid_t *fsid, int flags, vfs_context_t ctx)

Однако есть ли у нас обратная операция для mount ?


person Zohar81    schedule 28.02.2018    source источник


Ответы (1)


Общедоступного KPI для инициирования монтирования нет, и я даже не знаю о такой функции в com.apple.kpi.private. Однако в пользовательском пространстве в вашем распоряжении гораздо больше, чем DiskImages.framework: есть DiskArbitration.framework и, конечно же, системный вызов POSIX mount(2).

Я думаю, вы можете объединить здесь два понятия, которые на самом деле совершенно разные:

  1. Открытие образов дисков и создание виртуального блочного устройства для доступа к их содержимому
  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
comment
Привет, причина, по которой я хочу, чтобы мой процесс отвечал за присоединение файла dmg к процессу точки монтирования, заключается в том, что у меня есть модуль kauth, который отфильтровывает другие процессы при доступе к файлу изображения (.dmg) и избегает добавления инструментов Apple в белый список. (например, hfs_mount и hdiutil). обратите внимание, что dmg уже отформатирован в формате hfs +, мне просто нужно прикрепить его к какой-либо точке монтирования, чтобы я мог получить доступ к его содержимому. Я попытался выполнить дискарбитацию, DADiskMount, но для этого требуется имя устройства, а не файл изображения. - person Zohar81; 02.03.2018
comment
кстати, я пытался использовать mount(2), но для этого требуется файл устройства в соответствии с struct hfs_mount_args. единственное, чего мне не хватает, чтобы сделать процесс монтирования полностью программным, это имитировать hdiutil attach, который прикрепляет файл образа (dmg) к файлу устройства. любая идея, как это можно сделать? Спасибо - person Zohar81; 04.03.2018
comment
@ Zohar81 Я думаю, вы путаете монтирование с открытием образов дисков. Это 2 отдельных процесса. Я обновил свой ответ, чтобы объяснить, как именно это работает. - person pmdj; 05.03.2018