- Q: ossfs適合什麼樣的程式?
- ossfs能把oss bucket掛載到本地,如果您使用的軟體沒有支援OSS,但您又想讓數據能自動同步到OSS,那麼ossfs是很好的選擇。
- Q: ossfs有什麼局限性?
- 由於數據需要經過網路同步到雲端,ossfs在性能和功能上可能與本地檔案系統有差距。如果您想讓資料庫等對io要求很高的應用跑在ossfs掛載的盤上,請慎重考慮。和本地檔案系統具體差異:
- 隨機或者追加寫檔案會導致整個檔案的重寫。
- 元數據操作,例如list directory,性能較差,因為需要遠端存取OSS伺服器。
- 檔案/檔案夾的rename操作不是原子的。
- 多個客戶端掛載同一個oss bucket時,依賴用戶自行協調各個客戶端的行為。例如避免多個客戶端寫同一個檔案等等。
- 不支援hard link。
- 由於數據需要經過網路同步到雲端,ossfs在性能和功能上可能與本地檔案系統有差距。如果您想讓資料庫等對io要求很高的應用跑在ossfs掛載的盤上,請慎重考慮。和本地檔案系統具體差異:
- Q: ossfs一定要阿里雲的機器才能用麼?
- ossfs不限制一定要阿里雲的內網才可以使用,外網機器依然可以使用。
- Q: ossfs能不能同時掛載多個OSS bucket?
- 可以的,在passwd-ossfs檔案中寫入多個OSS配置資訊即可。支援不同帳號的OSS。
- Q: 我在yum/apt-get安裝ossfs,遇到conflicts with file from package fuse-devel的錯誤,請問是怎麼回事?
- 您的系統中存在老版本的fuse,請先使用相關的包管理器卸載,再重新安裝ossfs。
- Q: ossfs工作不正常,如何debug?
- 您可以使用在掛載時,加上-d -o f2參數,ossfs會把日誌寫入到系統日誌中。在centos系統中,在/var/log/messages中。
- 您也可以在掛載時使用-f -d -o f2參數,ossfs會把日誌輸出到螢幕上。
- Q: 為什麼我在mount時遇到 ossfs: unable to access MOUNTPOINT /tmp/ossfs: Transport endpoint is not connected這樣的錯誤?
- 請先umount對應的目錄。
- 請檢查您在使用ossfs掛載時,填入的url參數是否正確,是否和bucket/access key id/access key secret匹配。
- 特別注意:url中不包含bucket的名字。例如:您在oss控制台中看到bucket的網域名稱是這樣的:
ossfs-test-1.oss-cn-hangzhou.aliyuncs.com
。那麼填入的url則是:http://oss-cn-hangzhou.aliyuncs.com
。
- Q: ossfs提示ossfs: unable to access MOUNTPOINT /tmp/odat: No such file or directory
- 這是您未建立該目錄導致的,在掛載前需要建立對應目錄。
- Q: 我把bucket掛載到本地後,ls目錄,卻收到operation not permitted錯誤,這是為什麼?
- 請檢查您的bucket中,是否包含目錄名含有不可見字元的OSS object。檔案系統對檔案/目錄名有更嚴格的限制,因此會收到上述錯誤。使用其他工具對這些object重新命名後,ls就能正確顯示目錄內容了。
- Q: 我的一個目錄下有非常多的檔案,為什麼ls該目錄很慢?
- 假設一個目錄下有n個檔案,那麼ls該目錄至少需要n次OSS http requests。在檔案非常多的時候,這可能造成嚴重的性能問題。
- 您可以採用下面兩個辦法優化:
- 通過-omax_stat_cache_size=xxx參數增大stat cache的size,這樣第一次ls會較慢,但是後續的ls就快了,因為檔案的元數據都在本地cache中。預設這個值是1000,大約消耗4MB記憶體,請根據您機器記憶體大小調整為合適的值。
- 使用ls -f命令,這個命令會消除與OSS的n次http請求。
- 具體參見issue 13
- Q: ossfs掛載時如何設定許可權?
- 如果要允許其他用戶訪問掛載檔案夾,可以在運行ossfs的時候指定
allow_other
參數:-
ossfs your_bucket your_mount_point -ourl=your_endpoint -o allow_other
-
- 為什麼使用allow_other參數,仍然不能訪問檔案?
- 注意:allow_other是賦予掛載目錄其他用戶訪問的許可權,不是裡面的檔案!如果您要變更檔夾中的檔案,請用chmod命令。
- allow_other預設賦予掛載目錄777許可權,我想讓掛載目錄的許可權為770,該怎麼辦?
- 可以通過umask來設定,參見這裡。
- 如果要允許其他用戶訪問掛載檔案夾,可以在運行ossfs的時候指定
-
Q: 如果要使掛載的檔案夾(/tmp/ossfs)屬於某個user:
- 方法一: 如果要使掛載的檔案夾(/tmp/ossfs)屬於某個user,則需要以user的身份建立掛載檔案夾和使用ossfs:
sudo -u user mkdir /tmp/ossfs
sudo -u user ossfs bucket-name /tmp/ossfs
-
方法二: 首先通過id命令獲得指定用戶的uid/gid資訊。例如獲取www用戶的uid/gid資訊:id www;然後掛載時指定uid/gid參數:
-
ossfs your_bucket your_mountpoint -ourl=your_url -ouid=your_uid -ogid=your_gid
注意:uid/gid都是數字。
-
- 方法一: 如果要使掛載的檔案夾(/tmp/ossfs)屬於某個user,則需要以user的身份建立掛載檔案夾和使用ossfs:
- Q: 我不是root用戶,如何umount ossfs掛載的目錄
- fusermount -u your_mountpoint
- Q: 如何開機自動掛載ossfs?
- Step 1 首先請參考使用說明,把bucket name,access key id/secret等資訊寫入/etc/passwd-ossfs,並將該檔案許可權修改為640。
-
echo your_bucket_name:your_access_key_id:your_access_key_secret > /etc/passwd-ossfs
chmod 640 /etc/passwd-ossfs
-
- Step 1 首先請參考使用說明,把bucket name,access key id/secret等資訊寫入/etc/passwd-ossfs,並將該檔案許可權修改為640。
- Step 2 接下來針對不同的系統版本,設定方式有所不同
- Step 2A 通過fstab的方式自動mount(適用於ubuntu14.04, centos6.5)
- 在/etc/fstab中加入下面的命令
-
ossfs#your_bucket_name your_mount_point fuse _netdev,url=your_url,allow_other 0 0
- 其中上述命令中的your_xxx資訊需要根據您的bucket name等資訊填入。
- 保存/etc/fstab檔案。執行
mount -a
命令,如果沒有報錯,則說明設定正常。 - 到這一步,ubuntu14.04就能自動掛載了。centos6.5還需要執行下面的命令:
chkconfig netfs on
- Step 2B 通過開機自啟動指令碼或直譯式程式mount(適用於centos7.0及以上的系統)
- 在/etc/init.d/目錄下建立檔案ossfs,把模板檔案中的內容拷貝到這個新檔案中。並將其中的your_xxx內容改成您自己的資訊。
- 執行命令:
chmod a+x /etc/init.d/ossfs
- 上述命令是把新建立的ossfs指令碼或直譯式程式賦予可執行許可權。您可以執行該指令碼或直譯式程式,如果指令檔內容無誤,那麼此時oss中的bucket已經掛載到您指定的目錄下了。
- 執行命令:
chkconfig ossfs on
- 上述命令是把ossfs啟動指令碼或直譯式程式作為其他服務,開機自動啟動。
- 好了,現在ossfs就可以開機自動掛載了。總結起來,如果您是ubuntu14.04和centos6.5,您需要執行Step 1 + Step 2A;如果您是centos7.0系統,您需要執行Step 1 + Step 2B。
- Step 2A 通過fstab的方式自動mount(適用於ubuntu14.04, centos6.5)
- Q: 遇到fusermount: failed to open current directory: Permission denied錯誤如何解決?
- 這是fuse的一個bug,它要求目前使用者對目前的目錄(非掛載目錄)有讀許可權。解決的辦法就是cd到一個有讀許可權的目錄再運行ossfs命令
-
Q: 我需要以www用戶掛載ossfs,此時如何設定開機自動掛載?
-
參照上面的問題的解答,Step 1照做,對Step 2B稍加修改,修改
/etc/init.d/ossfs
中的命令為:sudo -u www ossfs your_bucket your_mountpoint -ourl=your_url
- 設定自啟動指令碼或直譯式程式中允許使用sudo,編輯/etc/sudoers,將其中的
Defaults requiretty
這行改為#Defaults requiretty
(注釋掉)
-
- Q: 遇到
fusermount: failed to open current directory: Permission denied
錯誤如何解決?- 這是fuse的一個bug,它要求目前使用者對目前的目錄(非掛載目錄)有讀許可權。解決的辦法就是cd到一個有讀許可權的目錄再運行ossfs命令。
-
Q: 使用ECS掛載ossfs,如何避免因背景程式掃描檔案而產生費用?
-
程式掃描ossfs掛載的目錄,會轉換成向OSS的請求,如果請求次數很多,會產生費用(1分錢/1萬次)。如果是updatedb,可以通過修改/etc/updatedb.conf讓它跳過。具體做法是:
- 在
PRUNEFS =
後面加上fuse.ossfs
- 在
PRUNEPATHS =
後面加上掛載的目錄
- 在
- 如何確定是哪個進程掃了我的目錄?
- 首先安裝auditd: sudo apt-get install auditd
- 啟動auditd: sudo service auditd start
- 設定監視掛載目錄: auditctl -w /mnt/ossfs
- 在auditlog中可以查看是哪些進程訪問了這個目錄:ausearch -i | grep /mnt/ossfs
-
- Q: 使用ossfs上傳到OSS的檔案Content-Type全是”application/octet-stream”是怎麼回事?
- ossfs通過查詢/etc/mime.types中的內容來確定檔案的Content-Type,請檢查這個檔案是否存在,如果不存在,則需要添加:
- 對於ubuntu可以通過sudo apt-get install mime-support來添加
- 對於centos可以通過sudo yum install mailcap來添加
- 也可以手動添加,每種格式一行,每行格式為:application/javascript js
- ossfs通過查詢/etc/mime.types中的內容來確定檔案的Content-Type,請檢查這個檔案是否存在,如果不存在,則需要添加:
- Q: 如何使用supervisor啟動ossfs?
- 安裝supervisor,在ubuntu中執行sudo apt-get install supervisor
- 建立一個目錄,編輯ossfs的啟動指令碼或直譯式程式:
寫入如下數據:mkdir /root/ossfs_scripts vi /root/ossfs_scripts/start_ossfs.sh
# 卸載 fusermount -u /mnt/ossfs # 重新掛載,必須要增加-f參數運行ossfs,讓ossfs在前台運行 exec ossfs my-bucket my-mount-point -ourl=my-oss-endpoint -f
- 編輯/etc/supervisor/supervisord.conf,在最後加入下面一段:
[program:ossfs] command=bash /root/ossfs_scripts/start_ossfs.sh logfile=/var/log/ossfs.log log_stdout=true log_stderr=true logfile_maxbytes=1MB logfile_backups=10
- 運行supervisor:
supervisordsupervisord
- 確認一切正常:
如果出錯,請檢查/var/log/supervisor/supervisord.log和/var/log/ossfs.log。ps aux | grep supervisor # 應該能看到supervisor進程 ps aux | grep ossfs # 應該能看到ossfs進程 kill -9 ossfs # 殺掉ossfs進程,supervisor應該會重啟它, 不要使用killall, 因為killall發送SIGTERM,進程正常退出,supervisor不再去重新運行ossfs ps aux | grep ossfs # 應該能看到ossfs進程
-
Q: 遇到”fuse: warning: library too old, some operations may not work”怎麼辦?
出現的原因是:ossfs編譯時間所使用的libfuse版本 比運行時連結到的libfuse版本高。這往往是用戶自行安裝了libfuse導致的。使用我們提供的rpm包安裝ossfs,無需再安裝libfuse。
在CentOS-5.x和CentOS-6.x上我們提供的rpm包裡包含了libfuse-2.8.4,如果在啟動並執行時候環境中有libfuse-2.8.3,並且ossfs被連結到了舊版本的fuse上,就會出現上述warning。
- 如何確認ossfs運行時連結的fuse版本?
- 運行ldd $(which ossfs) | grep fuse
- 例如結果是”/lib64/libfuse.so.2”,那麼通過ls -l /lib64/libfuse*可以看到fuse的版本
- 如何讓ossfs連結到正確的版本?
- 首先通過rpm -ql ossfs | grep fuse找到libfuse的目錄
- 例如結果是”/usr/lib/libfuse.so.2”,則通過LD_LIBRARY_PATH=/usr/lib ossfs …運行ossfs
- 我能忽略這個WARNING嗎?
- 最好不要,見這個bug
- Q: 為什麼用ossfs看到的檔案資訊(例如大小)與其他工具看到的不一致?
因為ossfs預設會快取檔案的元資訊(包括大小/許可權等),這樣就不需要每次ls的時候向OSS發送請求,加快速度。 如果用戶通過其他程式(例如SDK/官網控制台/osscmd等)對檔案進行了修改,那麼有可能在ossfs中看到的檔案資訊 沒有及時更新。
如果想禁止ossfs的緩存,那麼可以在掛載的時候加上如下參數:-omax_stat_cache_size=0