Вопрос или проблема
Я случайно использовал rsync (с следованием символьных ссылок) для копирования всего / на другой диск.
Я запускал rsync как обычный пользователь.
Осознав свою ошибку, я хотел очистить резервную копию.
Это удалило все файлы, кроме (сохраненных) файлов в BACKUPFOLDER/dev/fd
Было поздно, и я был нетерпелив, поэтому я применил sudo rm -rf * внутри BACKUPFOLDER, и это избавило меня от них.
Теперь я задумался: почему я не мог удалить эти резервные копии файловых дескрипторов (они имели моего пользователя как владельца), и не повредил ли я что-либо, запустив sudo rm -rf на этой копии?
$ namei -l /dev/fdf: /dev/fddrwxr-xr-x root root /drwxr-xr-x root root devlrwxrwxrwx root root fd -> /proc/self/fddrwxr-xr-x root root /dr-xr-xr-x root root proclrwxrwxrwx root root self -> 4701dr-xr-xr-x chazelas chazelas 4701dr-x—— chazelas chazelas fd
На операционных системах на базе Linux /dev/fd является символической ссылкой на /proc/self/fd, /proc/self — символическая ссылка на /proc/$pid, где $pid — это ID процесса, который выполняет readlink() на этом, а /proc/$pid/fd является виртуальной директорией только для чтения, чьи разрешения делают так, что никто не имеет права записи в нее.
Таким образом, если ваш rsync скопировал /dev/fd как копию /proc/$pid/fd (вместо копии символической ссылки), сохраняя в ней разрешения, вы получили директорию dr-x—— your-user your-group, и rm не может удалить файлы внутри, так как не имеет разрешения на изменение директории.
Так как вы владеете директорией, вы должны быть в состоянии изменить эти разрешения, или в более общем случае выполнить chmod -R u+rwx BACKUPFOLDER, если вы делали эту резервную копию как сам пользователь, так что rm -rf будет гарантированно успешным.
В любом случае, sudo rm -rf BACKUPFOLDER или sudo rm -rf BACKUPFOLDER/dev (так как sudo rm -rf BACKUPFOLDER/* было бы расширено до) или sudo rm -rf BACKUPFOLDER/dev/fd не могли нанести никакого вреда остальной части ОС. Даже если rsync создал символические ссылки на файлы или директории системы там, rm удалит символические ссылки там и не будет следовать символическим ссылкам к директориям для удаления файлов внутри. И в любом случае даже root не мог удалить файлы /proc/$pid/fd/$n, так как это виртуальные файлы, раскрывающие внутреннюю информацию ядра Linux, которые ядро не позволит вам удалить.
Символическая ссылка /dev/fd может быть удалена, поскольку в текущих версиях систем на базе Linux /dev не является виртуальной файловой системой, как это могло быть в более старых версиях Linux, а чем-то, что автоматически наполняется программами в пространстве пользователя (udev/systemd) на основе информации, предоставленной ядром, но опять же rm -rf BACKUPFOLDER/dev/fd мог бы удалить только символическую ссылку /dev/fd, если бы BACKUPFOLDER/dev была символической ссылкой на /dev (или BACKUPFOLDER была символической ссылкой на / или на директорию, содержащую символическую ссылку dev на /dev), которых здесь не должно быть.
Пара заметок о вашем sudo rm -rf *:
- * разворачивается (оболочкой, не rm) в список не скрытых файлов там, так что это не удалило бы скрытые. Если используете zsh, вы можете использовать *(D) вместо *, чтобы также удалить скрытые.
- Если там есть файлы или директории, чьи имена начинаются с -, разворачивание * могло бы включать аргументы, которые будут рассматриваться как опции rm. Вообще, при использовании глобов или по крайней мере глобов, разворачивание которых не гарантирует отсутствие элементов, начинающихся с — (или + для некоторых команд), вам нужно использовать — в качестве разделителя опций:
sudo rm -rf — *
Хотя вы также могли бы сделать:
sudo rm -rf ./*
Лучше всего было бы здесь сделать sudo rm -rf BACKUPFOLDER, что позволило бы избежать обеих проблем.
Ответ или решение
Удаление каталога /dev/fd из резервной копии может вызвать некоторый интерес, особенно если вы случайно скопировали его при помощи rsync с параметром следования за символическими ссылками. В случае, представленном в описании, пользователь случайно скопировал весь корень файловой системы «/» на другой диск, что может приводить к ряду проблем при очистке резервной копии.
Теория
На Linux-системах /dev/fd представляет собой символическую ссылку на /proc/self/fd. Этот каталог содержит ссылки на файловые дескрипторы текущего процесса. Поскольку это виртуальный каталог, никакие реальные файлы на диске не существуют в этом местоположении, и каталог не подлежит обычному копированию. Когда вы используете rsync, следуя символическим ссылкам, вы случайно копируете структуру, которая записывается как каталог с правами доступа, которые вы, как обычный пользователь, имеете только на чтение.
Пример
Когда вы осуществляете rsync с флагом -L (следование символическим ссылкам), вы получаете копию структуры файлов, как в случае с /proc/$pid/fd. Эта структура обычно имеет права dr-x——, что означает, что в нее можно заходить и читать, но не записывать или удалять файлы внутри, если вы не являетесь владельцем.
Применение
- Удаление через sudo: Поскольку вы владеете каталогом (как показано в описании, владелец — пользователь), вы можете изменить права доступа с помощью команды chmod, чтобы получить доступ на запись и удаление. Однако, использование sudo позволяет обойти это ограничение, и команду sudo rm -rf можно использовать без риска повредить саму систему, если вы удаляете резервную копию, а не оригинальные файлы. В данном случае вы использовали sudo rm -rf для удаления всех файлов, включая /dev/fd в резервной копии.
- Особенности использования rm с аргументами: При использовании rm с дорасширением . важно помнить, что оболочка разворачивает в список всех несокрытых файлов в каталоге. Это может пропустить скрытые файлы, если вы не укажете соответствующий флаг для их включения (например, *(D) в zsh). Кроме того, важно избегать ситуаций, когда файлы начинаются с -, так как это может быть интерпретировано как опции команды. Для безопасного использования стоит применять — для указания завершения списка опций, например:
sudo rm -rf — *
- Устранение нежелательных последствий: Ваша команда не приведет к удалению критически важных системных файлов, так как она была применена к резервной копии, а не к истинному каталогу /dev или /proc. Даже если в резервной копии присутствуют символические ссылки на другие части системы, rm удалит только саму ссылку, не следуя за ней к реальным данным.
- Рекомендации по управлению резервными копиями: Всегда внимательно проверяйте команды, которые вы выполняете с большими наборами данных или системными каталогами. Использование тестовых прогонов и симуляции — отличный способ убедиться, что резервные копии и сценарии восстановления работают должным образом без риска повреждения данных.
Такая практика очень полезна, так как понимание основ работы с файловыми системами и виртуальными каталогами, такими как /proc, помогает избежать ошибок при управлении данными. Ваше понимание того, как работают файловые дескрипторы и виртуальные каталоги в Linux, обеспечивает уверенность в эффективном и безопасном удалении нежелательных данных в будущем.