我的使用情境, 是在 bucket 的路徑上執行 python script 產生1GB 的檔案, 透過 goofys 會失敗, 只會產生一個 0 bytes 的檔案, 但是使用s3fs-fuse 就可以正確的產生檔案到 bucket 中.
python create_tmp_file.py 內容:
with open("1GB.dat", "wb") as out:
out.truncate(1*(1024**3))
測試環境:
- rocky linux 8
- goofys version 0.24.0-45b8d78375af1b24604439d2e60c567654bcdf88
測試情境:
- 複製 local storage 大於 500MB 檔案到 bucket 會失敗.
- 直接在 bucket 的 path 上, 執行 python script 產生 500MB 檔案會失敗.
- 連直接在 bucket 上使用 vi 開啟 python script 檔案來修改, 都會顯示錯誤訊息: E297: Write error in swap file
解法:
改用 s3fs-fuse 來 mount bucket 就一切正常,
s3fs-fuse 檔案下載/安裝:
https://github.com/s3fs-fuse/s3fs-fuse
其他人的安裝分享:
How to Mount S3 Bucket on Linux Instance
https://sysadminxpert.com/how-to-mount-s3-bucket-on-linux-instance/#Step_2_Install_the_s3fs_on_Linux_CentOSRHELAmazon_Linux
附註: 這個人所分享的 script 有些地方有錯誤, 直接使用原作者的 script 比較簡單.
值得注意的是上面文件中的 Limitations:
non-AWS providers may have eventual consistency so reads can temporarily yield stale data (AWS offers read-after-write consistency since Dec 2020)
- https://en.wikipedia.org/wiki/Eventual_consistency
- https://aws.amazon.com/about-aws/whats-new/2020/12/amazon-s3-now-delivers-strong-read-after-write-consistency-automatically-for-all-applications/
結論: non-AWS providers 就會是有bucket 的 bug 的樣子.
我的 mount 指令:
mkdir -p ~/bucket/
echo access_key:scrept_key > ~/bucket/.profile-8.passwd-s3fs
chmod 600 ~/bucket/.profile-8.passwd-s3fs
mkdir -p /tmp/cache/s3-mount-8
chmod 777 /tmp/cache/s3-mount-8
s3fs my_bucket_name /tmp/cache/s3-mount-8 -o passwd_file=~/bucket/.profile-8.passwd-s3fs -o url=https://my_end_point/
我的 unmount 指令:
- fusermount -u /tmp/cache/s3-mount-8
- umount /tmp/cache/s3-mount-8
- s3fs umount /tmp/cache/s3-mount-8
上面3個都可以, 但如果mount point 上有 process 正在存取中, 會 umount fail.
fusermount: failed to unmount /tmp/cache/s3-mount-8: Device or resource busy