61

Я хочу удалить некоторые файлы / каталоги из раздела Time Machine с помощью команды rm, но не могу этого сделать. Я почти уверен, что проблема связана с какими-то расширенными атрибутами контроля доступа к файлам в резервной копии, но я не знаю, как их переопределить / отключить, чтобы заставить работать rm . Пример ошибки, которую я получаю:

% sudo rm -rf Backups.backupdb/MacBook/Latest/MacBook/somedir
rm: Backups.backupdb/MacBook/Latest/MacBook/somedir: Directory not empty
rm: Backups.backupdb/MacBook/Latest/MacBook/somedir/somefile: Operation not permitted

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

8 ответов8

108

Чтобы обойти ошибки "операция не разрешена", используйте программу обхода Time Machine Safety Net :

sudo /System/Library/Extensions/TMSafetyNet.kext/Contents/MacOS/bypass rm -rfv /Volumes/[disk]/Backups.backupdb/[path]

В 10.8 Mountain Lion объезд перешел в «Помощники»:

/System/Library/Extensions/TMSafetyNet.kext/Helpers/bypass

В 10.10 Йосемити перебрался сюда:

/System/Library/Extensions/TMSafetyNet.kext/Contents/Helpers/bypass

Будьте осторожны при использовании этого для удаления определенных снимков: поскольку Time Machine использует жесткие ссылки, использование rm -r для папок также может повлиять на более старые и новые снимки того же компьютера. (Смотрите другие ответы, относящиеся к tmutil delete для безопасного удаления определенного снимка.) Использование rm для удаления всех снимков с одного компьютера - это нормально. То же самое можно сказать и об использовании rm для удаления определенного файла, который удалит только тот файл с жесткими связями из указанных снимков, если он не находится в жестко связанном каталоге, как если бы вы фактически удалили файл из все эти жестко связанные каталоги.

26

BLUF (нижняя строка впереди):

sudo tmutil delete snapshot-dir


Использование sudo chmod -R -N folder для удаления всех списков ACL из иерархии папок не работает с файлами и папками в Backups.backupdb Time Machine из-за механизма TM Safety Net и критериев, описанных в этом посте 318 Tech Journal ( но, возможно, не совсем так, как описано).
    (Прежде чем изучить это из поиска Сети безопасности, упомянутой в ответе Эрика В. (которая работает), я проверил только папку, клонированную из подпапки резервной копии TM, и там работал chmod . Но попытка chmod для папки в реальной резервной копии TM приводит к ошибке "Операция не разрешена".)

Возможного использования:
    В Mac OS 10.7+ есть команда tmutil (которую я не пробовал, так как я все еще на Snow Leopard). Он имеет глагол удаления , который в соответствии с описанием «может удалять моментальные снимки из резервных копий, которые не были сделаны или не заявлены текущим компьютером» (где "моментальный снимок" - это папка с датой, представляющая одну инкрементную резервную копию). Мне не ясно, означает ли это, что он не может удалять снимки , сделанные или заявленные текущей машиной. (?)

9

Предупреждение об использовании команды bypass для удаления старой резервной копии: если в удаленной резервной копии есть папки, которые в точности совпадают с более ранними или более поздними резервными копиями, файлы могут быть также удалены из более ранних или более поздних резервных копий !

Time Machine не только использует жесткие ссылки для неизмененных файлов, но также использует жесткие ссылки для папок, в которых файлы не были добавлены, изменены или удалены вообще. Это приводит к чему-то вроде:

/2014-11-06/folder/file1
                  /file2
                  /file3
/2014-11-13/folder/file1 = hard link to file /2014-11-06/folder/file1
                  /file2 (changed; new inode)
                  /file3 = hard link to file /2014-11-06/folder/file3
/2014-11-20/folder/ = hard link to folder /2014-11-13/folder/
/2014-11-27/folder/ = hard link to folder /2014-11-20/folder/

С учетом вышеизложенного удаление любого файла из /2014-11-06/folder/ , и влияет только на резервную копию на эту дату. Количество ссылок жестких ссылок уменьшается, поэтому « inode » для file2 будет удален, но inode для file1 и file3 будет по-прежнему иметь счетчик ссылок 1 из-за более позднего резервного копирования. Следовательно, rm -R /2014-11-06 тоже подойдет .

Однако удаление любого файла из /2014-11-13/folder/ , /2014-11-20/folder/ или /2014-11-27/folder/ эффективно удалит его из всех этих 3 папок.

Проблема в том, что rm -R не заботится о жестко связанных папках. Он просто возвращается в любую жестко связанную папку, которую находит, смело удаляет все свои файлы, а затем удаляет пустую папку.

Итак: при удалении старой резервной копии не следует возвращаться в жестко связанную папку и удалять ее содержимое.Вместо этого следует удалить только жесткую ссылку для самой папки. Поэтому вместо rm -R используйте tmutil delete как объяснено в ответе Арне.

Кроме того, кажется, что команда unlink OS X не может использоваться для папок: «может быть предоставлен только один аргумент, который не должен быть каталогом». API OS X может удалять жестко связанные папки, как и GNU Coreutils, например, установленный с помощью Homebrew.

Наконец, чтобы доказать все вышесказанное, тестовый пример (OSX 10.6.8):

sh-3.2# ls -lFa 2014-11*/Users/USERNAME/Library/Safari/TopSites.plist 
-rw-r--r--@ 2 USERNAME  staff  1551 10 30  2014 2014-11-06-012454/Users/USERNAME/Library/Safari/TopSites.plist
-rw-r--r--@ 2 USERNAME  staff  1551 10 30  2014 2014-11-13-024438/Users/USERNAME/Library/Safari/TopSites.plist
-rw-r--r--@ 2 USERNAME  staff  1551 10 30  2014 2014-11-20-014044/Users/USERNAME/Library/Safari/TopSites.plist
-rw-r--r--@ 2 USERNAME  staff  1551 10 30  2014 2014-11-27-025033/Users/USERNAME/Library/Safari/TopSites.plist

Обратите внимание, что количество ссылок для каждого экземпляра равно 2 (второй столбец). Давайте удалим первое вхождение:

sh-3.2# /System/Library/Extensions/TMSafetyNet.kext/Contents/MacOS/bypass unlink 2014-11-06-012454/Users/USERNAME/Library/Safari/TopSites.plist 
sh-3.2# ls -lFa 2014-11*/Users/USERNAME/Library/Safari/TopSites.plist 
-rw-r--r--@ 1 USERNAME  staff  1551 10 30  2014 2014-11-13-024438/Users/USERNAME/Library/Safari/TopSites.plist
-rw-r--r--@ 1 USERNAME  staff  1551 10 30  2014 2014-11-20-014044/Users/USERNAME/Library/Safari/TopSites.plist
-rw-r--r--@ 1 USERNAME  staff  1551 10 30  2014 2014-11-27-025033/Users/USERNAME/Library/Safari/TopSites.plist

Таким образом, после отсоединения одного из файлов количество ссылок уменьшилось до 1 для каждого вхождения, хотя файл по-прежнему отображается 3 раза. Проблем пока нет. Удалите первое вхождение снова:

sh-3.2# /System/Library/Extensions/TMSafetyNet.kext/Contents/MacOS/bypass unlink 2014-11-13-024438/Users/USERNAME/Library/Safari/TopSites.plist 
sh-3.2# ls -lFa 2014-11*/Users/USERNAME/Library/Safari/TopSites.plist 
ls: 2014-11*/Users/USERNAME/Library/Safari/TopSites.plist: No such file or directory

Теперь все прошло. Очевидно, файл TopSites.plist был последний раз изменен 2014-11-06 и жестко связан с 2014-11-13, а затем некоторые другие файлы были добавлены, изменены или удалены в папке Safari . Затем содержимое папки Safari не изменилось в последующих двух резервных копиях, поэтому в 2014-11-20 и 2014-11-27 папка Safari была жестко связана с предыдущей резервной копией.

Действительно, 4 папки используют только 2 inode (первый столбец):

sh-3.2# ls -lFaid 2014-11*/Users/USERNAME/Library/Safari/
648651968 drwxr-xr-x@ 86 USERNAME  staff  2924  9 10 16:06 2014-11-06-012454/Users/USERNAME/Library/Safari//
650804457 drwxr-xr-x@ 86 USERNAME  staff  2924  9 10 16:07 2014-11-13-024438/Users/USERNAME/Library/Safari//
650804457 drwxr-xr-x@ 86 USERNAME  staff  2924  9 10 16:07 2014-11-20-014044/Users/USERNAME/Library/Safari//
650804457 drwxr-xr-x@ 86 USERNAME  staff  2924  9 10 16:07 2014-11-27-025033/Users/USERNAME/Library/Safari//
3

Примечание. Из-за упоминания Эрика У "Сети безопасности ТМ" этот ответ не работает в случае резервной копии Time Machine, к которой конкретно относится этот вопрос. Но для большинства других случаев информация о том, как избавиться от ACL, актуальна.


Нет необходимости использовать инструменты ACL, скопированные со старой ОС.

Используйте ls -le для просмотра ACL и chmod для их изменения.

Для получения дополнительной информации введите man chmod и посмотрите «Опции манипуляции ACL».

Команда для удаления всех ACL из иерархии папок:

chmod -R -N foldername
0

Машина времени работает как rshapshot. Он создает дерево жестких ссылок для каждой новой резервной копии. Жесткие ссылки на файлы, уже существующие в предыдущей резервной копии, занимают очень мало дополнительного места. Только когда последняя жесткая ссылка на файл удаляется, файл фактически удаляется из файловой системы.

Удаление всей отдельной резервной копии не повредит. Вы просто удаляете жесткие ссылки. Другие резервные копии не будут затронуты. Но это может быть достигнуто через tmutil.

Один из сценариев, в котором может потребоваться обойти защиту, - удалить определенный файл из всех резервных копий (и причину, по которой я оказался в этом посте).

Мой резервный диск заполнен. У меня есть очень большой файл (много гигабайт), резервная копия которого месяцами. Существует одна физическая копия, но множество снимков с жесткими ссылками на эту копию. Чтобы на самом деле избавиться от этого файла, мне нужно удалить жесткую ссылку из каждой резервной копии.

Обратите внимание, что номер индекса одинаков для всех жестких ссылок на один и тот же файл.

% cd /Volumes/WD\ 500G\ USB/Backups.backupdb/csm-laptop
% ls -li */Macintosh\ HD/Users/csm/vm.img
...
2740350 -rw-r--r--@ 28 csm  staff  42949672960 Feb 17 16:12 2015-05-08-005636/Macintosh HD/Users/csm/vm.img
2740350 -rw-r--r--@ 28 csm  staff  42949672960 Feb 17 16:12 2015-05-08-015812/Macintosh HD/Users/csm/vm.img
2740350 -rw-r--r--@ 28 csm  staff  42949672960 Feb 17 16:12 2015-05-08-030036/Macintosh HD/Users/csm/vm.img
2740350 -rw-r--r--@ 28 csm  staff  42949672960 Feb 17 16:12 2015-05-08-041307/Macintosh HD/Users/csm/vm.img
2740350 -rw-r--r--@ 28 csm  staff  42949672960 Feb 17 16:12 Latest/Macintosh HD/Users/csm/vm.img

(Последний - это просто символическая ссылка на последний каталог с датой)

% sudo bypass rm -f */Macintosh\ HD\Users\csm\vm.img

Файл удаляется из всех резервных копий, и возвращается место. Если файл со временем менялся, у каждой резервной копии будет полная копия, а возвращаемое пространство будет огромным.

0

Если вы не выполняете команду как пользователь, которому "принадлежит" резервная копия, вам будет сложно удалить ее из командной строки. У меня только что возникла проблема с миграцией, и нам пришлось выполнить полное резервное копирование Time Machine (1 ТБ +) и отформатировать диск, прежде чем мы смогли получить какой-либо доступ к нему - и, поверьте мне, я попробовал все, чтобы переопределить разрешения.

0

Вы можете сделать список расширенных атрибутов ls в длинном представлении, используя флаг -@ . Он будет содержать список ACL, когда вы указали флаг -e . Итак, вы можете узнать, с чем имеете дело, используя ls -lea@ DIR .

Судя по моим локальным резервным копиям Time Machine, похоже, что Time Machine применяет расширенные атрибуты с метаданными о самых новых и самых старых снимках. Данные, хранящиеся в xattrs, выглядят как двоичный список. Это кажется безобидным.

Time Machine также рассматривает возможность применения списков ACL к определенным каталогам, о которых он знает, например, к каталогам, размещенным в стандартном пользовательском каталоге. На вашем пути могут стоять два типа ACL: те, которые применяются непосредственно к файлу или каталогу, которые запрещают удаление, и те, которые применяются к родительскому файлу, который запрещает delete_child.

К сожалению, Mac OS X не предоставляет пользовательских утилит getfacl и setfacl указанных в POSIX.2c, для просмотра и управления списками ACL. Чтобы связываться с ACL, вам придется заняться программированием; см. acl(3) .

0

Если вы хотите удалить все файлы в папке, а не только определенные файлы, вы можете сделать это, добавив папку в список исключений Time Machine. (Системные настройки -> Time Machine -> Параметры. Перетащите папку сюда.)

В следующий раз, когда вы выполните резервное копирование, копии этой папки будут удалены из предыдущих резервных копий.

Теперь, если вы действительно хотите сделать это из CLI, есть способ, хотя и немного громоздкий.

  1. Сделайте резервную копию /Library/Preferences/com.apple.TimeMachine.plist
  2. Скопируйте /Library/Preferences/com.apple.TimeMachine.plist где-то, где вы можете играть с ним.
  3. Cd туда, куда вы положите.
  4. казнить
    plutil -convert xml1 com.apple.TimeMachine.plist
    преобразовать его из двоичной формы.
  5. Откройте преобразованный список в предпочтительном текстовом редакторе, найдите "Skippaths"
  6. Вставьте новую строку в этот раздел в формате <string>/Path/To/Exclude</string>
  7. Сохранить и выйти, преобразовать обратно, выполнив
    plutil -convert binary1 com.apple.TimeMachine.plist
  8. Скопируйте отредактированный список обратно в /Library /Preferences /
  9. Запустите резервное копирование, выполнив
    /System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helper -auto

Редактировать: при выполнении шага 9 все копии вновь исключенной папки будут удалены из предыдущих резервных копий.

Чтобы удалить исключение, скопируйте резервную копию обратно в /Library /Preferences.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .