"Direktori junction" vs "direktori symbolic link"?

394

Dalam konteks NTFS:

MKLINK [[/D] | [/H] | [/J]] Link Target

/D Membuat tautan simbolis direktori. Default adalah tautan simbolis file.
/H Membuat tautan keras alih-alih tautan simbolis.
/J Membuat Persimpangan Direktori.
Link menentukan nama tautan simbolik baru.
Target menentukan jalur (relatif atau absolut) yang dirujuk oleh tautan baru.

  1. Bukankah persimpangan direktori sama persis dengan tautan simbolik direktori ?

    Apa perbedaan antara mklink /D f1 f2dan mklink /J f1 f2?

  2. Karena "direktori" sebenarnya hanya sebuah file , apa perbedaan antara tautan simbolik direktori dan tautan simbolik file?

Pacerier
sumber
2
Terkait: superuser.com/q/347930/24500
surfasb

Jawaban:

365

Persimpangan jelas bukan hal yang sama dengan tautan simbolik direktori, meskipun mereka berperilaku serupa. Perbedaan utama adalah bahwa, jika Anda melihat server jarak jauh, persimpangan diproses di server dan tautan simbolik direktori diproses di klien . Juga lihat komentar Matthew tentang fakta bahwa ini berarti tautan simbolik pada sistem file lokal dapat mengarah ke sistem file jarak jauh.

Misalkan pada mesin bernama Alice Anda harus meletakkan titik persimpangan c:\myjpdan tautan simbolik direktori c:\mysymlink, keduanya menunjuk ke c:\targetfolder. Saat Anda menggunakan Alice, Anda tidak akan melihat banyak perbedaan di antara mereka. Tetapi jika Anda menggunakan mesin lain bernama Bob, maka titik persimpangan

\\Alice\c$\myjp akan menunjuk ke \\Alice\c$\targetfolder

tetapi tautan simbolis

\\Alice\c$\mysymlink akan menunjuk ke \\Bob\c$\targetfolder

(Peringatan: secara default, sistem tidak mengikuti symlink pada volume jarak jauh, jadi dalam kebanyakan kasus contoh kedua sebenarnya akan menghasilkan "File Tidak Ditemukan" atau "Tautan simbolik tidak dapat diikuti karena tipenya dinonaktifkan." )

Perbedaan antara tautan simbolis direktori dan tautan simbolis file adalah secara sederhana satu merepresentasikan direktori dan satu merepresentasikan file. Karena target tautan tidak perlu ada saat tautan dibuat, sistem file perlu tahu apakah akan memberi tahu aplikasi apakah itu direktori atau tidak.

Juga harus dicatat bahwa membuat tautan simbolik memerlukan hak istimewa khusus (secara default, hanya tersedia untuk proses yang ditingkatkan) sedangkan membuat persimpangan hanya membutuhkan akses ke sistem file.

Harry Johnston
sumber
13
Hanya untuk menjadi jelas: mungkin ada perbedaan fungsional yang lebih subtil antara persimpangan direktori dan tautan simbolik direktori. Jarak jauh vs lokal adalah yang paling jelas dari perspektif pengguna (bukan pengembang).
Harry Johnston
12
@MatthewSteeples maksud Anda bahwa jika saya membuat tautan simbolis C:\testlink(yang mengarah ke C:\testkomputer saya) dan seseorang mengakses komputer saya secara remote dan mengklik C:\testlink, itu akan menyelesaikan ke C:\testkomputer HIS, sedangkan jika saya membuat persimpangan direktori C:\testlink(yang menunjuk ke C:\testdi komputer saya), dan seseorang mengakses komputer saya dari jarak jauh dan mengkliknya C:\testlink) itu akan membawanya ke C:\testkomputer saya? Atau apakah saya salah mengerti?
Pacerier
9
@Pacerier dalam konteks ini ya, tetapi tautan simbolis memungkinkan Anda untuk memiliki folder di komputer Anda yang mengarah ke jaringan berbagi (karena mereka diselesaikan sisi klien). Misalnya C: \ MyNetworkShare sebenarnya dapat menunjuk ke \\ Alice \ Share
Matthew Steeples
6
@ MatthewSteeples tetapi tidak bisakah kita membuat persimpangan direktori C:\MyNetworkShareyang menunjuk ke \\Alice\Sharejuga?
Pacerier
8
@Pacerier, tidak, titik persimpangan harus lokal.
Harry Johnston
56

Obrolan yang kompleks menyakitkan otak - Saya suka bagan:

Asumsikan ada yang MyLinkmerupakan tautan simbolis dan ada yang MyJuncmerupakan persimpangan yang menunjuk Target as created.

misalnya

mklink /D MyLink C:\T_Dir untuk membuat tautan simbolis ke direktori target

mklink /J MyJunc C:\T_Dir untuk membuat persimpangan direktori ke direktori target

Di mana sintaksis mklink [/J,/D] [link path] [target path]seperti yang diketik pada mesin lokal


 link path    |   target path   |         When accessed ..
              |                 |  (locally)    |    (remotely)
              |                 |               |
C:\MyLink     |   C:\T_Dir      |  C:\T_Dir     |  [leads back to local]
C:\MyJunc     |   C:\T_Dir      |  C:\T_Dir     |  [leads to remote]
              |                 |
\\Svr\MyLink  |   C:\T_Dir      |   C:\T_Dir    |  [leads back to local]
\\Svr\MyJunc  |   C:\T_Dir      |  *** Must create and point local ***
              |                 |
C:\MyLink     |  \\Sv2\T_Dir    |  \\Sv2\T_Dir  |   Error*1
C:\MyJunc     |  \\Sv2\T_Dir    |  *** Error - Must point local ***
              |                 |
\\Svr\MyLink  |  \\Sv2\T_Dir    |  Error*1
\\Svr\MyJunc  |  \\Sv2\T_Dir    |  *** Must create link using target device ***

Kesalahan * 1 - Jika Anda membuka blokir akses ke tautan simbolis jarak jauh pada mesin lokal Anda, maka ini akan bekerja .. tetapi hanya pada mesin lokal di mana itu diblokir

Tetap saja. Tony
sumber
3
Itu sangat aneh. Bahkan tautan simbolis relatif tidak berfungsi dari jarak jauh. Misalnya saya membuat direktori d:\_tmp\data. Membuat link seperti: d:\_tmp>mklink /d data-link data. Pengguna jarak jauh memiliki akses penuh ke d:\_tmpdan semua subfoldernya TETAPI dia masih tidak dapat membuka d:\_tmp\data-link.
Nux
4
Itu karena ketika tautan simbolik dievaluasi sisi klien, itu akan menunjuk ke data d: \ _ tmp \ pada klien, bukan server.
apraetor
Saya pikir alasan mengapa itu aneh sudah jelas. Tapi saya setuju dengan @Nux bahwa ini aneh, setidaknya dalam kasus symlink relatif.
Jon Coombs
Complex talk hurts brain -- I like chartsSaya suka kalimat ini, dan bagan juga.
Luke
46

Tautan simbolik memiliki lebih banyak fungsi, sementara persimpangan tampaknya merupakan fitur warisan karena keterbatasannya, tetapi implikasi keamanan dari batasan ini secara spesifik mengapa persimpangan mungkin lebih disukai daripada tautan simbolik. Penargetan jarak jauh membuat tautan simbolik lebih fungsional, tetapi juga meningkatkan profil keamanannya, sementara persimpangan mungkin dianggap lebih aman karena dibatasi oleh jalur lokal . Jadi, jika Anda menginginkan tautan lokal dan dapat hidup dengan jalur absolut, Anda mungkin lebih baik dengan persimpangan; jika tidak, pertimbangkan tautan simbolik untuk kemampuannya yang ditambahkan.

masukkan deskripsi gambar di sini

** Pernyataan perbedaan dalam kecepatan / kompleksitas berasal dari pernyataan tidak terverifikasi di entri Wikipedia tentang poin reparasi NTFS (bacaan yang bagus). *


Perbandingan NTFS Link Lainnya

Berikut adalah beberapa perbandingan lain pada topik, tetapi ini bisa menyesatkan ketika mempertimbangkan persimpangan karena mereka tidak mencantumkan manfaat yang saya sebutkan di atas.

Diambil dari sini (baca pengantar yang bagus)

masukkan deskripsi gambar di sini

Dari halaman SS64 di MKLink

masukkan deskripsi gambar di sini


Komentar tentang Terminologi

Persimpangan adalah Tautan Simbolik

Persimpangan dan tautan simbolik benar-benar melakukan hal yang sama dengan cara yang sama (titik reparse), selain dari perbedaan yang disebutkan di atas dalam cara mereka diproses. Faktanya, secara teknis, sebuah Junction adalah tautan simbolik, dan terkadang dokumentasi mungkin menyebut Junction sebagai tautan simbolik, seperti yang terjadi di sini . Jadi, itu hanya sesuatu yang harus diperhatikan tentang terminologi.

NTFS

Meskipun OP menentukan ini, ada baiknya menunjukkan bahwa "tautan simbolik" adalah istilah yang sangat umum yang tidak spesifik untuk NTFS. Jadi, untuk lebih spesifik, perbandingan ini adalah tentang NTFS Junctions vs NTFS Symbolic Links.

u8it
sumber
3
Adakah yang menguji kecepatan pemrosesan persimpangan vs tautan simbolik?
1000Gbps
Grafik pro / kontra sangat membantu, terima kasih!
GordonM