มีการนำไดเรกทอรีไปใช้ในระบบไฟล์ Unix อย่างไร?


19

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


1
คุณสนใจระบบแฟ้มใด ๆ หรือไม่?
Ignacio Vazquez-Abrams

3
ใน UNIX ทุกอย่างเป็นไฟล์ (ภูมิปัญญาทางประวัติศาสตร์) แต่ไม่ใช่ทุก UNIX ที่เป็นโอเพ่นซอร์ส Not Unix ของ Gnu คุณรู้หรือไม่? Open Solaris เป็น Open Source Unix ในขณะที่ Linux เป็นระบบปฏิบัติการยูนิกซ์เท่านั้น :) และใช่ - ระบบแฟ้ม - Reiserfs Ext2-3-4? XFS? NFS?
ผู้ใช้ไม่รู้จัก

2
ลิงก์ก็เป็นไฟล์เช่นกัน
mattdm

5
สัญลักษณ์การเชื่อมโยงเป็นไฟล์ที่ ฮาร์ดลิงก์คือขอบในกราฟของระบบไฟล์
dmckee

3
โฆษณา: คุณอาจสนใจในข้อเสนอไซต์พัฒนาระบบปฏิบัติการ
Gilles 'หยุดความชั่วร้าย'

คำตอบ:


22

โครงสร้างภายในของไดเรกทอรีขึ้นอยู่กับระบบไฟล์ที่ใช้งาน หากคุณต้องการทราบสิ่งที่เกิดขึ้นอย่างแม่นยำให้ดูที่การใช้งานระบบไฟล์

โดยทั่วไปในระบบไฟล์ส่วนใหญ่ไดเร็กทอรีคืออาร์เรย์ที่เชื่อมโยงระหว่างชื่อไฟล์ (คีย์) และหมายเลข inodes (ค่า) บางสิ่งเช่นนี้¹:

1167010 .
1158721 ..
1167626 subdir
 132651 barfile
 132650 bazfile

รายการนี้มีรหัสในบางวิธี - มากหรือน้อย - มีประสิทธิภาพในห่วงโซ่ของบล็อก 4KB (ปกติ) ขอให้สังเกตว่าเนื้อหาของไฟล์ปกติจะถูกจัดเก็บในทำนองเดียวกัน ในกรณีของไดเรกทอรีไม่มีประโยชน์ที่จะทราบขนาดที่ใช้จริงภายในบล็อคเหล่านี้ นั่นเป็นสาเหตุที่ขนาดของไดเรกทอรีที่รายงานโดยduเป็นทวีคูณของ 4KB

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

การจัดการทั้งหมดนี้เกิดขึ้นในโหมดเคอร์เนล ซอฟต์แวร์เพิ่งถามถึงการสร้างไดเรกทอรีที่มีฟังก์ชั่นชื่อที่int mkdir(const char *pathname, mode_t mode);นำไปสู่การเรียกของระบบและส่วนที่เหลือทั้งหมดจะดำเนินการเบื้องหลัง

เกี่ยวกับโครงสร้างลิงก์:

ฮาร์ดลิงก์ไม่ใช่ไฟล์มันเป็นเพียงรายการไดเรกทอรีใหม่ (เช่นการเชื่อมโยงชื่อ - inode number ) ที่อ้างถึงเอนทิตี้ของ inode ที่มีอยู่ก่อน² ซึ่งหมายความว่าไอโหนดเดียวกันสามารถเข้าถึงได้จากชื่อพา ธ ที่แตกต่างกัน โดยเฉพาะอย่างยิ่งเนื่องจากเมตาดาตา (สิทธิ์การเป็นเจ้าของการประทับเวลา ... ) จะถูกเก็บไว้ภายในไอโหนดเหล่านี้จะไม่ซ้ำกันและไม่ขึ้นอยู่กับชื่อพา ธ ที่เลือกเพื่อเข้าถึงไฟล์

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

-
1. ls -ai1 testdirนี้ได้จากการใช้
2. ประเภทใดจะต้องแตกต่างจาก 'ไดเรกทอรี' ทุกวันนี้


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

12

หากต้องการขยายโพสต์จากStéphane Gimenez การสร้างไดเรกทอรีใหม่คือกระบวนการสร้าง inode ใหม่ที่มีค่า st_mode ของ S_IFDIR (พร้อมโหมดสิทธิ์) สร้างสองรายการในบล็อกข้อมูลแรกของ inode ใหม่พร้อมลิงค์ ( 2) การโทรของระบบ: '.' จุดใดชี้ไปที่ไอโหนดใหม่นี้และ '.. ' ซึ่งชี้ไปที่ไดเร็กทอรีพาเรนต์จากนั้นสร้างรายการในไดเร็กทอรีพาเรนต์ที่มีไอโหนดและชื่อของไดเร็กทอรีใหม่ - ส่วนแรกและส่วนสุดท้ายถูกเรียกโดยระบบ mknod ( 2) นอกจากนี้มีเพียง root เท่านั้นที่สามารถใช้ mknod (2) ในวันนี้เพื่องานที่เรากำลังพูดถึง

ตัวอย่างเช่นmkdir("/home/larry.user/xyzzy", 0666)มีดังต่อไปนี้ (นี่คือรหัส C จาก SysV วัน [1]):

int mode = 0666;
char newdir[] = "/home/larry.user/xyzzy";
char path1[NAMESZ+4, path2[NAMESZ+4], *p;
mknod(newdir, S_IFDIR|mode);
strcpy(path1, newdir);
strcat(path1, "/."); /* "." link */
link(newdir, path1);
strcat(path1, ".");  /* ".." link */
strcpy(path2, newdir);
if ((p = strrchr(path2, '/') == (char *)0) /* root directory */
    link(".", path1);
else {
    *p = '\0';
    link(path2, path1);
}
  1. Haviland & Salama, "การเขียนโปรแกรมระบบยูนิกซ์", 1987, pp69-71

นี่เป็นข้อผิดพลาดง่ายเกินไป (และหนึ่งในเหตุผลหลักสำหรับ fsck) ดังนั้นการเรียกระบบ mkdir (2) ถูกสร้างขึ้นเพื่อให้สามารถทำสิ่งนี้ให้คุณได้

โปรดทราบว่าวัตถุระบบไฟล์ amy สามารถสร้างขึ้นด้วย mknod (2): ไฟล์ปกติ, ไดเรกทอรี, ไฟล์อุปกรณ์, symlink ฯลฯ ดังนั้นเพื่อตอบคำถามของ OP อย่างใดอย่างหนึ่งใช่ไดเรกทอรีคือไฟล์ซึ่งหมายความว่า "มัน เป็นวัตถุที่แสดงโดย inode อาศัยอยู่ในระบบแฟ้มซึ่งทำงานกับอินเทอร์เฟซ i / o "


ขอบคุณสำหรับคำตอบที่น่าสนใจมาก ฉันเข้าใจและคิดว่าฉันสามารถหาแหล่งที่มาของโปรแกรมtouchที่สร้างไฟล์เปล่าและดูว่ามันทำอะไร
Niklas

2

ถ้าคุณต้องการที่จะมีข้อมูลเพิ่มเติมเกี่ยวกับระบบไฟล์ Unix / Linux ผมแนะนำให้คุณ 2 เล่มทำความเข้าใจเกี่ยวกับ Linux Kernelและลินุกซ์เคอร์เนลพัฒนา หนังสือเหล่านี้เป็นหนังสือที่ดีที่สุดสำหรับทำความเข้าใจกับเคอร์เนล Linux

ในระบบ Unix "Common File Model" แต่ละไดเร็กทอรีถือว่าเป็นไฟล์ซึ่งมีรายการไฟล์และไดเร็กทอรี

ในวีเอฟเอ (Virtual ระบบไฟล์) dentryไดเรกทอรีที่จะเป็นตัวแทนในโครงสร้างที่เรียกว่า นี่dentry คือโครงสร้าง C ที่มีชื่อสตริง ( d_name ), ตัวชี้ไปยังไอโหนด ( d_inode ) และตัวชี้ไปยัง parent dentry ( d_parent ) inode เป็นโครงสร้างสำหรับจัดการข้อมูลเกี่ยวกับไฟล์ในระบบไฟล์ ตัวอย่างเช่นถ้าคุณมีไดเรกทอรี/tmp/test/fooVFS จะสร้างวัตถุ dentry สำหรับทุกองค์ประกอบในชื่อพา ธ ดังนั้นมันจะสร้างวัตถุ dentry สำหรับวัตถุ dentry /ที่สองสำหรับการtestเข้าสู่ไดเรกทอรีรากและวัตถุทันตกรรมที่สามสำหรับfooรายการไดเรกทอรีทดสอบ


ขอบคุณ Dimitri ฉันต้องการที่จะเข้าใจว่าทำไมบางโครงการเลือกโครงสร้างข้อมูลเฉพาะเช่น B-Tree, ต้นไม้ไบนารี, trie หรืออาเรย์เชื่อมโยง ฉันคิดว่าการเลือกโครงสร้างข้อมูล / ตัวแบบข้อมูลที่เหมาะสมเป็นสิ่งสำคัญ เรียนรู้เกี่ยวกับการใช้งานที่แตกต่างกันให้รายละเอียดที่ฉันกำลังมองหา
Niklas

1

คุณสามารถเริ่มต้นโดยการอ่านhttp://www.freebsd.org/doc/en/books/design-44bsd/book.html#OVERVIEW-FILESYSTEM สำหรับรายละเอียดเพิ่มเติมรับหนังสือคลาสสิกที่ยอดเยี่ยม "การออกแบบและการใช้งานระบบปฏิบัติการ 4.4 BSD"


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

1
ไดเร็กตอรี่เป็นไฟล์ที่ฟอร์แมตเป็นพิเศษ, แต่นั่นไม่เป็นความจริงอีกต่อไป: en.wikipedia.org/wiki/ReiserFS#Design ใน ReiserFS และอื่น ๆ , ไดเร็กตอรี่เป็นรายการในฐานข้อมูล. ไดเรกทอรีอาจทำหน้าที่เป็นอาร์เรย์ แต่นั่นเป็นเพียงการเขียนโปรแกรมที่เป็นนามธรรม
Bruce Ediger

ขอบคุณมากสำหรับการชี้รายละเอียด ตอนนี้ฉันคิดว่าฉันเข้าใจมากขึ้นว่าระบบไฟล์ยังทำงานอย่างไรและทำไมโปรแกรมlocateทำงานอย่างไรและเกี่ยวข้องกับการอัปเดตโปรแกรมค้นหาโดยใช้อย่างไรupdatedb(ข้อมูลจำเพาะฉันใช้ PC-BSD, DragonflyBSD และ Ubuntu Natty การบูตจาก Live CD และการเปรียบเทียบมาตรฐาน และอินเทอร์เฟซ)
Niklas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.