Внешнее резервное копирование - ошибка "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, Итак, оказалась основная проблема с разрешениями.