Client pentru Linux
Astăzi vă vom prezenta Yandex.Disk mult-așteptata pentru clientul Linux. S-ar putea spune chiar „în mod specific pentru Habrahabr“, deoarece nimeni nu mai vorbim de disc nu este fără întrebări cu privire la client pentru Linux.
Ea are toate funcțiile de bază pe care clienții au pentru Windows și OS X, și chiar mai mult, și o caracteristică (legăturile simbolice!) - el consola.
Îl puteți instala aici. Imediat după instalarea pachetului de echipa-discul va Yandex apărea în terminal. prin care, în viitor, și există comunicare cu nor Yandex. Apoi, trebuie să porniți manual comanda de setare.
Lucrările pregătitoare este terminat, este necesar să se înceapă daemon-ul echipelor. Acestea vă permit să sincronizați fișiere și foldere și să le utilizeze ori de câte ori există un Internet.
- Sincronizarea va lansa daemon sincronizeze toate situate în directorul unității și a opri daemon.
- Începe să facă același lucru, dar fără a opri demonul după sincronizare. Când se utilizează porni demonul rulează și toate schimbările care au loc din dosarul Drive vor fi sincronizate automat.
- Introducerea în bornă. în orice moment pentru a opri daemonul de funcționare, în cazul în care te oprește.
- Comanda de stare poate fi găsit în ceea ce este starea motorului de sincronizare.
Lucrul cu dosar de disc este posibil ca terminalul, și de la Nautilus'a.
În capacitatea de a sincroniza Yandex.Disk selectiv. exclude comanda va exclude un dosar din sincronizare: toate modificările aduse să-l după aceea, ei nu vor fi trimise la nor.
Read-only opțiune permite de a schimba fișierele de pe plan local, fără a le turna în nor. În cazul unor conflicte cu modificări locale, ultimul va fi salvat în fișierele redenumite, și schimbarea din nor va fi sincronizat. Opțiunea suprascriere va suprascrie fișierele modificate local în modul read-only.
Nu ne putem lăuda cu cea mai interesantă inovație în centrul de sincronizare - acum susținem sincronizarea de link-uri simbolice! Dacă există dificultăți și probleme în utilizarea omului client consolă și de a ajuta echipa pur și simplu și va ajuta să sortați-le.
Cum de a face
În viitor, codul poate fi utilizat pentru a implementa clientul sub diferite sisteme de operare, sa decis să-l scrie în C ++. Specifice pentru diferite sisteme de operare, bucăți de cod care le-am învățat în funcțiile individuale sau clase, precum și pentru fiecare platformă a scris punerea lor în aplicare. Principalele biblioteci cross-platform am luat Boost. OpenSSL și JsonCpp. un sistem de control versiune a devenit un Git. Client pentru Linux despre utilizarea autoconf. Codul a fost scris și depanat în conjuncție KDevelop + gdb consola sau Qt Creator'e (în funcție de preferințele dezvoltator).
Interacțiunea cu nor și sincronizare sunt realizate folosind nucleul bibliotecii Yandex.Disk, care este utilizat de către clienții de servicii pentru desktop.
Cum funcționează
client Consola este format din două părți: daemon și client. Ele comunică prin pachete de text care conțin JSON mesajele trimise printr-o priză (pe Linux și Mac OS X foloseste socket unix-domeniu). operațiune asincronă este implementat folosind impuls :: biblioteca ASIO. Sincronizarea de acces la date se realizează prin boost :: ASIO :: io_service :: Strand, care permite să nu se gândească la problema accesului simultan la mai multe fluxuri de date, precum și elimină aspectul de impas-uri.
Pentru localizare, vom folosi biblioteca boost :: locale. Textul din cadrul clientului codat în utf-8 și, dacă este necesar, transformat într-un cod specific pentru fiecare sistem de operare. Monitorizarea sistemului de fișiere pentru Linux utilizează Inotify, se potrivește perfect în boost asincron :: ASIO.
Cum sincronizarea
Sincronizare - inima Yandex.Disk, caracteristica sa esențială. Sincronizarea arborelui fișier de sarcini cu nor este împărțit în mai multe părți independente.
1. Monitorizarea sistemului de fișiere. Yandex.Disk sincroniza kernel-ul a fost proiectat și creat ca o abstracție portabil, care se poate efectua sarcini pe toate platformele suportate. Dar o astfel de problemă ca de monitorizare a sistemului de fișiere nu este pus în aplicare sau biblioteca standard C ++, sau chiar și astfel de monștri ca impuls. Mai mult decât atât, chiar și cu ajutorul unui sistem de „nativ“ de operare, API-ul, vom obține un set de evenimente specifice pentru fiecare platformă.
Pentru interfața de monitorizare a sistemului de fișiere a fost proiectat de „observator“, capabil de a urmări evenimentele într-un anumit director și returnează o listă de evenimente care au avut loc în ea. Și pentru fiecare set platformă susținută de aceste evenimente este diferit. De exemplu, Mac OS X este capabil de a raporta doar faptul unei schimbări într-una dintre filialele directoare, fără a intra în detalii. Dar Windows și Linux returnează un set complet, inclusiv crearea, ștergerea, modificarea și circulația obiectelor. Deși Practica arată că evenimentele de pe platforma Windows nu este în valoare de încredere și opțiunea cea mai fiabilă rămâne o listare director după primirea notificării.
2. Indexarea de fișiere locale și directoare. Pentru a monitoriza integritatea și punerea în aplicare a unei delte fișiere de actualizare de sincronizare Yandex.Disk de bază utilizează digestii - setează fișierul de control și a părților sale individuale. Întregul dosar ne așteptăm ca hash persistente SHA-256, și un set de sume mai puțin stabile pentru blocuri individuale. Fiecare fișier din Yandex.Disk dosar și nu se încadrează în lista de excepții ar trebui să fie indexate. Dar calcularea hash SHA-256 sunt suficient de funcționare costisitoare, și calcularea hash de fiecare dată când executați software-ul ar fi risipirea resurselor. Prin urmare, după indexarea fișierului finalizat, de bază de sincronizare stochează digest în „banca“ - o boltă specială, situată în directorul serviciului Yandex.Disk. Pentru a găsi digestiile în magazia utilizează un identificator unic de fișier - inod (dimensiunea și timpul ultimei modificări). Din păcate, această abordare nu este lipsită de dezavantaje. De exemplu, multe fișiere păstrează kriptokonteynera-timpul ultimei modificări neschimbate chiar și după înregistrare.
În general, link-uri simbolice - aceasta este o adevărată „durere de cap“ pentru a sincroniza kernel-ul. Acestea pot apărea în oricare din spațiul sistemului de fișiere, și nu toate dintre ele pot utiliza aceleași reguli de sincronizare. De exemplu, Mac OS X pachete de aplicații conțin adesea legături simbolice către bibliotecile de sistem director, și sincronizarea lor în nor ar fi de dorit - în special între diferitele versiuni ale sistemului de operare. Dar, în același timp, capacitatea de a sincroniza directoare suplimentare prin link-uri simbolice - o oportunitate foarte tentant, care nu a vrut să rateze.
Prin urmare, o politică specială a fost introdusă într-o sincronizare legătură simbolică, prin care nucleul poate alege o anumită opțiune pentru a sincroniza pentru fiecare link simbolic - în funcție de locația obiectului la care.
3. Obținerea unui sistem de copac nor de fișiere. Pentru a rezolva problema de sincronizare nu este suficient pentru a avea o structură de fișier local și digestii de fișiere - aveți nevoie pentru a obține starea actuală a sistemului de fișiere în nor. Dacă sincronizarea nucleu de fiecare dată când a avut pentru a obține un copac printr-o metodă PROPFIND. fiecare ciclu de ceas ar ocupa o cantitate disproporționată de timp și ar crea o povară inutilă pe canal. Prin urmare, Yandex.Disk folosește un API special, care face posibilă pentru a obține starea curentă a arborelui fișier în nor și schimbările în ea, începând cu un cunoscut timp determinat versiunea copac.
4. Primirea alerte privind schimbarea sistemului de fișiere în cloud. Sincronizarea fișierelor în timp real necesită primirea la timp a notificării modificărilor care au avut loc cu fișierele în cloud. Ai putea folosi un sondaj periodic al serverului de client, dar, având în vedere numărul posibil de clienți, am ajuns la concluzia că o astfel de abordare ar fi prost scalabile și va duce la o infrastructură rapidă de servicii de re-încărcare. După unele căutare, ne-am stabilit pe protocolul XMPP. Una din punerea sa în aplicare a fost mult timp de lucru în Yandex. Acesta a fost dezvoltat de o echipă care mai târziu au fost crearea unui server WebDAV pentru proiectul Yandex.Disk, astfel încât dificultățile cu integrarea acestui protocol nu a apărut.
Acum, notificările push manipulate prin sincronizarea kernel-ului, include nu numai evenimentele direct la fișiere sau foldere din nor Yandex.Disk, dar, de asemenea, diverse mesaje de serviciu. De exemplu, cu privire la problema de spațiu suplimentar sau acțiunile altor utilizatori din directoare partajate. Adăugarea acestor evenimente la protocolul existent nu a provocat mari dificultăți din cauza extensibilitatea XMPP, ceea ce confirmă încă o dată corectitudinea alegerii noastre.
5. Crearea unei liste de operații de sincronizare. După eliminarea sincronizării kernel-ului sunt atât fișierele copaci - locale și la distanță - puteți începe procesul de sincronizare în sine. În acest scop, un algoritm special pentru compararea arborilor, luând în alta decât acești doi copaci, și chiar a treia intrare - ultima sincronizat. Ca rezultat al algoritmului într-o listă de operațiuni care urmează să fie efectuate pe fișierele și directoarele locale și de la distanță pentru a aduce copaci la forma generală.
6. operațiuni de sincronizare coadă de prelucrare. Crearea unei liste de operațiuni pentru copac locale și de la distanță este independentă. Ca urmare a tranzacțiilor în conflict pot apărea. De exemplu, ștergerea unui fișier în nor, care a fost schimbat în el, și nu au fost încă sincronizate la nivel local, sau modificați fișierul în același timp, la nivel local și în nor. Conflicte modificare / ștergere este întotdeauna rezolvată în favoarea modificării kernel-ului, iar conflictele duble de modificare sunt rezolvate prin redenumirea una dintre versiunile unui fișier. Astfel putem garanta securitatea datelor și a da posibilitatea după finalizarea sincronizării pentru utilizator pentru a decide ce-i mai potrivite în fiecare caz.
operațiunile de sincronizare trebuie să fie supuse ordine strictă, este imposibil de a transfera fișierul nu există încă, directorul părinte. Același director nu poate fi eliminat atâta timp cât rămâne în fișierele pe care doriți să le mutați într-o nouă locație. Algoritmul de comparare creează un arbore are operațiuni în ordinea corectă, dar dacă apare o eroare poate fi rupt. Pentru a preveni această situație, fiecare operațiune are o listă de dependențe - un set de operațiuni care trebuie să fie finalizate înainte de începerea punerii sale în aplicare, precum și un set de operații care nu trebuie să înceapă până când aceasta este finalizată.
În plus față de dependențe pe ordinea operațiilor este influențată de prioritatea sa. De exemplu, operațiunile de transfer de fișiere se efectuează în funcție de dimensiunea fișierelor - de la mic la mare.
Toate aceste sarcini sunt realizate prin aplicarea simultană cerințe suplimentare privind calitatea sincronizarea proceselor concurente și alocarea resurselor în cadrul Yandex.Disk nucleu de sincronizare. Dacă nu aveți Ya.Diska, face aici. și a stabilit pentru Linux - aici: repo.yandex.ru/yandex-disk.