1

我有一个 java jar 文件,它使用 File.setLastModified() 通过引用 /mnt/nxx/file.name 为文件设置特定的时间戳。当文件由与运行 java 进程的登录用户相同的 UID 拥有时,它可以正常工作。但如果登录用户是任何其他 UID,它就会失败。

该文件托管在外部 USB 驱动器上,该驱动器格式化为在引导时通过 /etc/fstab 安装在 Raspberry Pi 上的 Ext4 文件系统,使用:

/dev/sdb1 /mnt/nxx ext4 defaults 0 2

同一网络上的 Ubuntu 主机,它在引导时通过 /etc/fstab 挂载同一个磁盘,使用:

192.168.x.x:/mnt/nxx /mnt/nxx nfs rw 0 1

只要登录的用户与 Pi 上的 UID 相同,也可以成功设置时间戳。

但是,通过 Samba 连接到同一个磁盘(映射为 N:\ 到 \RASPI\root\mnt)并运行相同的 java 代码的 Windows-10 主机可以成功地为任何文件设置时间戳,而不管文件所有者如何正如 Pi 所声称的那样。

有问题的文件具有 777 权限,并且正如预期的那样,我家庭网络中任何主机上的任何用户都可以成功修改该文件。唯一的问题是,当 Linux 主机上用户的 UID 与文件所有者不匹配时,对 setLastModified() 的 java 调用会失败——即使用户 java 进程正在使用与文件相同的 GID 运行。

我的目标是能够挂载磁盘并通过任何方法在我的家庭网络中的所有主机之间共享它,以便我的家庭网络上的 Windows 和 Linux 主机都可以使用 java 代码成功地操作时间戳。

为什么 Windows-10 可以不考虑用户而成功地操作时间戳,而 Linux 却不能?有没有办法让我在各种 fstab 挂载指令、smb.conf 或其他地方添加/配置选项来配置磁盘,以便 Linux 的行为与 Windows 相同?

顺便说一句:使用 NTFS 文件系统格式化的外部安装的 HDD 也存在同样的问题。我还没有尝试使用 NTFS 驱动器进行用户映射。

任何帮助,将不胜感激。

连续波

4

1 回答 1

2

以下是针对遇到此问题的人的一些进一步信息,我相信即使潜在问题似乎仍然存在,这些信息也可以提供可行的解决方法。

仅当 (1) 有问题的文件不属于正在运行的 java 进程的 UID 时(注意:文件读/写权限不是这里的问题,重要的是文件所有权)和( 2) 有问题的文件所在的磁盘卷安装在与文件所有者不同的 UID 下。在这些情况下,java 无法按预期设置 Last-Modified 时间。

如果磁盘安装为 CIFS 或使用与文件所有者匹配的 UID,则 java 可以成功管理时间戳。

此外,此问题仅在 Linux 主机上出现。无论文件所有权或文件系统如何,Windows 主机似乎都不会出现此问题。

于 2020-04-15T11:46:35.193 回答