我有一个java jar文件,它使用File.setLastModified()通过引用/mnt/nxx/file.name为文件设置特定的时间戳。当文件与运行java进程的登录用户拥有相同的UID时,它可以按需工作。但是如果登录的用户是任何其他UID,它就会失败。
该文件托管在外部U盘上,该驱动器使用以下命令在引导时通过/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:\ to \ RASPI\root\mnt)并运行相同java代码的Windows-10主机可以成功地为任何文件设置时间戳,而不管Pi声明的文件所有者是什么。
所讨论的文件具有777权限,不出所料,我的家庭网络中任何主机上的任何用户都可以成功修改该文件。唯一的问题是,当Linux主机上用户的UID与文件所有者不匹配时,对setLastModified()的java调用就会失败--即使用户java进程使用与文件相同的GID运行也是如此。
我的目标是能够挂载磁盘,并通过任何方法在我的家庭网络中的所有主机之间共享它,以便我家庭网络上的Windows和Linux主机都可以使用java代码成功地操作时间戳。
为什么无论用户是谁,Windows-10都能成功地操作时间戳,而Linux却不能?有没有办法在各种fstab mount指令中、在smb.conf或其他地方添加/配置选项来配置磁盘,使Linux的行为与Windows一样?
顺便说一句:使用NTFS文件系统格式化的外部挂载硬盘也存在同样的问题。我尚未尝试使用NTFS驱动器进行用户映射。
任何帮助都将不胜感激。
cw
发布于 2020-04-15 19:46:35
对于那些遇到这个问题的人,这里有一些进一步的信息,我相信这些信息提供了一个可行的变通办法,即使潜在的问题似乎仍然存在。
只有当(1)相关文件不属于正在运行的java进程的UID (注意:文件读/写权限在这里不是问题,重要的是文件所有权),并且(2)相关文件所在的磁盘卷挂载的UID与文件所有者的UID不同时,问题才会显现出来。在这些情况下,java无法按预期设置Last-Modified时间。
如果磁盘作为CIFS挂载,或者挂载在与文件所有者的UID匹配的UID下,则java可以成功管理时间戳。
此外,此问题仅在Linux主机上明显存在。无论文件所有权或文件系统如何,Windows主机似乎都不会出现此问题。
https://stackoverflow.com/questions/61011124
复制相似问题