22:32クラウドサービスの代名詞とも言える存在になった「Dropbox」。複数のパソコンやサーバー、スマートフォンなどを行き来する現代人にとって、もはや欠かせないオンラインストレージ・サービスでしょう。カメは踏むほど1UPするのが赤い配管工なら、comeばcomeほど無料で容量が10GB+αまで増えるのがDropboxです(?)。万が一、まだDropboxを利用していないという方や、新しい端末でアカウントを取得するという方は「こちら」からの登録で+250MBの容量をGETしてしまいましょう(!?)。世の中、そううまい話はありません。着実な日々の積み重ねを永遠に。その可能性は無限大」。このブログのタイトルです(???)。可能性が無限大なら良いですが資源は有限です。Dropboxのような便利なサービスも、使い方を誤ると貴重な資源を浪費する危険性があることについて、警鐘をならしたいと思います(?????)。ストレージ容量と時間という有限の資源を、Dropboxの同期という名の無限ループが食いつぶしてしまう危険性についでです。概要Dropboxの使い方として、各種の設定ファイルを同期させている人は多いのではないでしょうか。ファイルの置き場所を変更できない(したくない)場合には、シンボリックリンク(ハードリンク、ジャンクション)を利用することもあるかと思います(Dropboxでは、同期させるファイルを一つのディレクトリ、フォルダ内に置くことになっていますが、シンボリックリンクを作成するによって、他の場所からもファイルを参照できるようになります)。Dropboxにシンボリックリンクを組み合わせる方法は非常に便利な反面、注意が必要です。ディレクトリへのシンボリックリンクを扱う場合、ちょっとした手違いで、リンクが自分自身を再帰的に参照してしまう可能性があります。なると、Dropboxがディレクトリ内に延々と同じディレクトリとファイルを同期することを繰り返し、Dropboxのストレージ容量と端末のリソースを食いつぶしていきます。手元のパソコンでGUIで利用している場合には気付きやすいですが、VPSなどのリモート端末を利用している場合やCUI版のDropboxを利用している場合には気付きにくいので注意が必要です。Syncによる同期ファイルの設定もしておきましょう。)以下、(LinuxでDropboxを利用する際に)「比較的安全にシンボリックリンクを利用する方法」、「シンボリックリンクが循環してしまった場合の復旧方法」、「シンボリックリンクが循環する例」、「シンボリックリンクが循環しない例」についてまとめました。手動操作による間違いを防止するために簡単なシェルスクリプトも作成してみました。前提となるディレクトリ構成とシンボリックリンク以降、以下のような構成のディレクトリ・ファイルを例とします。/home/user/Dropbox/home/.vim)。比較的安全にシンボリックリンクを利用する方法lnコマンドでシンボリックリンクを作成する場合には、-sフラグに加え、-Tフラグを付けると比較的安全にシンボリックリンクを作成できます。-Tによって、シンボリックリンクが通常のファイルと同様に扱われるようになります。~/.vimシンボリックリンクの循環はlnコマンド以外にcp、mvコマンド等でも起こる可能性があります。シンボリックリンクのコピー、移動を行う場合にも-Tフラグを付けるようにします。~/.vim.bakシンボリックリンクと同じ名前のファイルがあった場合にバックアップを作成するには、加えて--backup=numberedなどを付けるようにします。-bや--backupとした場合は、バックアップは作られますが1世代分のみとなります。~/.vimシンボリックリンクが循環してしまった場合の復旧方法シンボリックリンクが循環し、Dropboxが再帰的に同期を行うようになってしまった場合は、先にシンボリックリンクの対象ディレクトリを丸ごと削除します。/home/user/Dropbox/home/.vimそれからシンボリックリンクを削除します。/home/user/.vim次にDropboxのWebインターフェイスからファイルを復元します。再帰的に同期されてしまったディレクトリの階層が深い場合や、ファイル数が多い場合には一括では復元できないことがあります。小分けにしながら復元するか、対象ディレクトリ・ファイルが多く復元できない場合はサポートへの問い合わせが必要になります。最後に、復元したディレクトリから不要なファイルを削除し、同期の際に移動されてしまったファイルを元のディレクトリへ移動します。シンボリックリンクが循環する例シンボリックリンクが循環してしまう例をいくつか挙げてみます。(シンボリックリンクが循環するのは、ディレクトリへのシンボリックリンクを扱う場合です。例ではlnコマンドを使用していますが、cp、mvコマンドの場合でも同様です。...引数として与えたディレクトリがシンボリックリンクのため、実際にはリンク先の同じディレクトリを参照していることから循環が起こります。通常は行うことがない処理のように思いますが、間違えたコマンドを入力したり、シェルスクリプトを二重に実行するなど、ちょっとした拍子に循環が起こる可能性はあります。シェルスクリプトからシンボリックリンクの作成やバックアップ処理などを行う場合には、循環が起こる原因となる処理が含まれていないか注意が必要です。シンボリックリンクが循環しない例lnコマンドでシンボリックリンクを作成する際に-Tフラグを付けると、リンクが通常のファイルとして扱われるようになり、通常ではリンクが循環するケースを防止できます(cp、mvコマンドの場合でも同様です)。(バックアップが作成され、古いものも削除されない)シェルスクリプトから、バックアップを取りつつシンボリックリンクを作成したい場合などには-T、--backup=numberedを併用すると、比較的安全にシンボリックリンクを作成できます。最後に、シンボリックリンクを作成するシェルスクリプトの例を紹介します。Dropboxの特定のディレクトリ下に、実際のディレクトリ構成と同じ構成のファイル・ディレクトリを置いておきます。TARGET_BASEDIRにリンク対象のファイル・ディレクトリを含むディレクトリを、LINK_BASEDIRにシンボリックリンクを作成するディレクトリを、FILESにシンボリックリンクの対象とするファイル・ディレクトリをTARGET_BASEDIRからの相対パスで指定します。BACKUPが0以外の場合は、同名のファイル・ディレクトリがあった場合にバックアップが作成されます。同名のファイル・ディレクトリがある場合でも、それが同じファイル・ディレクトリへのリンクであればバックアップは作成されません。BACKUPを0にした場合は、同名のファイル・ディレクトリがあっても上書きはされず、単にシンボリックリンクは作成されません。後はシェルスクリプトを実行すれば、指定したディレクトリを基点として、同じディレクトリ構成でシンボリックリンクが作成されます。0バックアップ作成の有無を設定する変数を追加しました。同一のシンボリックリンクが存在する場合には、新たにシンボリックリンクを作成しないようにしました。シェルスクリプト実行後のディレクトリ・ファイル構成は以下のようになります。13:17こんにちわ。当記事興味深く読みました。D:\)でシンボリックリンクを作成しました。これで、設定当初1.5GほどあったローカルDisk(C:\)の空き容量が消費されず維持されると期待していたのですが、運用しているとC:\ドライブの容量満杯になり、この記事で言われる循環参照が原因ではないかと推測しています。プログラミングは本業でなく不慣れなもので、ネット検索しましたがWindows環境のビンゴな手順さがせず、手前勝手なお願いで恐縮ですが、もしWindowsで循環参照しない作成方法のポイントご存知でしたらご教示戴けたらとコメントした次第です。<や>は&lt;、&gt;と入力してください。)コメントを入力してください。ボリックリンクを設定する際に、注意しないとディレクトリの無限増殖を起こしてしまうことがあるようです。こちらのブログで詳しい説明がなされていました。すごく勉強になります。