【问题标题】:Where to store application data (non-user specific) on Linux在 Linux 上存储应用程序数据(非用户特定)的位置
【发布时间】:2009-10-02 15:04:04
【问题描述】:

在我的基于 OSGi 的 Java 应用程序中,我正在开发一个包,以便为系统的其余部分提供对文件系统的访问权限。除了提供对用户主目录的访问之外,我还希望提供对非用户特定区域的访问。该区域的确切用途尚未确定,但不会用于偏好设置(由不同的捆绑包处理),但它可用于存储可能在运行时更改的数据。

我打算为此目的使用以下目录:

  • Windows Vista 和 Windows 7:“\ProgramData”。
  • Windows XP:“\Documents and Settings\所有用户”。
  • Mac OS X:“/Library/Application Support”。

在 Linux 中哪里有一个合理的等价物,我如何从我的 Java 代码中处理它?

【问题讨论】:

  • 您能否更具体地说明您存储的数据类型?是静态数据(配置文件、静态信息等)还是在运行时更改的数据?我在后者的假设下回答了下面的问题,但是在重新阅读您的问题后,我不完全确定您在追求什么。
  • 我已经改写了这个问题,以(希望)稍微澄清一下情况。

标签: java linux


【解决方案1】:

这取决于您计划存储的数据类型。这个答案是在您在运行时存储和修改数据的前提下。

与其他人的建议相反,我建议不要使用/usr/share 进行存储。来自Filesystem Hierarchy Standard

/usr/share 层次结构适用于所有人 只读架构独立 数据文件。

当您修改数据时,这违背了/usr 子系统的只读性质。

似乎更好的存储应用程序状态数据的位置是/var,或者更具体地说,/var/lib。这也来自Hierarchy Standard。您可以创建一个/var/lib/myapp,或者如果您还使用锁定文件或日志之类的东西,您可以利用/var/lock/var/log

更深入地了解整个标准(链接到上面) - 您可能会找到一个更适合您想要做得更好的地方。

Steve K 一样,我也建议使用 Preferences API 来获取应用程序偏好数据。

【讨论】:

  • 将程序数据写入/var 通常需要超级用户权限。如果应用以用户身份运行怎么办?
  • @MathiasKunter - 如果应用程序以特定用户身份运行,您应该设置适当的/var/... 目录(例如/var/log/my-app//var/lib/my-app/ 等)以提供读/写访问权限给该用户或其组。或者,如果您说的是实际的人类用户,您可以考虑使用他们的主目录(例如~/.my-app/...)。
  • 如果应用程序以 ACTUAL 用户身份运行,则数据应存储在该用户 $HOME 下。如果它是系统用户,则安装(作为 root 或类似用户)应授予该用户对其 /var 下文件和目录的所有权,并将该用户添加到访问其他设备/目录/文件所需的任何组中。
  • 我猜现在找到了官方的 FHS here?
  • @BoppityBop /var/lib 用于“可变状态信息”,而不是静态库文件。
【解决方案2】:

视情况而定。

  • 全局配置 -> /etc/appname

  • 只读,独立于机器架构 -> /usr/share/appname

  • 只读,机器特定 -> /usr/lib/appname

  • 读写 -> /var/lib/appname

不保证完整性,请查看Filesystem Hierarchy Standard

【讨论】:

  • 日志文件怎么样? /var/log/appname 也许?
【解决方案3】:

由于您使用的是Java,您是否看过Preferences API

来自简介:

应用程序需要偏好和配置数据来适应不同用户和环境的需求。 java.util.prefs 包为应用程序提供了一种存储和检索用户和系统首选项和配置数据的方法。数据永久存储在依赖于实现的后备存储中。有两棵独立的偏好节点树,一棵用于用户偏好,一棵用于系统偏好

我会让内置 API 完成这项工作。

【讨论】:

  • 谢谢。我们还将实现首选项服务(基于 OSGi),但也需要访问文件系统以用于其他目的。
  • Preferences API 的 Linux 实现确实使用了文件系统。不知道为什么它不能满足您的需求 - 您可以进一步扩展它吗?您还可以为偏好创建自己的后备存储 - 如果您想更进一步。
【解决方案4】:

freedesktop.org(以前称为 X Desktop Group)项目在XDG Base Directory Specification 中为此定义了一些标准。

在你的情况下,我会看看$XDG_DATA_DIRS

$XDG_DATA_DIRS 定义了除$XDG_DATA_HOME 基本目录之外的按首选项排序的基本目录集以搜索数据文件。 $XDG_DATA_DIRS 中的目录应该用冒号':'分隔。

如果$XDG_DATA_DIRS 未设置或为空,则应使用等于/usr/local/share/:/usr/share/ 的值。

强烈建议阅读XDG Base Directory Specification

【讨论】:

  • 在 GNU Linux 上,通常遵循GNU Coding Standards。 GNU 和 XDG 之间可能有很多重叠之处。关于 XDG 目录,它们似乎没有为通常存储在 /var 某处的非用户特定运行时数据做出调整。
【解决方案5】:

在 /usr/share 或 /usr/local/share 文件夹中

【讨论】:

    【解决方案6】:

    我知道这是一个老问题,但根据https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard (截至 2015 年 7 月似乎已更新并更正)...

    假设数据文件被理解为不满足/tmp/var/tmp 然后/usr/local/share/theApp/usr/local/theApp 的要求。

    【讨论】:

      【解决方案7】:

      如果它不是特定于用户的,您可以将其存储在 /usr/share/appname 下

      【讨论】:

        【解决方案8】:

        你想这样硬编码吗?您可以使用 System.getProperty("user.home") 让用户回家,这样它就更加独立于平台。

        【讨论】:

        • 当我需要访问用户的家时,我将使用它,但是我的问题与非用户特定区域(可以在 Windows 上使用 System.getenv("ALLUSERSPROFILE") 获得)有关,但这在 Linux 上不起作用)。
        • 啊,对不起。我误解了你的目的。前面建议的属性支持所有用户。我知道在 Windows 中它将它存储在注册表中,不确定它在 Linux 上存储信息的位置。
        猜你喜欢
        • 1970-01-01
        • 2015-03-06
        • 1970-01-01
        • 1970-01-01
        • 2011-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-14
        相关资源
        最近更新 更多