• Q: ossfs適合什麼樣的程式?
    • ossfs能把oss bucket掛載到本地,如果您使用的軟體沒有支援OSS,但您又想讓數據能自動同步到OSS,那麼ossfs是很好的選擇。
  • Q: ossfs有什麼局限性?
    • 由於數據需要經過網路同步到雲端,ossfs在性能和功能上可能與本地檔案系統有差距。如果您想讓資料庫等對io要求很高的應用跑在ossfs掛載的盤上,請慎重考慮。和本地檔案系統具體差異:
      • 隨機或者追加寫檔案會導致整個檔案的重寫。
      • 元數據操作,例如list directory,性能較差,因為需要遠端存取OSS伺服器。
      • 檔案/檔案夾的rename操作不是原子的。
      • 多個客戶端掛載同一個oss bucket時,依賴用戶自行協調各個客戶端的行為。例如避免多個客戶端寫同一個檔案等等。
      • 不支援hard link。
  • 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來設定,參見這裡
  • 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都是數字。

  • 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 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。
  • 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讓它跳過。具體做法是:

      1. PRUNEFS =後面加上fuse.ossfs
      2. PRUNEPATHS =後面加上掛載的目錄
    • 如何確定是哪個進程掃了我的目錄?
      1. 首先安裝auditd: sudo apt-get install auditd
      2. 啟動auditd: sudo service auditd start
      3. 設定監視掛載目錄: auditctl -w /mnt/ossfs
      4. 在auditlog中可以查看是哪些進程訪問了這個目錄:ausearch -i | grep /mnt/ossfs
  • Q: 使用ossfs上傳到OSS的檔案Content-Type全是”application/octet-stream”是怎麼回事?
    • ossfs通過查詢/etc/mime.types中的內容來確定檔案的Content-Type,請檢查這個檔案是否存在,如果不存在,則需要添加:
      1. 對於ubuntu可以通過sudo apt-get install mime-support來添加
      2. 對於centos可以通過sudo yum install mailcap來添加
      3. 也可以手動添加,每種格式一行,每行格式為:application/javascript js
  • Q: 如何使用supervisor啟動ossfs?
  1. 安裝supervisor,在ubuntu中執行sudo apt-get install supervisor
  2. 建立一個目錄,編輯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
  3. 編輯/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
  4. 運行supervisor:
    supervisord
    supervisord
  5. 確認一切正常:
    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進程
    如果出錯,請檢查/var/log/supervisor/supervisord.log和/var/log/ossfs.log。
  • 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。

  1. 如何確認ossfs運行時連結的fuse版本?
    • 運行ldd $(which ossfs) | grep fuse
    • 例如結果是”/lib64/libfuse.so.2”,那麼通過ls -l /lib64/libfuse*可以看到fuse的版本
  2. 如何讓ossfs連結到正確的版本?
    • 首先通過rpm -ql ossfs | grep fuse找到libfuse的目錄
    • 例如結果是”/usr/lib/libfuse.so.2”,則通過LD_LIBRARY_PATH=/usr/lib ossfs …運行ossfs
  3. 我能忽略這個WARNING嗎?
    • 最好不要,見這個bug
  • Q: 為什麼用ossfs看到的檔案資訊(例如大小)與其他工具看到的不一致?

因為ossfs預設會快取檔案的元資訊(包括大小/許可權等),這樣就不需要每次ls的時候向OSS發送請求,加快速度。 如果用戶通過其他程式(例如SDK/官網控制台/osscmd等)對檔案進行了修改,那麼有可能在ossfs中看到的檔案資訊 沒有及時更新。

如果想禁止ossfs的緩存,那麼可以在掛載的時候加上如下參數:-omax_stat_cache_size=0