“ junction directory” เทียบกับ“ directory symbolic link”?


392

ในบริบทของ NTFS:

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

/D สร้างลิงก์สัญลักษณ์ไดเร็กทอรี ค่าเริ่มต้นคือลิงก์สัญลักษณ์ไฟล์
/H สร้างฮาร์ดลิงก์แทนลิงก์สัญลักษณ์
/J สร้าง Directory Junction
Link ระบุชื่อลิงก์สัญลักษณ์ใหม่
Target ระบุเส้นทาง (สัมพัทธ์หรือสัมบูรณ์) ที่ลิงก์ใหม่อ้างถึง

  1. การแยกไดเรกทอรีนั้นไม่ใช่สิ่งเดียวกันกับลิงก์สัญลักษณ์ของไดเรกทอรีใช่หรือไม่

    ความแตกต่างระหว่างmklink /D f1 f2และmklink /J f1 f2คืออะไร

  2. เนื่องจาก "ไดเรกทอรี" เป็นเพียงไฟล์จริงๆแล้วอะไรคือความแตกต่างระหว่างลิงก์สัญลักษณ์ไดเรกทอรีและลิงก์สัญลักษณ์ไฟล์


2
เกี่ยวข้อง: superuser.com/q/347930/24500
surfasb

คำตอบ:


364

จุดเชื่อมต่อนั้นไม่ใช่สิ่งเดียวกันกับลิงก์สัญลักษณ์ไดเรกทอรีแม้ว่าจะทำงานในลักษณะเดียวกัน ความแตกต่างที่สำคัญคือว่าถ้าคุณกำลังมองหาที่เซิร์ฟเวอร์ระยะไกลทางแยกมีการประมวลผลที่เซิร์ฟเวอร์และไดเรกทอรีการเชื่อมโยงสัญลักษณ์มีการประมวลผลที่ลูกค้า ดูความคิดเห็นของ Matthew เกี่ยวกับความจริงที่ว่านี่หมายถึงลิงก์สัญลักษณ์ในระบบไฟล์โลคัลสามารถชี้ไปที่ระบบไฟล์รีโมต

สมมติว่าบนเครื่องที่มีชื่ออลิซคุณจะใส่จุดเชื่อมต่อc:\myjpและไดเรกทอรีที่เชื่อมโยงสัญลักษณ์ทั้งชี้ไปที่c:\mysymlink c:\targetfolderในขณะที่คุณใช้อลิซคุณจะไม่สังเกตเห็นความแตกต่างระหว่างพวกเขามากนัก แต่ถ้าคุณใช้เครื่องอื่นชื่อบ็อบจุดเชื่อมต่อ

\\Alice\c$\myjp จะชี้ไปที่ \\Alice\c$\targetfolder

แต่ลิงก์สัญลักษณ์

\\Alice\c$\mysymlink จะชี้ไปที่ \\Bob\c$\targetfolder

(ข้อแม้: โดยค่าเริ่มต้นระบบจะไม่ติดตาม symlinks บนรีโมตวอลุ่มดังนั้นในกรณีส่วนใหญ่ตัวอย่างที่สองจะส่งผลให้"File Not Found"หรือ"ไม่สามารถติดตามลิงก์สัญลักษณ์ได้เนื่องจากประเภทของมันถูกปิดใช้งาน" )

ความแตกต่างระหว่างลิงก์สัญลักษณ์ไดเรกทอรีและลิงก์สัญลักษณ์ไฟล์คือเพียงหนึ่งไดเรกทอรีแสดงถึงไดเรกทอรีและอีกหนึ่งแทนแฟ้ม เนื่องจากเป้าหมายของลิงก์ไม่จำเป็นต้องมีอยู่เมื่อสร้างลิงก์ระบบไฟล์จึงจำเป็นต้องรู้ว่าต้องบอกแอปพลิเคชันว่าเป็นไดเรกทอรีหรือไม่

ควรสังเกตว่าการสร้างลิงก์สัญลักษณ์ต้องใช้สิทธิ์พิเศษ (โดยค่าเริ่มต้นพร้อมใช้งานกับกระบวนการที่ยกระดับเท่านั้น) ในขณะที่การสร้างทางแยกนั้นต้องการการเข้าถึงระบบไฟล์เท่านั้น


13
เพื่อให้ชัดเจน: อาจมีความแตกต่างของฟังก์ชั่นย่อยอื่น ๆ ระหว่างทางแยกไดเรกทอรีและลิงก์สัญลักษณ์ของไดเรกทอรี สิ่งที่อยู่ห่างไกลกับท้องถิ่นนั้นชัดเจนที่สุดจากมุมมองของผู้ใช้ (ตรงข้ามกับผู้พัฒนา)
Harry Johnston

12
@ MatthewSteeples คุณหมายความว่าถ้าฉันสร้างลิงค์สัญลักษณ์C:\testlink(ซึ่งชี้ไปC:\testที่คอมพิวเตอร์ของฉัน) และใครบางคนเข้าถึงคอมพิวเตอร์ของฉันจากระยะไกลและคลิกที่C:\testlinkมันจะแก้ไขC:\testคอมพิวเตอร์ที่ HIS ในขณะที่ถ้าฉันสร้างไดเรกทอรีแยกC:\testlink(ซึ่งชี้ไปที่C:\testบนคอมพิวเตอร์ของฉัน) และบางคนเข้าถึงคอมพิวเตอร์ของฉันจากระยะไกลและคลิกที่C:\testlink) มันจะนำเขาไปสู่C:\testบนคอมพิวเตอร์ของฉันหรือไม่ หรือฉันได้รับมันผิดทางรอบ?
Pacerier

9
@Pacerier ในบริบทนี้ใช่ แต่ลิงก์สัญลักษณ์ช่วยให้คุณมีโฟลเดอร์ในคอมพิวเตอร์ของคุณที่ชี้ไปยังเครือข่ายที่ใช้ร่วมกัน (เพราะพวกเขาแก้ไขด้านไคลเอนต์) เช่น C: \ MyNetworkShare อาจชี้ไปที่ \\ Alice \ Share
Matthew Steeples

6
@ MatthewSteeples แต่เราไม่สามารถสร้าง junction directory C:\MyNetworkShareซึ่งชี้ไป\\Alice\Shareเช่นกัน?
Pacerier

8
@Pierier ไม่ต้องมีจุดเชื่อมต่อในพื้นที่
Harry Johnston

55

คอมเพล็กซ์พูดถึงเจ็บสมอง - ฉันชอบชาร์ต:

สมมติใด ๆMyLinkคือการเชื่อมโยงสัญลักษณ์ใด ๆ และเป็นชุมทางที่ชี้MyJuncTarget as created

เช่น

mklink /D MyLink C:\T_Dir สำหรับการสร้างลิงก์สัญลักษณ์ไปยังไดเรกทอรีเป้าหมาย

mklink /J MyJunc C:\T_Dir สำหรับการสร้างไดเรกทอรีทางแยกไปยังไดเรกทอรีเป้าหมาย

ตำแหน่งที่ไวยากรณ์ถูกmklink [/J,/D] [link path] [target path]พิมพ์บนเครื่องโลคัล


 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 ***

ข้อผิดพลาด * 1 - หากคุณยกเลิกการปิดกั้นการเข้าถึงลิงก์สัญลักษณ์ระยะไกลบนเครื่องท้องถิ่นของคุณสิ่งนี้จะทำงานได้ .. แต่เฉพาะในเครื่องท้องถิ่นที่ไม่มีการปิดกั้น


3
นั่นแปลกมาก แม้แต่ลิงก์สัมพัทธ์สัมพัทธ์ก็ยังใช้งานไม่ได้ d:\_tmp\dataเช่นผมสร้างไดเรกทอรี สร้างลิงค์ดังนี้: d:\_tmp>mklink /d data-link data. ผู้ใช้ระยะไกลสามารถเข้าถึงได้อย่างเต็มที่d:\_tmpและโฟลเดอร์ย่อยทั้งหมด แต่เขาจะยังไม่สามารถเปิดd:\_tmp\data-linkได้
Nux

4
นั่นเป็นเพราะเมื่อลิงก์สัญลักษณ์ได้รับการประเมินฝั่งไคลเอ็นต์มันจะชี้ไปที่ d: \ _ tmp \ data บนไคลเอ็นต์ไม่ใช่เซิร์ฟเวอร์
apraetor

ฉันคิดว่าเหตุผลที่ทำให้มันแปลก ๆ ชัดเจน แต่ฉันเห็นด้วยกับ @Nux ว่ามันแปลกอย่างน้อยก็ในกรณีของ symlink ที่เกี่ยวข้อง
Jon Coombs

Complex talk hurts brain -- I like chartsฉันรักประโยคนี้และแผนภูมิด้วย
ลุค

46

ลิงก์สัญลักษณ์มีหน้าที่การใช้งานมากกว่าในขณะที่ทางแยกนั้นดูเหมือนจะเป็นคุณสมบัติดั้งเดิมเนื่องจากข้อ จำกัด ของมัน แต่ข้อ จำกัด ด้านความปลอดภัยของข้อ จำกัด เหล่านี้เป็นเหตุผลเฉพาะว่าเหตุใดจึงควรเลือกจังก์ชั่นมากกว่าลิงก์สัญลักษณ์ การกำหนดเป้าหมายระยะไกลทำให้การเชื่อมโยงสัญลักษณ์การทำงานมากขึ้น แต่ยังเพิ่มรายละเอียดการรักษาความปลอดภัยของพวกเขาในขณะที่ทางแยกอาจได้รับการพิจารณาความปลอดภัยมากขึ้นเพราะพวกเขามีข้อ จำกัด เส้นทางท้องถิ่น ดังนั้นหากคุณต้องการลิงก์ท้องถิ่นและสามารถใช้ชีวิตกับเส้นทางที่สมบูรณ์ได้คุณน่าจะดีกว่าถ้าใช้ทางแยก มิฉะนั้นให้พิจารณาลิงก์สัญลักษณ์สำหรับความสามารถที่เพิ่มขึ้น

ป้อนคำอธิบายรูปภาพที่นี่

** คำแถลงความแตกต่างของความเร็ว / ความซับซ้อนมาจากคำแถลงที่ยังไม่ผ่านการตรวจสอบในรายการ Wikipedia บนจุดแยกย่อยของ NTFS (อ่านได้ดี) *


การเปรียบเทียบลิงค์ NTFS อื่น ๆ

นี่คือการเปรียบเทียบอื่น ๆ ในหัวข้อ แต่สิ่งเหล่านี้อาจทำให้เข้าใจผิดเมื่อพิจารณาทางแยกเพราะพวกเขาไม่ได้แสดงรายการผลประโยชน์ที่ฉันระบุไว้ข้างต้น

นำมาจากที่นี่ (อ่านเบื้องต้นที่ดี)

ป้อนคำอธิบายรูปภาพที่นี่

จากหน้า SS64 บน MKLink

ป้อนคำอธิบายรูปภาพที่นี่


ความคิดเห็นเกี่ยวกับคำศัพท์

ทางแยกเป็นลิงค์สัญลักษณ์

ลิงก์ Junctions และ Symbolic นั้นกำลังทำสิ่งเดียวกันในลักษณะเดียวกัน (จุดแยกวิเคราะห์ซ้ำ) นอกเหนือจากความแตกต่างดังกล่าวข้างต้นในวิธีการประมวลผล อันที่จริงแล้วทางเทคนิค Junction นั้นเป็นลิงค์สัญลักษณ์และบางครั้งเอกสารอาจจะเรียก Junction ว่าเป็น symbolic link ดังเช่นในกรณีนี้ ดังนั้นนั่นเป็นเพียงสิ่งที่ต้องระวังเกี่ยวกับคำศัพท์

NTFS

ถึงแม้ว่า OP จะระบุสิ่งนี้ แต่มันก็คุ้มค่าที่จะชี้ให้เห็นว่า "symbolic link" เป็นคำทั่วไปที่ไม่เฉพาะ NTFS ดังนั้นเพื่อให้มีความเฉพาะเจาะจงการเปรียบเทียบนี้เป็นเรื่องเกี่ยวกับ NTFS Junctions vs. การเชื่อมโยงสัญลักษณ์ NTFS


3
ทุกคนทดสอบความเร็วในการประมวลผลของ Junctions vs Symbolic Links หรือไม่
1000Gbps

กราฟข้อดี / ข้อเสียมีประโยชน์อย่างมากขอบคุณ!
GordonM
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.