Giữ chương trình sau luôn chạy mọi lúc trong nền, ví dụ: bằng cách tự động bắt đầu sử dụng 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;
}
Tìm hiểu UUID của âm lượng bạn không muốn gắn kết bằng cách sử dụng diskutil list
(để lấy tên thiết bị) và diskutil info
để đọc UUID.
Lưu dưới dạng main.c và biên dịch bằng lệnh sau (bạn cần Công cụ dành cho nhà phát triển):
cc main.c -o mountstopd -framework Foundation -framework DiskArbitration
Trên Mac OS X 10.7.1, việc thực hiện sau đây đã giúp tôi rất nhiều (khá giống với những gì trong OS X Gợi ý):
Trước tiên, hãy tìm hiểu tên thiết bị của âm lượng bạn không muốn gắn:
diskutil list
Đầu ra một phần trông như thế này:
/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
Trong ví dụ này, DropboBackup là phân vùng thực tế, vì vậy /dev/disk3s3
là thiết bị chúng ta cần tiếp theo. Sau đó tìm ra UUID của nó:
diskutil info /dev/disk3s3
Tìm kiếm Volume UUID
, ví dụ. 3B5315C1-96AE-3471-B43C-2C41CDB12A64
.
Sau đó, nhập như sau:
sudo touch /etc/fstab
sudo sh -c 'echo "UUID=3B5315C1-96AE-3471-B43C-2C41CDB12A64 none hfs rw,noauto" >> /etc/fstab'
Điều này sẽ ngăn đĩa gắn.