JindoFuse 使用指南§
概述§
OSS/OSS-HDFS 可以通过 JindoFuse 提供 POSIX 支持,将 OSS/OSS-HDFS 上的文件挂载到本地文件系统中,让您能够像操作本地文件系统一样操作 OSS/OSS-HDFS 上的文件。
部署安装§
下载最新的 tar.gz 包 jindosdk-x.y.z.tar.gz(x.y.z表版本号),下载页面。
安装部署 JindoSDK,参见 文档链接
挂载 JindoFuse§
在完成对 JindoSDK 的配置后。
- 创建一个挂载点, 命令如下:
mkdir -p <mountpoint>
- 挂载 Fuse, 命令如下:
jindo-fuse <mount_point> -ouri=[<osspath>]
这个命令会启动一个后台的守护进程,将指定的 <oss_path>
挂载到本地文件系统的 <mount_point>
。
<mount_point>
需替换为一个本地路径。
<oss_path>
需替换为待映射的 OSS/OSS-HDFS 路径,路径可以为 Bucket 根目录或者子目录。如 oss://examplebucket.cn-shanghai.oss-dls.aliyuncs.com/subdir/
挂载 OSS 和 OSS-HDFS 路径的方式基本相同,仅路径中的 endpoint 略有不同。根路径示例可参见:《OSS/OSS-HDFS 快速入门》
- 确认挂载成功,jindo-fuse 进程存在,且启动参数与预期一致
ps -ef | grep jindo-fuse
访问 JindoFuse§
如果将 JindoFS 服务挂载到了本地 /mnt/oss/,可以执行以下命令访问 JindoFuse。
- 列出/mnt/oss/下的所有目录:
ls /mnt/oss/
- 创建目录:
mkdir /mnt/oss/dir1
ls /mnt/oss/
- 写入文件:
echo "hello world" > /mnt/oss/dir1/hello.txt
- 读取文件:
cat /mnt/oss/dir1/hello.txt
显示hello world
。
- 删除目录:
rm -rf /mnt/oss/dir1/
卸载 JindoFuse§
想卸载之前挂载的挂载点,可以使用如下命令:
umount <mount_point>
自动卸载 JindoFuse§
可以使用 -oauto_unmount
参数,自动卸载挂载点。
使用该参数后,可以支持 killall -9 jindo-fuse
发送 SIGINT 给 jindo-fuse 进程,进程退出前会自动卸载挂载点。
特性支持§
目前 JindoFuse 已经支持以下 POSIX API:
特性 | 说明 | OSS | OSS-HDFS |
---|---|---|---|
getattr() | 查询文件属性,类似 ls | ✅ | ✅ |
mkdir() | 创建目录,类似 mkdir | ✅ | ✅ |
rmdir() | 删除目录,类似 rm -rf | ✅ | ✅ |
unlink() | 删除文件,类似 unlink | ✅ | ✅ |
rename() | 重命名,类似 mv | ✅ | ✅ |
read() | 顺序读取 | ✅ | ✅ |
pread() | 随机读 | ✅ | ✅ |
write() | 顺序写 | ✅ | ✅ |
pwrite() | 随机写 | ❌ | ✅ |
flush() | 刷新内存到内核缓冲区 | 仅支持以最追加写方式打开的文件 | ✅ |
fsync() | 刷新内存到磁盘 | 仅支持以最追加写方式打开的文件 | ✅ |
release() | 关闭文件 | ✅ | ✅ |
readdir() | 读取目录 | ✅ | ✅ |
create() | 创建文件 | ✅ | ✅ |
open() O_APPEND | 通过追加写的方式打开文件 | 支持,但有使用限制 | ✅ |
open() O_TRUNC | 通过覆盖写的方式打开文件 | ✅ | ✅ |
ftruncate() | 对打开的文件进行截断 | ❌ | ✅ |
truncate() | 对未打开的文件进行截断,类似 truncate -s | ❌ | ✅ |
lseek() | 指定打开文件中的读写位置。 | ❌ | ✅ |
chmod() | 修改文件权限,类似 chmod | ❌ | ✅ |
access() | 查询文件权限 | ✅ | ✅ |
utimes() | 修改文件的存取时间和更改时间 | ❌ | ✅ |
setxattr() | 修改文件 xattr 属性 | ❌ | ✅ |
getxattr() | 获取文件 xattr 属性 | ❌ | ✅ |
listxattr() | 列举文件 xattr 属性 | ❌ | ✅ |
removexattr() | 删除文件 xattr 属性 | ❌ | ✅ |
lock() | 支持 posix 锁,类似 fcntl | ❌ | ✅ |
fallocate() | 为文件预分配物理空间 | ❌ | ✅ |
symlink() | 创建软连接 | ❌ | 目前仅支持 OSS-HDFS 内部使用,且不支持缓存加速 |
readlink() | 读取软连接 | ❌ | 目前仅支持 OSS-HDFS 内部使用,且不支持缓存加速 |
高阶使用§
挂载选项§
参数名称 | 必选 | 版本 | 参数说明 | 使用范例 |
---|---|---|---|---|
uri | ✓ | 4.3.0+ | 配置需要映射的 oss 路径。路径可以是根目录,也可以是子目录。例如:oss://examplebucket/ 或 oss://examplebucket/subdir。 | -ouri=oss://examplebucket/ |
f | 4.3.0+ | 在前台启动进程。默认使用守护进程方式后台启动。使用该参数时,推荐开启终端日志。 | -f | |
d | 4.3.0+ | 使用 Debug 模式,在前台启动进程。使用该参数时,推荐开启终端日志。 | -d | |
auto_unmount | 4.3.0+ | fuse进程退出后自动umount挂载节点。 | -oauto_unmount | |
ro | 4.3.0+ | 只读挂载,启用参数后不允许写操作。 | -oro | |
direct_io | 4.3.0+ | 开启后,读写文件可以绕过page cache。 | -odirect_io | |
kernel_cache | 4.3.0+ | 开启后,利用内核缓存优化读性能。 | -okernel_cache | |
auto_cache | 4.3.0+ | 默认开启,与kernel_cache 二选一,与kernel_cache不同的是,如果文件大小或修改时间发生变化,缓存就会失效。 | ||
entry_timeout | 4.3.0+ | 默认值,60。文件名读取缓存保留时间(秒),用于优化性能。0表示不缓存。 | -oentry_timeout=60 | |
attr_timeout | 4.3.0+ | 默认值,60。文件属性缓存保留时间(秒),用于优化性能。0表示不缓存。 | -oattr_timeout=60 | |
negative_timeout | 4.3.0+ | 默认值,60。文件名读取失败缓存保留时间(秒),用于优化性能。0表示不缓存。 | -onegative_timeout=0 | |
max_idle_threads | 4.3.0+ | 默认值,10。处理内核回调的空闲线程池。 | -omax_idle_threads=10 | |
xengine | 4.3.0+ | 打开缓存 | -oxengine | |
pread | 4.5.1+ | 默认使用顺序读。打开后,使用随机读代替顺序读,适用于随机读远多于顺序读的场景。 | -opread | |
no_symlink | 4.5.1+ | 配置后,关闭symlink功能。 | -ono_symlink | |
no_writeback | 4.5.1+ | 配置后,关闭writeback功能。 | -ono_writeback | |
no_flock | 4.5.1+ | 配置后,关闭flock功能。 | -ono_flock | |
no_xattr | 4.5.1+ | 配置后,关闭xttar功能。 | -ono_xattr |
配置选项§
配置项 | 默认值 | 说明 |
---|---|---|
logger.dir | /tmp/bigboot-log | 日志目录,不存在会创建 |
logger.sync | false | 是否同步输出日志,false表示异步输出 |
logger.consolelogger | false | 打印日志到终端 |
logger.level | 2 | 输出大于等于该等级的日志,等级范围为0-6,分别表示:TRACE、DEBUG、INFO、WARN、ERROR、CRITICAL、OFF |
logger.verbose | 0 | 输出大于等于该等级的VERBOSE日志,等级范围为0-99,0表示不输出 |
logger.cleaner.enable | false | 是否开启日志清理 |
fs.oss.endpoint | 访问 JindoFS 服务的地址,如oss-cn-xxx.aliyuncs.com | |
fs.oss.accessKeyId | 访问 JindoFS 服务需要的 accessKeyId | |
fs.oss.accessKeySecret | 访问 JindoFS 服务需要的 accessKeySecret |
更多参数可见《客户端常用配置》。
- 支持将 jindosdk 配置节参数与挂载选项一同在挂载时指定(挂载时指定参数的优先级高于配置文件),如:
jindo-fuse <mount_point> -ouri=[<oss_path>] -ofs.oss.endpoint=[<your_endpoint>] -ofs.oss.accessKeyId=[<your_key_id>] -ofs.oss.accessKeySecret=[<your_key_secret>]
常见问题§
Input/Output error§
不像使用 JindoSDK 调用 API 可以获取更为具体的 ErrorMsg,JindoFuse 只能显示操作系统预设的错误信息,比如以下错误就非常常见:
$ ls /mnt/oss/
ls: /mnt/oss/: Input/output error
如果需要定位具体的错误原因,可以根据 JindoSDK 配置中的 logger.dir,在指定路径下的jindosdk.log
文件中,寻找具体的错误。
下面展示的这个错误就来自 jindosdk.log
,根据报错信息可见,这个错误是常见的鉴权问题。
EMMDD HH:mm:ss jindofs_connectivity.cpp:13] Please check your Endpoint/Bucket/RoleArn. Failed test connectivity, operation: mkdir, errMsg: [RequestId]: 618B8183343EA53531C62B74 [HostId]: oss-cn-shanghai-internal.aliyuncs.com [ErrorMessage]: [E1010]HTTP/1.1 403 Forbidden ...