เครื่องหมายสแลช (/) เป็นส่วนหนึ่งของชื่อของไดเรกทอรีรากของ Linux หรือไม่


46

เครื่องหมายทับ ( /) เป็นส่วนหนึ่งของชื่อไดเรกทอรีรากของ Linux หรือไม่ หรือมันเป็นเพียงสัญลักษณ์ของมัน?

แล้วเรื่อง/etcอื่นล่ะ?

ปรับปรุง

สมมติว่า/dev/sda2เป็นอุปกรณ์บล็อกของไดเร็กทอรีรูท Linux

$ sudo debugfs / dev / sda2
debugfs 1.44.1 (24-Mar-2018)
debugfs:   pwd
[pwd] INODE: 2 PATH: /
[root] INODE: 2 PATH: /
debugfs:   stat /
Inode: 2    ประเภท:     โหมดไดเรกทอรี : 0755 ค่าสถานะ: 0x80000
การสร้าง: 0 เวอร์ชัน: 0x00000000: 00000077
ผู้ใช้: 0 กลุ่ม: 0 โครงการ: 0 ขนาด: 4096
ไฟล์ ACL: 0
ลิงค์: 25 บล็อคนับ: 8
แฟรกเมนต์: ที่อยู่: 0 จำนวน: 0 ขนาด: 0
 ctime: 0x5b13c9f1: 3f017990 - วันอาทิตย์ 3 มิถุนายน 15:28:57 2018
 atime: 0x5b13ca0f: 3b3ee380 - อา. 3 มิ.ย. 15:29:27 2018
 mtime: 0x5b13c9f1: 3f017990 - วันอาทิตย์ 3 มิถุนายน 15:28:57 2018
crtime: 0x5aad1843: 00000000 - วันเสาร์ที่ 17 มีนาคม 16:59:39 2018
ขนาดของฟิลด์ไอโหนดพิเศษ: 32
extents:
(0): 9249

ดังนั้นจึงมีไดเรกทอรีอยู่ในนั้น inode # 2 แต่มันไม่มีชื่อ


1
เกี่ยวกับการอัปเดตล่าสุดของคุณแสดงdebugfsผลลัพธ์บางอย่าง คุณช่วยอธิบายได้อย่างไรว่าสิ่งนี้เปลี่ยนแปลงคำถามได้อย่างไร
Kusalananda

มันไม่ใช่ ฉันแค่ต้องการตอบคำถามให้สมบูรณ์ แต่ฉันไม่ต้องการเพิ่มอีก ดังนั้นฉันจึงปรับปรุงมัน หากคุณสามารถใส่บรรทัด thease ลงในคำตอบของคุณได้ก็จะลบมันออกไป
mlibre

คำตอบ:


61

มาตรฐาน POSIX.1-2008 กล่าวว่า

ชื่อพา ธ ที่ประกอบด้วยหนึ่ง/จะแก้ไขไปยังไดเรกทอรีรากของกระบวนการ ชื่อพา ธ ว่างจะไม่สามารถแก้ไขได้สำเร็จ

มาตรฐานต่อไปทำให้ความแตกต่างระหว่างชื่อไฟล์และpathnames /เป็นชื่อพา ธ สำหรับเส้นทางของไดเรกทอรีราก ชื่อของไดเรกทอรีคือ "ไดเรกทอรีราก" แต่ในระบบแฟ้มมันเป็นนิรนามมันไม่มีชื่อไฟล์ หากมีชื่อไฟล์ชื่อนั้นจะเป็นรายการไดเรกทอรีในไดเรกทอรีด้านบนไดเรกทอรีรากและไม่มีไดเรกทอรีดังกล่าว

อักขระ/ไม่สามารถเป็นส่วนหนึ่งของชื่อไฟล์ได้เนื่องจากเป็นตัวแยกพา ธ

เพื่อความชัดเจน: /ไม่ได้เป็นชื่อของไดเรกทอรีราก แต่เส้นทางที่ไปของชื่อพา ธ

/etcเป็นชื่อพา ธ อื่น มันเป็นชื่อของเส้นทางที่แน่นอนไปยังetcไดเรกทอรี ชื่อของไดเรกทอรีที่เส้นทางนั้นคือetc(ชื่อไฟล์ของมันคือetc)

/usr/local/bin/curlเป็นชื่อพา ธ ของcurlไฟล์เรียกทำงานในลักษณะเดียวกัน/etcกับชื่อพา ธ ของetcไดเรกทอรี


"หากมีชื่อไฟล์ชื่อนั้นจะเป็นรายการไดเรกทอรีในไดเรกทอรีด้านบนไดเรกทอรีราก" มันจะเป็นสองสิ่งในทางเทคนิค - หมายเลขไอโหนดและชื่อ (ซึ่งเรารู้ว่าเป็นไอโหนด 2) นอกจากนี้ยังเป็นที่น่าสนใจที่จะทราบว่า/..จุดกลับไปที่/และ/มีรายการไดเรกทอรีสำหรับตัวเอง - ที่ดีเก่า/.; ทั้งสามสิ่งนี้ชี้ไปที่ไอโหนดเดียวกัน - 2.
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy ในทางเทคนิคไดเรกทอรีรากคือ "ต่อกระบวนการ" ซึ่งมีความสำคัญในสภาพแวดล้อม chroot ใน chroot หมายเลขไอโหนดของไดเร็กทอรีรูทจะไม่เป็นหมายเลขเฉพาะ (ซึ่งจะเป็นหมายเลขไอโหนดของรูต chroot) นอกจากนี้ฉันคิดว่าหมายเลข 2 (ในสถานการณ์ที่ไม่ chrooted) ขึ้นอยู่กับระบบไฟล์ที่ใช้
Kusalananda

ฉันยังสังเกตเห็นว่า/มีการกำหนดไว้ในแง่ของรูตต่อกระบวนการ แต่ฉันไม่ทราบว่า inode chrootไม่จำเป็นต้องเป็น 2 ความจริงที่น่าสนใจมาก นอกจากนี้ยังทำให้เกิดคำถามว่าอะไรคือ/ไดเรกทอรีสำหรับกระบวนการเคอร์เนลที่มีสิทธิพิเศษ นั่นหมายความว่ามีเพียงกระบวนการพื้นที่ผู้ใช้เท่านั้น/ที่เกี่ยวข้อง
Sergiy Kolodyazhnyy

37

เฉือนเป็นตัวคั่น ; ชื่อไดเรกทอรีไม่รวมตัวคั่น แต่ชื่อพา ธ เต็มจะรวมตัวคั่น

ดังนั้น"ระดับราก" /ไม่มีชื่อ ในระบบที่เหมือน Unix ส่วนใหญ่จะถือว่าเป็นกรณีพิเศษเช่น.และ..(แม้ว่าแน่นอนว่าไม่มีความแตกต่างระหว่างทั้งสองในระดับราก)

ระบบการตั้งชื่อสามารถแตกต่างกัน ตัวอย่างเช่น POSIX.1-2017 แสดงรายการคำจำกัดความที่ใช้กันทั่วไป:

  • 3.2 ชื่อพา ธ สัมบูรณ์

    ชื่อพา ธ ที่ขึ้นต้นด้วย<slash>อักขระเดี่ยวหรือมากกว่าสองตัว ดูที่Pathnameด้วย

  • 3.271 ชื่อพา ธ

    สตริงที่ใช้เพื่อระบุไฟล์ ในบริบทของ POSIX.1-2008 ชื่อพา ธ อาจถูก จำกัด ไว้ที่ {PATH_MAX} ไบต์รวมถึงการยกเลิก null null มี<slash>อักขระเริ่มต้นที่เป็นตัวเลือกตามด้วยชื่อไฟล์ตั้งแต่ศูนย์หรือมากกว่าคั่นด้วย<slash>อักขระ ชื่อพา ธ อาจมี<slash>อักขระต่อท้ายหนึ่งตัวหรือมากกว่า <slash>อักขระที่ต่อเนื่องหลายตัวจะถูกพิจารณาว่าเป็นตัวเดียว<slash>ยกเว้น<slash>ตัวอักษรนำหน้าสองตัว

    หมายเหตุ: หากชื่อพา ธ ประกอบด้วยไบต์ที่สอดคล้องกับอักขระจากชุดอักขระชื่อไฟล์แบบพกพา (ดูที่ชุดอักขระชื่อไฟล์แบบพกพา ) <slash>อักขระและการยกเลิกเพียงครั้งเดียว<NUL>ตัวอักษรชื่อพา ธ จะสามารถใช้งานได้เป็นสตริงตัวอักษรในสถานที่ที่ได้รับการสนับสนุนทั้งหมด; มิฉะนั้นชื่อพา ธ อาจเป็นสตริงเท่านั้น (แทนที่จะเป็นสตริงอักขระ) นอกจากนี้เนื่องจากการเข้ารหัสอักขระไบต์เดียว<slash>จะต้องเหมือนกันในทุกภาษาและไม่เกิดขึ้นภายในอักขระแบบหลายไบต์การอ้างอิงถึง<slash>อักขระภายในชื่อพา ธ จะถูกกำหนดอย่างดีแม้ว่าชื่อพา ธ จะไม่ใช่ตัวอักษร เชือก อย่างไรก็ตามคุณสมบัตินี้ไม่จำเป็นต้องมีไว้สำหรับอักขระที่เหลืออยู่ภายในชุดอักขระชื่อไฟล์แบบพกพา

  • 3.272 Pathname Component

    ดูชื่อไฟล์ในชื่อไฟล์

  • 3.170 ชื่อไฟล์

    ลำดับของไบต์ประกอบด้วย 1 ถึง{NAME_MAX}ไบต์ที่ใช้เพื่อตั้งชื่อไฟล์ ไบต์ที่เขียนชื่อจะต้องไม่มีตัวอักษร<NUL>หรือ <slash>ในบริบทของชื่อพา ธ แต่ละชื่อไฟล์จะต้องตามมาด้วย<slash>หรือ<NUL>ตัวละคร; ที่อื่นชื่อไฟล์ตามด้วย<NUL>ตัวอักษรในรูปแบบสตริง (แต่ไม่จำเป็นต้องเป็นสตริงอักขระ) ชื่อไฟล์มีจุดและdot-dotมีความหมายพิเศษ ชื่อไฟล์บางครั้งเรียกว่า "องค์ประกอบชื่อพา ธ " ดูที่Pathnameด้วย

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


3
Nitpick: dot และ dot-dot เป็นชื่อไฟล์ไม่ใช่ชื่อพา ธ ที่จริงแล้วมาตรฐาน POSIX นั้นมีสูตรแปลก ๆ "ในกรณีพิเศษในไดเรกทอรีรากจุดดอทอาจอ้างถึงไดเรกทอรีรากเอง" (ความสำคัญของฉัน)
Kusalananda

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

มันตอบในPOSIX : มันมีตัวอักษรเริ่มต้นตัวเลือกตามด้วยชื่อไฟล์ศูนย์หรือมากกว่านั้นคั่นด้วยตัวละคร
Thomas Dickey

@ Kusalananda ทบทวนเหตุผลสเป็คสำหรับการเน้นของคุณ พฤษภาคมในกำหนดสเปคเป็นคำสั่งที่ชัดเจนของการประกันที่เกี่ยวกับการทดสอบการใช้งาน ที่ไหนที่อาจมีการใช้ข้อมูลจำเพาะมั่นใจรุ่นใด ๆ ของการปฏิบัติตามพฤติกรรมที่กำหนด ในคำอื่น ๆ การดำเนินการใด ๆ ที่อาจพึ่งพา..ที่เชื่อมโยง/ /
mikeserv

19

ใน Unix ไฟล์ (และไดเร็กตอรี่เป็นแค่ไฟล์) ไม่มี "names" ลิงก์มีชื่อลิงก์คือรายการในไดเร็กทอรีที่แม็พชื่อกับไฟล์

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

เนื่องจากไดเรกทอรีรูทคือไดเรกทอรีรากจึงไม่มีไดเรกทอรี "ที่สูงขึ้น" ซึ่งอาจมีลิงก์อยู่ด้วยดังนั้นจึงไม่สามารถเชื่อมโยงชื่อได้ ในทางทฤษฎีมันจะเป็นไปได้ที่จะเพิ่มลิงค์ไปยังไดเรกทอรีรากในบางไดเรกทอรีอื่น ๆ แต่ Unices ส่วนใหญ่ห้ามเพิ่มลิงค์ไปยังไดเรกทอรีที่มีอยู่เพราะอาจนำไปสู่รอบในลำดับชั้นของระบบแฟ้ม (ซึ่งจริง ๆ แล้วเป็นกราฟกำกับ) ในกราฟมีราคาแพง แต่การไม่ตรวจจับพวกมันสามารถนำไปสู่การเรียกซ้ำแบบไม่สิ้นสุดเมื่อพยายามแก้ไขชื่อภายในเคอร์เนล

ดังนั้นโดยพื้นฐานแล้วไดเรกทอรีรากไม่มีชื่อเพราะไม่มีไดเรกทอรีอยู่ด้านบนซึ่งเราสามารถบันทึกชื่อได้

ดังที่ได้อธิบายไว้ในคำตอบอื่น ๆ เราจำเป็นต้องแยกแยะระหว่างชื่อและพา ธ (ชื่อ) ไดเรกทอรีรากสามารถจะเรียกว่าผ่านเส้นทาง /(ชื่อ)


ใช่ไฟล์สามารถมีชื่อได้มากกว่าหนึ่งชื่อเหมือนคนอื่น ๆ โดยปกติแล้วสามีของลูกสาวคนเล็กของฉันจะใช้ชื่อกลางของเขา แต่แน่นอนว่าเขาต้องตอบชื่อแรกของเขาด้วย ชื่อหลักของไดเรกทอรีรากคือ "/" ออกเสียง "slash" เนื่องจากชื่อพา ธ สัมบูรณ์คือ "/" (และชื่อที่อ้างอิงตามชื่อพา ธ สัมพัทธ์ไม่เป็นประโยชน์โดยเฉพาะ) (การเรียกมันว่า "รูท" อาจทำให้เกิดความสับสนกับ "/ รูท" ซึ่งควรเรียกว่า "สแลชรูท" เสมอ
Monty Harder

1
ฉันชอบจุดที่ไม่มีชื่อเพราะไม่มีไดเรกทอรีที่สูงกว่าในการบันทึกชื่อนั้น ที่อธิบายแนวคิดอย่างชัดเจน
Joe

7

การใช้คำว่า "ชื่อ" นั้นมีความยืดหยุ่นเล็กน้อย สามารถอ้างถึง "ชื่อพา ธ แบบเต็ม"; มันสามารถอ้างถึง "รายการไดเรกทอรี"; มันสามารถอ้างถึง "ชื่อไฟล์" ส่งผ่านไปยังฟังก์ชั่นหรือกิจวัตรต่างๆ

ตัวอย่างเช่น/etc/fooและ/var/tmp/../../etc/fooและ/tmp/../../../../../../fooเป็นวิธีการอ้างอิงไฟล์เดียวกันทั้งหมด เป็นชื่อที่ถูกต้องทั้งหมดเช่นเดียวกับfooใน/etcไดเรกทอรี

ดังนั้นกลับไปที่พื้นฐาน

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

ดังนั้น "ชื่อเส้นทางครบถ้วน" ของเป็นสตริงเต็มรูปแบบ:/etc /etcซึ่งหมายความว่ามันมีetcส่วนประกอบในไดเรกทอรีราก

ในทำนองเดียวกัน/x/y/z/fooจะมีfooองค์ประกอบใน/x/y/zไดเรกทอรี

ตอนนี้ไดเร็กทอรีรูทจะไม่ซ้ำกันซึ่งไม่มีส่วนประกอบในไดเร็กทอรีพาเรนต์ มันเพียง แต่มีชื่อพา ธ /เต็มเป็นชื่อของมัน:

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