![如何防止不可自定义的应用程序覆盖手动更改的文件?](https://linux22.com/image/121325/%E5%A6%82%E4%BD%95%E9%98%B2%E6%AD%A2%E4%B8%8D%E5%8F%AF%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%84%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E8%A6%86%E7%9B%96%E6%89%8B%E5%8A%A8%E6%9B%B4%E6%94%B9%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%9F%20.png)
简而言之,我正在尝试替换其中一个应用程序中的一些图像资源。手动覆盖文件可以完成这项工作,但每次应用程序更新时,我更改的所有文件都会被原始文件替换。我不确定资源文件是否被覆盖包装袋或者在更新后首次运行时由应用程序本身执行。将文件设置为只读似乎没有帮助,因为应用程序或包装袋设法删除只读无论如何标记并替换文件。
更具体地说,我尝试自定义的应用程序是“Plex Media Server”,它没有任何更改 DLNA 图标的官方方法。不过,该图标可以在“/usr/lib/plexmediaserver/Resources/Graphics/dlna-icon-260.png”下找到,并且手动替换后会在 Plex 和连接到它的所有设备中正确显示。但是当我更新 Plex 软件时,我的所有更改都会再次被原始文件替换。
因此,我可以想到解决此问题的一种方法是编写一个小 shell 脚本,将资源再次替换为我的自定义资源,并且我可以在每次更新后运行它。但我试图找出是否有更好、更合适或更自动化的方法来做到这一点。
作为最好的“假设”情况,一种使 Linux 系统在读取文件时始终返回我的内容的方法,同时仍然允许虚拟写入、删除或创建文件,但无论如何总是返回我的内容。
所以我的问题是:我的“最佳假设案例”是否可以在 Linux 中实现?或者如何防止文件被覆盖包装袋?
问候和感谢。
答案1
这里的解决方案在很大程度上取决于应用程序的配置灵活性以及包管理器的功能。请记住,如果路径发生变化,您可能会突然得到一个无法运行的应用程序。
大多数程序允许您使用配置文件覆盖路径,也许您可以在此处指定自己的图像目录。否则,您的应用程序可能会在查看其默认图像目录(其中包含默认安装的图像)之前在特定目录中查找这些图像。如果你能您应该使用这些应用程序支持的方法之一。
如果不能,我会避免尝试停止文件的替换(例如,使用chattr +i
),因为这可能会导致包管理器在将来尝试更新包时出现错误退出。
更好的方法是合作与您的包管理器一起实现您想要的结果。例如,您可以尝试以下操作之一:
- 在包管理器中,告诉它在执行安装时不要提取这些文件。例如,在 中
pacman
,您可以执行以下操作:
% cat /etc/pacman.conf
[...]
NoExtract = usr/lib/my_image_dir/* usr/lib/my_image_dir_2/*
[...]
- 在包管理器中,设置一个挂钩以在安装/升级提供这些文件的包后替换这些文件。例如,在 中
pacman
,您可以使用如下所示的挂钩来执行此操作:
% cat /usr/share/libalpm/hooks/replace-images.hook
[Trigger]
Type = Package
Operation = Upgrade
Target = the_package_to_target
[Action]
Description = Replacing images
When = PostTransaction
Exec = /usr/bin/script_to_replace_images
如果这些都不可行,也许您可以使用以下命令来运行您的应用程序:覆盖当它运行时,位于仅对应用程序可见的安装命名空间中。这将满足您的包管理器,因为它永远不会看到覆盖图,并且它将满足您的需求,因为您只能在覆盖图中包含替换图像。