Включить собственные символические ссылки NTFS для Cygwin

Недавние NTFS и Windows реализуют символические ссылки:

  • точка соединения NTFS может использоваться как символическая ссылка каталога с NTFS 3.0 (Windows 2000) с использованием инструментов linkd или junction.
  • символическая ссылка NTFS также может использоваться в качестве символической ссылки (для файла и каталога) с Windows Vista с помощью инструмента mklink.

Но на Cygwin 1.7 (установленном в Windows 7) ln -s создает текстовый файл.

на Cygwin:

$ ln -s -v target mylink
`mylink' -> `target'

на MinGW (или ваш любимый редактор):

$ cat mylink
!<symlink>ÿþt a r g e t 

Можно ли сказать Cygwing использовать точку соединения NTFS или символическую ссылку NTFS?

другой вопрос: Доступно ли это на MinGW?

Ответ 1

⸻⸻⸻ Короткий ответ ⸻⸻⸻

Определите переменную среды:

CYGWIN=winsymlinks:nativestrict

Как указал mwm, вам также может понадобиться запустить от имени администратора.

⸻⸻⸻ длинный ответ ⸻⸻⸻

Симлинки по умолчанию - это обычные файлы

По умолчанию Cygwin создает текстовые файлы в качестве обходного пути для ошибки символьной ссылки Windows. Эти файлы не являются символическими ссылками. Почти все программы Windows не рассматривают эти файлы как символические ссылки.

Родные символические ссылки доступны в последних версиях Windows

Последние NTFS и Windows реализуют символические ссылки:

  • Точка соединения NTFS может использоваться в качестве символьной ссылки на каталог, начиная с NTFS 3.0 (Windows 2000) с использованием linkd или junction.
  • Символическая ссылка NTFS также может использоваться как символическая ссылка (как для файла, так и для каталога), поскольку в Windows Vista используется инструмент mklink.

Cygwin может создавать собственные символические ссылки NTFS

Упрощенная выписка документации Cygwin:

Символические ссылки

[...]

Cygwin создает символические ссылки потенциально различными способами:

  • Символические ссылки по умолчанию представляют собой простые файлы, содержащие магический файл cookie, за которым следует путь, на который указывает ссылка. [...]

  • Символьные ссылки в стиле ярлыков создаются в Windows .lnk [...], если переменная окружения CYGWIN [...] установлена на строку winsymlinks или winsymlinks:lnk. [...]

  • Собственные символические ссылки Windows создаются только в Windows Vista/2008 и более поздних версиях и только в файловых системах, поддерживающих точки повторной обработки. Из-за их странных ограничений и поведения они создаются только в том случае, если пользователь явно запрашивает их создание. Это делается путем установки переменной среды CYGWIN, которая будет содержать строку winsymlinks:native или winsymlinks:nativestrict. [...]

  • В файловой системе NFS Cygwin всегда создает реальные символические ссылки NFS.

Конфигурирование Cygwin

Руководство пользователя Cygwin представляет переменную CYGWIN и опцию winsymlinks:

Переменная окружения CYGWIN используется для настройки многих глобальных настроек [...]. Он содержит параметры, перечисленные ниже, разделенные пробелами. [...]

  • [...]
  • [...]
  • [...]
  • [...]
  • winsymlinks:{lnk,native,nativestrict} - если задано просто winsymlinks или winsymlinks:lnk, Cygwin создает символические ссылки в виде ярлыков Windows со специальным заголовком и набором атрибутов R/O.

    Если установлено значение winsymlinks:native или winsymlinks:nativestrict, Cygwin создает символические winsymlinks:nativestrict как собственные символические winsymlinks:nativestrict Windows в файловых системах и версиях ОС, поддерживающих их. Если известно, что ОС не поддерживает собственные символические ссылки (Windows XP, Windows Server 2003), предупреждающее сообщение выдается один раз за сеанс.

    Разница между winsymlinks:native и winsymlinks:nativestrict заключается в следующем: если файловая система поддерживает нативные символические ссылки, и Cygwin по какой-то причине не может создать нативную символическую ссылку, он будет вынужден создавать стандартные символические winsymlinks:native Cygwin с winsymlinks:native, а с winsymlinks:nativestrict системный вызов symlink(2) немедленно завершится ошибкой.

CYGWIN=winsymlinks:native
всегда создает ссылку, но использует запасной вариант Cygwin, когда цель не существует

на Cygwin:

$ export CYGWIN="winsymlinks:native"
$ ln -s -v target mylink
'mylink' -> 'target'
$ echo content > target

на MinGW:

$ cat mylink
content

Люди, использующие программы как Windows, так и Cygwin, могут иметь проблемы, когда символическая ссылка создается как фиктивный файл (резервный Cygwin, если цель отсутствует)...

CYGWIN=winsymlinks:nativestrict
всегда использует символическую ссылку native-Windows, но не работает, если цель не существует

на Cygwin:

$ export CYGWIN="winsymlinks:nativestrict"
$ rm -f  a b
$ ln -sv a b
ln: failed to create symbolic link 'b': No such file or directory
$ touch    b
$ ln -sv a b
ln: failed to create symbolic link 'b': File exists
$ rm b
$ touch a
$ ln -sv a b
'b' -> 'a'

Поскольку nativestrict требует, чтобы цель существовала до создания символической ссылки, некоторые команды/сценарии могут не работать при создании ссылки.

Примечание. Только администраторы могут создавать собственные символические ссылки NT, поэтому в Windows UAC эмулятор терминала Cygwin (mintty) должен запускаться с повышенными привилегиями (щелкните правой кнопкой мыши ярлык и выберите "Запуск от имени администратора" или задайте свойство ярлыка mintty, Дополнительно → Запустить от имени администратора).

Отдельное спасибо Guria и Spooky за их вклад.

Ответ 2

Принятый ответ правильный, две маленькие примечания.

Если вы только заботитесь о символических ссылках, которые вы создаете в командной строке, установите пакет cygutils-extra, он включает в себя команду winln, которая имеет тот же синтаксис, что и ln, но создает родные ссылки Windows. Создайте псевдоним: alias ln=winln (работает только в интерактивной оболочке) или даже замените файл ln на winln (также работает в сценариях оболочки) - но он может быть перезаписан при следующем обновлении пакета coreutils.

Я только выяснил, что можно использовать собственные символические ссылки, когда я уже установил Cygwin, и добавил некоторые символические ссылки. Поэтому после того, как я установил CYGWIN=winsymlinks:native в качестве переменной моей системной среды, мне захотелось преобразовать все существующие неродные ссылки в native. Вот что я сделал.

На всякий случай сначала создайте резервную копию всего каталога Cygwin.

Найти все символические ссылки и сохранить список в /links файле: cd /; find . -regextype egrep -regex './(dev|proc|mnt|cygdrive)' -prune -o -type l -print >links

Обзор links. Создайте архив tar со всеми ссылками: tar c --files-from=links >links.tar

Извлеките архив tar: tar x --files-from=links <links.tar Поскольку встроенные символические ссылки теперь включены, tar будет перезаписывать старые символические ссылки Cygwin с родными символическими ссылками.

Очистка: rm -f links links.tar

P.S. Сначала я использовал CYGWIN=winsymlinks:nativestrict, но потом выяснил, что в этом режиме ln -s target link терпит неудачу, если target не существует. Напротив, native создаст символическую ссылку Cygwin (non-native) link, указывающую на несуществующий target - это соответствует поведению ln в системах UNIX. В редких случаях nativestrict может разорвать некоторые программы или скрипты, например Gentoo run-crons script использует файл блокировки, который является символической ссылкой, указывающей на PID текущего процесса. В режиме nativestrict script перестает работать, потому что он больше не может создавать файл блокировки. Примечание: run-crons является помощником crontab script на Gentoo Linux, добавив поддержку cron.{hourly,daily,weekly,monthly}/ dirs, он отлично работает с Cygwin.

Ответ 3

Так как ответ @olibre не работал у меня. Я просто создал функцию оболочки.

: '
mklink - Create NTFS (Windows) links that is usable by Windows and Cygwin

Usage: mklink [/D | /H | /J] <link-path> <target-path>

Options:
    /D    Directory Symbolic Link
    /H    Hardlink
    /J    Directory Junction (you should prefer /D)

With no options, it creates a NTFS file symlink.
'
mklink () {

    if [ "$#" -ge "3" ]; then
        cmd /c mklink "$1" "$(cygpath --windows --absolute "$2")" "$(cygpath --windows --absolute "$3")"
    else
        cmd /c mklink "$(cygpath --windows --absolute "$1")" "$(cygpath --windows --absolute "$2")"
    fi

}

Обратите внимание, что вам нужны права администратора (для Cygwin), чтобы запустить вышеуказанный без проблем.

Обратите внимание, что я не знаю, существует ли какая-либо разница между символической привязкой к абсолютному пути и символической привязкой к относительному пути с использованием CMD mklink. В Linux эти 2 имеют разные типы поведения, если вы когда-либо решаете перемещать символическую ссылку или перемещать целевой файл или перемещать оба.

Ответ 4

Я думаю, что самый простой способ

1) предоставить SeCreateSymbolicLinkPrivelege из редактора локальной групповой политики (gpedit.msc, по умолчанию путь, не домашние версии)

2) создать скрипт с именем ln on path (batch или bash), реализация которого аналогична описанной выше функции оболочки

3) прибыль

Ответ 5

Вероятно, вы искали способ добраться до другого места в дереве каталогов с помощью MSYS. Есть выход. Вы должны создать файл оболочки script ( "*.sh" ), который содержит строку:

cd "/drive_letter/SubCatalogue/SubFolder/..."