cp -aはvirtfsのシンボリックリンクをコピーできません。

cp -aはvirtfsのシンボリックリンクをコピーできません。

質問:

隠しファイル/ディレクトリとシンボリックリンクを含む、あるディレクトリの内容全体を別のディレクトリにコピーしてみてください。

とても簡単です。cp -a ${src} ${dst}

私のローカルVMでは期待どおりに動作しますが、私のVPS(hostgator)では正しく動作しません。リンク先がディレクトリリストの後ろにある場合は、シンボリックリンクをコピーできません。

元のリンク先が有効で、デバイスにローカルであり、同じデバイスにコピーしていることを考えると、ディレクトリ構造全体が正確にコピーされるようにするための最良の方法は何ですか?

時間がかかりましたが、実際にすべきことはコピーコマンドを2回実行し、2番目に欠落しているリンクを追加することだけであることがわかりました。これより良い方法がありますか?

効果的ですがハッキングされたソリューション:

src=".default/.";
dst="tld.domain/";
cp -a ${src} ${dst};
cp -a ${src} ${dst};

すべてが正しくコピーされたことを確認するためにコマンドを繰り返す必要はありません。

私もtarを試してみましたが、同じ問題でした。私はrsyncを試していませんでしたが、両方のソリューションは非常にマイナーなことについて過度に見えます。

想像する:

重要または不明な場合は、追加の視点を提供してください。

Webサイトドメイン用のテンプレートディレクトリ構造を作成しました。私のWebホストに新しいサブドメインを作成した後、テンプレートをサブドメインのドキュメントルートにコピーしました。

私のサブドメインとテンプレート(.default /)ディレクトリ構造は次のとおりです。

sites/
    .default/
        .htaccess
        .www -> production/
        production/
    tld.domain.x/
    tld.domain.y/
    tld.domain.z/

そのため、新しいサブドメインを作成し、そのドキュメントルートをテンプレートディレクトリのコンテンツで埋めます。ここでの問題は、これが.www/シンボリックリンクですが、production/et cpalはすべてをソートされた順序で生成するため、.www/その前に生成しようとするとproduction/失敗することです。

私のウェブホストはCentOS6を実行しているHostGator VPS

シンボリックリンクの作成に関するいくつかの制限事項について質問することができます。私の考えでは、VPSは通常、間違ったリンク先と同じように動作する外部ソースへのシンボリックリンクを許可しないようです。 IEの起源は不明です。

名前がすべてない場合は、私のVPSに電話してください。

ln -s foo bar

出力:

ln: creating symbolic link `bar': Permission denied

foo/を最初に作成してから接続すると、期待どおりに機能します。

df -T .見せるファイルシステムの種類は次のとおりです。virtfs

ベストアンサー1

通常、シンボリックリンクは怠惰です。すべてのバイトシーケンスを格納できます(ヌルバイトを除く、特定の長さまで)。シンボリックリンクを作成するときにコンテンツが既存のファイルを指しているかどうかは重要ではありません。ターゲットの存在は、シンボリックリンクにアクセスするときにのみ重要です。したがって、VPSに表示される内容は異常です(そして起動も異常です)。

仮想ファイルシステムゲストとホストの両方がLinuxを実行するKVM / QEMU仮想マシン用に設計されたファイルシステムです。このファイルシステムは、ホストファイルシステムの一部としてゲストに表示されます。簡単で迅速な方法でゲストとホスト間でファイルを共有できます(ネットワークファイルシステムよりも高速です)。たとえば、すべてのゲストが同じオペレーティングシステムを実行しているため、オペレーティングシステムファイルがホストとすべてのゲスト間で共有(読み取り専用であることを望む)VPSで役立ちます。ゲスト固有のファイルにも使用できます(他のゲストと共有されていません)。

Virtfsには2つの保存モードがあります。マッピングされたそして直接。パススルーモードは、名前が示すように、単にファイル操作コマンドをゲストからホストに渡します。たとえば、ゲストでシンボリックリンクを作成すると、ホストにシンボリックリンクが作成されます。マッピングモードはホストの拡張属性を使用してファイルメタデータを保存し、すべてのファイルをQEMUを実行しているユーザーが所有するようにします。マッピングモードは、ゲストのどのユーザーがファイルを所有しているかにかかわらず、QEMUを実行している1人のユーザーがファイルを所有するため、ゲスト固有のファイルを保存するのに適しています。あなたのサイトはおそらくマッピングモードでvirtfsインスタンスに保存されています。

マッピングモードでは、シンボリックリンクは、シンボリックリンクであることを示す拡張属性とともに通常のファイルとして保存されます。これだけでは問題を説明できません。ただし、これは問題が発生する可能性がある機会のウィンドウを開きます。何かシンボリックリンクターゲットが存在するかどうかを確認し、ターゲットが存在しない場合は生成を拒否するようです。

私はvirtfsの経験が不足しているので、これがいくつかの設定オプションが原因であるかどうかはわかりません。私が見つけたあなたに似た質問。影響を受けたユーザーもVPSを使用しており、ぶら下がっているシンボリックリンクを作成しようとしたときに「許可拒否」エラーが発生しました。彼の結論は

参考までに、RedHat 4.4には問題はありません。ln -sユーザーがRVMのようなものをインストールできないように、システムプロバイダは意図的にコマンドを中断しました。

説明と修正を要求するには、VPSプロバイダに連絡する必要があります。

修正が得られない場合、回避策は最初にディレクトリと通常のファイルをコピーしてからシンボリックリンクをコピーすることです。一般的に使用されているコピープログラム(GNU cp、rsync、cpio、tar、pax)には、すべてをコピーしてシンボリックリンクのみを維持する方法がないと思います。簡単な回避策は、最初のステップでエラーを無視して2つのコピーを実行することです(すでにコピーされたファイルが再コピーされないようにrsyncを使用)。

rsync -a source/ destination/ 2>/dev/null
rsync -a source/ destination/

おすすめ記事