Java File.setLastModified() не работает в Linux, когда вы не являетесь владельцем файла

У меня есть файл java jar, который использует File.setLastModified() для установки конкретной отметки времени для файла, ссылаясь на /mnt/nxx/file.name. Он работает по желанию, когда файл принадлежит тому же UID, что и вошедший в систему пользователь, запускающий процесс java. Но это не удается, если вошедший в систему пользователь является любым другим UID.

Файл размещен на внешнем USB-накопителе, отформатированном в файловой системе Ext4, смонтированном на Raspberry Pi во время загрузки через /etc/fstab с использованием:

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

Хост Ubuntu в той же сети, который монтирует тот же диск во время загрузки через /etc/fstab, используя:

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

также может успешно установить отметку времени, если вошедший в систему пользователь имеет тот же UID, что и на Pi.

Однако хост Windows-10, который подключается через Samba к тому же диску (отображается как N:\ в \ RASPI\root\mnt) и выполняет тот же код Java, может успешно установить отметку времени для ЛЮБОГО файла независимо от владельца файла. как утверждает Пи.

Рассматриваемый файл имеет права доступа 777, и, как и ожидалось, любой пользователь на любом хосте в моей домашней сети может успешно изменить файл. Единственная проблема заключается в том, что java-вызов setLastModified() терпит неудачу, когда UID пользователя на хостах Linux не совпадает с владельцем файла, даже если пользовательский java-процесс выполняется с тем же GID, что и файл.

Моя цель состоит в том, чтобы иметь возможность смонтировать диск и поделиться им со всеми хостами в моей домашней сети любым способом, чтобы хосты Windows и Linux в моей домашней сети могли использовать код Java для успешного управления временными метками.

Почему Windows-10 может успешно манипулировать отметкой времени независимо от пользователя, а Linux — нет? Есть ли способ добавить/настроить параметры в различных директивах монтирования fstab, в smb.conf или в другом месте, чтобы настроить диск так, чтобы Linux вел себя так же, как Windows?

Кстати: та же проблема существует с внешними жесткими дисками, отформатированными в файловых системах NTFS. Я не пробовал сопоставление пользователей с дисками NTFS.

Любая помощь будет оценена по достоинству.

cw


person Chucko    schedule 03.04.2020    source источник


Ответы (1)


Вот некоторая дополнительная информация для тех, кто сталкивается с этой проблемой, которая, как я считаю, предлагает жизнеспособный обходной путь, даже если основная проблема остается.

Проблема, по-видимому, проявляется только тогда, когда (1) рассматриваемые файлы НЕ принадлежат UID запущенного процесса Java (Примечание. Разрешения на чтение/запись файлов здесь не проблема, важно владение файлом) и ( 2) том диска, на котором находятся рассматриваемые файлы, смонтирован под UID, отличным от UID владельца файла. В этих условиях java не может установить время последнего изменения, как ожидалось.

Если диск смонтирован как CIFS или под UID, совпадающим с идентификатором владельца файла, то java может успешно управлять отметками времени.

Кроме того, эта проблема проявляется только на хостах Linux. Хосты Windows не проявляют эту проблему независимо от владельца файла или файловой системы.

person Chucko    schedule 15.04.2020
comment
Похоже, это вызывает проблему в последнем вводе-выводе Commons: issues.apache.org/jira/ просмотреть/IO-721 - person Darius X.; 24.04.2021