QingCloud 文档 – 客户端工具 - kaiyun官方网站下载手机网页 /storage/object-storage/manual/tool/ Recent content in 客户端工具 on QingCloud 文档 Hugo -- gohugo.io Storage: qsctl /storage/object-storage/manual/tool/qsctl/ Mon, 17 May 2021 10:08:56 +0800 /storage/object-storage/manual/tool/qsctl/ <h2 id="概述">概述</h2> <p>qsctl 是 QingStor 对象存储提供的客户端高级命令行工具,用于管理 QingStor 对象存储资源。qsctl 提供了强大的类 UNIX 命令,所有的 qsctl 命令均支持批量操作。</p> <p>QingStor 对象存储建议用户下载使用最新版本的 qsctl,若您仍需查看 qsctl v1.x 版本的相关文档,请点击 <a href="v1">qsctl v1 文档</a>。</p> <h2 id="安装">安装</h2> <h3 id="下载安装">下载安装</h3> <ol> <li>直接<a href="https://releases.qingstor.dev/#qsctl">点击此处</a>,根据客户端操作系统版本,下载相应安装包。若无特殊要求,QingStor 对象存储建议下载最新版本。</li> </ol> <p><img src="/storage/object-storage/_images/qsctl_install1.png" alt=""></p> <ol start="2"> <li>本地解压安装包后,即可运行:</li> </ol> <p><img src="/storage/object-storage/_images/qsctl_install2.png" alt=""></p> <h3 id="修改配置">修改配置</h3> <p>在正式使用 qsctl 工具前,用户需修改相应的配置文件,从而使其能正常工作。在载入配置文件时,qsctl 会按照如下顺序进行尝试,一旦读取成功便不再尝试下一个配置文件:</p> <ul> <li>用户通过 <code>-c</code> 参数指定的配置文件</li> <li>配置文件:<code>~/.qingstor/config.yaml</code></li> <li>配置文件:<code>~/.config/qingstor/config.yaml</code></li> <li>配置文件:<code>/etc/qingstor/config.yaml</code></li> </ul> <p>以上为类 Unix 系统下的配置文件路径,对于 Windows 用户而言,配置文件路径为 <code>C:\User\{\%USERPROFILE\%}\.qingstor\config.yaml</code>。</p> <p><strong>详细操作步骤如下:</strong></p> <ol> <li> <p>在 <a href="https://console.qingcloud.com/access_keys/">管理控制台</a> 申请 API 密钥,并下载保存。</p> </li> <li> <p>根据前文信息,依次查看是否存在默认配置文件:</p> </li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>cat ~/.qingstor/config.yaml </span></span><span style="display:flex;"><span>cat ~/.config/qingstor/config.yaml </span></span><span style="display:flex;"><span>cat /etc/qingstor/config.yaml </span></span></code></pre></div><ol start="3"> <li>若以上文件均不存在,即说明无默认配置文件,需按照如下步骤手动创建配置文件:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>touch qsctl_config.yaml </span></span></code></pre></div><ol start="4"> <li>按如下格式填写配置相关信息:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">access_key_id</span>: <span style="color:#e6db74">&#39;ACCESS_KEY_ID_EXAMPLE&#39;</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">secret_access_key</span>: <span style="color:#e6db74">&#39;SECRET_ACCESS_KEY_EXAMPLE&#39;</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">zone</span>: <span style="color:#e6db74">&#39;zone_name&#39;</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">host</span>: <span style="color:#e6db74">&#39;qingstor.com&#39;</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">port</span>: <span style="color:#ae81ff">443</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">protocol</span>: <span style="color:#e6db74">&#39;https&#39;</span> </span></span></code></pre></div><p><strong>说明:</strong></p> <ul> <li> <p><code>access_key_id</code> 与 <code>secret_access_key</code> 根据步骤 1 中下载的 API 密钥进行填写。</p> </li> <li> <p><code>zone</code>,<code>host</code>,<code>port</code> 与 <code>protocol</code> 参数为待访问的 QingStor 对象存储的区域名,域名,端口号及协议类型。公有云维持默认即可,私有云环境需根据实际情况进行填写。</p> </li> <li> <p><code>host</code> 参数为待访问的 QingStor 对象存储域名,该域名 URL 不包含 Zone 字段。</p> </li> <li> <p>配置文件默认使用 HTTPS 访问方式,若需修改为 HTTP 访问方式,可按照如下内容填写:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">port</span>: <span style="color:#ae81ff">80</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">protocol</span>: <span style="color:#e6db74">&#39;http&#39;</span> </span></span></code></pre></div></li> </ul> <h2 id="升级">升级</h2> <h3 id="变更日志">变更日志</h3> <p>详见 <a href="https://github.com/qingstor/qsctl/blob/master/CHANGELOG.md">qsctl changelog</a>。</p> <h3 id="升级指南">升级指南</h3> <p>QingStor 对象存储建议您升级至 qsctl 最新版本。详细操作步骤如下:</p> <ol> <li>执行如下命令行,删除历史版本的 qsctl :</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo pip uninstall qsctl </span></span></code></pre></div><ol start="2"> <li>参考上文安装配置 <a href="#%E5%AE%89%E8%A3%85">qsctl</a></li> </ol> <h3 id="兼容性说明">兼容性说明</h3> <ul> <li>配置文件中,相关字段更新如下:</li> </ul> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># 原字段</span> </span></span><span style="display:flex;"><span>qs_access_key_id: </span></span><span style="display:flex;"><span>qs_secret_access_key: </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># 更新为如下字段:</span> </span></span><span style="display:flex;"><span>access_key_id: </span></span><span style="display:flex;"><span>secret_access_key: </span></span></code></pre></div><ul> <li>qsctl 自 v2.4.3 不再从如下路径读取配置文件:</li> </ul> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>~/.qingcloud/config.yaml </span></span></code></pre></div><ul> <li>对相关命令做出的变更说明如下:</li> </ul> <table> <tr> <th>命令</th> <th>说明</th> </tr> <tr> <td rowspan="2">cp,mv</td> <td>暂时取消对 include,exclude,--rate-limit 和 workers 选项的支持</td> </tr> <tr> <td>对本地文件夹的操作在路径结尾是否添加 `/` 时行为有所不同</td> </tr> <tr> <td rowspan="3">sync</td> <td>暂时取消对 include,exclude,--rate-limit 和 workers 选项的支持</td> </tr> <tr> <td>暂未添加对 --delete 选项的支持</td> </tr> <tr> <td>默认修改为非递归操作,如果需要递归同步子目录,请添加 -r 选项</td> </tr> <tr> <td>ls</td> <td>默认修改为只显示文件名的操作;如需显示详细信息,请添加 -l 选项</td> </tr> <tr> <td>rm</td> <td>暂时取消对 include,exclude,--rate-limit 和 workers 选项的支持</td> </tr> </table> <h2 id="使用">使用</h2> <p>qsctl v2.2.0 中移除了之前添加的交互式的配置程序。若您仍需要进行交互式配置,建议使用 v2.1.2 版本。 v2.1.2 版本中,在您首次使用 qsctl 且未在默认目录下检索到配置文件时,便会启动该交互配置。您只需要根据命令行的提示输入或选择配置内容即可。配置完成后,配置程序会根据您输入的信息,在系统中生成如下配置文件:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#f92672">{</span>主目录<span style="color:#f92672">}</span>/.qingstor/config.yaml </span></span></code></pre></div><p><strong>说明:</strong></p> <ul> <li>具体的配置文件的位置会根据您的系统而有所不同。</li> <li>在类 Unix 操作系统下,配置文件会生成在 <code>~/.qingstor/config.yaml</code>。</li> <li>在 Windows 操作系统下,配置文件会生成在 <code>C:\User\{\%USERPROFILE\%}\.qingstor\config.yaml</code>。</li> </ul> <h3 id="命令列表">命令列表</h3> <table> <thead> <tr> <th>命令</th> <th>描述</th> </tr> </thead> <tbody> <tr> <td>cat</td> <td>输出远程对象内容至标准输出。</td> </tr> <tr> <td>cp</td> <td>复制本地文件至 QingStor 对象存储的 Bucket,或从 QingStor 对象存储的 Bucket 复制对象至本地。</td> </tr> <tr> <td>ls</td> <td>列出本用户下创建的所有 QingStor 对象存储的 Bucket,或列出给定 QingStor 对象存储的 Bucket 中给定前缀下的所有对象。</td> </tr> <tr> <td>mb</td> <td>在 QingStor 对象存储服务端创建一个新的 Bucket。</td> </tr> <tr> <td>mv</td> <td>移动本地文件至 QingStor 对象存储的 Bucket,或移动 QingStor 对象存储 Bucket 中的对象至本地。</td> </tr> <tr> <td>presign</td> <td>生成 QingStor 对象存储的 Bucket 指定对象的临时下载链接。</td> </tr> <tr> <td>rb</td> <td>从 QingStor 对象存储删除 Bucket。</td> </tr> <tr> <td>rm</td> <td>从 QingStor 对象存储 Bucket 删除一个对象或给定前缀下的所有对象。</td> </tr> <tr> <td>stat</td> <td>查看一个指定的 QingStor 对象存储的对象信息。</td> </tr> <tr> <td>sync</td> <td>同步本地目录和 QingStor 对象存储目录。</td> </tr> <tr> <td>tee</td> <td>从标准输入读取内容并上传至 QingStor 对象存储的 Bucket。</td> </tr> </tbody> </table> <h3 id="查看帮助文件">查看帮助文件</h3> <ol> <li>查看 qsctl 的命令列表和简易教程,可以通过 <code>-h</code> 参数打印出来:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>qsctl -h </span></span></code></pre></div><ol start="2"> <li>查看 qsctl 的某个命令的详细说明和示例,请运行:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>qsctl &lt;command&gt; --help </span></span></code></pre></div><h3 id="上传文件">上传文件</h3> <ol> <li>将本地文件上传至 QingStor 对象存储的 Bucket 中:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>qsctl cp /path/to/file qs://mybucket/filename </span></span></code></pre></div><p><strong>说明:</strong></p> <ul> <li>若不指定 <code>-c</code> 参数,则使用默认配置文件。</li> <li>命令行中 <code>/path/to/file</code> 为本地待上传文件,需根据实际情况进行修改。</li> <li>命令行中 <code>qs://mybucket/filename</code> 为 QingStor 对象存储 Bucket 中文件路径,需根据实际情况进行修改。其中若不指定 <code>filename</code>,则上传后文件名根据源文件名创建;若指定 <code>filename</code>,则将源文件重命名为 <code>filename</code> 进行存储。</li> </ul> <ol start="2"> <li>将本地文件夹上传至 QingStor 对象存储的 Bucket 中:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ qsctl cp /path/to/folder qs://mybucket/parent/ -r </span></span></code></pre></div><ol start="3"> <li>将本地文件夹下的所有文件上传至 QingStor 对象存储的 Bucket 中:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ qsctl cp /path/to/folder/ qs://mybucket/parent/ -r </span></span></code></pre></div><p><strong>说明:</strong></p> <ul> <li>若待上传的对象是文件夹,则源文件为:<code>/path/to/folder</code>。</li> <li>若待上传的对象是文件夹下的所有内容,则源文件为:<code>/path/to/folder/</code>。需注意两者的区别。</li> <li><code>-r</code> 参数用于递归地复制文件夹及其子文件夹。所以使用该参数时,源路径与目标路径必须都是目录。</li> </ul> <h3 id="下载文件">下载文件</h3> <p>执行如下命令行,从 QingStor 对象存储的 Bucket 中下载文件至本地:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>qsctl cp qs://mybucket/filename /path/to/file </span></span></code></pre></div><p><strong>说明:</strong></p> <ul> <li>与上传文件至 QingStor 对象存储 Bucket 的区别在于源路径与目标路径的位置不同。</li> <li>其他用法均与上传文件至 QingStor 对象存储 Bucket 保持一致。</li> </ul> <h3 id="查看文件信息">查看文件信息</h3> <p><code>ls</code> 的结果不能保证有序,请勿依赖该命令来遍历显示顺序。</p> <ol> <li>列出该用户的所有 Bucket:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>qsctl ls </span></span></code></pre></div><ol start="2"> <li>列出指定 Bucket <code>mybucket</code> 下的所有对象:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>qsctl ls qs://mybucket -R </span></span></code></pre></div><p><strong>说明:</strong></p> <ul> <li><code>-R</code> 参数用于递归地显示文件夹及其子文件夹下的对象。</li> <li>若不指定<code>-R</code> 参数,Bucket 若有文件夹时,则仅显示文件夹名,不显示文件夹内的文件。</li> <li>输出内容如下所示: <img src="/storage/object-storage/_images/qsctl_ls1.png" alt=""> <img src="/storage/object-storage/_images/qsctl_ls2.png" alt=""></li> </ul> <ol start="3"> <li>以列出指定 Bucket <code>mybucket</code> 下所有对象的详细信息:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>qsctl ls qs://mybucket -lRh </span></span></code></pre></div><p><strong>说明:</strong></p> <ul> <li><code>-l</code> 参数用于显示文件的详细信息。</li> <li><code>-h</code> 参数用于转换文件的大小。</li> <li>输出内容如下所示: <img src="/storage/object-storage/_images/qsctl_ls3.png" alt=""></li> </ul> <h3 id="移动文件">移动文件</h3> <p><code>mv</code> 操作与 <code>cp</code> 操作对文件夹与文件夹中的文件的处理逻辑相同, 请参考 <a href="#%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6">cp</a>。</p> <h3 id="查看统计信息">查看统计信息</h3> <ol> <li>查看指定 Bucket <code>mybucket</code> 的统计信息:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>qsctl stat qs://mybucket </span></span></code></pre></div><p><strong>输出结果:</strong></p> <p><img src="/storage/object-storage/_images/qsctl_stat1.png" alt=""></p> <ol start="2"> <li>查看指定 QingStor 对象信息:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>qsctl stat qs://mybucket/dir/to/test </span></span></code></pre></div><p><strong>输出结果:</strong></p> <p><img src="/storage/object-storage/_images/qsctl_stat2.png" alt=""></p> <ol start="3"> <li>查看指定 QingStor 对象信息,并自定义格式输出:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>qsctl stat qs://mybucket/dir/to/test --format<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;name:%n, size:%s&#34;</span> </span></span></code></pre></div><p><strong>输出结果:</strong></p> <p><img src="/storage/object-storage/_images/qsctl_stat3.png" alt=""></p> <p><strong>说明:</strong><code>format</code> 参数用于传入格式化输出字符串。其中可用的有:</p> <ul> <li><code>%F</code> (文件类型)</li> <li><code>%h</code> (文件内容的 etag 信息)</li> <li><code>%n</code> (文件名)</li> <li><code>%s</code> (文件大小,单位为字节)</li> <li><code>%y</code> (最后一次数据修改的时间,显示为可读模式)</li> <li><code>%Y</code> (最后一次数据修改的时间,显示为 Unix 时间戳)</li> </ul> <h3 id="数据同步">数据同步</h3> <p><code>sync</code> 命令用于本地目录与 QingStor 对象存储目录的数据同步。故该操作的源路径与目标路径必须都是目录。由于 QingStor 对象存储没有目录概念,所以必须以 <code>/</code> 结尾。本地文件夹若为类 Unix 系统,须以 <code>/</code> 结尾;若为 Windows 系统请替换为 <code>\</code>。若本地文件夹不添加结尾字符,则系统会针对本地文件夹的父目录进行同步操作。</p> <ol> <li>同步 QingStor 对象存储目录至本地文件夹:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>qsctl sync qs://mybucket/test/ /path/to/dir/ -r </span></span></code></pre></div><ol start="2"> <li>仅同步本地文件夹中更新的文件(不同步目标路径中不存在的文件):</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>qsctl sync . qs://mybucket/test/ -r --update --existing </span></span></code></pre></div><p><strong>说明:</strong></p> <ul> <li><code>--update</code> 参数用于指定仅同步源路径中(比目标路径)更新的文件。</li> <li><code>--existing</code> 参数用于指定仅复制已存在于目标目录中的文件。对于目标目录中不存在的文件,不做同步。</li> <li><code>--dry-run</code> 参数可用于显示哪些文件将会被同步(但并不真正执行同步操作),用于确认,避免误操作。</li> </ul> <h3 id="tee">tee</h3> <p>从标准输入上传文件至 QingStor 对象存储。qsctl 将不会像 Linux tee 命令那样将内容绑定至标准输出。</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>cat /path/to/file | qsctl tee qs://mybucket/filename </span></span></code></pre></div><h3 id="qsctl-shell">qsctl shell</h3> <p>自 qsctl v2.2.0 版本以来,QingStor 对象存储新加入了交互式的 shell 界面,包含更多的引导和提示信息,推荐新用户使用。若用户需使用 qsctl 开发脚本,建议直接使用前文介绍的命令模式。</p> <p>QingStor 对象存储将所有命令执行中的交互都移动至 shell 中,包括进度条,删除 bucket 时的确认输入,删除 object 时的确认等。并在命令行直接执行时移除了这些交互效果,以便更好的支持用户使用脚本进行操作。除此之外,用户在终端与 qsctl shell 中输入同样指令所得到的结果是一致的。</p> <ol> <li>执行如下命令,进入命令行界面:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>qsctl shell </span></span></code></pre></div><ol start="2"> <li>命令行界面如下下图所示:</li> </ol> <p><img src="/storage/object-storage/_images/qsctl_shell1.png" alt=""></p> <ol start="3"> <li>根据提示,进行相关操作即可。在命令行中,QingStor 对象存储新增了对历史命令和自动补全的支持。详细说明如下:</li> </ol> <ul> <li>在行开头可以自动提示补全可用命令;</li> <li>输入 <code>qs://</code> 可以自动提示补全用户的 Bucket 信息;</li> <li>空格后可以自动提示补全本地文件信息;</li> <li>输入 <code>-</code> 可以自动提示补全当前命令可用 flag 信息。</li> </ul> Storage: qscamel /storage/object-storage/manual/tool/qscamel/ Tue, 10 Aug 2021 10:08:56 +0900 /storage/object-storage/manual/tool/qscamel/ <h2 id="功能概述">功能概述</h2> <p>qscamel 是一个用于在不同的端点 (Endpoint) 间高效迁移数据的工具。作为端点间数据迁移的工具,qscamel 有着如下特性:</p> <ul> <li>简单,便于使用的任务管理</li> <li>支持从任务中断处续传,从而节省用户的时间</li> <li>提供完全自动化的重试机制,无须人工介入</li> <li>基于 Goroutine 池实现的并发机制,提高迁移效率</li> <li>支持 copy,fetch,delete 等迁移机制</li> <li>支持数据校验</li> </ul> <h2 id="安装">安装</h2> <ol> <li> <p>在 <a href="https://github.com/qingstor/qscamel/releases">releases</a> 页面分别获取适用于 Linux,macOS 以及 Windows 操作系统的最新版本的 qscamel工具,并进行解压。</p> </li> <li> <p>进入 qscamel 工具所在文件夹,执行如下命令查看 qscamel 版本信息:</p> <pre tabindex="0"><code>./qscamel-xxxx version </code></pre><p>命令行回显如下所示时,说明安装成功。</p> <pre tabindex="0"><code>qscamel version xxxx </code></pre><blockquote> <p><strong>说明</strong></p> <ul> <li>需进入 qscamel 工具所在文件夹下执行命令使用该工具。</li> <li>qscamel-xxxx 为工具下载后解压的文件名称,可根据实际情况进行修改。</li> </ul> </blockquote> </li> <li> <p>执行步骤2中命令后,会自动生成 <code>qscamel.yaml</code> 配置文件,修改配置文件可参考<a href="#%E9%85%8D%E7%BD%AE">配置</a>。</p> </li> </ol> <h2 id="配置">配置</h2> <p>执行如下命令,修改配置文件:</p> <pre tabindex="0"><code>vim ~/.qscamel/qscamel.yaml </code></pre><blockquote> <p><strong>说明</strong></p> <p>qscamel 默认从 <code>~/.qscamel/qscamel.yaml</code> 读取配置文件,用户也可以通过 <code>-c</code> 或者 <code>--config</code> 参数来指定配置文件的位置。</p> </blockquote> <p>qscamel 配置示例:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">concurrency</span>: <span style="color:#ae81ff">0</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">log_level</span>: <span style="color:#ae81ff">info</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">pid_file</span>: <span style="color:#ae81ff">~/.qscamel/qscamel.pid</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">log_file</span>: <span style="color:#ae81ff">~/.qscamel/qscamel.log</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">database_file</span>: <span style="color:#ae81ff">~/.qscamel/db</span> </span></span></code></pre></div><blockquote> <p><strong>说明</strong></p> <ul> <li><code>concurrency</code> 用于控制同时启用的任务并发数量。若没有设置,或者设置为 0, qscamle 将会使用 <code>逻辑 CPU 数量 * 100</code> 作为该项的值。</li> <li><code>log_level</code> 用于控制日志的级别。日志内容显示从多到少依次可设置为:debug,info,warn,error,fatal,panic。</li> <li><code>pid_file</code> 用于控制在何处创建 PID 文件。</li> <li><code>log_file</code> 用于控制在何处创建日志文件。</li> <li><code>database_file</code> 用于控制在何处创建数据库。</li> <li>以上配置字段均有默认值,默认值如示例文件所示。用户可根据需求,修改相应参数。若无特殊需求,用户无需对其进行修改。</li> </ul> </blockquote> <h2 id="任务">任务</h2> <p>用户可通过任务文件来定义一个数据迁移任务,支持如下命令新建任务文件:</p> <pre tabindex="0"><code>vim example-task.yaml </code></pre><p><strong>任务文件配置示例:</strong></p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">type</span>: <span style="color:#ae81ff">copy</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">source</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">type</span>: <span style="color:#ae81ff">fs</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">path</span>: <span style="color:#e6db74">&#34;/path/to/source&#34;</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">destination</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">type</span>: <span style="color:#ae81ff">qingstor</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">path</span>: <span style="color:#ae81ff">/aaa</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">options</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">bucket_name</span>: <span style="color:#ae81ff">example_bucket</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">access_key_id</span>: <span style="color:#ae81ff">example_access_key_id</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">secret_access_key</span>: <span style="color:#ae81ff">example_secret_access_key</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">ignore_existing</span>: <span style="color:#ae81ff">last_modified</span> </span></span></code></pre></div><blockquote> <p><strong>说明</strong></p> <ul> <li><code>type</code> 用于定义该任务的类型。可选值: copy,fetch,delete。<br>copy 将会从 <code>source</code> 指定的端点读取文件,并写入到 <code>destination</code> 指定的端点;<br>fetch 将会从 <code>source</code> 指定的端点获取文件的下载链接,并使用 <code>destination</code> 指定的端点的 fetch 功能对其进行拉取;<br>delete 将会从 <code>source</code> 指定的端点获取文件的信息,并在 <code>destination</code> 指定的端点将其删除。</li> <li><code>source:</code> 标识后续字段为任务的源端点,即:source 端点信息。</li> <li><code>destination</code> 标识后续字段为任务的目标端点,即 destination 端点信息。</li> <li><code>type</code> 当前端点的类型。可选值: aliyun,azblob,cos,fs,filelist,gcs,hdfs,qingstor,qiniu,s3,upyun。</li> <li><code>path</code> 当前端点的路径。须为目录名。</li> <li><code>options</code> 标识后续字段为可选字段。不同端点的可选字段,会有区别,详情可参考 <a href="#%E7%AB%AF%E7%82%B9%E4%BF%A1%E6%81%AF">端点信息</a>。</li> <li><code>ignore_existing</code> 用于控制是否跳过已经存在的文件,为空或未配置时将会禁用该配置,即总是覆盖。可选值为:last_modified 与 md5sum。<br>last_modified 将会检查目标的 LastModified 是否比源站要大;<br>md5sum 将会对文件做完整的 MD5 计算,当 MD5 相同时会跳过。</li> </ul> </blockquote> <h2 id="使用">使用</h2> <h3 id="run">Run</h3> <p>qscamel 最主要的命令。用户可通过该命令来创建或者恢复一个迁移任务。</p> <p>当使用该命令创建或恢复一个任务时,qscamel 会根据任务名查询数据库,检查任务文件内容是否有更新。若任务文件内容有更新,qscamel 会报错并退出;若无同名任务,qscamel 会对任务内容的 sha256 校验和进行计算,并将结果保存于数据库中;若有同名任务,且任务文件没有更新,qscamel 将恢复该任务,继续执行。</p> <p>换句话说,数据迁移任务在创建成功后就不能修改。若用户需修改一个任务,请先 <a href="#delete">删除</a> 该任务后,再创建一个新任务,或直接创建一个新任务。创建后的任务,无论执行完成或执行失败,均不会自动从数据库中删除,须人为执行 <a href="#delete">删除</a> 或 <a href="#clean">Clean</a> 操作。</p> <p>详细操作步骤如下:</p> <ol> <li> <p>用户可执行如下命令行,查看 <code>run</code> 的使用教程:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>./qscamel-xxxx run -h </span></span></code></pre></div><blockquote> <p><strong>说明</strong></p> <p>qscamel-xxxx为工具下载后解压的文件名称,可根据实际情况进行修改。</p> </blockquote> <p><strong>命令行回显:</strong></p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>Create or resume a task </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>Usage: </span></span><span style="display:flex;"><span> qscamel run <span style="color:#f92672">[</span>task name or task path<span style="color:#f92672">]</span> <span style="color:#f92672">[</span>flags<span style="color:#f92672">]</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>Flags: </span></span><span style="display:flex;"><span> -h, --help help <span style="color:#66d9ef">for</span> run </span></span><span style="display:flex;"><span> -t, --task string task path </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>Global Flags: </span></span><span style="display:flex;"><span> -c, --config string config path <span style="color:#f92672">(</span>default <span style="color:#e6db74">&#34;~/.qscamel/qscamel.yaml&#34;</span><span style="color:#f92672">)</span> </span></span></code></pre></div></li> <li> <p>用户如需创建一个新的数据迁移任务,可执行如下命令行:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>./qscamel-xxxx run task-name -t /path/to/task/file </span></span></code></pre></div><blockquote> <p><strong>说明:</strong></p> <p>qscamel-xxxx 为工具下载后解压的文件名称,可根据实际情况进行修改。</p> <ul> <li><code>task-name</code> 为新建数据迁移任务名,须唯一。若用户需修改该任务中的任务文件,请先 <a href="#delete">删除</a> 该任务,再创建一个新任务,或直接创建一个新任务。</li> <li><code>-t</code> 参数用于指定任务文件。</li> <li><code>/path/to/task/file</code> 任务文件,可参考前文相关内容 <a href="#%E4%BB%BB%E5%8A%A1">任务</a> 创建。</li> </ul> </blockquote> </li> <li> <p>在任务文件没有更新的前提下,若用户需要恢复一个数据迁移任务,可执行如下命令行:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>./qscamel-xxxx run task-name </span></span></code></pre></div><blockquote> <p><strong>说明:</strong></p> <ul> <li>qscamel-xxxx 为下载后解压的文件名称,可根据实际情况进行修改。</li> <li>由于该操作用于恢复一个历史任务,故 <code>task-name</code> 须为原任务名。</li> <li>由于任务文件没有更新,故命令行中省略了任务文件,qscamel 会自动调用历史任务文件。</li> <li>命令行中也可添加原任务文件 <code>-t /path/to/task/file</code>,若添加该参数,则须确保任务文件没有变更,否则该操作会报错。</li> </ul> </blockquote> </li> <li> <p>更新任务文件后,再次创建该任务时,可执行如下操作:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># step 1:删除任务</span> </span></span><span style="display:flex;"><span>./qscamel-xxxx delete task-name </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># step 2:创建任务</span> </span></span><span style="display:flex;"><span>./qscamel-xxxx run task-name -t /path/to/task/file </span></span></code></pre></div></li> <li> <p>若需要同时进行多个任务,可执行如下命令行:</p> <pre tabindex="0"><code>./qscamel-xxxx run task-name1 -t example1-task.yaml -c example1-qscamel.yaml ./qscamel-xxxx run task-name2 -t example2-task.yaml -c example2-qscamel.yaml …… </code></pre><blockquote> <p><strong>说明:</strong></p> <ul> <li>qscamel-xxxx 为下载后解压的文件名称,可根据实际情况进行修改。</li> <li>不同任务需指定不同任务文件和配置文件,创建任务文件请参考<a href="#%E4%BB%BB%E5%8A%A1">任务</a>,创建配置文件请参考<a href="#%E9%85%8D%E7%BD%AE">配置</a>。 example1-qscamel.yaml 配置文件示例: <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">concurrency</span>: <span style="color:#ae81ff">0</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">log_level</span>: <span style="color:#ae81ff">info</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">pid_file</span>: <span style="color:#ae81ff">~/.example1-qscamel/qscamel.pid</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">log_file</span>: <span style="color:#ae81ff">~/.example1-qscamel/qscamel.log</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">database_file</span>: <span style="color:#ae81ff">~/.example1-qscamel/db</span> </span></span></code></pre></div></li> </ul> </blockquote> </li> </ol> <h3 id="delete">Delete</h3> <p>用户可使用该命令删除一个已经创建的任务。</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>./qscamel-xxxx delete task-name </span></span></code></pre></div><h3 id="status">Status</h3> <p>该命令用于查询展示所有任务的状态。</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>./qscamel-xxxx status </span></span></code></pre></div><h3 id="clean">Clean</h3> <p>用户可通过该命令删除所有已经完成的任务。</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>./qscamel-xxxx clean </span></span></code></pre></div><h3 id="version">Version</h3> <p>Version 命令用于查询当前 qscamel 的版本信息。</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>./qscamel-xxxx version </span></span></code></pre></div><h2 id="快速入门">快速入门</h2> <ol> <li> <p><a href="#%E5%AE%89%E8%A3%85">安装</a> qscamel 工具。</p> </li> <li> <p>(可选)更新 qscamel <a href="#%E9%85%8D%E7%BD%AE">配置</a>。</p> </li> <li> <p>根据如下内容创建任务文件,并保存为 <code>example-task.yaml</code>:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">type</span>: <span style="color:#ae81ff">copy</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">source</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">type</span>: <span style="color:#ae81ff">fs</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">path</span>: <span style="color:#ae81ff">/path/to/source</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">destination</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">type</span>: <span style="color:#ae81ff">qingstor</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">path</span>: <span style="color:#ae81ff">/path/to/destination</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">options</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">bucket_name</span>: <span style="color:#ae81ff">example_bucket</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">access_key_id</span>: <span style="color:#ae81ff">example_access_key_id</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">secret_access_key</span>: <span style="color:#ae81ff">example_secret_access_key</span> </span></span></code></pre></div><blockquote> <p><strong>说明</strong></p> <ul> <li>该任务即为:将本地目录 <code>/path/to/source</code> 下的文件 copy 至 QingStor 对象存储的 <code>example_bucket</code> 下的 <code>/path/to/destination</code> 目录。</li> <li><code>access_key_id</code> 与 <code>secret_access_key</code> 可参考 <a href="/storage/object-storage/api/practices/signature/#%E8%8E%B7%E5%8F%96-access-key">获取 Access Key</a>。</li> </ul> </blockquote> </li> <li> <p>执行如下命令,创建数据迁移任务:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>./qscamel-xxxx run example-task -t example-task.yaml -c /path/to/config/file </span></span></code></pre></div></li> <li> <p>执行如下命令,查看数据迁移任务的状态:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>./qscamel-xxxx status </span></span></code></pre></div></li> </ol> <h2 id="端点信息">端点信息</h2> <h3 id="endpoint-qingstor">Endpoint qingstor</h3> <p><a href="//m.websorachi.com/products/qingstor">QingStor</a> 是开·云app官方版下载提供的对象存储服务。能够用做 qscamel 数据迁移任务中的 <strong>source</strong> 与 <strong>destination</strong> 端点。</p> <p>使用 qingstor 作为端点时,可添加如下配置内容:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">source</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">type</span>: <span style="color:#ae81ff">qingstor</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">path</span>: <span style="color:#ae81ff">/path/to/source</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">options</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">protocol</span>: <span style="color:#ae81ff">https</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">host</span>: <span style="color:#ae81ff">qingstor.com</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">port</span>: <span style="color:#ae81ff">443</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">zone</span>: <span style="color:#ae81ff">pek3b</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">bucket_name</span>: <span style="color:#ae81ff">example_bucket</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">access_key_id</span>: <span style="color:#ae81ff">example_access_key_id</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">secret_access_key</span>: <span style="color:#ae81ff">example_secret_access_key</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">user_define_meta</span>: <span style="color:#66d9ef">true</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">storage_class</span>: <span style="color:#ae81ff">STANDARD</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">disable_uri_cleaning</span>: <span style="color:#66d9ef">false</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">timeout_config</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">connect_timeout</span>: <span style="color:#ae81ff">30</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">read_timeout</span>: <span style="color:#ae81ff">30</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">write_timeout</span>: <span style="color:#ae81ff">30</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">multipart_boundary_size</span>: <span style="color:#ae81ff">2147483648</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">ignore_existing</span>: <span style="color:#ae81ff">last_modified</span> </span></span></code></pre></div><blockquote> <p><strong>说明</strong></p> <ul> <li><code>path</code> 若迁移指定 bucket 内所有数据,该参数配置为 <code>path:/</code>;若迁移指定目录 <code>/dir1/dir2</code> 下的数据,该参数配置为 <code>path:/dir1/dir2</code>。若需迁移的数据较多,建议分成多个任务进行迁移,详细可参考 <a href="#run">Run</a>。</li> <li><code>protocol</code> 用于控制访问 QingStor 对象存储的协议类型。可选值: https, http;默认值: https。</li> <li><code>host</code> 标识访问 QingStor 对象存储的云服务器名。默认值: qingstor.com。</li> <li><code>port</code> 标识访问 QingStor 对象存储的端口号。默认值: 443。</li> <li><code>zone</code> 标识访问 QingStor 对象存储的区域。自动检测,无需手动配置。</li> <li><code>bucket_name</code> 标识操作的 QingStor 对象存储的 Bucket 名称。无默认值,须手动配置。</li> <li><code>access_key_id</code> QingStor 对象存储的 access_key_id。无默认值,须手动配置。</li> <li><code>secret_access_key</code> QingStor 对象存储的 secret_access_key。无默认值,须手动配置。</li> <li><code>user_define_meta</code> 用于控制 QingStor 对象存储在迁移数据时是否同步迁移自定义元数据。源端点与目标端点均配置为 <code>true</code> 时,表示是。v2.0.21及以后版本支持。</li> <li><code>storage_class</code> 标识 QingStor 对象存储所使用的存储级别。可选值: STANDARD, STANDARD_IA;默认值: STANDARD。</li> <li><code>disable_uri_cleaning</code> 是否自动清理 url,默认为 <code>false</code>,即转换 <code>abc//bcd</code> 为 <code>abc/bcd</code>。</li> <li><code>timeout_config</code> 请求过期时间. <ul> <li><code>connect_timeout</code> 连接过期时间,默认30秒。</li> <li><code>read_timeout</code> 读过期时间,默认30秒。</li> <li><code>write_timeout</code> 写过期时间,默认30秒。</li> </ul> </li> <li><code>multipart_boundary_size</code> 用于控制 QingStor 对象存储何时使用分段上传,单位为 Byte,当文件大于该数值时,将会使用分段上传。可选值: 1 ~ 5368709120 (5G)。默认值: 2147483648 (2G)。</li> <li><code>ignore_existing</code> 用于控制是否跳过已经存在的文件,为空或未配置时将会禁用该配置,即总是覆盖。可选值为:last_modified 与 md5sum。<br>last_modified 将会检查目标的 LastModified 是否比源站要大;<br>md5sum 将会对文件做完整的 MD5 计算,当 MD5 相同时会跳过。</li> <li>综上,除 <code>bucket_name</code>,<code>access_key_id</code> 与 <code>secret_access_key</code> 以外,均有默认值,故除此三个参数外,其他参数均为可选参数。</li> </ul> </blockquote> <h3 id="endpoint-s3">Endpoint s3</h3> <p><a href="https://amazonaws-china.com/cn/s3">S3</a> 是 AWS 提供的对象存储服务。可作为 qscamel 数据迁移任务中的 <strong>source</strong> 和 <strong>destination</strong> 端点。</p> <p>使用 s3 作为端点,可添加如下配置内容:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">source</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">type</span>: <span style="color:#ae81ff">s3</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">path</span>: <span style="color:#ae81ff">/path/to/source</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">options</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">bucket_name</span>: <span style="color:#ae81ff">example_bucket</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">endpoint</span>: <span style="color:#ae81ff">example_endpoint</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">region</span>: <span style="color:#ae81ff">example_region</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">access_key_id</span>: <span style="color:#ae81ff">example_access_key_id</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">secret_access_key</span>: <span style="color:#ae81ff">example_secret_access_key</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">disable_ssl</span>: <span style="color:#66d9ef">false</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">use_accelerate</span>: <span style="color:#66d9ef">false</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">path_style</span>: <span style="color:#66d9ef">false</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">enable_list_object_v2</span>: <span style="color:#66d9ef">false</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">enable_signatrue_v2</span>: <span style="color:#66d9ef">false</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">disable_uri_cleaning</span>: <span style="color:#66d9ef">false</span> </span></span></code></pre></div><blockquote> <p><strong>说明</strong></p> <ul> <li><code>bucket_name</code> S3 的 Bucket 名称。</li> <li><code>endpoint</code> S3 的接口端点地址。</li> <li><code>region</code> S3 bucket 所在的区域。</li> <li><code>access_key_id</code> 访问 S3 的 access_key_id。</li> <li><code>secret_access_key</code> 访问 S3 的 secret_access_key。</li> <li><code>disable_ssl</code> 是否禁用 SSL。</li> <li><code>use_accelerate</code> 是否启用加速。</li> <li><code>path_style</code> 是否强制请求使用路径样式寻址,即 <code>http://s3.amazonaws.com/BUCKET/KEY</code>。默认为 <code>false</code>,即使用 <code>http://s3.amazonaws.com/BUCKET/KEY</code>。</li> <li><code>enable_list_object_v2</code> 是否使用 <code>ListObjectsV2</code>。默认为 <code>false</code>,即使用 <code>ListObjects</code>。</li> <li><code>enable_signature_v2</code> 是否强制客户端使用 <code>v2.SignRequestHandler</code>。默认为 <code>false</code>,即使用 <code>v4.SignRequestHandler</code>。</li> <li><code>disable_uri_cleaning</code> 是否自动清理 url,默认为 <code>false</code>,即转换 <code>abc//bcd</code> 为 <code>abc/bcd</code>。</li> </ul> </blockquote> <h3 id="endpoint-aliyun">Endpoint aliyun</h3> <p><a href="https://www.aliyun.com/product/oss">Aliyun</a> 是阿里云提供的对象存储服务。可作为 qscamel 数据迁移任务中的 <strong>source</strong> 端点。</p> <p>Aliyun 作为 <strong>source</strong> 端点时,须添加如下配置内容:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">source</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">type</span>: <span style="color:#ae81ff">aliyun</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">path</span>: <span style="color:#ae81ff">/path/to/source</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">options</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">endpoint</span>: <span style="color:#ae81ff">example_endpoint</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">bucket_name</span>: <span style="color:#ae81ff">example_bucket</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">access_key_id</span>: <span style="color:#ae81ff">example_access_key_id</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">access_key_secret</span>: <span style="color:#ae81ff">example_access_key_secret</span> </span></span></code></pre></div><blockquote> <p><strong>说明</strong></p> <ul> <li><code>endpoint</code> 用于标识访问的接口端点地址。无默认值,须手动配置。</li> <li><code>bucket_name</code> 标识操作的 Aliyun 的 Bucket 名称。无默认值,须手动配置。</li> <li><code>access_key_id</code> Aliyun 的 access_key_id。无默认值,须手动配置。</li> <li><code>secret_access_key</code> Aliyun 的 secret_access_key。无默认值,须手动配置。</li> </ul> </blockquote> <h3 id="endpoint-fs">Endpoint fs</h3> <p>fs 是指符合 POSIX 标准的文件系统 (local fs, nfs, s3fs 等)。可作为 qscamel 数据迁移任务中的 <strong>source</strong> 端点与 <strong>destination</strong> 端点。</p> <p>fs 作为端点有着如下配置内容,用于控制遇到软连接时,是否上传指向的文件。默认值为 false:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">source</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">type</span>: <span style="color:#ae81ff">fs</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">path</span>: <span style="color:#ae81ff">/path/to/source</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">options</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">enable_link_follow</span>: <span style="color:#66d9ef">false</span> </span></span></code></pre></div><h3 id="endpoint-azblob">Endpoint azblob</h3> <p><a href="https://azure.microsoft.com/zh-cn/services/storage/">Azure Blob</a> 是 Microsoft 提供的存储服务。可作为 qscamel 数据迁移任务中的 <strong>source</strong> 端点。</p> <p>azblob 作为 <strong>source</strong> 端点时,须添加如下配置内容:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">source</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">type</span>: <span style="color:#ae81ff">azblob</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">path</span>: <span style="color:#ae81ff">/path/to/source</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">options</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">account_name</span>: <span style="color:#ae81ff">example_account_name</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">account_key</span>: <span style="color:#ae81ff">example_account_key</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">bucket_name</span>: <span style="color:#ae81ff">example_bucket</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">endpoint</span>: <span style="color:#ae81ff">example_endpoint</span> </span></span></code></pre></div><blockquote> <p><strong>说明</strong></p> <ul> <li><code>account_name</code> 访问 Azure Blob 的账号。无默认值,须手动配置。</li> <li><code>account_key</code> 访问 Azure Blob 的密码。无默认值,须手动配置。</li> <li><code>bucket_name</code> 标识操作的 Azure Blob 的 Bucket 名称。无默认值,须手动配置。</li> <li><code>endpoint</code> 用于标识访问的接口端点地址。无默认值,须手动配置。</li> </ul> </blockquote> <h3 id="endpoint-cos">Endpoint cos</h3> <p><a href="https://cloud.tencent.com/product/cos">Tencent COS</a> 是 Tencent 提供的对象存储服务。可作为 qscamel 数据迁移任务中的 <strong>source</strong> 端点。</p> <p>COS 作为 <strong>source</strong> 端点时,须添加如下配置内容:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">source</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">type</span>: <span style="color:#ae81ff">cos</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">path</span>: <span style="color:#ae81ff">/path/to/source</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">options</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">bucket_url</span>: <span style="color:#ae81ff">example_bucket_url</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">secret_id</span>: <span style="color:#ae81ff">example_secret_id</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">secret_key</span>: <span style="color:#ae81ff">example_secret_key</span> </span></span></code></pre></div><blockquote> <p><strong>说明</strong></p> <ul> <li><code>bucket_url</code> Tencent COS 的 Bucket URL 地址。无默认值,须手动配置。</li> <li><code>secret_id</code> 访问 Tencent COS 的 secret_id。无默认值,须手动配置。</li> <li><code>secret_key</code> 访问 Tencent COS 的 secret_key。无默认值,须手动配置。</li> </ul> </blockquote> <h3 id="endpoint-filelist">Endpoint filelist</h3> <p>filelist 是本地文件列表。可作为 qscamel 数据迁移任务中的 <strong>source</strong> 端点。</p> <p>filelist 作为 <strong>source</strong> 端点时,须添加如下配置项,用于指定待迁移的文件列表,qscamel 将会逐行来读取该列表。</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">source</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">type</span>: <span style="color:#ae81ff">filelist</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">path</span>: <span style="color:#ae81ff">/path/to/source</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">options</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">list_path</span>: <span style="color:#ae81ff">/path/to/list</span> </span></span></code></pre></div><h3 id="endpoint-gcs">Endpoint gcs</h3> <p>GCS(Google Cloud Storage) 是 Google 提供的对象存储服务。可作为 qscamel 数据迁移任务中的 <strong>source</strong> 端点。</p> <p>使用 gcs 作为 <strong>source</strong> 端点时,须添加如下配置项,</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">source</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">type</span>: <span style="color:#ae81ff">gcs</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">path</span>: <span style="color:#ae81ff">/path/to/source</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">options</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">api_key</span>: <span style="color:#ae81ff">example_api_key</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">bucket_name</span>: <span style="color:#ae81ff">exmaple_bukcet</span> </span></span></code></pre></div><blockquote> <p><strong>说明</strong></p> <ul> <li><code>api_key</code> 访问 GCS 的 api_key。无默认值,须手动配置。</li> <li><code>bucket_name</code> GCS 的 bucket 名。无默认值,须手动配置。</li> </ul> </blockquote> <h3 id="endpoint-hdfs">Endpoint hdfs</h3> <p>能够用做 <strong>source</strong> 端点。</p> <p>hdfs 是 <a href="http://hadoop.apache.org/">Hadoop</a> 的分布式文件系统,可作为 qscamel 数据迁移任务中的 <strong>source</strong> 端点。</p> <p>使用 hdfs 作为 <strong>source</strong> 端点时,须添加如下配置项,</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">source</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">type</span>: <span style="color:#ae81ff">hdfs</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">path</span>: <span style="color:#ae81ff">/path/to/source</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">options</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">address</span>: <span style="color:#ae81ff">example_address</span> </span></span></code></pre></div><h3 id="endpoint-qiniu">Endpoint qiniu</h3> <p>Qiniu 是 Qiniu 提供的对象存储服务。可用作 qscamel 数据迁移任务中的 <strong>source</strong> 端点。</p> <p>使用 qiniu 作为 <strong>source</strong> 端点,须添加如下配置内容:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">source</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">type</span>: <span style="color:#ae81ff">qiniu</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">path</span>: <span style="color:#ae81ff">/path/to/source</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">options</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">bucket_name</span>: <span style="color:#ae81ff">example_bucket</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">access_key</span>: <span style="color:#ae81ff">example_access_key</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">secret_key</span>: <span style="color:#ae81ff">example_secret_key</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">domain</span>: <span style="color:#ae81ff">example_domain</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">use_https</span>: <span style="color:#66d9ef">false</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">use_cdn_domains</span>: <span style="color:#66d9ef">false</span> </span></span></code></pre></div><blockquote> <p><strong>说明</strong></p> <ul> <li><code>bucket_name</code> 标识 qiniu 的 bucket 名称。</li> <li><code>access_key</code> 标识 qiniu 的 access_key。</li> <li><code>secret_key</code> 标识 qiniu 的 secret_key。</li> <li><code>domain</code> 标识用于访问 qiniu bucket 的域名。</li> <li><code>use_https</code> 控制是否使用 https 来访问 qiniu。默认值: false。</li> <li><code>use_cdn_domains</code> 控制是否使用 CDN 加速域名来访问 qiniu。默认值: false。</li> </ul> </blockquote> <h3 id="endpoint-upyun">Endpoint upyun</h3> <p>upyun 是 <a href="https://www.upyun.com/">Upyun</a> 提供的对象存储服务。可作为 qscamel 数据迁移任务中的 <strong>source</strong> 端点。</p> <p>使用 upyun 作为 <strong>source</strong> 端点,须配置如下内容:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">options</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">bucket_name</span>: <span style="color:#ae81ff">example_bucket</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">operator</span>: <span style="color:#ae81ff">example_operator</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">password</span>: <span style="color:#ae81ff">example_password</span> </span></span></code></pre></div><blockquote> <p><strong>说明</strong></p> <ul> <li><code>bucket_name</code> upyun 的 bucket 名称。</li> <li><code>operator</code> upyun 的 operator。</li> <li><code>password</code> upyun 的 password。</li> </ul> </blockquote> <h2 id="使用示例">使用示例</h2> <h3 id="将数据从-s3-迁移到-qingstor">将数据从 s3 迁移到 QingStor</h3> <ol> <li> <p><a href="#%E5%AE%89%E8%A3%85">安装</a> qscamel 工具。</p> </li> <li> <p>(可选)更新 qscamel <a href="#%E9%85%8D%E7%BD%AE">配置</a>。</p> </li> <li> <p>根据如下内容创建任务文件,并保存为 <code>example-task.yaml</code>:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">type</span>: <span style="color:#ae81ff">copy</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">source</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">type</span>: <span style="color:#ae81ff">s3</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">path</span>: <span style="color:#ae81ff">/path/to/source</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">options</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">bucket_name</span>: <span style="color:#ae81ff">bucket_name</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">endpoint</span>: <span style="color:#ae81ff">s3.pek3b.qingstor.com</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">region</span>: <span style="color:#ae81ff">pek3b</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">access_key_id</span>: <span style="color:#ae81ff">s3_access_key_id</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">secret_access_key</span>: <span style="color:#ae81ff">s3_secret_access_key</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">disable_ssl</span>: <span style="color:#66d9ef">false</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">use_accelerate</span>: <span style="color:#66d9ef">false</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">path_style</span>: <span style="color:#66d9ef">false</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">enable_list_object_v2</span>: <span style="color:#66d9ef">false</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">enable_signatrue_v2</span>: <span style="color:#66d9ef">false</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">disable_uri_cleaning</span>: <span style="color:#66d9ef">false</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">destination</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">type</span>: <span style="color:#ae81ff">qingstor</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">path</span>: <span style="color:#ae81ff">/path/to/destination</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">options</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">protocol</span>: <span style="color:#ae81ff">https</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">host</span>: <span style="color:#ae81ff">qingstor.com</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">port</span>: <span style="color:#ae81ff">443</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">zone</span>: <span style="color:#ae81ff">zone_id</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">bucket_name</span>: <span style="color:#ae81ff">bucket_name</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">access_key_id</span>: <span style="color:#ae81ff">qingstor_access_key_id</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">secret_access_key</span>: <span style="color:#ae81ff">qingstor_secret_access_key</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">storage_class</span>: <span style="color:#ae81ff">STANDARD</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">disable_uri_cleaning</span>: <span style="color:#66d9ef">false</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">timeout_config</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">connect_timeout</span>: <span style="color:#ae81ff">30</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">read_timeout</span>: <span style="color:#ae81ff">30</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">write_timeout</span>: <span style="color:#ae81ff">30</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">multipart_boundary_size</span>: <span style="color:#ae81ff">2147483648</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">ignore_existing</span>: <span style="color:#ae81ff">last_modified</span> </span></span></code></pre></div><blockquote> <p><strong>说明</strong></p> <ul> <li>该任务即为:将 s3 的 <code>bucket_name</code> 下 <code>/path/to/source</code> 下的文件 copy 至 QingStor 对象存储的 <code>bucket_name</code> 下的 <code>/path/to/destination</code> 目录。</li> <li><code>options</code> 标识后续字段为可选字段。详情可参考 <a href="#endpoint-s3">Endpoint s3</a> 及 <a href="#endpoint-qingstor">Endpoint qingstor</a>。</li> <li><code>access_key_id</code> 与 <code>secret_access_key</code> 可参考 <a href="/storage/object-storage/api/practices/signature/#%E8%8E%B7%E5%8F%96-access-key">获取 Access Key</a>。</li> </ul> </blockquote> </li> <li> <p>执行如下命令,创建数据迁移任务:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>./qscamel-xxxx run example-task -t example-task.yaml -c /path/to/config/file </span></span></code></pre></div></li> <li> <p>执行如下命令,查看数据迁移任务的状态:</p> <pre tabindex="0"><code>./qscamel-xxxx status </code></pre></li> </ol> <h3 id="将数据从qingstor同区域不同账户间进行迁移">将数据从QingStor同区域不同账户间进行迁移</h3> <h4 id="使用源账户的aksk和目标账户的aksk">使用源账户的AK/SK和目标账户的AK/SK</h4> <ol> <li> <p><a href="#%E5%AE%89%E8%A3%85">安装</a> qscamel 工具。</p> </li> <li> <p>(可选)更新 qscamel <a href="#%E9%85%8D%E7%BD%AE">配置</a>。</p> </li> <li> <p>根据如下内容创建任务文件,并保存为 <code>example-task.yaml</code>:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">type</span>: <span style="color:#ae81ff">copy</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">source</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">type</span>: <span style="color:#ae81ff">qingstor</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">path</span>: <span style="color:#ae81ff">/path/to/source</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">options</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">protocol</span>: <span style="color:#ae81ff">https</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">host</span>: <span style="color:#ae81ff">qingstor.com</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">port</span>: <span style="color:#ae81ff">443</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">zone</span>: <span style="color:#ae81ff">zone_id</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">bucket_name</span>: <span style="color:#ae81ff">source_bucket</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">access_key_id</span>: <span style="color:#ae81ff">source_access_key_id</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">secret_access_key</span>: <span style="color:#ae81ff">source_secret_access_key</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">storage_class</span>: <span style="color:#ae81ff">STANDARD</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">disable_uri_cleaning</span>: <span style="color:#66d9ef">false</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">timeout_config</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">connect_timeout</span>: <span style="color:#ae81ff">30</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">read_timeout</span>: <span style="color:#ae81ff">30</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">write_timeout</span>: <span style="color:#ae81ff">30</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">destination</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">type</span>: <span style="color:#ae81ff">qingstor</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">path</span>: <span style="color:#ae81ff">/path/to/destination</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">options</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">protocol</span>: <span style="color:#ae81ff">https</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">host</span>: <span style="color:#ae81ff">qingstor.com</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">port</span>: <span style="color:#ae81ff">443</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">zone</span>: <span style="color:#ae81ff">zone_id</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">bucket_name</span>: <span style="color:#ae81ff">destination_bucket</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">access_key_id</span>: <span style="color:#ae81ff">destination_access_key_id</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">secret_access_key</span>: <span style="color:#ae81ff">destination_secret_access_key</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">storage_class</span>: <span style="color:#ae81ff">STANDARD</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">disable_uri_cleaning</span>: <span style="color:#66d9ef">false</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">timeout_config</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">connect_timeout</span>: <span style="color:#ae81ff">30</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">read_timeout</span>: <span style="color:#ae81ff">30</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">write_timeout</span>: <span style="color:#ae81ff">30</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">multipart_boundary_size</span>: <span style="color:#ae81ff">2147483648</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">ignore_existing</span>: <span style="color:#ae81ff">last_modified</span> </span></span></code></pre></div><blockquote> <p><strong>说明</strong></p> <ul> <li>该任务即为:将QingStor 对象存储源账户的 <code>source_bucket</code> 下 <code>/path/to/source</code> 下的文件 copy 至 QingStor 对象存储目标账户的 <code>destination_bucket</code> 下的 <code>/path/to/destination</code> 目录。</li> <li><code>options</code> 标识后续字段为可选字段。详情可参考 <a href="#endpoint-qingstor">Endpoint qingstor</a>。</li> <li><code>access_key_id</code> 与 <code>secret_access_key</code> 可参考 <a href="/storage/object-storage/api/practices/signature/#%E8%8E%B7%E5%8F%96-access-key">获取 Access Key</a>。<code>source</code>字段的<code>access_key_id</code> 与 <code>secret_access_key</code>填写源账户的AK/SK,<code>destination</code>字段的<code>access_key_id</code> 与 <code>secret_access_key</code>填写目标账户的AK/SK。</li> </ul> </blockquote> </li> <li> <p>执行如下命令,创建数据迁移任务:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>./qscamel-xxxx run example-task -t example-task.yaml -c /path/to/config/file </span></span></code></pre></div></li> <li> <p>执行如下命令,查看数据迁移任务的状态:</p> <pre tabindex="0"><code>./qscamel-xxxx status </code></pre></li> </ol> <h4 id="仅使用目标账户的aksk">仅使用目标账户的AK/SK</h4> <p><strong>前提条件</strong></p> <p>源账户已授权目标账户可读访问权限。详细操作请参考<a href="/storage/object-storage/manual/console/bucket_manage/access_control/#%E5%AD%98%E5%82%A8%E7%A9%BA%E9%97%B4%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6bucket-acl">存储空间访问控制 bucket-acl</a>。</p> <p><strong>操作步骤</strong></p> <ol> <li> <p><a href="#%E5%AE%89%E8%A3%85">安装</a> qscamel 工具。</p> </li> <li> <p>(可选)更新 qscamel <a href="#%E9%85%8D%E7%BD%AE">配置</a>。</p> </li> <li> <p>根据如下内容创建任务文件,并保存为 <code>example-task.yaml</code>:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">type</span>: <span style="color:#ae81ff">copy</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">source</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">type</span>: <span style="color:#ae81ff">qingstor</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">path</span>: <span style="color:#ae81ff">/path/to/source</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">options</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">protocol</span>: <span style="color:#ae81ff">https</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">host</span>: <span style="color:#ae81ff">qingstor.com</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">port</span>: <span style="color:#ae81ff">443</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">zone</span>: <span style="color:#ae81ff">zone_id</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">bucket_name</span>: <span style="color:#ae81ff">source_bucket</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">access_key_id</span>: <span style="color:#ae81ff">destination_access_key_id</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">secret_access_key</span>: <span style="color:#ae81ff">destination_secret_access_key</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">storage_class</span>: <span style="color:#ae81ff">STANDARD</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">disable_uri_cleaning</span>: <span style="color:#66d9ef">false</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">timeout_config</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">connect_timeout</span>: <span style="color:#ae81ff">30</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">read_timeout</span>: <span style="color:#ae81ff">30</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">write_timeout</span>: <span style="color:#ae81ff">30</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">destination</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">type</span>: <span style="color:#ae81ff">qingstor</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">path</span>: <span style="color:#ae81ff">/path/to/destination</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">options</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">protocol</span>: <span style="color:#ae81ff">https</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">host</span>: <span style="color:#ae81ff">qingstor.com</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">port</span>: <span style="color:#ae81ff">443</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">zone</span>: <span style="color:#ae81ff">zone_id</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">bucket_name</span>: <span style="color:#ae81ff">destination_bucket</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">access_key_id</span>: <span style="color:#ae81ff">destination_access_key_id</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">secret_access_key</span>: <span style="color:#ae81ff">destination_secret_access_key</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">storage_class</span>: <span style="color:#ae81ff">STANDARD</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">disable_uri_cleaning</span>: <span style="color:#66d9ef">false</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">timeout_config</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">connect_timeout</span>: <span style="color:#ae81ff">30</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">read_timeout</span>: <span style="color:#ae81ff">30</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">write_timeout</span>: <span style="color:#ae81ff">30</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">multipart_boundary_size</span>: <span style="color:#ae81ff">2147483648</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">ignore_existing</span>: <span style="color:#ae81ff">last_modified</span> </span></span></code></pre></div><blockquote> <p><strong>说明</strong></p> <ul> <li>该任务即为:将 QingStor 对象存储源账户的 <code>source_bucket</code> 下 <code>/path/to/source</code> 下的文件 copy 至 QingStor 对象存储目标账户的 <code>destination_bucket</code> 下的 <code>/path/to/destination</code> 目录。</li> <li><code>options</code> 标识后续字段为可选字段。详情可参考 <a href="#endpoint-qingstor">Endpoint qingstor</a>。</li> <li><code>access_key_id</code> 与 <code>secret_access_key</code> 可参考 <a href="/storage/object-storage/api/practices/signature/#%E8%8E%B7%E5%8F%96-access-key">获取 Access Key</a>。<code>source</code>字段的<code>access_key_id</code> 与 <code>secret_access_key</code>,<code>destination</code>字段的<code>access_key_id</code> 与 <code>secret_access_key</code>均填写目标账户的AK/SK。</li> </ul> </blockquote> </li> <li> <p>执行如下命令,创建数据迁移任务:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>./qscamel-xxxx run example-task -t example-task.yaml -c /path/to/config/file </span></span></code></pre></div></li> <li> <p>执行如下命令,查看数据迁移任务的状态:</p> <pre tabindex="0"><code>./qscamel-xxxx status </code></pre></li> </ol> Storage: qsftpd /storage/object-storage/manual/tool/qsftpd/ Tue, 24 Nov 2020 10:08:56 +0900 /storage/object-storage/manual/tool/qsftpd/ <p>qsftpd 是 QingStor 对象存储提供的 FTP Server。用户通过简单的配置,即可通过 FTP 协议使用 QingStor 对象存储服务。该工具已在 GitHub 开源,更多详情可参见 <a href="https://github.com/qingstor/qsftpd">https://github.com/qingstor/qsftpd</a>。</p> <h2 id="安装">安装</h2> <p>qsftpd 支持 Linux、macOS 和 Windows 操作系统。用户可访问 GitHub 项目的 <a href="https://github.com/qingstor/qsftpd/releases">Releases</a> 页面查看和下载相应版本。</p> <h2 id="配置">配置</h2> <p>在正式使用 qsftpd 工具之前,需要创建并填写配置文件 <strong>qsftpd.yaml</strong>。详细操作步骤如下:</p> <ol> <li>在终端执行如下命令,创建配置文件:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#ae81ff">touch qsftpd.yaml</span> </span></span></code></pre></div><ol start="2"> <li>配置文件内容如下:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">qingstor</span>: </span></span><span style="display:flex;"><span> <span style="color:#f92672">access_key_id</span>: <span style="color:#ae81ff">access_key_id_example</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">secret_access_key</span>: <span style="color:#ae81ff">secret_access_key_example</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">host</span>: <span style="color:#ae81ff">qingstor.com</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">port</span>: <span style="color:#ae81ff">443</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">protocol</span>: <span style="color:#ae81ff">https</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">log_level</span>: <span style="color:#ae81ff">warn</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">bucket_name</span>: <span style="color:#ae81ff">bucket_name_example</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">zone</span>: <span style="color:#ae81ff">pek3a</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">listen_host</span>: <span style="color:#ae81ff">127.0.0.1</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">listen_port</span>: <span style="color:#ae81ff">21</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">public_host</span>: <span style="color:#ae81ff">127.0.0.1</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">max_connections</span>: <span style="color:#ae81ff">128</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">start_port</span>: <span style="color:#ae81ff">6000</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">end_port</span>: <span style="color:#ae81ff">7000</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">log_level</span>: <span style="color:#ae81ff">error </span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">cache_path</span>: <span style="color:#ae81ff">/var/cache/qsftpd</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># 认证设置,默认允许匿名用户登录,也可以指定特定的用户登录</span> </span></span><span style="display:flex;"><span><span style="color:#75715e">#users:</span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># username_example: password_example</span> </span></span></code></pre></div><p><strong>说明:</strong></p> <ul> <li><code>qingstor</code> 用于标识后续字段为 QingStor 对象存储的基本信息。</li> <li><code>access_key_id</code> 与 <code>secret_access_key</code> 用于访问 QingStor 对象存储的 AK 与 SK,须根据实际情况进行填写。具体可参照 <a href="/storage/object-storage/api/practices/signature/#%E8%8E%B7%E5%8F%96-access-key">获取 Access Key</a>。</li> <li><code>host</code> QingStor 对象存储的域名。公有云环境无需修改。</li> <li><code>port</code> 访问 QingStor 对象存储的端口号。公有云环境无需修改。</li> <li><code>protocol</code> 访问 QingStor 对象存储的协议。公有云环境无需修改。</li> <li><code>log_level</code> QingStor 对象存储的日志级别。日志内容显示从多到少依次可设置为:debug,info,warn,error,fatal,panic。</li> <li><code>bucket_name</code> 待访问的 QingStor 对象存储的 Bucket 名。须根据实际情况进行填写。</li> <li><code>zone</code> 待访问的 QingStor 对象存储的 Zone。</li> <li><code>listen_host listen_port public_host max_connections</code> FTP Server 配置,监听的端口号以及最大连接数。</li> <li><code>start_port end_port</code> FTP 数据连接建立方式为被动模式时,将会随机在 <code>start_port</code> 与 <code>end_port</code> 之间选择端口号进行数据传输。默认值是从 6000 至 7000。</li> <li><code>log_level</code> FTP Server 的日志等级。日志内容显示从多到少依次可设置为:debug,info,warn,error,fatal,panic。</li> <li><code>cache_path</code> 缓存路径,qsftpd 将会在每次启动时清除 <code>cache_path</code> 配置的目录。</li> <li><code>users</code> 认证设置,默认允许匿名用户登录,也可以指定的用户登录。若指定用户,须根据配置上文中的示例进行填写用户信息。</li> <li>除 <code>access_key_id,secret_access_key,bucket_name,zone</code> 以外,其余字段均有默认值,用户可无需修改。</li> <li>qsftpd 的配置文件可根据需要进行配置。模板可以 <a href="https://github.com/qingstor/qsftpd/blob/master/qsftpd.yaml.example">查看</a>。</li> </ul> <h2 id="使用说明">使用说明</h2> <h3 id="帮助信息">帮助信息</h3> <p>用户可执行如下命令行,查看帮助信息:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#ae81ff">$ qsftpd -h</span> </span></span><span style="display:flex;"><span><span style="color:#ae81ff">A FTP server that persists all data to QingStor Object Storage.</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">Usage</span>: </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">qsftpd [flags]</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#f92672">Flags</span>: </span></span><span style="display:flex;"><span> -<span style="color:#ae81ff">c, --config string Specify config file (default &#34;qsftpd.yaml&#34;)</span> </span></span><span style="display:flex;"><span> -<span style="color:#ae81ff">h, --help help for qsftpd</span> </span></span><span style="display:flex;"><span> -<span style="color:#ae81ff">v, --version Show version</span> </span></span></code></pre></div><h3 id="选项列表">选项列表</h3> <p>根据前文可知,qsftpd 支持的常规命令选项如下所示:</p> <table> <thead> <tr> <th>参数简写</th> <th>参数全名</th> <th>类型</th> <th>是否必须</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>-c</td> <td>–config</td> <td>string</td> <td>否</td> <td>指定配置文件的路径,默认为 <code>qsftpd.yaml</code></td> </tr> <tr> <td>-h</td> <td>–help</td> <td>string</td> <td>否</td> <td>输出帮助信息</td> </tr> <tr> <td>-v</td> <td>–version</td> <td>string</td> <td>否</td> <td>输出版本信息</td> </tr> </tbody> </table> <h3 id="使用示例">使用示例</h3> <ol> <li> <p>创建配置文件,如 <code>qsftpd.yaml</code>,按照前文的配置文件说明进行配置。参考 <a href="#%E9%85%8D%E7%BD%AE">配置</a></p> </li> <li> <p>执行如下命令,启动 FTP Server,终端显示如下打印,即,说明服务端准备就绪:</p> </li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ qsftpd -c path/to/your/qsftpd.yaml </span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>2017-04-12T03:24:40.541Z <span style="color:#75715e">#2527] INFO -- : Listening... 127.0.0.1:21</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>2017-04-12T03:24:40.541Z <span style="color:#75715e">#2527] INFO -- : Starting...</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>2017-04-12T03:24:49.330Z <span style="color:#75715e">#2527] INFO -- : FTP Client connected: ftp.connected, id: 76e209d6a89448279e947a7babe0097d, RemoteAddr: 127.0.0.1:51788, Total: 1</span> </span></span><span style="display:flex;"><span>...... </span></span></code></pre></div><ol start="3"> <li>在客户端,执行如下命令行,通过 FTP 客户端连接 FTP Server 进行测试:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ ftp -a 127.0.0.1 </span></span><span style="display:flex;"><span>Connected to 127.0.0.1. </span></span><span style="display:flex;"><span><span style="color:#ae81ff">220</span> Welcome to QSFTP Server </span></span><span style="display:flex;"><span><span style="color:#ae81ff">331</span> User name okay, need password. </span></span><span style="display:flex;"><span><span style="color:#ae81ff">230</span> Password ok, <span style="color:#66d9ef">continue</span> </span></span><span style="display:flex;"><span>Remote system type is UNIX. </span></span><span style="display:flex;"><span>Using binary mode to transfer files. </span></span><span style="display:flex;"><span>ftp&gt; </span></span></code></pre></div><ol start="4"> <li>客户端成功链接后,FTP 服务端显示如下打印:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#f92672">[</span>2017-04-12T03:24:49.330Z <span style="color:#75715e">#2527] INFO -- : FTP Client connected: ftp.connected, id: 76e209d6a89448279e947a7babe0097d, RemoteAddr: 127.0.0.1:51788, Total: 1</span> </span></span><span style="display:flex;"><span>...... </span></span></code></pre></div><ol start="5"> <li>在客户端执行如下命令行,查看文件列表:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>ftp&gt; ls </span></span><span style="display:flex;"><span><span style="color:#ae81ff">229</span> Entering Extended Passive Mode <span style="color:#f92672">(||</span>|6081|<span style="color:#f92672">)</span> </span></span><span style="display:flex;"><span><span style="color:#ae81ff">150</span> Using transfer connection </span></span><span style="display:flex;"><span>d--------- <span style="color:#ae81ff">1</span> ftp ftp <span style="color:#ae81ff">0</span> Nov <span style="color:#ae81ff">30</span> 00:00 test-output </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#ae81ff">226</span> Closing transfer connection </span></span></code></pre></div><ol start="6"> <li>在客户端执行如下命令行,上传文件:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>ftp&gt; put AUTHORS </span></span><span style="display:flex;"><span>local: AUTHORS remote: AUTHORS </span></span><span style="display:flex;"><span><span style="color:#ae81ff">229</span> Entering Extended Passive Mode <span style="color:#f92672">(||</span>|6887|<span style="color:#f92672">)</span> </span></span><span style="display:flex;"><span><span style="color:#ae81ff">150</span> Using transfer connection </span></span><span style="display:flex;"><span>100% |***********************************| <span style="color:#ae81ff">146</span> 91.68 KiB/s 00:00 ETA </span></span><span style="display:flex;"><span><span style="color:#ae81ff">226</span> Closing transfer connection </span></span><span style="display:flex;"><span><span style="color:#ae81ff">146</span> bytes sent in 00:00 <span style="color:#f92672">(</span>2.19 KiB/s<span style="color:#f92672">)</span> </span></span><span style="display:flex;"><span>ftp&gt; </span></span></code></pre></div> Storage: Docker Registry 后端对接 S3 存储 /storage/object-storage/manual/tool/docker_registry/ Thu, 12 Aug 2021 10:08:56 +0900 /storage/object-storage/manual/tool/docker_registry/ <h2 id="概述">概述</h2> <p>官方的 Docker hub 是一个用于管理公共镜像的地方,用户可以从这里获取相应的镜像,也可以将自己的镜像推送上去。当用户的使用场景需要拥有一个私有的镜像仓库用于管理自己的镜像。这个时候,可以通过开源软件 Registry 来达成目的。</p> <p>Docker Registry 是一个无状态,高度可扩展的服务器端应用程序,它存储并允许用户分发 Docker 映像。</p> <h2 id="环境搭建">环境搭建</h2> <p>用户在客户端服务器上,参考如下步骤可完成 Docker Registry 环境的搭建。详细操作步骤如下:</p> <ol> <li>CentOS 可执行如下命令,使用官方安装脚本自动安装 <code>docker</code>:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun</span> </span></span></code></pre></div><p><strong>备注:</strong> 也可使用国内 <code>daocloud</code> 一键安装命令:<code>curl -sSL https://get.daocloud.io/docker | sh</code> 进行安装。</p> <ol start="2"> <li>启动 <code>docker</code>:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>step 1: 启动 docket </span></span><span style="display:flex;"><span><span style="color:#75715e"># systemctl start docker</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>step 2: 查看 docker 是否安装成功 </span></span><span style="display:flex;"><span><span style="color:#75715e"># docker version</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>step 3: 测试 </span></span><span style="display:flex;"><span><span style="color:#75715e"># docker run hello-world</span> </span></span></code></pre></div><p><strong>备注:</strong> 输出 <code>Hello from Docker!</code> 即为正常。</p> <ol start="3"> <li>执行如下命令行,安装 <code>docker-compose</code></li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` &gt; /usr/local/bin/docker-compose</span> </span></span></code></pre></div><ol start="4"> <li>修改 <code>docker-compose</code> 的权限</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># chmod +x /usr/local/bin/docker-compose</span> </span></span></code></pre></div><ol start="5"> <li>新建工作目录 <code>my_registry</code> 并进入该目录:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># mkdir my_registry &amp;&amp; cd my_registry</span> </span></span></code></pre></div><p><strong>说明:</strong> 用户可根据实际情况,修改相应参数,创建工作目录。</p> <ol start="6"> <li>在工作目录 <code>my_registry</code> 下创建配置文件 <code>docker-compose.yml</code>,内容如下:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># vi docker-compose.yml</span> </span></span><span style="display:flex;"><span>registry: </span></span><span style="display:flex;"><span> restart: always </span></span><span style="display:flex;"><span> image: <span style="color:#e6db74">&#34;registry:2&#34;</span> </span></span><span style="display:flex;"><span> ports: </span></span><span style="display:flex;"><span> - 127.0.0.1:5000:5000 </span></span><span style="display:flex;"><span> volumes: </span></span><span style="display:flex;"><span> - ./auth:/auth </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> environment: </span></span><span style="display:flex;"><span> - REGISTRY_STORAGE<span style="color:#f92672">=</span>s3 </span></span><span style="display:flex;"><span> - REGISTRY_STORAGE_S3_ACCESSKEY<span style="color:#f92672">=</span>YOUR_ACCESSKEY </span></span><span style="display:flex;"><span> - REGISTRY_STORAGE_S3_SECRETKEY<span style="color:#f92672">=</span>YOUR_SECRETKEY </span></span><span style="display:flex;"><span> - REGISTRY_STORAGE_S3_BUCKET<span style="color:#f92672">=</span>YOUR_BUCKET_NAME </span></span><span style="display:flex;"><span> - REGISTRY_STORAGE_S3_REGION<span style="color:#f92672">=</span>YOUR_REGION_NAME //pek3b </span></span><span style="display:flex;"><span> - REGISTRY_STORAGE_S3_REGIONENDPOINT<span style="color:#f92672">=</span>s3.YOUR_REGION_NAME.qingstor.com //example:s3.pek3b.qingstor.com </span></span><span style="display:flex;"><span> - REGISTRY_STORAGE_S3_chunksize<span style="color:#f92672">=</span><span style="color:#ae81ff">67108864</span> </span></span></code></pre></div><p><strong>说明:</strong></p> <ul> <li><code>REGISTRY_STORAGE_S3_ACCESSKEY</code> 填写用户的 access_key。</li> <li><code>REGISTRY_STORAGE_S3_SECRETKEY</code> 填写用户的 secret_key。</li> <li><code>REGISTRY_STORAGE_S3_BUCKET</code> 填写用户的 Bucket 名。</li> <li><code>REGISTRY_STORAGE_S3_REGION</code> 填写 Bucket 所在的 Zone ID。可参考<a href="/storage/object-storage/intro/object-storage/#zone">QingStor 对象存储 Zone 列表</a>。</li> <li><code>REGISTRY_STORAGE_S3_REGIONENDPOINT</code> 填写 Bucket 域名。根据示例填写。</li> <li><code>REGISTRY_STORAGE_S3_chunksize</code> 建议尽量往大设置,以避免上传分段数为 200 的超大镜像失败。如设置为 67108864,即 64M,则可以成功上传 12G 以内文件。</li> </ul> <ol start="7"> <li>启动 <code>registry</code> 服务:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># docker-compose up -d</span> </span></span></code></pre></div><h2 id="环境验证">环境验证</h2> <p>Docker Registry 环境搭建完成后,用户可对该环境进行测试验证,以确认能正常上传镜像。</p> <ol> <li>创建新镜像</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>step 1: 创建一个 1G 的文件 </span></span><span style="display:flex;"><span><span style="color:#75715e"># dd if=/dev/urandom of=test count=1024 bs=1M</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>step 2: 编写 Dockerfile </span></span><span style="display:flex;"><span><span style="color:#75715e"># vim Dockerfile</span> </span></span><span style="display:flex;"><span>FROM centos:7 </span></span><span style="display:flex;"><span>ADD test test </span></span><span style="display:flex;"><span>CMD /bin/bash </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>step 3: 创建镜像 </span></span><span style="display:flex;"><span><span style="color:#75715e"># docker build -t 1g</span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># docker tag 1g 127.0.0.1:5000/1g</span> </span></span></code></pre></div><ol start="2"> <li>执行如下命令,上传该镜像</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># docker push 127.0.0.1:5000/1g</span> </span></span></code></pre></div><h2 id="常见问题">常见问题</h2> <h3 id="不断重传">不断重传</h3> <p><strong>问题描述:</strong></p> <p>当上传大镜像时,会出现不断重传的现象。Console 界面显示结果如下:</p> <p><img src="/storage/object-storage/_images/docker_registry_1.png" alt=""></p> <p><strong>原因分析:</strong></p> <p>Registry 默认分段大小为 10M,当发现最后一段大小异常时,终端显示如下内容:</p> <p><img src="/storage/object-storage/_images/docker_registry_2.png" alt=""></p> <p>查看相关日志信息,错误日志如下所示:</p> <p><img src="/storage/object-storage/_images/docker_registry_3.png" alt=""></p> <p>由上可知,当前错误信息如下:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>upload resumed at wrong offest: <span style="color:#ae81ff">1048576000</span> !<span style="color:#f92672">=</span> <span style="color:#ae81ff">1074069675</span> </span></span></code></pre></div><p>当分段数大于 200 均会发生上传失败,报 <code>upload resumed at wrong offest: 2157152000 != 2175259408</code>。</p> <p><strong>解决方法:</strong></p> <p>修改配置文件 <code>docker-compose.yml</code> 中如下字段内容,尽量往大了设置,使得上传分段数在 200 以内的超大镜像能成功上传:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span> - REGISTRY_STORAGE_S3_chunksize<span style="color:#f92672">=</span><span style="color:#ae81ff">67108864</span> </span></span></code></pre></div><p><strong>说明:</strong></p> <ul> <li>设置为:33554432,即 32M,可以成功上传大小为 6G 以内的文件。</li> <li>设置为:67108864,即 64M,可以成功上传大小为 12G 以内文件。</li> <li>根据带宽尽量填写较大的值。</li> </ul> Storage: Mountain Duck /storage/object-storage/manual/tool/mountain-duck/ Thu, 12 Aug 2021 10:08:56 +0900 /storage/object-storage/manual/tool/mountain-duck/ <h2 id="概述">概述</h2> <p>Mountain Duck 是 Windows 平台上用于挂载访问对象存储的第三方客户端软件。目前也支持 MAC 平台。</p> <p>QingStor 对象存储推荐用户使用 Mountain Duck 来挂载由 QingStor 对象存储为其提供的无限容量的在线文件存储空间,从而节省本地磁盘空间。用户通过 Mountain Duck 可以像操作本地磁盘(例如 C 盘、D 盘等)一样方便、快捷地访问或存取 QingStor 对象存储 Bucket 中的各种类型文件。</p> <p>目前支持以下平台:</p> <ul> <li>Windows 7、Windows 8、Windows 10 的 32/64 位平台。</li> <li>MAC OS 10.12 及以后版本。</li> </ul> <h2 id="安装">安装</h2> <p>用户可下载 <a href="https://mountainduck.io/">Mountain Duck 安装包</a>,解压缩后直接运行安装即可完成。</p> <h2 id="使用">使用</h2> <p>通过 Mountain Duck 成功挂载 QingStor 对象存储中的 Bucket 后,用户即可像操作本地磁盘一样对 QingStor 对象存储 Bucket 中的文件进行读写、存取等操作,同时可通过托盘菜单对缓存设置、版本更新、帐户信息等进行查看或操作。</p> <h3 id="windows-平台">Windows 平台</h3> <p>详细操作步骤如下:</p> <ol> <li>点击 <strong>Mountain Duck &ndash; &gt; 新建链接</strong>,如下图所示:</li> </ol> <p><img src="/storage/object-storage/_images/mountain-duck1.png" alt=""></p> <ol start="2"> <li>弹出新建链接对话框,根据提示信息输入相关字段,点击 <strong>连接</strong> 即可:</li> </ol> <p><img src="/storage/object-storage/_images/mountain-duck2.png" alt=""></p> <p><strong>说明:</strong></p> <ul> <li>协议下拉框里,选择 <code>Amazon S3</code>,如上图所示。</li> <li><code>服务器名</code>,填写 QingStor 对象存储的域名,格式为:<code>s3.&lt;zone_id&gt;.qingstor.com</code>。其中 <code>zone_id</code> 须根据实际情况进行修改。公有云环境,可参考 <a href="/storage/object-storage/intro/object-storage/#zone">公有云开放区域</a>。</li> <li><code>访问密钥 ID</code> 与 <code>访问私钥</code>,即 AK/SK 须根据实际情况进行填写。具体可参考<a href="/storage/object-storage/api/practices/signature/#%E8%8E%B7%E5%8F%96-access-key">获取 Access Key</a>。</li> <li><code>盘符</code> 即 QingStor 对象存储 Bucket 成功挂载至本地后的磁盘盘符。</li> </ul> <ol start="3"> <li>成功挂载后,本地可直接查看 QingStor 对象存储的 Bucket,如下图所示:</li> </ol> <p><img src="/storage/object-storage/_images/mountain-duck3.png" alt=""></p> <p><strong>说明:</strong></p> <ul> <li>成功挂载的 QingStor 对象存储 Bucket,可像本地磁盘一样进行操作。</li> <li>由于新建链接时,没有指定路径,故这里显示了根目录下的所有 Bucket。</li> <li>若用户须操作指定 Bucket,可在新建链接时,指定对应的目录即可。</li> </ul> <ol start="4"> <li>Mountain Duck 挂载成功后,用户可通过设置菜单对该工具进行相关操作设置。设置菜单如下图所示:</li> </ol> <p><img src="/storage/object-storage/_images/mountain-duck4.png" alt=""></p> <h3 id="mac-平台">MAC 平台</h3> <p>详细操作步骤如下:</p> <ol> <li> <p>点击 <strong>Mountain Duck &gt; Open Connection</strong>,如下图所示:</p> <img src="/storage/object-storage/_images/mountain-duck5.png" style="zoom:50%;" /> </li> <li> <p>弹出新建链接对话框,根据提示信息输入相关字段,点击 <strong>连接</strong> 即可:</p> <img src="/storage/object-storage/_images/mountain-duck6.png" style="zoom:50%;" /> <blockquote> <p><strong>说明:</strong></p> <ul> <li>协议下拉框里,选择 <code>Amazon S3</code>,如上图所示。</li> <li><code>服务器名</code>,填写 QingStor 对象存储的域名,格式为:<code>s3.&lt;zone_id&gt;.qingstor.com</code>。其中 <code>zone_id</code> 须根据实际情况进行修改。公有云环境,可参考 <a href="/storage/object-storage/intro/object-storage/#zone">公有云开放区域</a>。</li> <li><code>访问密钥 ID</code> 与 <code>访问私钥</code>,即 AK/SK 须根据实际情况进行填写。具体可参考<a href="/storage/object-storage/api/practices/signature/#%E8%8E%B7%E5%8F%96-access-key">获取 Access Key</a>。</li> </ul> </blockquote> </li> <li> <p>成功挂载后,本地可直接查看 QingStor 对象存储的 Bucket,如下图所示:</p> <img src="/storage/object-storage/_images/mountain-duck7.png" style="zoom:30%;" /> </li> </ol> <h2 id="升级">升级</h2> <p>当 Mountain Duck 新版本发布后,用户在登录 Mountain Duck 时将会收到版本的更新提示,用户根据需求进行更新即可。当然,用户也可在使用过程中,通过托盘菜单中的检查更新入口主动更新最新版本。</p>