cp -r
コマンドを使用して、ホームディレクトリを常に外部ハードドライブにバックアップしました。
最近までは正常に機能していましたが、今では定期的にcp: cannot create regular file
に続いてinvalid argument
またはcp: cannot create symbolic link
に続いてoperation not permitted
のエラーメッセージが定期的に表示されます。
Sudo cp -r
を試しましたが、問題は解決しません。何が間違っていますか?
cp -rv
は、少なくとも、どのファイルがベイクアウトされているかを示す必要があります。
あなたが抱えている問題は、シンボリックリンクをサポートしていないファイルシステムにシンボリックリンク(別のものを指しているだけのファイル)をコピーしているように聞こえます。これには3つのオプションがあります。
バックアップボリュームをシンボリックリンクを受け入れるファイルシステムに変換します(たとえば、FATまたはNTFSからEXT3またはEXT4に再フォーマットします)。あなたがそこに持っているデータの量によっては苦痛になるかもしれません(あなたがそれをしている間、あなたはジャグリングしなければならないかもしれません)。
シンボリックリンクを無視して、コピーしないでください。いくつかのファイルが欠落しているため、復元しようとすると、これにより問題が発生する可能性があります。
実際のデータのコピーが含まれるように、シンボリックリンクを展開します。これはより多くのスペースを占有します。
最初は私の選択ですが、EXTxボリュームをサポートしていない別のシステム用のドライブが必要な場合、それは問題です。
2番目の2つが現実的なオプションであるかどうかにかかわらず、cp
をその冗長フラグで実行して、何を扱っているかを確認します。単一のファイルの場合は、プレーンコピーでも大丈夫でしょう。そうでない場合は、単なるジャンクヘルパーです。省略しても大丈夫でしょう。
ただし、補足として、ほとんどの人はrsync
を使用してバックアップすることを好むようです。仕事に最適なオプションがたくさんあります。 そのマンページはこちら のバージョンを読むことができます。シンボリックリンクの処理方法に関するさまざまなオプション(上記の概要を参照)があります。
ソースファイル名と宛先ファイルシステムの競合により、cannot create regular file
エラーが発生する可能性があります。 USBサムドライブにコピーする場合は、おそらくvfatまたはfat32ファイルシステムを使用していることになりますが、これには通常の Windows命名規則 が適用されます。
これを確認するには、Windowsの予約文字である:
という名前のファイルを作成してみてください。
$ cp /dev/null /path/to/dest/:
cp: cannot create regular file '/path/to/dest/:': Invalid argument
Operation not permitted
エラーを個別に表示するには、コピーせずにシンボリックリンクを作成してみてください。
$ ln -s somesillysymlink /path/to/dest/symlink
ln: failed to create symbolic link '/path/to/dest/symlink': Operation not permitted
これらのエラーが表示される場合、問題の原因である可能性があります。
おそらく最も簡単なアプローチは、遭遇した命名の制限から解放され、またシンボリックリンクを保持するアーカイブを作成することです。デフォルトでは、tar
および7z
はシンボリックリンクを保持します。 Zip
は、適切なフラグでシンボリックリンクを保持します。これらはそれぞれ、名前にWindows予約文字を含むファイルを保存できます。 「 シンボリックリンクを圧縮/圧縮するにはどうすればよいですか? 」も参照してください
Vfatファイルシステムをext4などのよりLinuxフレンドリーなものに置き換えると、問題は軽減されますが、移植性が低下します。ほとんどすべてのLinuxシステムでドライブをマウントできますが、他の一般的なシステムでは追加の作業が必要になります。プロセスの作成終了の詳細については、「 console からのext4パーティションの作成」およびmke2fs
マンページを参照してください。 「 Windowsでext4パーティションを読み込む方法は? 」、「 OSでext4ファイルシステムをマウントする方法X? 」、および「 OS Xを使用してExt4をマウントする方法Fuse 」ドライブを移動する必要がある場合他のオペレーティングシステムに。
dmesg
をご覧ください。通常の問題は、ファイルシステムの問題か、ハードディスクの障害(したがって、ファイルシステムの問題)です。
外部ディスクをアンマウントしてからfsck
を実行できます。例えば
umount /dev/sdb1
fsck -f /dev/sdb1
私は同じ問題に実際に遭遇しました(実際にはCentOSでVirtualBoxを介して)、問題は権限に関連していました。ローカルマシン(OSX Mavericks上のMac)と共有ディレクトリを使用して、cp
を試行し、Protocol error
で失敗しました。ローカルマシンで、ディレクトリの所有者を(root
から)通常のユーザー(me)に変更し、グループをwheel
よりも一般的なものに変更しました。そのため、基本的な権限の問題であることが判明しました。