我在使用 S3FS 时遇到问题。我正在使用
ubuntu@ip-x-x-x-x:~$ /usr/bin/s3fs --version
Amazon Simple Storage Service File System 1.71
并且我600
许可在/usr/share/myapp/s3fs-password
中安装了密码文件。
我已成功挂载 S3 存储桶。
sudo /usr/bin/s3fs -o allow_other -opasswd_file=/usr/share/myapp/s3fs-password -ouse_cache=/tmp mybucket.example.com /bucket
我已经在/etc/fuse.conf
中启用了user_allow_other
当我尝试在存储桶中创建文件时,root
它起作用了。
ubuntu@ip-x-x-x-x:~$ sudo su
root@ip-x-x-x-x:/home/ubuntu# cd /bucket
root@ip-x-x-x-x:/bucket# echo 'Hello World!' > test-`date +%s`.txt
root@ip-x-x-x-x:/bucket# ls
test-1373359118.txt
我检查了存储桶mybucket.example.com
的内容,文件创建成功。
但是我很难以不同的用户身份写入目录/bucket
。
root@ip-x-x-x-x:/bucket# exit
ubuntu@ip-x-x-x-x:~$ cd /bucket
ubuntu@ip-x-x-x-x:/bucket$ echo 'Hello World!' > test-`date +%s`.txt
-bash: test-1373359543.txt: Permission denied
我拼命地尝试777
test-1373359118.txt
.我可以写入文件
ubuntu@ip-x-x-x-x:/bucket$ sudo chmod 777 test-1373359118.txt
ubuntu@ip-x-x-x-x:/bucket$ echo 'Test' > test-1373359118.txt
ubuntu@ip-x-x-x-x:/bucket$ cat test-1373359118.txt
Test
有趣的是,我可以在存储桶内创建一个目录,将 chmod 设置为 777
,然后在那里写一个文件。
ubuntu@ip-x-x-x-x:/bucket$ sudo mkdir -m 1777 test
ubuntu@ip-x-x-x-x:/bucket$ ls
test test-1373359118.txt
ubuntu@ip-x-x-x-x:/bucket$ cd test
ubuntu@ip-x-x-x-x:/bucket/test$ echo 'Hello World!' > test-`date +%s`.txt
ubuntu@ip-x-x-x-x:/bucket/test$ ls
test-1373360059.txt
ubuntu@ip-x-x-x-x:/bucket/test$ cat test-1373360059.txt
Hello World
但后来我尝试了
ubuntu@ip-x-x-x-x:~$ sudo chmod 777 /mybucket
chmod: changing permissions of '/mybucket': Input/output error
它没有用。
最初,我考虑使用此/bucket
目录来存储位于几台EC2机器的LAMP堆栈中的大型且很少访问的文件。(我认为使用它足够合适,而无需使用 AWS PHP SDK 创建特殊的处理库,但这不是重点。
由于这个原因,我可以使用/mybucket
内的目录来存储文件。但我只是好奇是否有办法允许其他用户使用整个/mybucket
?
权限是旧版本的 S3FS 的问题。升级到最新版本以使其正常工作。
正如问题本身和其他答案中已经指出的那样,在安装时,您必须传递以下参数: -o allow_other
例:
s3fs mybucket:/ mymountlocation/ -o allow_other
此外,在执行此操作之前,请确保在/etc/fuse.conf
中启用以下内容:
user_allow_other
默认情况下处于禁用状态;)
我有用:
s3fs ec2downloads:/ /mnt/s3 -o use_rrs -o allow_other -o use_cache=/tmp
它一定已在最新版本中修复,我使用的是 github 项目中的最新克隆 (1.78(。
这是唯一对我有用的东西:
您可以传递uid
选项以确保它:
-o umask=0007,uid=1001,gid=1001 # replace 1001 with your ids
来自: https://github.com/s3fs-fuse/s3fs-fuse/issues/673
要查找您的 uid 和 gid,请参阅此处的前两个数字:
sudo cat /etc/passwd | grep $USER
建议看看新项目RioFS(用户空间S3文件系统(:https://github.com/skoobe/riofs。
该项目是"s3fs">的替代方案,与"s3fs"相比,主要优点是:简单,操作速度和无错误代码。目前,该项目处于"测试"状态,但它已经在几个高负载文件服务器上运行了相当长的一段时间。
我们正在寻求更多的人加入我们的项目并帮助进行测试。在我们这边,我们提供快速的错误修复,并将听取您添加新功能的请求。
关于您的问题,为了以 root 用户身份运行 RioFS 并允许其他用户对挂载的目录具有 r/w 访问权限:
- 确保/etc/fuse.conf 包含user_allow_other选项
- 使用 -o "allow_other" 参数启动 RioFS 。
启动 RioFS 的整个命令行如下所示:
sudo riofs -c /path/to/riofs.conf.xml http://s3.amazonaws.com mybucket.example.com /bucket
(确保导出了AWSACCESSKEYID
和AWSSECRETACCESSKEY
变量riofs.conf.xml
或在配置文件中设置它们(。
希望对您有所帮助,我们期待看到您加入我们的社区!
可能有几个原因,当我遇到同样的问题时,我列出了一个可能的原因。如果您查看您的文件权限,它可能继承了"---------" - 没有权限/ACL。
如果是这种情况,您可以将"x-amz-meta-mode"添加到文件的元数据中。请查看我关于如何动态执行此操作/执行此操作的帖子。
如果你使用的是 centos,你需要启用httpd_use_fusefs选项,否则无论你为 s3fs 选项提供什么,它都永远不会有通过 httpd 访问的权限
setsebool -P httpd_use_fusefs on
所有用户访问挂载的存储桶,请使用/etc/fstab 文件中的 umask=0002 并重新挂载 S3 存储桶
例fuse.s3fs _netdev,allow_other,umask=0002,passwd_file=/etc/passwdfile.txt