Следите за тем, чтобы следующая программа работала в фоновом режиме, например, с помощью автоматического запуска с помощью launchd
#include <CoreFoundation/CoreFoundation.h>
#include <DiskArbitration/DiskArbitration.h>
DADissenterRef BlockMount(DADiskRef disk, void *context)
{
DADissenterRef dissenter = DADissenterCreate(kCFAllocatorDefault, kDAReturnNotPermitted, CFSTR("forbidden!"));
CFDictionaryRef description = DADiskCopyDescription(disk);
// UUID of the disk you don't want to mount:
CFUUIDRef backupDisk = CFUUIDCreateFromString(NULL, CFStringCreateWithCString(NULL, "3B5315C1-96AE-3471-B43C-2C41CDB12A64", kCFStringEncodingUTF8));
if (CFDictionaryContainsKey(description, kDADiskDescriptionVolumeUUIDKey)) {
CFUUIDRef value = CFDictionaryGetValue(description, kDADiskDescriptionVolumeUUIDKey);
if (CFEqual(backupDisk, value)) {
return dissenter;
}
}
return NULL;
}
int main (int argc, const char * argv[])
{
DAApprovalSessionRef session = DAApprovalSessionCreate (kCFAllocatorDefault);
if (!session)
{
fprintf(stderr, "failed to create Disk Arbitration session");
}
else
{
DARegisterDiskMountApprovalCallback(session, NULL, BlockMount, NULL);
DAApprovalSessionScheduleWithRunLoop(session, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
while (true) {
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 60 /* seconds */, false);
}
DAApprovalSessionUnscheduleFromRunLoop(session, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
DAUnregisterApprovalCallback(session, BlockMount, NULL);
CFRelease(session);
}
return 0;
}
Узнайте UUID тома, который вы не хотите монтировать, используя diskutil list
(чтобы получить имя устройства) и информацию о diskutil info
для чтения UUID.
Сохраните как main.c и скомпилируйте с помощью следующей команды (вам нужны инструменты разработчика):
cc main.c -o mountstopd -framework Foundation -framework DiskArbitration
На Mac OS X 10.7.1 выполнение следующего работало для меня только сейчас (в значительной степени идентично тому, что в OS X Hint):
Сначала найдите имя устройства тома, который вы не хотите монтировать:
diskutil list
Частичный вывод выглядит так:
/dev/disk3
#: TYPE NAME SIZE IDENTIFIER
0: Apple_partition_scheme *2.2 TB disk3
1: Apple_partition_map 32.3 KB disk3s1
2: Apple_HFS DroboBackup 2.2 TB disk3s3
В этом примере DroboBackup является фактическим разделом, поэтому /dev/disk3s3
- это устройство, которое нам нужно дальше. Тогда узнайте его UUID:
diskutil info /dev/disk3s3
Найдите Volume UUID
, например, 3B5315C1-96AE-3471-B43C-2C41CDB12A64
.
Затем введите следующее:
sudo touch /etc/fstab
sudo sh -c 'echo "UUID=3B5315C1-96AE-3471-B43C-2C41CDB12A64 none hfs rw,noauto" >> /etc/fstab'
Это предотвратит монтаж диска.