it-swarm.com.de

Aktivieren Sie native symbolische NTFS-Links für Cygwin

Kürzlich verwendete NTFS- und Windows-Symlinks:

  • NTFS-Verzweigungspunkt kann seit NTFS 3.0 (Windows 2000) als Verzeichnissymbollink mit den Tools linkd oder junction verwendet werden.
  • NTFS-symbolischer Link kann seit Windows Vista mit dem mklink-Tool auch als Symlink (für Datei und Verzeichnis) verwendet werden.

Bei Cygwin 1.7 (installiert unter Windows 7) erstellt ln -s jedoch eine Textdatei.

auf Cygwin:

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

bei MinGW (oder Ihrem bevorzugten Editor):

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

Kann Cygwing angewiesen werden, NTFS-Knotenpunkt oder symbolischer NTFS-Link zu verwenden?

andere Frage: Ist das bei MinGW verfügbar? 

43
olibre

⸻⸻⸻ Kurze Antwort ⸻⸻⸻

Umgebungsvariable definieren:

CYGWIN=winsymlinks:nativestrict

Wie von mwm ausgeführt, müssen Sie möglicherweise auch bash als Administrator ausführen.

⸻⸻⸻ Lange Antwort ⸻⸻⸻

Cygwin-Standard-Symlinks sind nur reguläre Dateien

Standardmäßig erstellt Cygwin Textdateien als Problemumgehung für Windows Symlink-Fehler . Diese Dateien sind nicht wirklich Symlinks . Fast alle Windows-Programme betrachten diese Dateien nicht als Symlinks.

In aktuellen Windows-Versionen sind systemeigene Symlinks verfügbar

Kürzlich verwendete NTFS- und Windows-Symlinks:

  • NTFS-Knotenpunkt kann als Verzeichnissymbollink Seit NTFS 3.0 (Windows 2000) verwendet werden, wobei linkd- oder junction-Tools verwendet werden.
  • NTFS symbolischer Link kann auch als Symlink (Für Datei und Verzeichnis) verwendet werden, seit Windows Vista das mklink-Tool verwendet.

Cygwin kann native NTFS-Symlinks erstellen

Vereinfachter Auszug aus der Cygwin-Dokumentation :

Symbolische Links

[...]

Cygwin erstellt symbolische Links auf verschiedene Arten:

  • Die Standard-Symlinks sind einfache Dateien mit einem magischen Cookie gefolgt von dem Pfad, auf den der Link verweist. [...]

  • Die symbolischen Verknüpfungen im Verknüpfungsstil werden von Windows .lnk [...] erstellt wenn die Umgebungsvariable CYGWIN [...] auf .__ gesetzt ist. die Zeichenfolge winsymlinks oder winsymlinks:lnk. [...]

  • Native Windows-Symlinks werden nur unter Windows Vista/2008 und höher erstellt. und nur auf Dateisystemen, die Reparse-Punkte unterstützen. Aufgrund ihrer seltsamen Einschränkungen und ihres Verhaltens werden sie nur erstellt wenn der Benutzer explizit anfordert, sie zu erstellen. Dies erfolgt durch Setzen der Umgebungsvariablen CYGWIN um die Zeichenfolge winsymlinks:native oder winsymlinks:nativestrict..__ zu enthalten. [...]

  • Auf dem NFS-Dateisystem erstellt Cygwin immer echte NFS-Symlinks.

Cygwin konfigurieren

Cygwin Benutzerhandbuch präsentiert die Variable CYGWIN und die Option winsymlinks:

Die Umgebungsvariable CYGWIN wird zum Konfigurieren vieler globaler Einstellungen [...] ..__ verwendet. Es enthält die unten aufgeführten Optionen, die durch Leerzeichen getrennt sind. [...]

  • [...]
  • [...]
  • [...]
  • [...]
  • winsymlinks:{lnk,native,nativestrict} - Wenn nur winsymlinks oder winsymlinks:lnk eingestellt ist, erstellt Cygwin Symlinks als Windows-Verknüpfungen mit einem speziellen Header und dem R/O-Attributsatz.

    Wenn auf winsymlinks:native oder winsymlinks:nativestrict eingestellt ist, Cygwin erstellt Symlinks als native Windows-Symlinks zu Dateisystemen und Betriebssystemversionen, die sie unterstützen. Wenn bekannt ist, dass das Betriebssystem .__ nicht unterstützt. systemeigene symbolische Links (Windows XP, Windows Server 2003), eine Warnmeldung wird einmal pro Sitzung produziert.

    Der Unterschied zwischen winsymlinks:native und winsymlinks:nativestrict ist dies: Wenn das Dateisystem native .__ unterstützt. Symlinks und Cygwin kann aus irgendeinem Grund keinen systemeigenen Symlink erstellen, Es wird darauf zurückgegriffen, Cygwin-Standard-Symlinks mit .__ zu erstellen. winsymlinks:native, während mit winsymlinks:nativestrict Der Systemaufruf symlink(2) schlägt sofort fehl.

CYGWIN=winsymlinks:native 
Erstellt immer einen Link, verwendet jedoch einen Cygwin-Fallback, wenn das Ziel nicht vorhanden ist

auf Cygwin:

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

auf MinGW:

$ cat mylink
content

Benutzer, die sowohl Windows- als auch Cygwin-Programme verwenden, haben möglicherweise Probleme, wenn ein Symlink als Dummy-Datei erstellt wird (Cygwin-Fallback, wenn das Ziel fehlt).

CYGWIN=winsymlinks:nativestrict 
verwendet immer den systemeigenen Windows-Symlink, schlägt jedoch fehl, wenn das Ziel nicht vorhanden ist

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

Da nativestrict voraussetzt, dass das Ziel vor der Symlink-Erstellung vorhanden ist, schlagen einige Befehle/Skripts möglicherweise fehl, wenn eine Verknüpfung erstellt wird.

Hinweis: Nur Administratoren können systemeigene NT-Symlinks erstellen Wählen Sie Als Administrator ausführen oder legen Sie die Mintty-Verknüpfungseigenschaft fest, Erweitert → Als Administrator ausführen).

Besonderer Dank geht an Guria und Spooky für ihre Beiträge.

70
olibre

Die akzeptierte Antwort ist richtig, zwei kleine Anmerkungen.

Wenn Sie sich nur für die Symlinks interessieren, die Sie in der Befehlszeile erstellen, installieren Sie das Paket cygutils-extra. Es enthält den Befehl winln, der dieselbe Syntax wie ln hat, aber native Windows-Links erstellt. Erstellen Sie einen Alias: alias ln=winln (funktioniert nur in der interaktiven Shell), oder ersetzen Sie sogar die ln-Datei durch winln (funktioniert auch in Shell-Skripts) - sie wird jedoch beim nächsten Aktualisieren des coreutils-Pakets überschrieben.

Ich habe nur herausgefunden, dass es möglich ist, native Symlinks zu verwenden, wenn ich bereits Cygwin installiert hatte, und einige Symlinks von mir selbst hinzugefügt. Nachdem ich CYGWIN=winsymlinks:native als Systemumgebungsvariable festgelegt hatte, wollte ich alle vorhandenen nicht-nativen Links in native konvertieren. Hier ist was ich getan habe.

Nur für den Fall, sichern Sie zuerst Ihr gesamtes Cygwin-Verzeichnis.

Finden Sie alle Symlinks und speichern Sie die Liste in /links-Datei: cd /; find . -regextype egrep -regex './(dev|proc|mnt|cygdrive)' -Prune -o -type l -print >links

links..__ überprüfen: Erstellen Sie ein tar-Archiv mit allen Links: tar c --files-from=links >links.tar

Extrahieren Sie das tar-Archiv: tar x --files-from=links <links.tar Da native Symlinks jetzt aktiviert sind, überschreibt tar die alten Cygwin-Symlinks mit nativen Symlinks.

Aufräumen: rm -f links links.tar

P.S. Zuerst habe ich CYGWIN=winsymlinks:nativestrict verwendet, aber dann habe ich herausgefunden, dass ln -s target link in diesem Modus fehlschlägt, wenn target nicht existiert. Im Gegensatz dazu erstellt native ein Cygwin-Symbol (nicht-systemeigenes Symbol) link, das auf die nicht vorhandene target verweist. Dies entspricht dem Verhalten von ln auf UNIX-Systemen. In seltenen Fällen kann nativestrict einige Programme oder Skripts beschädigen. Beispielsweise verwendet das run-crons-Skript von Gentoo eine Sperrdatei, die ein Symlink ist, der auf die PID des laufenden Prozesses zeigt. Im nativestrict-Modus funktionierte das Skript nicht mehr, da die Sperrdatei nicht mehr erstellt werden konnte. Hinweis: run-crons ist ein Crontab-Hilfsskript unter Gentoo Linux, das Unterstützung für cron.{hourly,daily,weekly,monthly}/-Verzeichnisse hinzufügt. Es funktioniert sehr gut mit Cygwin.

7
Gene Pavlovsky

Da @olibre antwortete bei mir nicht. Ich habe gerade eine Shell-Funktion erstellt.

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

}

Beachten Sie, dass Sie Administratorberechtigungen (für Cygwin) benötigen, um die oben genannten Probleme ohne Probleme ausführen zu können.

Beachten Sie, dass ich nicht weiß, ob es einen Unterschied gibt zwischen einer Symlink-Verknüpfung mit einem absoluten Pfad und einer Symlink-Verknüpfung mit einem relativen Pfad mit CMDs mklink. Unter Linux haben diese beiden ein anderes Verhalten, wenn Sie sich entscheiden, den Symlink oder die Zieldatei oder beide zu verschieben.

2
CMCDragonkai

Ich denke, der einfachste Weg ist es

  1. grant SeCreateSymbolicLinkPrivilege aus dem Editor für lokale Gruppenrichtlinien (gpedit.msc, standardmäßig Pfad, nicht Home-Versionen)

  2. erstellen Sie ein Skript mit dem Namen ln im Pfad (batch oder bash), Implementierung ähnlich der oben beschriebenen Shell-Funktion

  3. profitieren

0
Agnes K. Cathex