Решил я тут, что будет удобно иметь 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-режиме благодаря флагу-fExecStartPre - команда, выполняемая перед запуском основной службы. Принудительно отмонтируется бакет, если он остался висеть с прошлого запуска.
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 петабайта. Работает очень шустро.
