如何创建 s3ql 文件系统并在启动时自动挂载?

如何创建 s3ql 文件系统并在启动时自动挂载?

我一直在尝试s3ql在 Ubuntu 10.04 上,使用它来挂载 Amazon S3 存储桶。但是,我真的很想让它自动挂载它们。有人知道怎么做吗?


解决方案:

感谢 Nikratio 的帮助s3ql我终于能够在系统启动时自动挂载 S3 存储桶了。你肯定会想看看手动的,但这里是如何操作的基本方法!

第一步是创建一个 authinfo 文件。该文件应放在将使用它的用户主目录中的 .s3ql 目录中。authinfo 文件包含允许 s3ql 无需提示即可挂载存储桶的登录信息。以下是您的 authinfo 文件的示例。第一行包含您的 Amazon 安全凭证。第二行包含您的存储桶的位置和密码。如果需要,您可以向此文件添加多个存储桶行,但在此示例中我仅使用一个。此时,存储桶密码可以是任何内容。

backend s3 machine any login YourAWSAccessKeyID password YourAWSSecretAccessKey
storage-url s3://mybucket password EncryptionPasswordOfYourChoosing

S3QL使用encryption_password_of_your_choosing来加密/解密从 S3 写入/读取的所有文件。

存储桶名称在整个 AWS 中必须是唯一的:任何两个用户都不能拥有相同的存储桶名称,因此最好登录 Amazon Web Services 并尝试不同的名称,直到找到一个可用的名称。一个好的命名方案是使用您将从中访问存储桶的域+服务器的名称(即“staging.example.com”或“east.coast.01.example.com”,或任何合适的名称)。

要创建文件系统,请使用以下命令:

mkfs.s3ql s3://mybucket

它会提示您输入加密密码。该密码应与 authinfo 文件中的存储桶密码相同。

现在您的文件系统已创建,您可以使用以下命令挂载它:

mount.s3ql s3://mybucket /mnt/s3/bucket

当然,您的存储桶名称和挂载点会有所不同。

现在,如果我们想在启动时自动挂载此 bucket,我们需要将 upstart 脚本添加到 /etc/init。幸运的是,s3ql 附带了一个脚本,即 s3ql.conf。

我在 mount.s3ql 命令中添加了“--allow-other”,以允许除 root 之外的用户访问已挂载的存储桶。

#
# This file can be placed in /etc/init. It defines an upstart job that
# takes care of mounting and unmounting an S3QL file system.
# 
description "S3QL Backup File System"
author      "Nikolaus Rath <[email protected]>"

start on (filesystem and net-device-up IFACE=eth0)
stop on runlevel [016]

env BUCKET="s3://mybucket"
env MOUNTPOINT="/mnt/s3/bucket"

expect stop

script
    # Redirect stdout and stderr into the system log
    DIR=$(mktemp -d)
    mkfifo "$DIR/LOG_FIFO"
    logger -t s3ql -p local0.info < "$DIR/LOG_FIFO" &
    exec > "$DIR/LOG_FIFO"
    exec 2>&1
    rm -rf "$DIR"

    # Check and mount file system
    fsck.s3ql --batch "$BUCKET"
    exec mount.s3ql --upstart --allow-other "$BUCKET" "$MOUNTPOINT"
end script

pre-stop script
    umount.s3ql "$MOUNTPOINT"
end script

添加此脚本后,理论上你应该能够重新启动并自动挂载你的 bucket,但这正是我遇到麻烦的地方。我的 bucket 没有被挂载。

我的问题是由于 upstart 以 root 身份运行脚本,但我以其他用户身份创建了文件系统。一旦我将 .s3ql 目录从我以其他用户身份登录的用户的主目录复制到 /root,问题就解决了。

我希望这对其他人有所帮助。虽然我使用挂载的 S3 存储桶的时间不长,但我对初始测试的进展印象深刻。

此外,这个答案是在找到解决方案后大约一周写的。我想我已经涵盖了所有内容,但如果你发现我漏掉了一步,请告诉我,我会添加它。你还需要阅读手动的,如果您打算使用 s3ql,那么它真的值得一读。

答案1

由于我还没有找到使用 systemd(Ubuntu 20.04,s3ql 3.8.0)轻松解决此问题的方法,因此我将在此处发布我的解决方案:

[Unit]
Description=mount s3ql filesystem
Wants=network-online.target

[Service]
Type=notify
NotifyAccess=all
ExecStart=mount.s3ql --systemd --fg <other options> <storage url> <mount point>
ExecStop=umount.s3ql <mount point>
TimeoutStopSec=5min

[Install]
WantedBy=multi-user.target

对于非常大的文件系统,可能需要增加TimeoutStopSec或将其设置为无穷大(我个人想避免这种情况)。

将其添加到正确的 systemd 目录(例如/lib/systemd/system/s3ql.service)并且systemctl daemon-reload && systemctl start s3ql(当 fs 已卸载且未损坏时)。

答案2

现代 Ubuntu 安装使用事件驱动的 upstart 系统来完成大部分启动过程,因此最好将启动移至该系统。/etc/init 中应该有一个类似这样的脚本:

description     "S3FS"

start on (filesystem
        and net-device-up IFACE!=lo)
stop on runlevel[!2345]

console output
expect fork
respawn

script
    # Redirect stdout and stderr into the system log
    DIR=$(mktemp -d)
    mkfifo "$DIR/LOG_FIFO"
    logger -t s3ql -p local0.info < "$DIR/LOG_FIFO" &
    exec > "$DIR/LOG_FIFO"
    exec 2>&1
    rm -rf "$DIR"

    modprobe fuse
    fsck.s3ql --batch s3://mybucket
    exec mount.s3ql --allow-other s3://mybucket /mnt/s3fs
end script

您必须做一些测试工作 - 我不知道日志的输出重定向将如何运行,并且您可能需要设置停止后脚本才能正确卸载文件系统。

upstart 文档是这里。我还没有找到使用它的基于 FUSE 的包,但我没有进行详尽的搜索。

另一种方法可能是为文件系统构建一个 fstab 条目,以便让 mountall 条目负责为您安装它,但我不知道是否有办法指定给定的 FUSE 文件系统依赖于网络。

答案3

在 Nikratio 的帮助下,我终于能够在启动时自动安装我的 S3 存储桶。我已用解决方案更新了我的问题。

相关内容