Внешнее резервное копирование - ошибка "cp: не удается создать обычный файл"

Я всегда копировал домашний каталог на внешний жесткий диск, используя cp -r команда.

До недавнего времени все работало нормально, но теперь я регулярно получаю сообщение об ошибке cp: cannot create regular file с последующим invalid argument или же cp: cannot create symbolic link с последующим operation not permitted,

я пробовал sudo cp -r но проблема сохраняется. Что я делаю неправильно?

4 ответа

Конфликт между исходными именами файлов и целевой файловой системой может привести к 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 чем-то более дружественным для Linux- например, ext4 - облегчит вашу проблему, но за счет снижения переносимости. Почти любая система Linux сможет смонтировать диск, но другие распространенные системы потребуют дополнительной работы. См. " Создание раздела ext4 из консоли" и mke2fs man-страница для получения подробной информации о завершении процесса создания. См. " Как читать разделы ext4 в Windows?" Как я могу смонтировать файловую систему ext4 в OS X?"И" Как мне подключить Ext4 с помощью OS X Fuse", если вам нужно переместить этот диск в другие операционные системы.

cp -rv должен, по крайней мере, сказать вам, на каком файле он скрывается.

Проблема, с которой вы столкнулись, звучит так, будто вы копируете символическую ссылку (это файл, который просто указывает на другую) в файловую систему, которая не поддерживает символические ссылки. Для этого есть три варианта:

  • Превратите свой резервный том в файловую систему, которая принимает символические ссылки (например, переформатируйте его из FAT или NTFS в EXT3 или EXT4). Это может быть неприятно в зависимости от того, сколько данных у вас есть (что вам, возможно, придется жонглировать, пока вы это делаете).

  • Просто игнорируйте символические ссылки и не копируйте их. Это может привести к поломке, если вы попытаетесь восстановить, так как будут отсутствовать некоторые файлы.

  • Разверните символические ссылки, чтобы они содержали копию фактических данных. Это занимает больше места.

Первый - мой выбор, но если вам нужен диск для другой системы, которая не поддерживает тома EXTx, это проблема.

Независимо от того, являются ли вторые два реалистичными вариантами, я бы cp с подробным флагом, чтобы увидеть, с чем вы имеете дело. Если это один файл, возможно, простая копия будет в порядке, если это не так, и это всего лишь бесполезный помощник, возможно, пропустить его будет хорошо.

Но, как примечание, большинство людей предпочитают использовать rsync делать резервные копии. У этого есть много вариантов, которые делают его идеальным для работы. Вы можете прочитать версию его справочной страницы здесь. Он имеет различные варианты (как описано выше) о том, как обрабатывать символические ссылки.

Увидеть ваш dmesg, Обычная проблема - либо проблема файловой системы, либо сбой жесткого диска (и, следовательно, проблема файловой системы).

Вы можете размонтировать внешний диск и затем запустить fsck, Например

umount /dev/sdb1
fsck -f /dev/sdb1

Я просто столкнулся с той же проблемой (на самом деле на Cent OS через VirtualBox), и проблема была связана с разрешениями. У меня был общий каталог с моей локальной машиной (Mac на OSX Mavericks), попытался cp и он отказался от Protocol error, На моем локальном компьютере я изменил владельца каталога на обычного пользователя (меня) (с root) и группа к чему-то более общему, чем wheel, Итак, оказалась основная проблема с разрешениями.

Другие вопросы по тегам