Вопрос или проблема
Я новичок в Fuse. Я смонтировал Fuse с помощью следующей команды.
/home/bin/fusexmp /mnt/fuse -o default_permissions -o allow_other -o nonempty -o hard_remove -d
Теперь, если я войду как пользователь “test” и попытаюсь создать файл под названием “testfile”.
test@11540302:/registration> touch testfile
touch: установка времени `testfile': Доступ запрещен
Вывод Strace:
uname({sys="Linux", node="11540302", ...}) = 0
brk(0) = 0x8055000
brk(0x8076000) = 0x8076000
open("testfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_LARGEFILE, 0666) = 3
dup2(3, 0) = 0
close(3) = 0
utimensat(0, NULL, NULL, 0) = -1 EACCES (Доступ запрещен)
close(0) = 0
Но создание “testfile” успешно завершается с владельцем как root,
-rw-r--r-- 1 root trusted 0 Янв 19 13:51 testfile
Я понимаю, что приложение Fuse работает на уровне root, создание файла происходит с владельцем root. Из-за этого пользователь test не может выполнять никакие операции с “testfile”.
Мой вопрос:
1. Поскольку я указал “allow_other” при монтировании, почему пользователь test не имеет прав доступа к “testfile”?
2. После входа в систему как пользователь “test” и попытки создать “testfile”, почему файл назначается владельцем “root”, а не “test”? Это наблюдается даже после указания “default_permission” во время монтирования.
Пожалуйста, поправьте меня, если я не прав в своих пониманиях.
Хорошо, позвольте мне прояснить: Вы не “смонтировали fuse”, вы использовали пример программы fusexmp
, который является очень простой программой на основе Fuse, которая просто передает все операции на стандартные библиотеки Linux. Это всего лишь пример программы и весьма скучная.
Вы не указали, от имени какого пользователя вы выполнили эту операцию монтирования, но я предполагаю, что вы сделали это от имени root
(потому что в противном случае allow_other
не сработал бы, и не было бы создано testfile
с владельцем root
). Обратите внимание, что вы в принципе можете монтировать файловые системы FUSE от любого пользователя.
Когда пользователь test
выполнил touch
, сначала он открыл файл в смонтированной файловой системе fuse. Поскольку вы использовали default_permissions
, система проверила, позволяет ли пользователю test
создавать файлы в этом конкретном каталоге (что, очевидно, успешно), и затем разрешила fusexmp
создать файл. Поскольку fusexmp
работает от имени root
, этот файл был создан с владельцем root
.
Далее, touch
захотел установить дату. Поскольку вы использовали default_permissions
, система проверила, может ли пользователь test
установить дату для этого конкретного файла. Это не так, поэтому система прервала операцию с ошибкой разрешения, вне зависимости от того, может ли программа fusexmp
на самом деле установить дату (что она и могла бы, работая как root).
Я все еще не понимаю суть этого упражнения: вы использовали пример программы необычным образом и затем удивлялись результатам. Если вы задали default_permissions
, вам также следует убедиться, что ваша программа в пространстве пользователей создает файлы с правильным владельцем и т. д. (что fusexmp
не делает).
Если вы хотите понять файловые системы fuse с точки зрения пользователя, я предлагаю вам поэкспериментировать с реальными примерами, такими как sshfs. Или написать свою собственную программу на Fuse и самостоятельно управлять разрешениями и т. д.
Я нашел решение для этой проблемы.
Подробное объяснение этой проблемы.
Решение:
Как сказал @dirkt, нам нужно самостоятельно управлять разрешениями.
Код для получения uid и gid вызывающего:
fuse_get_context()->uid;
fuse_get_context()->gid;
Получите идентификатор пользователя и группы вызывающего, и установите владельца файла/каталога при создании через API Fuse.
Всегда есть место для улучшения. Пожалуйста, поправьте меня, если я не прав.
Спасибо, dirkt, за ваше объяснение.
Ответ или решение
Конечно, давайте разберёмся с вашим вопросом о файловой системе FUSE и опции "default_permissions".
Понимание проблемы
Вы правильно отметили, что при создании файлов с использованием программы примера fusexmp
файл создаётся с владельцем root
, даже когда вы запускаете команду от имени пользователя test
. Это связано с тем, что fusexmp
— это простой пример реализации FUSE, который не учитывает контекст пользователя, выполняющего операции.
Ответы на ваши вопросы
-
Почему тестовый пользователь не имеет прав доступа к созданному файлу, даже с параметром
allow_other
?Параметр
allow_other
позволяет другим пользователям (кроме пользователя, выполнившего монтирование) видеть и взаимодействовать с файлами в файловой системе FUSE. Однако это не влияет на способ, которым программа создаёт файлы. В вашем случае, когдаtest
пользователь создал файл, он был создан в контекстеfusexmp
, работающего от имениroot
. Учитывая, что в FUSE используется опцияdefault_permissions
, система проверяет права доступа пользователяtest
к создаваемому файлу. Это приводит к ошибке при попытке установить метку времени на файл, поскольку у пользователяtest
нет прав на эту операцию. -
Почему при создании файла пользователем
test
он получает владельцаroot
, несмотря на использованиеdefault_permissions
?Опция
default_permissions
просто указывает операционной системе проверять права доступа на уровне файловой системы перед выполнением операций. Однако, посколькуfusexmp
не устанавливает владельца создаваемого файла на основе контекста вызывающего пользователя, файл всегда создаётся с владельцемroot
. Чтобы изменить это поведение, необходимо модифицировать код FUSE для установления принадлежности создаваемого файла к пользователю, вызывшему операцию. Как вы уже упомянули в своём решении, вы можете использовать функцииfuse_get_context()
для получения идентификаторов пользователя и группы вызывающего процесса и соответствующим образом устанавливать владельца.
Рекомендации
В следующем шаге вы можете попробовать написать свою реализацию файловой системы FUSE, где будете более подробно управлять правами доступа и владельцами файлов. Это поможет вам лучше понять, как работает FUSE и как можно реализовать более сложные модели управления доступом.
Вы также можете рассмотреть использование более сложных FUSE-примеров или библиотек, таких как sshfs
, которые обеспечивают более продвинутую обработку файловых операций и управления доступом.
Если у вас возникнут дополнительные вопросы, не стесняйтесь их задавать.