Решил я тут, что будет удобно иметь S3 бакет как диск в системе для всякого. Так как я плотно работаю с Yandex Cloud, то и использовать буду их бакет.

У них довольно щедрые тарифы и достаточно большие бесплатные лимиты. https://yandex.cloud/ru/docs/storage/pricing

Я сижу на Федоре. Для подключения бакета буду использовать GeeseFS - - высокопроизводительная файловая система S3 ( Яндекс , Amazon ), соответствующая стандарту POSIX и написанная на языке Go.

GeeseFS позволяет монтировать S3 бакет как файловую систему. Файловые системы FUSE на основе S3 обычно имеют проблемы с производительностью, особенно при работе с небольшими файлами и операциями с метаданными. GeeseFS пытается решить эти проблемы, используя агрессивный параллелизм и асинхронность.

Будет работать кстати и на винде.

Естественно нужно иметь аккаунт в яндекс облаке. У меня он есть. Создать новый не представляет сложности. Там ещё и грант 4000 рублей дадут. Поэтому переходим к делу.

В облаке нужно будет создать бакет. А так же статические ключи доступа.

Скачиваю бинарник https://github.com/yandex-cloud/geesefs/releases/latest/download/geesefs-linux-amd64. Кстати должна быть установлена ещё fuse, в федоре она предустановлена.

В профиль aws нужно добавить созданный ранее статический ключ доступа. Если вы не пользовались aws cli, то нужно создать файл ~/.aws/credentials, если пользовались то файл уже есть. В него нужно добавить профиль

[home-reserve]
aws_access_key_id = AKID1234567890
aws_secret_access_key = MY-SECRET-KEY

Cоздать каталог для монтирования бакета mkdir -p ~/mnt/yc-bucket/.

Далее создать юнит nano ~/.config/systemd/user/geesefs-home-reserve.service

[Unit]
Description=Mount Yandex Cloud bucket home-reserve via GeeseFS
After=network.target

[Service]
Type=simple
ExecStartPre=/bin/sh -c 'fusermount3 -u /home/your-user-name/mnt/yc-bucket 2>/dev/null || true'
ExecStart=/home/your-user-name/Scripts/geesefs-linux-amd64 \
    -f \
    --endpoint https://storage.yandexcloud.net   \
    --profile home-reserve \
    --enable-perms \
    --enable-mtime \
    --enable-patch \
    home-reserve \
    /home/your-user-name/mnt/yc-bucket
ExecStop=fusermount3 -u /home/your-user-name/mnt/yc-bucket
Restart=on-failure
RestartSec=5

[Install]
WantedBy=default.target

Пояснения:

  • After=network.target - запускать эту службу после того, как будут подняты сетевые интерфейсы

  • Type=simple - systemd считает службу запущенной сразу после запуска ExecStart. Требуется так как geesefs работает в foreground-режиме благодаря флагу -f

  • ExecStartPre - команда, выполняемая перед запуском основной службы. Принудительно отмонтируется бакет, если он остался висеть с прошлого запуска. 2>/dev/null || true подавляет ошибки, если бакет не был смонтирован

  • ExecStart - запускает geesefs. Указан путь до ранее скачанного бинарника. Параметры:

    • -f - запуск в foreground. Процесс не уходит в фон и контролируется systemd

    • --endpoint - URL S3-совместимого API Yandex Cloud

    • --profile home-reserve - профиль из ~/.aws/credentials

    • --enable-perms, --enable-mtime, --enable-patch - улучшают совместимость с POSIX (права, временные метки и частичное обновление файлов)

    • home-reserve - название бакета в облаке

    • /home/your-user-name/mnt/yc-bucket - локальная директория, куда монтируется бакет

  • ExecStop - команда для корректного отмонтирования при остановке службы

  • Restart - если процесс упадёт, systemd перезапустит его через 5 секунд (RestartSec)

Обновляем внутреннюю конфигурацию демона systemd в памяти systemctl daemon-reload
Монтируем fusermount -u /home/your-user-name/mnt/yc-bucket
Перезагружаем systemctl --user restart geesefs-home-reserve.service

Готово. Теперь есть диск на 288,2 петабайта. Работает очень шустро.