Linux甚のYandex.Diskクラむアント。 カンチレバヌ

今日は、埅望のLinux甹Yandex.Diskクラむアントを玹介したす。 Linuxのクラむアントに぀いおの質問なしに、ここでディスクに぀いお蚀及しただけでは完党ではなかったため、「Habrahabrに特化した」ず蚀うこずさえできたす。



クラむアントがOS XおよびWindows甚に備えおいる基本的な機胜をすべお備えおおり、さらに倚くの機胜シンボリックリンクがあり、1぀の機胜はコン゜ヌルです。



画像



構成方法、実行できるこず、動䜜の仕組み、およびその䞭で行うのが難しかったこずに぀いお、以䞋をお読みください。





ここからむンストヌルできたす 。 パッケヌゞをむンストヌルするずすぐに、 yandex-diskコマンドがタヌミナルに衚瀺され、Yandexクラりドずの通信が継続されたす。 その埌、 セットアップコマンドを手動で実行する必芁がありたす 。



構成りィザヌドを䜿甚するず、ダむアログモヌドで同期するフォルダヌを遞択し、システム起動時の自動実行を有効にし、プロキシサヌバヌを介しお䜜業を構成したすもちろん䜿甚しない限り、Yandex.Diskにログむンできたす。 手動で蚭定する堎合、最初に行う必芁があるのはログむンです。 その埌、ホヌムディレクトリにある.configフォルダヌに構成が䜜成されたす。このフォルダヌでは、同期フォルダヌぞのパスを構成できたすコン゜ヌルで手動で指定できたす。トヌクンファむルぞのパスを指定し、同期するフォルダヌたたは同期しないフォルダヌを指定したす。プロキシサヌバヌの蚭定を芏定したす。



チヌム



準備䜜業は終了し、チヌムの1぀のデヌモンを起動したす。 圌らはあなたがファむルやフォルダを同期し、むンタヌネットがある堎所でそれらを䜿甚するこずができたす。





タヌミナルずNautilusの䞡方からディスクフォルダヌを操䜜できたす。



䜕ができる



コン゜ヌルクラむアントでは、 publishコマンドを䜿甚しおファむルたたはフォルダヌを共有できたすファむルがディスクフォルダヌにない堎合は、 公開前にそこにコピヌされたす。 タヌミナルでリンクが䜿甚可胜になり、リンクをたどったナヌザヌは、公開したファむルたたはフォルダヌを衚瀺たたは保存できるようになりたす。 誀ったファむルが誀っお公開された堎合、 unpublishコマンドは公開オブゞェクトぞのアクセスをブロックできたす。



Yandex.Diskでは、遞択的な同期が可胜です。 excludeコマンドは、フォルダヌを同期から陀倖したす。それ以降に行われたすべおの倉曎はクラりドに送信されたせん。



読み取り専甚オプションを䜿甚するず、ファむルをクラりドにアップロヌドせずにロヌカルで倉曎できたす。 ロヌカルの倉曎ず競合が発生した堎合、倉曎は名前が倉曎されたファむルに保存され、クラりドからの倉曎が同期されたす。 䞊曞きオプションは、ロヌカルで倉曎されたファむルを読み取り専甚モヌドで䞊曞きしたす。



同期コアの最も興味深いむノベヌションを自慢せずにはいられたせん-これからシンボリックリンク同期をサポヌトしたす コン゜ヌルクラむアントの䜿甚に関する問題や質問に遭遇した堎合は、 manコマンドずhelpコマンドを䜿甚するず、それらを簡単か぀簡単に理解できたす。



どうやっお



将来、異なるOSのクラむアントを実装するためにコヌドを䜿甚できるように、C ++で蚘述するこずが決定されたした。 異なるオペレヌティングシステムに固有のコヌドを個別の関数たたはクラスに取り出し、各プラットフォヌムの実装を䜜成したした。 Boost 、 OpenSSL 、およびJsonCppを䞻芁なクロスプラットフォヌムラむブラリずしお採甚し、 gitがバヌゞョン管理システムになりたした。 Linuxのクラむアントはautoconfを䜿甚しお構築されたした。 コヌドは、倚くのKDevelop +コン゜ヌルgdbたたはQt Creator開発者の奜みに応じおで䜜成およびデバッグされたした。



クラりドずの盞互䜜甚ず同期は、サヌビスのデスクトップクラむアントが䜿甚するYandex.Diskカヌネルラむブラリを䜿甚しお実行されたす。



仕組み



コン゜ヌルクラむアントは、デヌモンずクラむアントの2぀の郚分で構成されおいたす。 それらは、゜ケットを介しお送信されるjsonメッセヌゞを含むテキストパケットを介しお通信したすLinuxおよびMac OS X UNIXドメむン゜ケットが䜿甚されたす。 非同期操䜜は、boost :: asioラむブラリを䜿甚しお実装されたす。 デヌタアクセス同期は、boost :: asio :: io \ _service :: strandによっお実装されたす。これにより、耇数のストリヌムのデヌタぞの同時アクセスの問題を考える必芁がなくなり、デッドロックの発生もなくなりたす。



ロヌカラむズには、boost ::ロケヌルラむブラリを䜿甚したす。 クラむアント内のテキストはutf-8で゚ンコヌドされ、必芁に応じお各オペレヌティングシステムに固有のコヌドに倉換されたす。 Linuxのファむルシステムモニタリングでは、boost :: asioの非同期操䜜に最適なinotifyを䜿甚したす。



同期の仕組み



同期は、その䞻芁機胜であるYandex.Diskの心臓郚です。 ファむルツリヌをクラりドず同期するタスクは、いく぀かの独立した郚分に分かれおいたす。



1 ファむルシステムモニタリング 。 Yandex.Disk同期コアは、サポヌトされるすべおのプラットフォヌムでタスクを実行できるポヌタブルな抜象化ずしお蚭蚈および䜜成されたした。 しかし、ファむルシステムの監芖などの問題は、暙準のC ++ラむブラリや、ブヌストなどのモンスタヌによっおも実装されおいたせん。 さらに、オペレヌティングシステムの「ネむティブ」APIを䜿甚しおも、各プラットフォヌムに固有の䞀連のむベントを取埗したす。



ファむルシステムを監芖するために、特定のディレクトリ内のむベントを監芖し、そのディレクトリで発生したむベントのリストを返す「オブザヌバ」むンタヌフェむスが蚭蚈されたした。 さらに、サポヌトされるプラットフォヌムごずに、これらのむベントのセットは異なりたす。 たずえば、Mac OS Xは、子ディレクトリの1぀に䜕らかの倉曎があったこずを詳现なしで報告するこずしかできたせん。 しかし、WindowsずLinuxは、オブゞェクトの䜜成、削陀、倉曎、移動を含む完党なセットを返したす。 Windowsプラットフォヌムのむベントは信頌すべきではなく、最も信頌性の高いオプションは通知を受信した埌にディレクトリをリストするこずであるこずが実践により瀺されおいたすが。



2 。 ロヌカルファむルずディレクトリのむンデックス䜜成 。 ファむルのデルタ曎新の敎合性ず実装を制埡するために、Yandex.Disk同期コアはダむゞェストファむルずその個々の郚分のチェックサムのセットを䜿甚したす。 ファむル党䜓に぀いお、安定したSHA-256ハッシュず、個々のブロックの䞍安定な合蚈のセットを蚈算したす。 Yandex.Diskフォルダヌにあり、䟋倖のリストに含たれおいない各ファむルには、むンデックスを䜜成する必芁がありたす。 ただし、SHA-256ハッシュの蚈算はかなり高䟡な操䜜であり、゜フトりェアを起動するたびにハッシュを蚈算するこずは蚱されないリ゜ヌスの浪費になりたす。 したがっお、ファむルのむンデックス䜜成が完了するず、同期コアは受信したダむゞェストを「銀行」に保存したす。これは、Yandex.Diskサヌビスディレクトリにある特別なリポゞトリです。 リポゞトリ内のダむゞェストを怜玢するには、䞀意のファむル識別子-iノヌド最終倉曎のサむズず時刻が䜿甚されたす。 残念ながら、このアプロヌチには欠点がないわけではありたせん。 たずえば、倚くの暗号化コンテナファむルは、蚘録埌も最終倉曎時刻を倉曎せずに保持したす。



おそらく、シンボリックリンクでの䜜業の耇雑さに加えお、ディレクトリのリストには特に関心がありたせん。 同期を正垞に完了するには、カヌネルが埪環ブランチを怜出しお同期から陀倖する必芁がありたす。



䞀般に、シンボリックリンクは、同期コアの本圓の「頭痛」です。 ファむルシステム内の任意の堎所を指すこずができ、それらすべおに同じ同期ルヌルを適甚できたす。 たずえば、Mac OS Xアプリケヌションパッケヌゞには、システムラむブラリディレクトリぞのシンボリックリンクが含たれおいるこずが非垞に倚く、それらをクラりドに同期するこずは望たしくありたせん特にOSの異なるバヌゞョン間。 しかし同時に、シンボリックリンクを䜿甚しお远加のディレクトリを同期する機胜は非垞に魅力的な機䌚であり、芋逃したくはありたせんでした。



したがっお、シンボリックリンクを同期するための特別なポリシヌが導入されたした。これにより、カヌネルは、シンボリックリンクが指すオブゞェクトの堎所に応じお、シンボリックリンクごずに特定の同期オプションを遞択できたす。



 。 クラりドファむルシステムツリヌを取埗したす 。 同期の問題を解決するには、ロヌカルファむル構造ずファむルダむゞェストを甚意するだけでは䞍十分です。クラりド内のファむルシステムの珟圚の状態を取埗する必芁がありたす。 同期コアがPROPFINDメ゜ッドを䜿甚しお毎回ツリヌを走査する必芁がある堎合、各同期サむクルに䞍圓に長い時間がかかり、チャネルに䞍芁な負荷がかかりたす。 そのため、Yandex.Disk゜フトりェアは特別なAPIを䜿甚したす。これにより、ツリヌのバヌゞョンによっお決定される既知の瞬間から開始しお、クラりド内のファむルツリヌの珟圚の状態ずその䞭で発生した倉曎を取埗できたす。



4 。 クラりドファむルシステムの倉曎に関するアラヌトを受信したす 。 リアルタむムのファむル同期には、クラりド内のファむルに発生した倉曎のタむムリヌな通知が必芁です。 クラむアントによるサヌバヌの定期的なポヌリングを䜿甚するこずは可胜ですが、クラむアントの可胜な数を芋積もるず、このアプロヌチは拡匵性が匱く、サヌビスむンフラストラクチャの急速な過負荷に぀ながるずいう結論に達したした。 短い怜玢の埌、XMPPプロトコルに萜ち着きたした。 その実装の1぀は、長い間Yandexで機胜しおいたす。 これは埌にYandex.DiskプロゞェクトのWebDAVサヌバヌの䜜成に埓事したチヌムによっお開発されたため、このプロトコルの統合に問題はありたせんでした。



同期コアによっお凊理されるプッシュ通知には、Yandex.Diskクラりド内のファむルたたはフォルダヌで盎接発生したむベントだけでなく、さたざたなサヌビスメッセヌゞも含たれたす。 たずえば、䜙分なスペヌスの問題や、パブリックフォルダヌ内の他のナヌザヌのアクション。 これらのむベントを既存のプロトコルに远加しおも、XMPPの拡匵性により、それほど困難は生じたせんでした。これにより、遞択が正しいこずが再床確認されたした。



5 。 同期操䜜のリストを䜜成したす 。 同期カヌネルがロヌカルずリモヌトの䞡方のファむルツリヌを自由に䜿甚できるようになったら、同期手順自䜓を続行できたす。 このために、特別なツリヌ比范アルゎリズムが䜿甚されたす。これは、2぀の蚀及されたツリヌに加えお、3番目の-最埌に同期されたツリヌを受け入れたす。 アルゎリズムの結果ずしお、ツリヌを䞀般的なビュヌに衚瀺するためにロヌカルおよびリモヌトのファむルずディレクトリで実行する必芁がある操䜜のリストが取埗されたす。



6 。 同期操䜜のキュヌの凊理 。 ロヌカルツリヌずリモヌトツリヌの操䜜のリストの䜜成は、独立しお行われたす。 その結果、競合する操䜜が衚瀺される堎合がありたす。 たずえば、倉曎されおただロヌカルで同期されおいないクラりド内のファむルを削陀したり、ロヌカルずクラりド内の䞡方でファむルを倉曎したりしたす。 修正/削陀の競合は垞にカヌネルによっお解決され、修正が優先されたす。たた、二重の修正の競合は、いずれかのファむルバヌゞョンの名前を倉曎するこずで解決されたす。 したがっお、デヌタの安党性を保蚌し、同期が完了した埌、各特定のケヌスでナヌザヌにずっおより適切な倉曎を決定する機䌚をナヌザヌ自身に䞎えるこずができたす。



同期操䜜は厳密な順序に埓う必芁があり、芪ディレクトリが䜜成されるたでファむルを転送できたせん。 たた、新しい堎所に移動する必芁のあるファむルがただ存圚しおいる間は、ディレクトリを削陀できたせん。 ツリヌ比范アルゎリズムはすでに目的の順序で操䜜を䜜成しおいたすが、゚ラヌが発生した堎合は違反する可胜性がありたす。 この状況を防ぐため、各操䜜には䟝存関係のリストがありたす。実行を開始する前に完了する必芁がある䞀連の操䜜ず、完了するたで開始しおはならない䞀連の操䜜です。



䟝存関係に加えお、操䜜の順序はその優先床の圱響を受けたす。 たずえば、ファむル転送操䜜は、ファむルサむズに応じお実行されたす小芏暡から倧芏暡たで。



これらのタスクはすべお同時に実行され、䞊列プロセスの同期の品質ずYandex.Disk同期カヌネル内のリ゜ヌスの割り圓おに远加の芁件が課されたす。 Ya.Diskをただお持ちでない堎合は、 こちらから入手しおLinuxにむンストヌルできたす repo.yandex.ru/yandex-disk



All Articles