web-dev-qa-db-fra.com

Activer les liens symboliques NTFS natifs pour Cygwin

NTFS et Windows récents implémentent des liens symboliques:

  • Le point de jonction NTFS peut être utilisé comme lien symbolique de répertoire depuis NTFS 3.0 (Windows 2000) à l'aide des outils linkd ou junction.
  • Le lien symbolique NTFS peut également être utilisé comme lien symbolique (pour le fichier et le répertoire) depuis Windows Vista à l'aide de l'outil mklink.

Mais sur Cygwin 1.7 (installé sur Windows 7), ln -s crée un fichier texte.

sur Cygwin:

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

sur MinGW (ou votre éditeur préféré):

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

Est-il possible de dire à Cygwing d'utiliser le point de jonction NTFS ou le lien symbolique NTFS ?

autre question: Est-ce disponible sur MinGW? 

43
olibre

⸻⸻⸻ Réponse courte ⸻⸻⸻

Définir la variable d'environnement:

CYGWIN=winsymlinks:nativestrict

Comme indiqué par mwm , vous devrez peut-être également exécuter bash en tant qu’administrateur.

⸻⸻⸻ Longue réponse ⸻⸻⸻

Les liens symboliques par défaut Cygwin ne sont que des fichiers normaux

Par défaut, Cygwin crée des fichiers texte comme solution de contournement pour la faille de lien symbolique Windows . Ces fichiers ne sont pas vraiment liens symboliques . La plupart des programmes Windows ne les considèrent pas comme des liens symboliques.

Les liens symboliques natifs sont disponibles sur les versions récentes de Windows

NTFS et Windows récents implémentent des liens symboliques:

  • Le point de jonction NTFS peut être utilisé comme lien symbolique de répertoire Depuis NTFS 3.0 (Windows 2000) à l’aide des outils linkd ou junction.
  • Le lien symbolique NTFS peut également être utilisé comme lien symbolique .__ (pour le fichier et le répertoire) depuis Windows Vista à l'aide de l'outil mklink.

Cygwin peut créer des liens symboliques natifs NTFS

Extrait simplifié de la documentation Cygwin :

Liens symboliques

[...]

Cygwin crée potentiellement des liens symboliques de plusieurs manières différentes:

  • Les liens symboliques par défaut sont des fichiers simples contenant un cookie magique suivi du chemin sur lequel pointe le lien. [...]

  • Les liens symboliques de style de raccourci sont créés par Windows .lnk [...] si la variable d'environnement CYGWIN [...] est définie pour contenir la chaîne winsymlinks ou winsymlinks:lnk. [...]

  • Les liens symboliques Windows natifs ne sont créés que sous Windows Vista/2008 et les versions ultérieures, et uniquement sur les systèmes de fichiers prenant en charge les points d'analyse. En raison de leurs restrictions et de leur comportement étranges, ils ne sont créés que si l'utilisateur demande explicitement de les créer. Ceci est fait en définissant la variable d'environnement CYGWIN contenir la chaîne winsymlinks:native ou winsymlinks:nativestrict. [...]

  • Sur le système de fichiers NFS, Cygwin crée toujours de véritables liens symboliques NFS.

Configuration de Cygwin

Guide de l'utilisateur Cygwin présente la variable CYGWIN et l'option winsymlinks:

La variable d'environnement CYGWIN permet de configurer de nombreux paramètres globaux [...] . Il contient les options énumérées ci-dessous, séparées par des caractères vides. [...]

  • [...]
  • [...]
  • [...]
  • [...]
  • winsymlinks:{lnk,native,nativestrict} - si elle est définie uniquement sur winsymlinks ou winsymlinks:lnk, Cygwin crée des liens symboliques en tant que raccourcis Windows avec un en-tête spécial et l'ensemble d'attributs R/O.

    Si défini sur winsymlinks:native ou winsymlinks:nativestrict, Cygwin crée des liens symboliques sous forme de liens symboliques Windows natifs sur des systèmes de fichiers et les versions d'OS les supportant. Si on sait que le système d'exploitation ne prend pas en charge Liens symboliques natifs (Windows XP, Windows Server 2003), un message d'avertissement est produit une fois par session.

    La différence entre winsymlinks:native et winsymlinks:nativestrict est ceci: Si le système de fichiers prend en charge natif Liens symboliques et Cygwin ne parvient pas à créer un lien symbolique natif pour une raison quelconque, il faudra revenir à la création de liens symboliques par défaut avec Cygwin avec winsymlinks:native, alors que avec winsymlinks:nativestrict l'appel système symlink(2) échouera immédiatement.

CYGWIN=winsymlinks:native 
crée toujours un lien mais utilise une solution de secours Cygwin lorsque la cible n'existe pas

sur Cygwin:

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

sur MinGW:

$ cat mylink
content

Les personnes utilisant à la fois Windows et les programmes Cygwin peuvent avoir des problèmes lorsqu'un lien symbolique est créé en tant que fichier factice (remplacement de Cygwin lorsque la cible est manquante) ...

CYGWIN=winsymlinks:nativestrict 
utilise toujours le lien symbolique natif de Windows mais échoue lorsque la cible n'existe pas

sur 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'

Étant donné que nativestrict requiert que la cible existe avant la création du lien symbolique, certaines commandes/scripts peuvent échouer lors de la création d'un lien.

Remarque: Seuls les administrateurs ont la possibilité de créer des liens symboliques NT natifsSo sous Windows UAC, l'émulateur de terminal Cygwin (mintty) Doit être exécuté avec des privilèges élevés (Cliquez avec le bouton droit sur le raccourci et choisissez Exécuter en tant qu'administrateur ou définissez la propriété de raccourci menthe, Avancé → Exécuter en tant qu'administrateur).

Un merci spécial à Guria et Spooky pour leurs contributions.

70
olibre

La réponse acceptée est la bonne, deux petites notes.

Si vous ne vous souciez que des liens symboliques que vous créez vous-même sur la ligne de commande, installez le package cygutils-extra, qui inclut une commande winln, qui a la même syntaxe que ln, mais crée des liens Windows natifs. Créez un alias: alias ln=winln (ne fonctionne que dans le shell interactif), ou remplacez même le fichier ln par winln (fonctionne également dans les scripts du shell) - mais il pourrait être écrasé à la prochaine mise à jour du paquet coreutils.

J'ai seulement découvert qu'il était possible d'utiliser des liens symboliques natifs alors que j'avais déjà installé Cygwin, et que j'avais également ajouté quelques liens symboliques. Ainsi, après avoir défini CYGWIN=winsymlinks:native comme variable d’environnement système, je souhaitais convertir tous les liens non natifs existants en natifs. Voici ce que j'ai fait.

Juste au cas où, sauvegardez d'abord tout votre répertoire Cygwin.

Recherchez tous les liens symboliques et enregistrez la liste dans le fichier /links: cd /; find . -regextype egrep -regex './(dev|proc|mnt|cygdrive)' -Prune -o -type l -print >links

Passez en revue links. Créez une archive tar avec tous les liens: tar c --files-from=links >links.tar

Extrayez l'archive tar: tar x --files-from=links <links.tar Comme les liens symboliques natifs sont maintenant activés, tar remplacera les liens symboliques de l'ancien Cygwin par des liens symboliques natifs.

Nettoyer: rm -f links links.tar

P.S. Au début, j'ai utilisé CYGWIN=winsymlinks:nativestrict, mais j'ai découvert que dans ce mode, ln -s target link échoue si target n'existe pas. En revanche, native créera un lien symbolique Cygwin (non natif) link pointant vers la variable target non existante - ceci correspond au comportement de ln sur les systèmes UNIX. Dans de rares cas, nativestrict peut interrompre certains programmes ou scripts, par exemple, le script Gentoo run-crons utilise un fichier de verrouillage qui est un lien symbolique pointant vers le PID du processus en cours d'exécution. En mode nativestrict, le script a cessé de fonctionner car il ne pouvait plus créer le fichier de verrouillage. Remarque: run-crons est un script d’aide crontab sous Gentoo Linux, qui prend en charge les répertoires cron.{hourly,daily,weekly,monthly}/ et fonctionne très bien avec Cygwin.

7
Gene Pavlovsky

Depuis @olibre answer n'a pas fonctionné pour moi. Je viens de créer une fonction Shell.

: '
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

}

Notez que vous avez besoin d'autorisations d'administrateur (pour Cygwin) pour exécuter ce qui précède sans problèmes.

Notez que je ne sais pas s’il existe une différence entre une liaison symbolique vers un chemin absolu et une liaison symbolique vers un chemin relatif utilisant la variable mklink de CMD. Sous Linux, ces deux comportements ont des comportements différents si vous décidez de déplacer le lien symbolique ou de déplacer le fichier cible, ou de déplacer les deux.

2
CMCDragonkai

Je suppose que le moyen le plus simple est de

  1. grant SeCreateSymbolicLinkPrivilege à partir de l'éditeur de stratégie de groupe locale (gpedit.msc, sur le chemin par défaut, versions non domestiques)

  2. créer un script nommé ln sur le chemin (batch ou bash), implémentation semblable à la fonction Shell décrite ci-dessus

  3. profit

0
Agnes K. Cathex