Termux — удобная среда для работы на Android, где можно автоматизировать задачи, запускать утилиты и использовать сетевые файловые системы. В практических сценариях часто возникает потребность подключить «облачное» хранилище к Termux так, чтобы оно появлялось как обычная директория в файловой системе. Для этого обычно применяют FUSE (Filesystem in Userspace) — механизм, позволяющий монтировать удалённые файловые системы в пользовательском пространстве без глубоких изменений в системе.
В этой статье мы рассмотрим подход к подключению Termux к Ceph и GlusterFS через FUSE и автоматическое монтирование: от подготовки Termux до настройки скриптов автозапуска. Материал ориентирован на эксплуатационные сценарии и соответствует типовым требованиям безопасности в РФ: мы не обходим блокировки и не применяем инструменты для обхода ограничений.
Что нужно знать заранее
Подход «Ceph/GlusterFS + FUSE + автоматическое монтирование» обычно опирается на один из вариантов:
- Клиент FUSE, специфичный для конкретной СХД (если он доступен и корректно работает на Android).
- Универсальные варианты через SSHFS (как компромисс, если прямой FUSE-клиент отсутствует, а на стороне сервера доступен SSH/SFTP).
- Сетевые протоколы (NFS/SMB) и монтирование, но это чаще требует root/специфической поддержки, поэтому в рамках FUSE-стратегии мы ориентируемся на user-space.
Для Ceph и GlusterFS в реальной практике важно уточнить, какие именно протоколы и доступы у вас есть:
- Есть ли доступ к MON/MGR и корректные ключи (для Ceph auth).
- Есть ли доступ к Gluster через необходимые интерфейсы и клиенты.
- Доступна ли на сервере/в сети служебная учётная запись для SSH (если используете SSHFS как мост).
- Потребуются ли Kerberos/AD для корпоративных сред (в статье мы не углубляемся в Kerberos, но покажем архитектуру автоматизации).
Если вам нужно обеспечить локальную связность между Android и сервером в закрытой сети (например, в лабораторной инфраструктуре), допускается использование VPN только для создания локальной сети между устройствами/сегментами.
Подготовка Termux: базовые пакеты и FUSE
Начните с обновления пакетов Termux и установки базовых зависимостей. Дальнейшие шаги зависят от выбранной стратегии (прямой FUSE-клиент или SSHFS как альтернативный мост).
pkg update -y
pkg upgrade -y
pkg install -y proot-distro termux-tools fuse nano wget curl git
Далее установите FUSE-утилиты, в зависимости от доступности в вашем окружении. На Android FUSE-поддержка должна быть разрешена на уровне устройства/ядра и приложения/модуля (в разных прошивках поведение отличается). Проверьте наличие доступа к FUSE:
ls -l /dev/fuse 2>/dev/null || echo "/dev/fuse недоступен — проверьте поддержку FUSE на устройстве"
Если устройство и приложение поддерживают FUSE, переходите к настройке клиента под вашу файловую систему.
Вариант 1. Ceph: подключение через FUSE/клиент (концепция и подготовка доступов)
Ceph как объектная/блочная/файловая система имеет несколько режимов доступа. Для файлового доступа в терминах POSIX чаще рассматривают CephFS и её клиент. На Android прямые «готовые» FUSE-клиенты встречаются реже, чем для NFS/SSHFS, однако практический подход часто строится вокруг доступного клиента и грамотной подготовки параметров Ceph.
Рекомендуемая схема такая:
- Подготовить keyring Ceph (секрет доступа),
- Подготовить адреса мониторов (MON) и, при необходимости, параметры сети,
- Запустить монтирование в Termux через соответствующий клиент (FUSE-ориентированный),
- Автоматизировать повторную попытку при потере сети.
В упрощённом примере ниже показана подготовка каталога для хранения ключа и создание структуры для монтирования. Содержимое ключа вы получаете на стороне Ceph у администратора/в панели управления.
mkdir -p ~/ceph-secrets ~/mnt/cephfs
Допустим, вы получили файл keyring и хотите сохранить его локально в Termux (с соблюдением принципов безопасности: права доступа — только для владельца).
# пример: загрузка keyring (подставьте свой источник/способ получения)
# curl -o ~/ceph-secrets/ceph.client.admin.keyring https://.../ceph.client.admin.keyring
chmod 600 ~/ceph-secrets/ceph.client.admin.keyring
Далее задайте переменные окружения (адреса мониторов, путь монтирования, пользователь/realm). Конкретная команда монтирования зависит от того, какой клиент доступен в вашем окружении. Важно: не храните пароли в открытом виде и не коммитьте секреты в репозитории.
export CEPH_MONS="10.0.0.10,10.0.0.11,10.0.0.12"
export CEPH_FS_NAME="cephfs"
export CEPH_USER="client.admin"
export CEPH_KEYRING="$HOME/ceph-secrets/ceph.client.admin.keyring"
export CEPH_MOUNTPOINT="$HOME/mnt/cephfs"
Дальше следует реальная команда FUSE-монтирования. Так как на Android доступность конкретных CephFS-FUSE-клиентов зависит от вашего сборочного набора/архитектуры, универсальный «один на всех» пример команды в этой статье не публикуется. Профессиональная практика в РыбинскЛАБ — подобрать рабочий клиент под вашу версию Android/NDK/архитектуру и согласовать параметры сети и ключей.
Тем не менее, ниже приведён каркас скрипта автоподнятия: он проверяет, смонтировано ли, и выполняет монтирование с ретраями.
#!/data/data/com.termux/files/usr/bin/bash
set -e
MOUNTPOINT="$HOME/mnt/cephfs"
mkdir -p "$MOUNTPOINT"
# Проверка: смонтировано ли уже
if mountpoint -q "$MOUNTPOINT"; then
echo "CephFS уже смонтирован: $MOUNTPOINT"
exit 0
fi
# Простейшие ретраи при старте/нестабильной сети
for i in 1 2 3; do
echo "Попытка монтирования CephFS (№$i)..."
# TODO: вставьте команду FUSE-монтирования CephFS под вашу конфигурацию.
# Пример-вставка (НЕ является универсальной командой для всех сред):
# ceph-fuse -m "$CEPH_MONS" -n "$CEPH_USER" --keyring "$CEPH_KEYRING" -r "$CEPH_FS_NAME" "$MOUNTPOINT"
# Если команда выполнена — выходим
sleep 2
if mountpoint -q "$MOUNTPOINT"; then
echo "Монтирование успешно: $MOUNTPOINT"
exit 0
fi
sleep 3
done
echo "Не удалось смонтировать CephFS после попыток. Проверьте сеть и ключи."
exit 1
Сохраните каркас, например, как ~/scripts/mount-cephfs.sh и добавьте права:
mkdir -p ~/scripts
chmod +x ~/scripts/mount-cephfs.sh
Вариант 2. GlusterFS: практический путь через FUSE или «мост» по SSHFS
GlusterFS часто проще подключать, если на стороне есть подходящий клиент, либо если можно использовать SSH как канал для «псевдо-FUSE». На Android иногда удобнее и надёжнее использовать:
- direct FUSE-клиент GlusterFS (если поддерживается в вашем Android/сборке), либо
- SSHFS: вы монтируете удалённую директорию по SSH, а локально получаете каталог, как если бы это была часть файловой системы.
Рассмотрим надёжный эксплуатационный сценарий: SSHFS как единый механизм монтирования для разных backend’ов. Он не заменяет нативный Gluster-протокол, но решает задачу «мне нужен каталог в Termux и автоматизация».
SSHFS как FUSE-решение для автоматического монтирования
Установите SSHFS:
pkg install -y sshfs
Подготовьте ключи SSH (рекомендуется ключевая аутентификация, а не пароль). Если доступ в серверную сеть закрытый, настраивайте VPN только для локальной сети (без обхода блокировок).
mkdir -p ~/mnt/gluster
mkdir -p ~/.ssh
chmod 700 ~/.ssh
Пример монтирования (замените user, host и путь на сервере):
sshfs user@gluster-server:/data/brick1 ~/mnt/gluster \
-o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3,allow_other,StrictHostKeyChecking=accept-new
Если allow_other недоступен/не поддерживается в вашем окружении, уберите опцию. Для безопасности старайтесь ограничивать права и не раскрывать лишние монтирования.
Скрипт автоподнятия для GlusterFS через SSHFS
Сделайте скрипт, который:
- проверяет точку монтирования,
- пытается выполнить SSHFS с ретраями,
- логирует действия.
#!/data/data/com.termux/files/usr/bin/bash
set -e
MOUNTPOINT="$HOME/mnt/gluster"
USER="user"
HOST="gluster-server"
REMOTEPATH="/data/brick1"
mkdir -p "$MOUNTPOINT"
if mountpoint -q "$MOUNTPOINT"; then
echo "GlusterFS(через SSHFS) уже смонтирован: $MOUNTPOINT"
exit 0
fi
for i in 1 2 3 4; do
echo "Попытка монтирования SSHFS (№$i)..."
sshfs "${USER}@${HOST}:${REMOTEPATH}" "$MOUNTPOINT" \
-o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3
sleep 2
if mountpoint -q "$MOUNTPOINT"; then
echo "Монтирование успешно: $MOUNTPOINT"
exit 0
fi
sleep 3
done
echo "Не удалось смонтировать SSHFS. Проверьте доступ по SSH и сеть."
exit 1
Сохраните:
chmod +x ~/scripts/mount-gluster-sshfs.sh
Автоматическое монтирование при запуске Termux
В Termux есть несколько рабочих моделей запуска. На практике чаще всего используют:
- termux:boot (при старте устройства),
- пользовательский запуск вручную через ярлык/cron-like подход,
- внутренние «умные» проверки при первом запуске сессии.
Установите пакет termux:boot:
pkg install -y termux-api
# В зависимости от версии Termux/Android может потребоваться установка термина termux:boot вручную из F-Droid/репозитория.
Далее настройте событие. Если в вашем окружении доступен termux-setup-storage и есть поддержка автозапуска — используйте нативный подход. Если нет, простой и надёжный метод — запуск скриптов через Termux сессии (например, через ~/.bashrc или ~/.profile).
Пример для ~/.bashrc: добавьте в конец файла проверку и запуск (без бесконечного цикла). Важно: не запускайте монтирование слишком часто.
nano ~/.bashrc
Добавьте:
# Auto-mount on interactive shell start
if [ -z "$TERMUX_DISABLE_AUTOMOUNT" ]; then
# CephFS
if [ -x "$HOME/scripts/mount-cephfs.sh" ]; then
"$HOME/scripts/mount-cephfs.sh" >> "$HOME/mnt-autolog.txt" 2>&1 &
fi
# GlusterFS via SSHFS
if [ -x "$HOME/scripts/mount-gluster-sshfs.sh" ]; then
"$HOME/scripts/mount-gluster-sshfs.sh" >> "$HOME/mnt-autolog.txt" 2>&1 &
fi
fi
Если вы предпочитаете управление через явное включение/выключение, можно задавать переменную TERMUX_DISABLE_AUTOMOUNT при тестах.
Рекомендации по безопасности
- Секреты (keyring, ключи SSH) храните с правами только для пользователя:
chmod 600/chmod 700на секреты и директории. - Не логируйте содержимое ключей и токены в файлы.
- Для SSHFS используйте ключевую аутентификацию и по возможности ограничивайте доступ в authorized_keys.
- Сеть: для приватных сегментов применяйте VPN только для создания локальной сети и корректной маршрутизации.
Надёжность: обработка разрывов сети и контроль состояния
При мобильной сети часто происходят разрывы. Чтобы монтирование «держалось», используйте:
- опции реконнекта (например, для SSHFS —
reconnect), - периодические keepalive (например,
ServerAliveInterval), - скрипты автоповтора, которые проверяют
mountpoint -q.
Также полезно проверять логи:
tail -n 200 ~/mnt-autolog.txt
Заключение
Подключение Termux к Ceph и GlusterFS через FUSE и автоматическое монтирование — реалистичная задача для эксплуатации и повседневных рабочих сценариев на Android. Практический успех зависит от двух вещей: корректной подготовки доступов (ключи/права) и выбора стабильного FUSE-механизма для вашей конфигурации. Для GlusterFS часто удобен унифицированный подход через SSHFS, а для Ceph — требуется подобрать рабочий клиент/параметры и организовать автоповтор с ретраями.
Если вы хотите сделать решение «под ключ» под вашу инфраструктуру (версии Android/архитектуры, конкретные параметры Ceph/Gluster, требования безопасности и сетевой доступ), обращайтесь в РыбинскЛАБ — поможем спроектировать, настроить и отладить автозапуск монтирований для Termux.