Yandex disk linux синхронизация

Яндекс.Диск — использование облачного хранилища в Linux

В настоящее время очень популярным инструментом для доступа и управления файлами являются так называемые облачные хранилища. Они предполагают размещение пользовательских данных на доступных через интернет удалённых серверах т. е. в «облаке» и доступ к нему посредством специального программного обеспечения (ПО) и протоколов. Компании-разработчики облачных хранилищ и сред поддерживают практически все популярные платформы и операционные системы (ОС) для взаимодействия пользователей с облаком. Не стала исключением и компания «Яндекс», которая вместе с предоставляемым ею сервисом «Яндекс.Диск» предлагает пользователям и одноимённый продукт для удобного пользования, собственно, самим сервисом. В этой статье речь пойдёт об утилите Яндекс.Диск и её использовании в Linux.

Загрузка и установка пакета Яндекс.Диск

Сама утилита представляет собой демон, постоянно работающий в памяти и следящий за изменениями определённых файлов и каталогов в локальном и удалённом хранилище (облаке) и реагирует на определённые события (добавление, удаление, переименование и/или изменение файлов/каталогов), запуская синхронизацию, которая актуализирует данные в облаке и локальных хранилищах.

Утилита является бесплатной и, как указывают сами разработчики, написана на языке C++ в IDE Kdevelop. Распространяется Яндекс.Диск в виде пакетов *.deb и *.rpm, которые можно скачать и установить как вручную (используя менеджер пакетов apt например), так и при помощи системы управления пакетами используемой ОС.

Для Debian-ориентированной системы для установки Яндекс.Диск через систему управления пакетами (СУП) нужно выполнить следующие команды:

В результате в системный репозиторий будет добавлен новый источник «deb http://repo.yandex.ru/yandex-disk/deb/ stable main» со стабильными сборками Яндекс.Диск, из которого будет производиться установка и последующие обновления утилиты.

Для RPM-ориентированных систем порядок установки с помощью СУП несколько иной. Нужно для начала вручную создать и отредактировать файл источника для добавления его в системный репозиторий:

Запустится текстовый редактор nano (который сразу создаст файл yandex.repo по указанному пути), в котором нужно ввести следующее содержимое:

Далее, сохранить сделанные изменения, нажав сочетание клавиш , подтвердить сохранение (Enter), закрыть редактор nano (Ctrl + X) и выполнить следующие команды:

Все эти действия выполняются и при использовании пакетных менеджеров, если сначала вручную скачать пакеты Яндекс.Диска через веб-браузер (или утилиту wget), например для deb-пакетов:

Сами пакеты для нужных платформ и под соответствующую архитектуру можно скачать по адресу: https://disk.yandex.ru/download#pc.

Также может потребоваться импортировать с помощью wget открытые GPG-ключи для проверки цифровой подписи пакетов, если это по какой-либо причине не произошло автоматически при использовании СУП или менеджера пакетов. Для Debian:

Управление демоном из командной оболочки

Разработчики Яндекс.Диска в реализации этого проекта постарались максимально придерживаться принципов так называемой концепции UNIX-Way, которая предполагает при разработке ПО соблюдение следующих принципов:

  • программа должна быть очень (насколько это возможно) небольшой;
  • программа должна выполнять только одну простую задачу, но выполнять её хорошо;
  • программа должна легко взаимодействовать с другими программами.

Утилита Яндекс.Диск, как уже говорилось, работает как демон (в хорошем смысле…), а потому основной метод управления ею — это дискретные команды с соответствующими опциями и параметрами. Эти команды могут выполняться как непосредственно пользователем в командной оболочке, так и другими программами, которые могут быть графическими оболочками для демона Яндекс.Диска, как в виде оконных приложений, так и в виде виджетов и/или апплетов рабочего стола. Некоторые достойные реализации (YD-tools, Yandex.Disk ServiceMenu) графического пользовательского интерфейса (GUI) давно существуют.

Для управления клиентом Яндекс.Диск предназначена команда yandex-disk, её общий синтаксис следующий:

Внутренними командами утилиты yandex-disk являются команды управления демоном синхронизации, а также команды его настройки, которые приведены в следующей таблице:

Начальное конфигурирование демона.

Команда Назначение
start Запускает как демон и начинает синхронизацию каталога. В файл «.sync/status» каталога синхронизации записывается текущий статус синхронизации.
stop Останавливает демон.
status Выводит статус демона: статус синхронизации, ошибки, последние синхронизированные файлы, состояние дискового пространства.
token Получает OAuth-токен, шифрует и сохраняет его в специальном файле (по умочанию — /.config/yandex-disk/passwd). Если не указаны опции -p PASSWORD или —password PASSWORD, то выводит приглашение ввести пароль из STDIN.
sync Синхронизирует каталог и завершение работы (если демон запущен, дождается окончания синхронизации). Требуется для ручной синхронизации по требованию.
publish Делает файл/каталог публичным и выводит ссылку в STDOUT. Сам объект будет скопирован в синхронизируемый каталог. Для перезаписи существующих объектов следует использовать опцию —overwrite.
unpublish Удаляет публичный доступ к файлу/каталогу.
setup Начальное конфигурирование демона.

Начальное конфигурирование демона.

Соответственно, сами эти команды могут выполняться в следующем виде:

Читайте также:  Windows active directory console

В следующей таблице приводится описание всех доступных для yandex-disk опций:

Опция Описание
—config=FILE, -c FILE Читает опции из конфигурационного файла. Файл должен содержать строки вида имя=значение. Путь к файлу по умолчанию

/.config/yandex-disk/config.cfg.

—dir=DIR, -d DIR Задаёт путь к каталогу Яндекс.Диска.
—auth=FILE, -a FILE Читает данные токена из файла. Файл должен быть сгенерирован командой token. Путь к файлу по умолчанию

/.config/yandex-disk/passwd.

—exclude-dirs=DIR1,DIR2,… Исключает из синхронизации указанные каталоги.
—read-only Указывает не загружать локальные изменения в облако. Измененные локально файлы будут переименованы.
—overwrite Указывает в режиме «read-only» перезаписывать локально измененные файлы.
—no-daemon, -D Запускает демон без возможности управления через командную оболочку. Чтобы вернуть управление, демон необходимо остановить, запустив в другой консоли команду yandex-disk stop или закрыв текущую консоль.
—version, -v Выводит информацию о версии.
—proxy=PARAM Задаёт настройки прокси-сервера. Допустимые параметры: auto — использовать системные настройки прокси-сервера — используется по умолчанию, no — не использовать прокси сервер. protocol,address,port,login,password — настроить вручную. Пример настройки прокси-сервера вручную:
proxy=socks4,my.proxy.local,1080,login,password

Как можно видеть, разработчики подошли к реализации утилиты Яндекс.Диск, что называется — «по-настоящему», ярко отразив в ней философию маленькой, эффективной, простой и удобной UNIX-программы. Все команды и опции говорят сами за себя и настройка демона Яндекс.Диск не вызывает никаких сложностей.

Первое, что необходимо выполнить в командной строке, после установки утилиты Яндекс.Диск — это запустить начальную настройку её демона с помощью команды:

Далее нужно проследовать несложному процессу, в ходе которого будет предложено создать защищённый токен на основе учётных данных, задать настройки прокси-сервера (если предполагается его использовать), указать путь к каталогу синхронизации, а также определить опции автозапуска демона при входе в систему:

В приведённом примере производится настройка демона синхронизации для учетной записи mylogin без задействования прокси-сервера. Каталогом для синхронизации в данном случае является каталог Disk на отдельном разделе (или устройстве) Yandex.Disk.

Интеграция с файловым менеджером

Поскольку сервис Яндекс.Диск поддерживает работу по протоколу WebDAV, то синхронизацию легко настроить для приложений, которые поддерживают эту технологию. В Linux таковыми являются например файловые менеджеры Dolphin (для среды KDE), а также Nautilus – для среды GNOME.

Сама настройка файлового менеджера для работы через WebDAV совсем несложна и на примере Dolphin выглядит следующим образом:

  • Для начала в адресной строке файлового менеджера нужно перейти по адресу webdavs://webdav.yandex.ru.
  • Далее, в появившемся диалоговом окне требуется ввести имя пользователя и пароль для доступа к облачному хранилищу.
  • После успешной авторизации Dolphin отобразит содержимое облачного хранилища, как-будто это локальный каталог.
  • По желанию можно добавить данный адрес в список точек «быстрого входа» в Dolphin, чтобы каждый раз не вводить адрес вручную.

Как можно видеть, благодаря грамотной реализации для Linux-систем и поддержке современных технологий для работы и защиты данных в удалённых хранилищах, утилита Яндекс.Диск легко и гибко способна организовать синхронизацию файлов. Для системных администраторов она примечательна ещё и тем, что полностью соответствует принципам администрирования UNIX/Linux систем. И если в это позволяет политика и регламент безопасности сети организации, то утилита Яндекс.Диск — это отличный вариант предоставить пользователям инструмент для синхронизации их данных с облаком.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Источник

Клиент Яндекс.Диска для Linux. Консольный

Сегодня мы представляем долгожданный клиент Яндекс.Диска для Linux. Можно было бы даже сказать «специально для Хабрахабра», так как ни одно упоминание Диска здесь не обходилось без вопросов о клиенте для Линукса.

У него есть вся основная функциональность, которая есть у клиентов для OS X и Windows, и даже больше (симлинки!), и одна особенность — он консольный.

Ниже читайте о том, как он настраивается, что конкретно умеет, и о том, как именно он устроен и что в нём было непросто сделать.

Установить его можно здесь. Сразу после установки пакета в терминале появится команда yandex-disk, через которую в дальнейшем и идет общение с облаком Яндекса. После этого нужно вручную запустить команду setup.

Визард настройки позволяет в режиме диалога выбрать папку для синхронизации, включить автозапуск при старте системы, настроить работу через прокси-сервер (если конечно вы им пользуетесь) и авторизоваться в Яндекс.Диске. При настройке вручную первым делом необходимо авторизоваться. После этого в папке .config, расположенной в домашнем каталоге, будет создан конфиг, в котором можно будет настроить путь к папке синхронизации (можно указать в консоли вручную), прописать путь к файлу токена, указать папки, которые будут или не будут синхронизироваться, и прописать настройки прокси-сервера.

Команды

Подготовительная работа окончена, осталось запустить демон одной из команд. Они позволят вам синхронизировать файлы и папки и пользоваться ими везде, где есть интернет.

  • Sync запустит демон, синхронизирует все, находящееся в папке Диска, и остановит демон.
  • Start сделает то же самое, но без остановки демона после завершения синхронизации. При использовании start демон остается запущен и все изменения, происходящие в папке Диска, будут синхронизироваться автоматически.
  • Введя в терминале stop, можно в любой момент остановить запущенный демон, если он вам мешает.
  • Командой status можно узнать, в каком статусе находится ядро синхронизации.

Работать с папкой диска можно как из терминала, так и из Nautilus’a.

Что умеет

Консольный клиент позволяет поделиться файлом или папкой с помощью команды publish (если файл находится не в папке диска, перед публикацией он будет туда скопирован). Ссылка будет доступна в терминале, и любой человек, пройдя по ней, сможет посмотреть или сохранить себе опубликованный вами файл или папку. Если случайно был опубликован не тот файл, с помощью команды unpublish можно закрыть доступ к публичному объекту.

В Яндекс.Диске возможна выборочная синхронизация. Команда exclude позволит исключить папку из синхронизации: все изменения, производимые в ней после этого, не будут отправлены в облако.

Опция read-only позволит менять файлы локально, без заливки их в облако. При возникновении конфликтов с локальными изменениями, последние будут сохранены в переименованных файлах, а изменения из облака будут синхронизированы. Опция overwrite будет перезаписывать локально измененные файлы в режиме read-only.

Не можем не похвастаться самым интересным нововведением в ядре синхронизации — отныне мы поддерживаем синхронизацию симлинков! Если возникнут трудности и вопросы в использовании консольного клиента команды man и help просто и доступно помогут в них разобраться.

Как сделан

Чтобы в будущем код можно было использовать для реализации клиентов под разные ОС, было принято решение писать его на C++. Специфичные для разных операционных систем куски кода мы вынесли в отдельные функции или классы, а под каждую платформу писали свою реализацию. В качестве основных кроссплатформенных библиотек мы взяли Boost, OpenSSL и JsonCpp, а системой контроля версий стал git. Клиент под Linux собирался с помощью autoconf. Код писался и отлаживался в связке KDevelop + консольный gdb, либо в Qt Creator’е (в зависимости от предпочтений разработчика).

Взаимодействие с облаком и синхронизация производятся с помощью библиотеки ядра Яндекс.Диска, которую используют десктопные клиенты сервиса.

Как работает

Консольный клиент состоит из двух частей: демона и клиента. Общаются они посредством текстовых пакетов содержащих json-сообщения, посылаемые через сокеты (на Linux и Mac OS X используются unix-domain сокеты). Асинхронная работа реализована с помощью библиотеки boost::asio. Синхронизация доступа к данным реализуется через boost::asio::io\_service::strand, что позволяет не думать о проблеме одновременного доступа к данным нескольких потоков, а также исключает появление deadlock-ов.

Для локализации мы используем библиотеку boost::locale. Текст внутри клиента закодирован в utf-8 и по необходимости преобразовывается в специфичном для каждой операционной системы коде. Мониторинг файловой системы для Linux использует inotify, прекрасно вписыващийся в асинхронную работу boost::asio.

Как устроена синхронизация

Синхронизация — сердце Яндекс.Диска, его ключевая возможность. Задача синхронизации файлового дерева с облаком делится на несколько независимых частей.

1. Мониторинг файловой системы. Ядро синхронизации Яндекс.Диска проектировалось и создавалось как переносимая абстракция, способная выполнять поставленные задачи на всех поддерживаемых платформах. Но такая проблема, как мониторинг файловой системы не реализуется ни стандартной библиотекой C++, ни даже такими монстрами как boost. Более того, даже используя «родное» API операционной системы, мы получаем набор событий, специфический для каждой платформы.

Для мониторинга файловой системы был спроектирован интерфейс «наблюдателя», способного следить за событиями в определённой директории и возвращающего список событий, произошедших в ней. Причём для каждой поддерживаемой платформы набор этих событий отличается. Например, Mac OS X способна сообщить только о факте какого-то изменения в одной из дочерних директорий без детализации. А вот Windows и Linux возвращают полный набор, включая создание, удаление, модификацию и перемещение объектов. Хотя практика показывала, что событиям на платформе Windows доверять не стоит и самым надёжным вариантом остаётся листинг директории после получения оповещения.

2. Индексация локальных файлов и директорий. Для контроля целостности и реализации дельта-обновления файлов ядро синхронизации Яндекс.Диска использует дайджесты — наборы контрольных сумм файла и отдельных его частей. Для всего файла мы рассчитываем стойкий хэш SHA-256 и набор менее стойких сумм для отдельных блоков. Каждый файл, находящийся в папке Яндекс.Диска и не попадающий в список исключений, должен быть проиндексирован. Но вычисление хэша SHA-256 -достаточно дорогая операция, а расчёт хэшей при каждом запуске ПО был бы непростительной тратой ресурсов. Поэтому после того, как завершается индексация файла, ядро синхронизации сохраняет полученный дайджест в «банке» — специальном хранилище, находящемся в служебной директории Яндекс.Диска. Для поиска дайджестов в хранилище используется уникальный идентификатор файла — inode (размер и время последнего изменения). К сожалению, подобный подход не лишён недостатков. Например, многие файлы-криптоконтейнеры сохраняют время последней модификации неизменным даже после записи.

Наверное, кроме тонкостей работы с символическими ссылками, ничего в листинге директорий не представляет особого интереса. Для успешного завершения синхронизации ядро должно обнаруживать и исключать из синхронизации циклические ветки.

Вообще, символические ссылки — это настоящая «головная боль» для ядра синхронизации. Они могут указывать в произвольные места файловой системы, и ни ко всем из них можно применять одинаковые правила синхронизации. Например, пакеты приложений Mac OS X очень часто содержат в себе символические ссылки на директории системных библиотек, и их синхронизация в облако была бы нежелательна — особенно между разными версиями ОС. Но в то же время возможность синхронизировать дополнительные директории с помощью символических ссылок — очень заманчивая возможность, упускать которую не хотелось.

Поэтому для синхронизации символических ссылок была введена особая политика, благодаря которой ядро может выбирать специфический вариант синхронизации для каждой символической ссылки — в зависимости от расположения объекта, на который она указывает.

3. Получение дерева облачной файловой системы. Для решения проблемы синхронизации мало иметь локальную файловую структуру и дайджесты файлов — необходимо получить текущее состояние файловой системы в облаке. Если бы ядру синхронизации каждый раз приходилось обходить дерево с помощью метода PROPFIND, то каждый цикл синхронизации занимал бы неоправданно много времени и создавал бы излишнюю нагрузку на канал. Поэтому ПО Яндекс.Диска использует специальный API, который даёт возможность получать текущее состояние дерева файлов в облаке и изменения, произошедшие в нём, начиная с некоторого известного момента, определяемого версией дерева.

4. Получение оповещений об изменении облачной файловой системы. Синхронизация файлов в реальном времени требует своевременного получения оповещений об изменениях, произошедших с файлами в облаке. Можно было бы использовать периодический опрос сервера клиентами, но, оценив возможное количество клиентов, мы пришли к выводу, что такой подход окажется слабо масштабируемым и приведёт к быстрой перегрузке инфраструктуры сервиса. После недолгих поисков мы остановились на протоколе XMPP. Одна из его реализаций уже долгое время работает в Яндексе. Она была разработана командой, которая позже занимались созданием сервера WebDAV для проекта Яндекс.Диск, поэтому сложностей с интеграцией этого протокола не возникло.

Сейчас пуш-оповещения, обрабатываемые ядром синхронизации, включают в себя не только события, произошедшие непосредственно с файлами или папками в облаке Яндекс.Диска, но и различные сервисные сообщения. Например о выдаче дополнительного места или действиях других пользователей в общих папках. Добавление этих событий к имеющемуся протоколу не вызвало больших сложностей благодаря расширяемости XMPP, что в очередной раз подтвердило правильность нашего выбора.

5. Создание списка операций синхронизации. После того как в распоряжении ядра синхронизации оказываются оба дерева файлов — локальное и удалённое — можно приступать к самой процедуре синхронизации. Для этого применяется специальный алгоритм сравнения деревьев, принимающий на вход кроме двух упомянутых деревьев, ещё и третье — последнее синхронизированное. В результате работы алгоритма получается список операций, которые необходимо произвести над локальными и удалёнными файлами и директориям для приведения деревьев к общему виду.

6. Обработка очереди операций синхронизации. Создание списка операций для локального и удалённого деревьев происходит независимо. В результате могут появиться конфликтующие операции. Например, удаление в облаке файла, который был в нём изменён и ещё не синхронизирован локально, или изменение файла одновременно локально и в облаке. Конфликты модификации/удаления всегда разрешаются ядром в пользу модификации, а конфликты двойной модификации разрешаются переименованием одной из версий файла. Таким образом мы можем гарантировать сохранность данных и даём возможность после завершения синхронизации самому пользователю решить, какое из изменений больше ему подходит в каждом конкретном случае.

Операции синхронизации должны подчиняться строгому порядку, нельзя передавать файл, пока не создана его родительская директория. Так же директорию нельзя удалять, пока внутри неё остаются файлы, которые нужно переместить на новое место. Алгоритм сравнения деревьев уже создаёт операции в нужном порядке, но при возникновении ошибок он может нарушиться. Для предотвращения этой ситуации у каждой операции есть список зависимостей — набор операций, которые должны завершиться до начала её выполнения, и набор операций, которые не должны начаться, пока она не будет выполнена.

Кроме зависимостей на порядок выполнения операций оказывает влияние её приоритет. Например, операции передачи файлов выполняются в зависимости от размеров файлов — от маленьких к большим.

Источник

Читайте также:  Server on windows phone
Оцените статью