
Я написал небольшой скрипт резервного копирования rsync для моего недавно замененного компьютера (с внутреннего жесткого диска на внешний жесткий диск).
Когда у меня появился новый компьютер, я скопировал файлы (со старого внутреннего HD на новый внутренний HD). Та же структура файлов, имена файлов и т. д.
Мне интересно, могу ли я просто запустить скрипт резервного копирования на новом компьютере, который теперь подключен к старому внешнему жесткому диску.
Потенциальная проблема, которую я предвижу, будет связана с тем, ссылается ли rsync на конкретные файлы или только на имена файлов.
Помню, я где-то читал о том, что у файловых систем есть определенные идентификаторы (серийный номер или что-то в этом роде) «под капотом» для каждого файла, и изменение имени не меняет этот номер.
Таким образом, если rsync ссылается на этот номер, а не просто на имя файла в определенной позиции в структуре каталогов, он может полностью испортить внешний жесткий диск, скопировав все в двух экземплярах или получив какой-то другой странный результат.
Просто rsync работает с использованием жестких/мягких ссылок, а я не настолько эксперт в этом вопросе, чтобы знать подробности или их последствия...
Любая помощь приветствуется!
MacOS Ventura 13.4.1, APFS (файловая система)
решение1
вкратце
Не о чем беспокоиться. Сделайте так, чтобы ваш сценарий использовалrsync --dry-run --verbose …
и посмотрите сами. Если это выглядит разумно, продолжайте использовать оригинальный сценарий (без --dry-run
).
Номера инодов
Помню, я где-то читал о том, что у файловых систем есть определенные идентификаторы (серийный номер или что-то в этом роде) «под капотом» для каждого файла, и изменение имени не меняет этот номер.
Инодномера. Собственные файловые системы в Unix/Linux обычно используют эту концепцию (а macOS — это Unix). Файловые системы, которые внутренне не используют inode, выглядят так, как будто они их используют, поэтому с ними можно обращаться аналогичным образом. Так что да, у файлов есть серийные номера, ls -i
выводит их.
Итак, если rsync ссылается на этот номер, а не просто на имя файла…
rsync
не основывается на номерах inode, он используетимена путей(и имена путей состоят изимена файлов). Номера инодов не предназначены для обозначения чего-либо за пределами их файловой системы. И я не имею в виду тип файловой системы; я имею в виду, что они являются внутренними для своего конкретного экземпляра файловой системы, не связанными с номерами инодов в другой файловой системе (даже того же типа).
Вы правы, если rsync
попытаться основываться на номерах inode, это может посеять хаос. Этого не происходит. AFAIKнет стандартного интерфейса для доступа к файлам по номерам инодов. И вы (или rsync
) не можете запросить определенный номер при создании нового файла. Для файловых систем, которые не используют иноды и только выглядят так, как будто они их используют, номера инодов могут быть сгенерированы на лету, и во многих (всех?) случаях нет гарантии, что точно такие же номера будут связаны с точно такими же файлами после того, как вы размонтируете и снова смонтируете такую файловую систему.
Все это означает, что программы не должны заботиться о номерах инодов, если только они не должны иметь дело с внутренностями самой файловой системы. Номера инодов являются внутренними для файловой системы. Программы, такие как cp
или rsync
должны работать на другом уровне абстракции, и они работают. Другой уровень абстракции — это дерево каталогов с именами путей.
Один из сценариев, когда номера инодов «просачиваются» и (безопасно) используются такими программами, — это когда программа хочет обнаружить жесткие ссылки. Жесткие ссылки на файлы — это два или более имен путей, ведущих к одному файлу (номер инода). Программы могут сравнивать номера инодов и таким образом определять, какие имена путей ведут к одному и тому же файлу. Жесткие ссылки работают только в пределах одной файловой системы; файлы, которые имеют одинаковые номера инодов, но существуют в разных файловых системах, не связаны, программы учитывают это.
Например, rsync
вы можете использовать опцию --hard-links
/ -H
:
Это говорит
rsync
о необходимости поиска файлов с жесткими ссылками в источнике и связывания соответствующих файлов в месте назначения. Без этой опции файлы с жесткими ссылками в источнике рассматриваются как отдельные файлы.[…]
Обратите внимание, что rsync может обнаруживать только жесткие ссылки между файлами, находящимися внутри набора для передачи. […]
rsync -H
пытается обнаружить жесткие ссылки в источнике и создать жесткие ссылки в месте назначения. Но даже тогда номера инодов в месте назначения не будут иметь ничего общего с номерами инодов в источнике. Когда rsync -H
замечает, что некоторые имена путей в источнике ведут к одному и тому же номеру инода в той же файловой системе, то он попытается сделать так, чтобы соответствующие имена путей в месте назначения вели кнекоторыйодин номер inode; другими словами, он попытается создать файлы с жесткой ссылкой. Каким именно будет это число, выходит за рамки (и возможностей) rsync
. Инструменту не нужно заботиться о числе, поскольку даже интерфейс для создания жестких ссылок ( link(2)
) использует имена путей, а не номера inode.
Могу ли я просто запустить скрипт резервного копирования?
Я скопировал файлы (со старого внутреннего HD на новый внутренний HD). Та же структура файлов, имена файлов и т. д. Мне интересно, могу ли я просто запустить скрипт резервного копирования на новом компьютере, который теперь подключен к старому внешнему HD.
Ты можешь.Номера инодов в новом источнике могут быть (и, скорее всего, есть) совершенно другими, чем номера инодов в старом источнике, но это не имеет никакого значения. Достаточно идентичной структуры каталогов источника.
Помните, что есть--dry-run
/-n
.Чтобы быть в безопасности, создайте копию вашего скрипта и заставьте его использовать rsync --dry-run --verbose …
или около того; запустите его и проанализируйте вывод. Проблемы, с которыми вы столкнетесь (если таковые возникнут), не будут иметь ничего общего с номерами inode.