Почему я не могу создать жесткую ссылку на символическую ссылку на томе macOS HFS+?

Вопрос или проблема

Это началось как проблема с rsync --link-dest, которая вызвала ошибку Operation not supported (45) для каждого символической ссылки, для которой он пытался создать жесткую ссылку.

Некоторые эксперименты показали, что это не специфично для rsync и может быть воспроизведено в командной строке следующим образом:

touch x
ln -s x x1
ln -P x1 x2
ln: x.2: Операция не поддерживается

Немного дополнительной информации:

  • MacOS Sonoma 14.5.
  • Объем, о котором идет речь, находится на внешнем диске, который пришел с более старого Mac.
  • Это работало на том старом Mac (macOS Mojave 10.14.6).
  • Вышеупомянутые команды оболочки работают на старом Mac.
  • Объем, о котором идет речь, представляет собой “Mac OS Extended (с учетом регистра, журналируемый)” (HFS+).
  • Вышеупомянутые команды оболочки работают на объеме APFS.

Я потратил некоторое время на поиск доступного исходного кода macOS и обнаружил, что создание жестких ссылок на символические ссылки на объемах HFS+ явно запрещено в коде HFS. В macos/hfs/core/hfs_link на строке 442 находится следующий код:

/*
 * операция ссылки vnode
 *
 *  IN vnode_t  a_vp;
 *  IN vnode_t  a_tdvp;
 *  IN struct componentname  *a_cnp;
 *  IN vfs_context_t  a_context;
 */
int
hfs_vnop_link(struct vnop_link_args *ap)
{
    ...
    /*
     * На данный момент вернуть ENOTSUP для цели символической ссылки. Это может происходить
     * при вызове linkat(2) без AT_SYMLINK_FOLLOW.
     */
    if (v_type == VLNK)
        return (ENOTSUP);

Обратите внимание, что перед этим есть проверка HFS_STANDARD, который является “не-плюсовым” форматом HFS и не применим в этом случае.

Замечу, что я далек от того, чтобы быть экспертом по исходникам macOS, но это определенно выглядит как правильный код.

Ответ или решение

Вы не можете создать жесткую ссылку на символическую ссылку на томе macOS с файловой системой HFS+ из-за ограничений, наложенных на файловую систему. Данная проблема, которую вы наблюдаете, связана с параметрами схемы управления ссылками в HFS+.

Как вы уже выяснили, при выполнении команды ln -P x1 x2, где x1 является символической ссылкой на файл x, система возвращает ошибку Operation not supported (45). Данная ошибка возникает из-за того, что HFS+ не поддерживает создание жестких ссылок на символические ссылки. В коде, соответствующем HFS, присутствует явная проверка, которая возвращает ENOTSUP (операция не поддерживается), если тип v_type указан как VLNK, что обозначает символическую ссылку.

Вы также упомянули, что на предыдущей версии macOS (Mojave 10.14.6) такая операция работала, однако это может быть связано с различиями в реализации системных вызовов или обработке файловых операций между версиями macOS. На HFS+ томах, которые были созданы в более ранних версиях системы, возможны некоторые нестыковки, но основной принцип остается неизменным.

В отличие от HFS+, файловая система APFS не накладывает таких ограничений, и, как вы заметили, создание жесткой ссылки на символическую ссылку возможно, что подтверждает различия между этими файловыми системами.

Таким образом, чтобы обойти данное ограничение, вы можете:

  1. Избежать создания жестких ссылок на символические ссылки. Вместо этого можно использовать символические ссылки напрямую, если это допустимо в вашем случае.

  2. Если возможно, перенести данные на APFS том, где поддерживается создание жестких ссылок на символические ссылки.

В заключение, ваше понимание проблемы и анализ приведенного вами кода на C показывают, что вы на правильном пути. Однако в текущем состоянии HFS+ имеет свои ограничения, с которыми нужно работать, учитывая специфику файловой системы.

Оцените материал
Добавить комментарий

Капча загружается...