【问题标题】:Invalidate kextcache after removing driver launchd plist file删除驱动程序启动 plist 文件后使 kextcache 无效
【发布时间】:2016-09-06 20:26:29
【问题描述】:

我已经为我的驱动程序创建了卸载程序,它从/Library/LaunchDaemons 中删除了它的匹配 plist 文件,这样它就不会在下一个引导周期被 launchd 再次加载。 但是,它似乎对启动机器后仍在正常加载的驱动程序没有任何影响。

在对此事进行了一些研究后,我发现kextcache 是导致此行为的原因,为了清理/使其无效,我需要touch 安装目标卷所在的文件夹。但是,它没有任何效果。

我的问题是如何正确地使 kext 缓存无效,以便在删除相应的 plist 文件后,launchd 不会加载 kext。

感谢下面的答案,我使 kext 缓存无效。但是,我希望在我的卸载程序助手所基于的目标 c 中访问现有文件夹的等价物。

确切地说,这是我想转换为 Objective-C 的代码:

sudo touch /System/Library/Extensions; sudo touch /Library/Extensions

【问题讨论】:

    标签: macos launchd kernel-extension xnu


    【解决方案1】:

    使 kext 缓存失效的正确方法是

    sudo touch /System/Library/Extensions
    

    或在支持从 /Library 加载扩展的操作系统版本中:

    sudo touch /Library/Extensions
    

    执行此操作后,kext 缓存会自动重新生成。

    【讨论】:

    • 当我手动输入时它似乎可以工作,但是当我通过objective-c卸载助手从applescript运行它时,我什么也没做。也许你可以告诉我我的代码NSString * script = [NSString stringWithFormat:@"do shell script \"touch /Library/Extensions/; touch /System/Library/Extensions/\" with administrator privileges"]; NSAppleScript *appleScript = [[NSAppleScript new] initWithSource:script]; 有什么问题。请注意,我在特权模式下运行它
    • 我也很高兴听到您是否有更好的方法从用 Objective-C 编写的卸载程序助手执行此命令,但如果值得付出努力,我可能会考虑将其更改为其他语言.
    • 您需要使用 /usr/bin/touch 的绝对路径,因为 PATH 环境变量在该环境中故意为空,以防止帮助程序以 root 身份运行任意代码。
    • 如果这没有帮助,请尝试使用 posix_spawn 直接运行它,例如pid_t pid = -1; char *args[] = { "touch", "/Library/Extensions", NULL}; posix_spawn(&pid, "/usr/bin/touch", NULL, NULL, args, NULL); 并查看它返回什么以及 errno 等于什么。
    • 如果您使用该方法,请不要忘记waitpid()之后的过程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    相关资源
    最近更新 更多