Продолжим рассмотрение новой системы резервного копирования от Apple — Time Machine. В этой части статьи заглянем внутрь Машины Времени и рассмотрим как она устроена.

Первая часть статьи доступна здесь.

Символьные и жёсткие ссылки

Возможность создавать «псевдонимы» была включена в Mac OS начиная ещё с седьмой версии. Псевдонимы (ярлыки) — это маленькие файлы, содержимое которых позволяет Finder’у и другим приложениям находить исходные файлы. Но для ядра операционной системы они ничем не отличаются от других файлов. Первая часть урока состоит в том, что псевдонимы с символьными и жёсткими ссылками не имеют ничего общего.

Уже несколько десятков лет в ОС Unix существует два аналогичных псевдонимам решения: символьные и жёсткие ссылки. Символьная ссылка (symbolic link, symlink) — это указатель на другой файл. Местоположение оригинального файла указывается в виде текстовой строки, содержащей абсолютный или относительный путь. Символьные ссылки создаются командой ln с флагом -s. Вот пример:

% ls -l
-rw-r--r--  1 john  staff  894 Oct 18 10:04 myfile
% ln -s myfile mysymlink
% ls -l
-rw-r--r--  1 john  staff  894 Oct 18 10:04 myfile
lrwxr-xr-x  1 john  staff    6 Oct 18 10:06 mysymlink -> myfile

Судя по флагу «l» строки разрешений Unix (lrwxr-xr-x), файл mysymlink является символьнной ссылкой. Он указывает на файл myfile; это видно по стрелке «->» в выводе команды ls. Обратите внимание, что символьная ссылка очень маленькая: всего 6 байт. Это не случайность. Символьные ссылки содержат всего лишь путь к оригинальному файлу в виде строки. В нашем случае этой строкой является относительный путь к файлу myfile длинной ровно шесть символов.

Если переместить mysymlink в другую директорию, также содержащую файл myfile ссылка будет указывать уже на другой файл. Если удалить myfile, символьная ссылка останется и по-прежнему будет содержать тот же путь, но больше не будет вести к файлу. Проверим:

% rm myfile
% cat mysymlink
cat: mysymlink: No such file or directory

Сообщение об ошибке несколько сбивает с толку. Файл mysymlink существует. Но когда операционная система пытается его открыть, она послушно идёт по символьной ссылке и обнаруживает отсутсвие файла по ней. Тогда команда cat сообщает об ошибке при открытии исходного файла.

Эта простота символьных ссылок в некоторых случаях может оказаться полезной, но иногда нужен более мощный механизм. Тут нам помогут жёсткие ссылки.

Жёсткая ссылка — это просто указание на некоторые данные на диске. Файл следует рассматривать как комбинацию имени и указателя на определённые данные. При удалении файла удаляется только имя. Когда на область данных не указывает ни одно имя, она может быть использована для других файлов.

Бóльшая часть файлов имеют только одно имя. В сущности каждый файл является жёсткой ссылкой. Посмотрим ещё раз на myfile.

-rw-r--r--  1 john  staff  894 Oct 18 10:04 myfile

Видите единицу прямо перед словом «john»? Она указывает на то, что информация, связанная с именем myfile имеет только одно имя. Другими словами, удаление myfile сбросит счётчик на ноль, и файловая система разрешит использовать освободившееся место для других целей. Учтите, что создание символьной ссылки не увеличивает это число.

% ls -l
-rw-r--r--  1 john  staff  894 Oct 18 10:04 myfile
lrwxr-xr-x  1 john  staff    6 Oct 18 10:06 mysymlink -> myfile

Сама символьная ссылка содержит во втором столбце единицу, показывая, что к нашим шести байтам привязано только одно имя. Давайте теперь сделаем жёсткую ссылку, снова используя команду ln, но на этот раз без флагов.

% ln myfile myhardlink
% ls -l
-rw-r--r--  2 john  staff  894 Oct 18 10:04 myfile
-rw-r--r--  2 john  staff  894 Oct 18 10:04 myhardlink
lrwxr-xr-x  1 john  staff    6 Oct 18 10:06 mysymlink -> myfile

Теперь счётчик для myfile и myhardlink равен двум. Это показывает, что данные, с которыми связан myfile имеют два имени, и точно так же два имени есть у данных, связанных с myhardlink. В данном случае обе ссылки указывают на одну и ту же область данных, но это мы знаем только потому, что сами выполняли команду ln.

Несмотря на то, что размер обоих файлов myfile и myhardlink равен 894 байтам, эти 894 байта записаны на диск только один раз, а эта область данных имеет два имени. Ни myfile, ни myhardlink не являются «настоящими» файлами. Они оба настолько же настоящи, насколько настоящим был бы один из них со счётчиком ссылок равным единице.

Так как эти два файла указывают на одни и те же данные, результаты изменения этих данных будут отражены в каждом файле. Например, добавим пять байт к myfile (слово «test» плюс перевод строки):

% cat >> myfile
test
^D

Теперь посмотрим на результат.

% ls -l
total 24
-rw-r--r--  2 john  staff  899 Oct 18 10:38 myfile
-rw-r--r--  2 john  staff  899 Oct 18 10:38 myhardlink
lrwxr-xr-x  1 john  staff    6 Oct 18 10:06 mysymlink -> myfile

Размеры myfile и myhardlink равны теперь 899 байт (894 + 5). В то же время mysymlink по-прежнему является шестибайтовым символьным файлом со ссылкой на myfile.

Возвращаемся к Time Machine

Теперь давайте вернёмся к загадке десяти полных копий моего тома «Leopard Demo» в папке Backups.backupdb. Как вы наверное уже догадались, Time Machine использует жёсткие ссылки для указания на одни и те же данные несколько раз. Вот пример:

% cd Backups.backupdb/Leopard/2007-10-18-103601/Leopard Demo
% ls -l mach_kernel
-rw-r--r--@ 10 root  wheel  10235416 Sep 18 23:50 mach_kernel

Здесь хорошо видно: «10» рядом со словом «root» указывает на то, что существует 10 имён, связанных с теми же данными, на которые указывает mach_kernel. На том для резервного копирования Time Machine эти данные записаны только один раз. Жёсткие ссылки на этот файл будут добавляться до тех пор, пока при очередном резервном копировании он не окажется измененным.

Time Machine идёт на шаг дальше. Исторически сложилось, что Unix допускает создание жёстких ссылок только на файлы. В Leopard Apple добавила возможность создавать жёсткие ссылки на директории. Это было запрещено в Unix, потому что могло привести к разным видам бесконечных циклов при поиске файлов. Конечно, символьные ссылки тоже могут создать зацикливания, но их намного легче вычислить и предотвратить, потому что они легко отличимы от обычных файлов.

Тем не менее преимущества Time Machine были достаточно существенны, чтобы Apple аккуратно добавила эту возможность в Leopard. Например, если целая папка /System не изменилась со времени последнего резервного копирования, Time Machine всего лишь создаст на неё единственную жёсткую ссылку. Если бы не было поддержки жёстких ссылок для директорий, пришлось бы создавать 18 774 папок, содержащих 68 839 жёстких ссылок на файлы (пользуюсь числами со своей папки /System).

Да, директории и жёсткие ссылки сами по себе малы, но эти байты быстро растут, когда идёт речь о десятках тысяч жёстких ссылок, создающихся при каждом резервном копировании. Жёсткие ссылки для папок существенно увеличивают эффективность процесса.

Есть ещё одна маленькая умность в Time Machine. Как Time Machine узнаёт какие из файлов изменились со времени последнего резервного копирования? Ведь само приложение Time Machine запускается только для проведения резервного копирования; ей не нужно быть запущенной постоянно. Помогают ей отчёты файловой системы на уровне директорий. С помощью них Time Machine сканнирует директории на предмет наличия изменённых файлов и быстро находит обновлённые файлы.

Последствия реализации

К сожалению, на этом умения Time Machine и заканчиваются. Наименьшая единица данных, которую она обрабатывает — это файл. Это значит, что если вы измените один байт в 10-гигабайтном файле, придётся делать новую резервную копию всего файла. Жёсткая ссылка тут не поможет. Нельзя создать жёсткую ссылку на «9 999 999 гигабайт старых данных плюс один байт новых данных».

Конечно, это наихудший сценарий для системы резервного копирования файлового уровня, какой является Time Machine, но как часто необходимо изменять небольшую часть огромного файла? Бывает по-разному. Мне приходят в голову два случая, которые могут повлиять на тысячи пользователей Macintosh.

Во-первых, если вы пользуетесь Microsoft Entourage, ваша почта хранится в одном большом файле базы данных. Моя занимает около 2 гигабайт. А большинство людей получают новую почту каждый день!

Во-вторых, если вы пользуетесь виртуализаторами типа VMware или Parallels, каждая виртуальная машина имеет многогигабайтный файл образа, который существенно изменяется каждый раз, когда вы её используете.

Как много пользователей виртуальных машин или Entourage? Наверное, их количество измеряется тысячами и, вероятно, растёт.

Годами среди разработчиков Apple продвигала принцип использования большого количества маленьких файлов вместо больших, в основном для того, чтобы Spotlight’у было легче индексировать данные программ. В ОС Tiger изменили приложение Mail так, чтобы каждое письмо и вложения хранились в отдельных файлах вместо монолитной почтовой базы данных. Но в случае с файлами виртуальных машин проблему не обойти. Они, скорее всего, будут наибольшими файлами на большинстве дисков.

Тем не менее, меры принимать надо. Лучшим решением для Apple будет переход к новой файловой системе, поддерживающей снимки на уровне блоков. Подойдёт, например, ZFS. К сожалению, в Leopard этот переход не осуществили. Time Machine делает резервные копии на том HFS+ (хотя в ОС Leopard имеется поддержка ZFS в режиме только для чтения, а также экспериментальная поддержка чтения-записи, доступная разработчикам).

Внедрение в Time Machine ZFS или другой файловой системы с подобными возможностями дало бы большой выигрыш в использовании дискового пространства. К сожалению, сделать это тяжело, поэтому не стоит ждать такого нововведения, по крайней мере, до выхода OS 10.6.

Между тем, можно исключить отдельные файлы от Time Machine добавлением их в список «Do not back up» в настройках Time Machine.

Ещё формат сохранения резервных копий подразумевает невозможность загрузки с тома Time Machine. Вместо этого можно загузиться с установочного диска Leopard и восстановить резервную копию Time Machine. Если вы, как и я, предпочитаете иметь под рукой резервную копию, с которой можно загрузиться, без приложения типа SuperDuper не обойтись.

С оптимистичной точки зрения, формат резервной копии совершенно и не является никаким форматом. Это просто кучка простых файлов на диске в папках, именованных датами. Не нравится головокружительный космический интерфейс восстановления файлов Finder? Не пользуйтесь им. Вы можете сами походить по папке Backups.backupdb с помощью Finder, командной строки или любого другого файлового менеджера. Но наибольшим преимуществом является то, что любой разработчик может внедрить Time Machine в своё приложение.

Просто, правда?

Несмотря на то, что Apple не смогла выпустить преемника древней файловой системы HFS+, Time Machine выполняет задачу, которая ранее была очень сложной и устрашающей. Как и любая гениальная идея, она выглядит вполне понятной при ближайшем рассмотрении, но это нисколько не уменьшает её достоинства.

Время покажет, достигнет ли Apple с помощью Time Machine своей цели — выполнения регулярного резервного копирования 100 процентами пользователей, — но в любом случае свой след в истории оставит. Time Machine — буквально единственный способ, который приходит на ум, для запуска системы резервного копирования путём консультации по телефону. Просто нужно попросить купить внешний накопитель, подключить его и нажать кнопку в диалоговом окне.

Открытый формат резервного копирования и интерфейса для разработчиков — вот правильный путь лёгкого добавления важной функции. Дайте разработчикам улучшать систему, и они будут вас любить. Time Machine уверенно занимает место отличительной черты Mac OS X Leopard. Хорошая работа, Apple!

Первая часть статьи доступна здесь.