在这篇文章中:

    通过S3cmd实现对象存储资源的创建和使用

    S3cmd介绍:

    S3cmd是一款Amazon S3命令行工具。它不仅能上传、下载、同步数据,还能设置访问权限。S3cmd是开源的,在GPLv2许可下分发。

    本文将介绍如何安装、配置和使用S3cmd来管理您在交大云平台对象存储中的数据。

    S3cmd安装:

    方法一:通过RPM库安装

    在CentOS,RHEL和Ubuntu等系统上,可以简单的执行以下命令进行安装。

    CentOS / RHEL系统:

    1
    # yum install s3cmd

    Ubuntu / Debian系统:

    1
    2
    3
    # wget -O- -q http://s3tools.org/repo/deb-all/stable/s3tools.key | sudo apt-key add -
    # wget -O/etc/apt/sources.list.d/s3tools.list http://s3tools.org/repo/deb-all/stable/s3tools.list
    # apt-get update && sudo apt-get install s3cmd

    方法二:使用Source安装最新的S3cmd

    如果使用上述软件包管理器,您没有得到最新的版本,可以使用源代码,在系统上安装最新的s3cmd版本。

    访问https://sourceforge.net/projects/s3tools/files/s3cmd/ 或者使用下面的命令来下载最新版本的s3cmd。

    1
    2
    # wget http://ufpr.dl.sourceforge.net/project/s3tools/s3cmd/2.1.0/s3cmd-2.1.0.tar.gz
    # tar xzf s3cmd-2.1.0.tar.g

    现在,使用下面的命令对下载的源文件进行安装。

    1
    2
    # cd s3cmd-2.1.0
    # sudo python setup.py install

    安装的过程中有可能会出现“ImportError: No module named setuptools”的错误提示。

    解决方法:先执行下面的命令,之后再执行安装命令即可。

    1
    2
    # wget   https://bootstrap.pypa.io/ez_setup.py 
    # python ez_setup.py

    s3cmd环境配置:

    1. 获取AK/SK

    a) 登录交大云平台:https://home.jcloud.sjtu.edu.cn

    b) 选择并确认需要创建对象存储的项目

    c) 点击界面左侧的:存储、对象存储条目,进入对象存储管理界面

    d)点击管理界面左上方的:获取AK/SK

    1. 修改s3cmd配置文件:

    a)在/root目录下,创建.s3cfg文件:

    1
    # vi /root/.s3cfg

    b)在.s3cfg 文件中添加如下内容,其中access_key和secret_key分别填入步骤1中获得的AK和SK

    1
    2
    3
    4
    5
    access_key = **********************************b014
    secret_key = **********************************fdb9
    host_base = s3.jcloud.sjtu.edu.cn:443
    host_bucket = s3.jcloud.sjtu.edu.cn:443
    use_https = True

    c) 执行s3cmd ls 命令,验证安装及配置是否成功:(如此时还没有创建任何资源,因此无内容返回)

    1
    2
    # s3cmd ls
    2021-03-16 03:08 s3://my_bucket

    通过s3cmd命令进行对象存储资源的管理和访问:

    1. 创建存储桶:(示例桶名:my_bucket )

    命令:s3cmd mb s3://存储桶名

    示例:s3cmd mb s3://my_bucket

    注意:存储桶名是唯一的,不能重复,不能用点号(“.”)分隔,可以使用下划线

    1
    2
    # s3cmd mb s3://my_bucket
    Bucket 's3://my_bucket/' created
    1. 查看所有已创建的存储桶:

    命令:s3cmd ls

    1
    2
    # s3cmd ls
    2021-03-18 01:01 s3://my_bucket
    1. 向指定存储桶上传文件:

    命令:s3cmd put 文件路径/源文件名 存储桶名

    示例:s3cmd put /etc/hosts s3://my_bucket

    1
    2
    3
    # s3cmd put  /etc/hosts  s3://my_bucket
    upload: '/etc/hosts' -> 's3://my_bucket/hosts' [1 of 1]
    159 of 159 100% in 0s 1693.76 B/s done
    1. 向指定存储桶批量上传文件:

    命令:s3cmd put 文件路径/* s3://存储桶名/

    示例:s3cmd put /test/* s3://my_bucket

    1
    2
    3
    4
    5
    6
    7
    # s3cmd put /test/* s3://my_bucket
    upload: '/test/adjtime' -> 's3://my_bucket/adjtime' [1 of 3]
    16 of 16 100% in 0s 901.76 B/s done
    upload: '/test/bashrc' -> 's3://my_bucket/bashrc' [2 of 3]
    2853 of 2853 100% in 0s 29.47 KB/s done
    upload: '/test/hosts' -> 's3://my_bucket/hosts' [3 of 3]
    159 of 159 100% in 0s 12.51 KB/s done
    1. 查看指定存储桶中的文件:

    命令:s3cmd ls s3://存储桶名

    示例:s3cmd ls s3://my_bucket

    1
    2
    3
    4
    # s3cmd ls s3://my_bucket
    2021-03-18 01:02 16 s3://my_bucket/adjtime
    2021-03-18 01:02 2853 s3://my_bucket/bashrc
    2021-03-18 01:02 159 s3://my_bucket/hosts
    1. 下载指定存储桶中的文件:

    命令:s3cmd get s3://存储桶名/源文件名 目标文件名

    示例:s3cmd get s3://my-bucket-name/hosts hosts

    1
    2
    3
    # s3cmd get s3://my_bucket/hosts hosts
    download: 's3://my_bucket/hosts' -> 'hosts' [1 of 1]
    159 of 159 100% in 0s 1989.17 B/s done
    1. 批量下载指定存储桶中的文件:

    命令:s3cmd get s3://存储桶名/* 目标路径

    示例:s3cmd get s3://my_bucket/* ./

    1
    2
    3
    4
    5
    6
    7
    # s3cmd get s3://my_bucket/* ./
    download: 's3://my_bucket/adjtime' -> './adjtime' [1 of 3]
    16 of 16 100% in 0s 200.69 B/s done
    download: 's3://my_bucket/bashrc' -> './bashrc' [2 of 3]
    2853 of 2853 100% in 0s 148.37 KB/s done
    download: 's3://my_bucket/hosts' -> './hosts' [3 of 3]
    159 of 159 100% in 0s 1863.86 B/s done
    1. 删除指定存储桶中的文件:

    命令:s3cmd del s3://存储桶名称/文件名称

    示例:s3cmd del s3://my_bucket/hosts

    1
    2
    # s3cmd del s3://my_bucket/hosts
    delete: 's3://my_bucket/hosts'
    1. 删除指定空存储桶:(如存储桶内有未删除的文件,则需先删除文件)

    命令:s3cmd rb s3://存储桶名称

    示例:s3cmd rb s3://my_bucket

    1
    2
    # s3cmd rb s3://my_bucket
    Bucket 's3://my_bucket/' removed
    1. 获得指定存储桶所占用的空间大小

    命令:s3cmd du -H s3://存储桶名

    示例:s3cmd du -H s3://my_bucket

    1
    2
    # s3cmd du -H s3://my_bucket
    2K 3 objects s3://my_bucket/

    目录处理规则:

    以下命令都能将dir1 中的文件上传至my-bucket-name,但效果截然不同。

    1) dir1 不带”/“斜杠,那么dir1会作为文件路径的一部分,相当于上传整个dir1目录,即类似 “cp -r dir1/

    1
    2
    # s3cmd put -r dir1 s3://my-bucket-name/
    dir1/file1-1.txt -> s3://my-bucket-name/dir1/file1-1.txt [1 of 1]

    2) 带”/“斜杠的 dir1,相当于上传dir1目录下的所有文件,即类似 “cp ./*

    1
    2
    # s3cmd put -r dir1/ s3://my-bucket-name/
    dir1/file1-1.txt -> s3://my-bucket-name/file1-1.txt [1 of 1]

    同步方法

    这是s3cmd 使用难点,但却是最实用的功能。官方使用说明见《s3cmd sync HowTo》

    首先明确,同步操作是要进行MD5校验的,只有当文件不同时,才会被传输。

    1. 常规同步操作

      1) 同步当前目录下所有文件

      1
      # s3cmd sync  ./  s3://my-bucket-name/

      2) 加 “–dry-run”参数后,仅列出需要同步的项目,不实际进行同步

      1
      # s3cmd sync  --dry-run ./  s3://my-bucket-name/

      3) 加 “ –delete-removed”参数后,若本地不存在但存储桶中存在的文件,会删除存储桶中的文件;若本地存在但存储桶中不存在的文件,则会上传到存储桶中。

      1
      # s3cmd sync  --delete-removed ./  s3://my-bucket-name/

      4) 加 “ –skip-existing”参数后,不进行MD5校验,直接跳过本地已存在的文件

      1
      # s3cmd sync  --skip-existing ./  s3://my-bucket-name/
    2. 高级同步操作

      1) 排除、包含规则(–exclude 、–include)

      file1-1.txt被排除,file2-2.txt同样是txt格式却能被包含。

      1
      2
      3
      # s3cmd sync --dry-run --exclude '*.txt' --include 'dir2/*' ./  s3://my-bucket-name/
      exclude: dir1/file1-1.txt
      upload: ./dir2/file2-2.txt -> s3://my-bucket-name/dir2/file2-2.txt

    2) 从文件中载入排除或包含规则。(–exclude-from、–include-from)

    1
    # s3cmd sync  --exclude-from pictures.exclude ./  s3://my-bucket-name/

    pictures.exclude 文件内容

    1
    2
    3
    # Hey, comments are allowed here ;-)
    *.jpg
    *.gif

    3) 排除或包含规则支持正则表达式

    1
    --rexclude 、--rinclude、--rexclude-from、--rinclude-from