Клиент за Linux
Днес ви представяме дългоочакваното Yandex.Disk за Linux клиент. Човек би могъл дори да се каже, "специално за Habrahabr", защото никой не спомена Disk не е без въпроси за клиента за Linux.
Той разполага с всички основни функции, които клиентите имат за Windows и OS X, а дори и повече, и една функция (символните връзки!) - той утешава.
Можете да го инсталирате тук. Веднага след инсталирането на пакет екип Yandex-диск ще се появи в терминала. чрез които в бъдеще и има връзка с облака Yandex. След това трябва да стартирате ръчно командата за настройка.
Подготвителната работа е завършена, е необходимо за стартиране на обслужващата на екипите. Те ви позволяват да синхронизирате файлове и папки и да ги използвате навсякъде, където има интернет.
- Sync ще стартира демон синхронизира всичко се намира в папката на устройството и да се спре демона.
- Започнете да направят същото, но без да се спира на демона след синхронизация. При използване на стартиране на обслужващата работи и всички промени, настъпили в папката Диск ще се синхронизира автоматично.
- Въвеждане на ограничителя в терминала. по всяко време, за да спре работа демон, ако това ви спира.
- Командата статус може да се намери в какво е състоянието на двигателя на синхронизация.
Работа с диск папка е възможно, тъй като изводът и от Nautilus'a.
В Yandex.Disk способността селективно да се синхронизира. изключва команда ще изключва папка синхронизирането: всички промени, направени в нея, след това, те няма да бъдат изпратени на облака.
Само за четене опция позволява да се променят файловете на местно ниво, без да ги налива в облака. В случай на конфликт с локални промени, последният ще бъде записан в преименувания файлове и промени из облака, ще бъдат синхронизирани. Презаписване опция ще доведе до записване на място модифицирани файлове в режим само за четене.
Ние не можем да се похвалим с най-интересното нововъведение в основата на синхронизацията - сега ние подкрепяме синхронизацията на символни връзки! Ако има някакви трудности и проблеми при използването на конзолата клиент мъжа и помогна на отбора просто и ще им помогне да се оправи.
Как се прави
В бъдеще, кодът може да се използва за изпълнение на клиента под различни операционни системи, беше решено да го напиша в C ++. Специфична за различни операционни системи, части от код, които научихме в отделните функции или класове, както и за всяка платформа пише тяхното изпълнение. Основните библиотеки междуплатформени взехме Boost. OpenSSL и JsonCpp. система за контрол на версиите се превърна в Git. Клиент за Linux за използването Autoconf. Кодът е написан и отстраняването на грешките във връзка KDevelop + конзола GDB, или Qt Creator'e (в зависимост от предпочитанията на програмиста).
Взаимодействието с облака и за синхронизирането са направени с помощта на библиотеката Yandex.Disk ядрото, което се използва от клиентите десктоп услуги.
Как работи
Console клиент се състои от две части: демона и клиент. Те общуват чрез текстови пакети, съдържащи JSON-съобщения, изпратени през контакт (на Linux и Mac OS X използва гнезда UNIX-домейни). Asynchronous операция се осъществява чрез използване на тласък :: ASIO библиотека. Синхронизация на достъп до данните се осъществява чрез тласък :: ASIO :: io_service :: нишка, която дава възможност да не мисля за проблема с едновременен достъп до множество потоци от данни, както и елиминира появата на безизходица-ите.
За локализация, ние използваме библиотека тласък :: локал. Текстът в рамките на клиента, кодиран в UTF-8 и ако е необходимо, се превръща в код, специфични за всяка операционна система. Наблюдение на файловата система за Linux използва inotify, се вписва перфектно в асинхронен операция тласък :: ASIO.
Как работи синхронизацията
Синхронизация - сърцето Yandex.Disk, ключовата му характеристика. синхронизиране на задачите файл дърво с облака е разделена на няколко независими части.
1. Наблюдение на файловата система. Yandex.Disk синхронизиране на ядрото е проектиран и създаден като преносима абстракция, която може да изпълнява задачи от всички поддържани платформи. Но такъв проблем, тъй като мониторингът на файловата система не се изпълнява или стандартната библиотека на C ++, или дори такива чудовища като тласък. Освен това, дори и с помощта на "родния" операционна система, на API, ние получаваме набор от събития, специфични за всяка платформа.
За наблюдение на интерфейса на файловата система е проектирана от "наблюдател", могат да следят събитията в определена директория и връща списък от събития, които са настъпили в него. И за всеки поддържан набор от тези събития е различен. Например, Mac OS X е в състояние да докладва само факта на промяна в едно от дъщерните дружества на директории, без да навлиза в подробности. Но Windows и Linux върне пълен комплект, включително създаване, изтриване, изменение и движение на обектите. Въпреки Практиката показва, че събитията на платформата Windows не си заслужава доверие и най-надежден вариант остава вписване в директорията, след получаване на уведомлението.
2. Индексирането на местните файлове и директории. За да се следи за професионалната етика и прилагането на делта файлове за актуализация ядро Yandex.Disk синхронизация използва подхранвания - определя контролна файл и отделните му части. Целият файл очакваме устойчиви хеш SHA-256, както и набор от по-малко стабилни суми за отделни блокове. Всеки файл в Yandex.Disk на папката и не попадат в списъка на изключенията трябва да бъдат индексирани. Но изчисляване на хеш SHA-256 са достатъчно скъпа операция, както и изчисляване на хеш всеки път, когато стартирате софтуера ще бъде непростимо разхищение на ресурси. Ето защо, след като приключи индексиране на файлове, ядро синхронизация съхранява извлечението в "банката" - специален трезор, намиращ се в директорията на обслужване Yandex.Disk. За да намерите разградени в хранилището използва уникален идентификатор на файла - на възела (размер и време на последна промяна). За съжаление, този подход не е без недостатъци. Например, много файлове запазват kriptokonteynera време на последна промяна непроменен дори след запис.
Като цяло, символни връзки - това е истински "главоболие", за да синхронизирате ядрото. Те могат да се появят във всяка от пространството на файловата система, и не всички от тях могат да използват едни и същи правила за синхронизация. Например, Mac OS X пакети приложни често съдържат символични връзки към библиотеки директория на системата, както и синхронизация им в облака би било нежелателно - особено между различните версии на операционната система. Но в същото време, възможността за синхронизация на допълнителни директории с помощта на символни връзки - много съблазнително възможност, която не искате да пропуснете.
Ето защо, специална политика е въведено с цел символично синхронизация на връзка, при която ядрото може да изберете конкретна опция за синхронизиране на символни връзки - в зависимост от местоположението на обекта, за който се посочва.
3. Получаване на дърво облак файлова система. За решаване на проблема на синхронизация не е достатъчно да имат местен структура на файлове и усвоявания на файлове - трябва да получите на текущото състояние на файловата система в облака. Ако синхронизацията на ядрото всеки път, когато трябваше да се дърво по метода на PROPFIND. всеки такт ще заемат непропорционално голямо количество от време и би създало ненужно натоварване на канала. Ето защо, Yandex.Disk използва специален API, което го прави възможно да се получи текущото състояние на дървото на файла в облака и промените в него, като се започне с известно време, определен дърво версия.
4. получаване на сигнали за промяна на файлове в облак система. Синхронизиране на файлове в реално време, изисква своевременно получаване на уведомлението за промените, които са настъпили с файловете в облака. Можете да използвате периодично проучване на сървъра на клиентите, но, като се има предвид възможно броят на клиентите, ние сме дошли до извода, че такъв подход би било лошо мащабируема и ще доведе до по-бързото презареждане на инфраструктура услуга. След известно търсене, ние се настанихме на XMPP протокол. Един от прилагането му отдавна се работи в Яндекс. Тя е разработена от екип, който по-късно се създава WebDAV сървър за проект Yandex.Disk, така че трудности с интегрирането на този протокол не е възникнало.
Сега известия за предаване, се обработват от синхронизацията на ядрото, включва не само събитията директно на файлове или папки в Yandex.Disk облаци, но и различни съобщения за услуги. Така например по въпроса за допълнително пространство или на действията на другите участници в споделени папки. Добавянето на тези събития към съществуващия протокол не е причинил големи трудности поради разтегливостта на XMPP, което още веднъж потвърждава правилността на нашия избор.
5. Създаване на списък на операциите за синхронизиране. След унищожаване на синхронизацията на ядрото са двете дървета файлове - локални и отдалечени - можете да започнете процеса на синхронизация себе си. За тази цел специален алгоритъм за сравняване на дървета, като във входа, различни от тези две дървета, а дори и трето - последният синхронизирани. В резултат на алгоритъма в списъка на операциите, които се извършват на локални и отдалечени файлове и директории, за да донесе на дървета за общия вид.
6. операции опашка синхронизация обработка. Създаване на списък на операциите за локално и отдалечено дърво е независима. В резултат на противоречивите сделките може да се случи. Например, изтриването на файл в облака, което е променено в него, и все още не са синхронизирани на местно ниво, или да промените файла в същото време и на място в облака. Конфликти модификация / изтриване винаги е решен в полза на промяна на ядрото, както и за модифициране на конфликтите двойни се разрешават чрез преименуване на една от най-версии на файловете. По този начин ние можем да гарантираме сигурността на данните и дават възможност след завършване на синхронизацията на потребителя да вземе решение, което променя него по-подходяща за всеки отделен случай.
операции за синхронизация трябва да подлежат на строг ред, не е възможно да прехвърлите файла не съществува все още, неговата майка директория. В същата директория не може да бъде отстранен, докато тя остава в рамките на файловете, които искате да се премести в ново място. Сравнение алгоритъм създава едно дърво има операции в правилния ред, но ако възникне грешка може да бъде счупен. За да се избегне тази ситуация, всяка операция има списък със зависимости - набор от операции, които трябва да бъдат завършени преди началото на неговото изпълнение, както и набор от операции, които не трябва да започва, докато не бъде завършена.
В допълнение към зависимости по нареждане на операции се влияе от нейния приоритет. Например, операции за прехвърляне на файлове се извършват в зависимост от размера на файловете - от малки до големи.
Всички тези задачи се изпълняват от едновременно прилагане на допълнителни изисквания по отношение на качеството на синхронизирането на едновременно протичащи процеси и разпределението на ресурсите в рамките на ядро Yandex.Disk синхронизация. Ако не разполагате с Ya.Diska, го направи тук. и определен за Linux - тук: repo.yandex.ru/yandex-disk.