มีการสร้างไฟล์“ / dev” Linux อย่างไร


112

มีไฟล์พิเศษใน Linux ที่ไม่ใช่ไฟล์จริงๆ

ตัวอย่างที่เด่นที่สุดและชัดเจนที่สุดของเหล่านี้อยู่ในdevโฟลเดอร์ "files" ที่ชอบ:

  • /dev/null - ละเว้นสิ่งที่คุณเขียนไปยังไฟล์
  • /dev/random - ส่งออกข้อมูลแบบสุ่มแทนเนื้อหาของไฟล์
  • /dev/tcp - ส่งข้อมูลใด ๆ ที่คุณเขียนไปยังไฟล์นี้ผ่านเครือข่าย

ก่อนอื่นชื่อของไฟล์ "ประเภท" เหล่านี้ที่เป็นประเภทของสคริปต์หรือไบนารีในการปลอมตัวคืออะไร?

ประการที่สองพวกเขาสร้างอย่างไร ไฟล์เหล่านี้สร้างขึ้นในระบบในระดับเคอร์เนลหรือมีวิธีในการสร้าง "ไฟล์มายากล" ด้วยตัวคุณเอง (เป็น/dev/rickrollอย่างไร)


1
ฉันไม่รู้ว่าจะติดแท็กคำถามนี้อย่างไรโดยเฉพาะอย่างยิ่งเมื่อฉันไม่รู้ชื่อของสิ่งที่ฉันกำลังมองหา รู้สึกอิสระที่จะแก้ไขในแท็กที่เกี่ยวข้อง
IQAndreas

15
BTW นี่เป็นส่วนพื้นฐานของการออกแบบระบบปฏิบัติการยูนิกซ์และยูนิกซ์เช่น: (เกือบ) ทุกอย่างเป็นไฟล์หรือสามารถทำให้ดูเหมือนไฟล์ได้
cas

5
ดูเพิ่มเติม: mknod (2) man 2 mknod
RobertL

4
เหล่านี้คือ "โหนดอุปกรณ์" อย่างไรก็ตามสิ่งที่คุณพูดถึง - ซึ่งแตกต่างจากที่เกี่ยวข้องกับดิสก์แป้นพิมพ์เมาส์การ์ดเสียงและอุปกรณ์อื่น ๆ เรียกว่า "อุปกรณ์หลอก" เนื่องจากไม่ใช่อุปกรณ์ "ของจริง" และมีอยู่ในเคอร์เนลเท่านั้น เป็นไปได้ที่จะสร้างใหม่โดยการเขียนไดรเวอร์อุปกรณ์ที่เหมาะสมและเพิ่มลงในเคอร์เนล (เช่นอุปกรณ์หลอกสำหรับตรวจสอบกิจกรรมบางอย่างบนคอมพิวเตอร์) ก่อนที่จะมี / dev-directory อยู่บนดิสก์ - ทุกวันนี้เป็นระบบไฟล์เสมือน (ของประเภท devfs) ที่สร้างโดยเคอร์เนล
Baard Kopperud

10
ไฟล์ทั้งหมดแม้แต่ไฟล์ "ของจริง" เป็นส่วนซอฟต์แวร์ ซอฟแวร์ที่อยู่เบื้องหลังอุปกรณ์ทุกไฟล์ซ็อกเก็ต, แฟ้มพิเศษหรือสิ่งที่ยังไม่ได้รับการคิดค้นให้ตารางของฟังก์ชั่นการจัดการopen(), read(), close()ฯลฯ หลังจากนั้นก็ขึ้นอยู่กับซอฟแวร์
waltinator

คำตอบ:


101

/dev/zeroเป็นตัวอย่างของ "ไฟล์พิเศษ" - โดยเฉพาะ "โหนดอุปกรณ์" ปกติเหล่านี้ได้รับการสร้างขึ้นโดยกระบวนการติดตั้ง distro แต่คุณสามารถทั้งหมดสร้างด้วยตัวเองถ้าคุณต้องการ

หากคุณถามlsเกี่ยวกับ/dev/zero:

# ls -l /dev/zero
crw-rw-rw- 1 root root 1, 5  Nov 5 09:34 /dev/zero

"c" ตอนเริ่มต้นจะบอกคุณว่านี่คือ "อุปกรณ์ตัวอักษร"; อีกประเภทคือ "อุปกรณ์บล็อก" (พิมพ์โดยlsเป็น "b") อุปกรณ์ที่เข้าถึงได้แบบสุ่มเช่น harddisks นั้นมีแนวโน้มที่จะบล็อกอุปกรณ์ในขณะที่สิ่งต่าง ๆ ตามลำดับเช่นเทปไดรฟ์หรือการ์ดเสียงของคุณมักจะเป็นอุปกรณ์ตัวอักษร

ส่วน "1, 5" คือ "หมายเลขอุปกรณ์หลัก" และ "หมายเลขอุปกรณ์รอง"

ด้วยข้อมูลนี้เราสามารถใช้mknodคำสั่งเพื่อสร้างโหนดอุปกรณ์ของเราเอง:

# mknod foobar c 1 5

นี้จะสร้างไฟล์ใหม่ชื่อfoobarในโฟลเดอร์ปัจจุบันซึ่งไม่ว่า/dev/zeroสิ่งเดียวกับ (แน่นอนคุณสามารถตั้งค่าการอนุญาตต่าง ๆ ได้หากคุณต้องการ) "ไฟล์" ทั้งหมดนี้มีอยู่จริงคือรายการทั้งสามด้านบน - ประเภทอุปกรณ์, หมายเลขหลัก, หมายเลขรอง คุณสามารถใช้lsเพื่อค้นหารหัสสำหรับอุปกรณ์อื่น ๆ และสร้างใหม่ได้เช่นกัน เมื่อคุณเบื่อให้ใช้rmเพื่อลบโหนดอุปกรณ์ที่คุณเพิ่งสร้างขึ้น

โดยทั่วไปแล้วหมายเลขหลักจะบอกเคอร์เนลของ Linux ว่าควรจะใช้ไดรเวอร์อุปกรณ์ใดและหมายเลขรองจะบอกถึงไดรเวอร์อุปกรณ์ที่คุณกำลังพูดถึง (เช่นคุณอาจมีคอนโทรลเลอร์ SATA หนึ่งตัว แต่อาจเสียบฮาร์ดิสก์หลายตัวไว้)

หากคุณต้องการประดิษฐ์อุปกรณ์ใหม่ที่ทำสิ่งใหม่ ๆ ได้ดีคุณต้องแก้ไขซอร์สโค้ดสำหรับเคอร์เนล Linux และรวบรวมเคอร์เนลที่คุณกำหนดเอง ดังนั้นอย่าทำอย่างนั้น! :-) แต่คุณสามารถเพิ่มไฟล์อุปกรณ์ที่ซ้ำกับไฟล์ที่คุณมีอยู่แล้วก็ได้ ระบบอัตโนมัติเช่น udev นั้นเป็นเพียงแค่ดูเหตุการณ์อุปกรณ์และโทรmknod/ rmให้คุณโดยอัตโนมัติ ไม่มีอะไรที่วิเศษไปกว่านั้นอีกแล้ว

ยังมีไฟล์พิเศษประเภทอื่น ๆ :

  • Linux พิจารณาว่าไดเร็กทอรีเป็นไฟล์ชนิดพิเศษ (โดยปกติคุณไม่สามารถเปิดไดเรกทอรีโดยตรง แต่ถ้าทำได้คุณจะพบว่าเป็นไฟล์ปกติที่มีข้อมูลในรูปแบบพิเศษและบอกเคอร์เนลว่าจะค้นหาไฟล์ทั้งหมดในไดเรกทอรีนั้นได้ที่ใด)

  • symlink เป็นไฟล์พิเศษ (แต่ฮาร์ดลิงก์ไม่ใช่) คุณสามารถสร้าง symlink โดยใช้ln -sคำสั่ง (ค้นหา manpage สำหรับมัน)

  • นอกจากนี้ยังมีสิ่งที่เรียกว่า "ไปป์ที่มีชื่อ" หรือ "FIFO" (คิวเข้า - ออกก่อน) mkfifoคุณสามารถสร้างเป็นหนึ่งเดียวกับ FIFO เป็นไฟล์วิเศษที่สามารถเปิดได้สองโปรแกรมในคราวเดียว - หนึ่งการอ่านหนึ่งการเขียน เมื่อสิ่งนี้เกิดขึ้นจะทำงานเหมือนท่อเปลือกปกติ แต่คุณสามารถเริ่มแต่ละโปรแกรมแยกกัน ...

ไฟล์ที่ไม่ "พิเศษ" ในทางใดทางหนึ่งเรียกว่า "ไฟล์ปกติ" บางครั้งคุณจะเห็นการกล่าวถึงในเอกสาร Unix นั่นคือความหมาย ไฟล์ที่ไม่ใช่โหนดอุปกรณ์หรือ symlink หรืออะไรก็ตาม เป็นเพียงไฟล์ธรรมดาทุกวันที่ไม่มีคุณสมบัติวิเศษ


4
นอกจากนี้ยังมีไฟล์พิเศษอีกประเภทหนึ่งซ็อกเก็ตโดเมน Unix ที่เชื่อมโยงกับระบบไฟล์
Brian Bi

8
หากคุณต้องการเล่นmknodให้เรียกใช้cat /proc/devicesเพื่อดูหมายเลขหลักสำหรับไดรเวอร์ทั้งหมด ซึ่งนำเราไปสู่/procระบบไฟล์ประเภทอื่นซึ่งเป็นระบบไฟล์ ( คำตอบนี้พูดถึงมัน)
ugoren

8
Unices อื่น ๆ ได้คิดค้นไฟล์พิเศษของตัวเองเช่น Solaris มีประตู
เควิน

6
ผู้เยาว์ nitpick: คุณไม่ต้องคอมไพล์เคอร์เนลใหม่เพื่อเขียนตัวละคร / อุปกรณ์บล็อกใหม่ :) crashcourse.ca/introduction-linux-kernel-programming/ …มิฉะนั้นนี่เป็นคำตอบที่ดีมาก +1!
Commander Coriander Salamander

1
@MathematicalOrchid: ขั้นตอนที่การตอบกลับของคุณหายไป (หรืออย่างน้อยก็เพียงการบอกชัดแจ้ง) คือความจริงที่ว่าไฟล์พิเศษเหล่านั้นไม่ได้ปลอมแปลงเชลล์สคริปต์หรือไบนารีเลย (ตามคำถามโดยนัย) แต่เป็นอินเทอร์เฟซ ในเคอร์เนลระบบปฏิบัติการ
Dreamer

34

รายการส่วนใหญ่/devเป็น inode อุปกรณ์บล็อกหรือ inodes อุปกรณ์ตัวละคร Wikipedia มีรายละเอียดมากมายเกี่ยวกับเรื่องนั้นซึ่งฉันจะไม่พูดซ้ำ

แต่/dev/tcpสิ่งที่กล่าวถึงในคำถามของคุณไม่ได้อธิบายโดยคำตอบใด ๆ ที่มีอยู่ /dev/tcpและ/dev/udpแตกต่างจาก/devรายการอื่น ๆ ส่วนใหญ่ เคอร์เนลและอุปกรณ์ตัวละครถูกนำมาใช้โดยเคอร์เนล แต่/dev/tcpและ/dev/udpนำไปใช้ในโหมดผู้ใช้

bash shell เป็นหนึ่งโปรแกรมที่มีการนำไปปฏิบัติ/dev/tcpและ/dev/udp(คัดลอกมาจากksh93) เมื่อคุณพยายามเปิดพา ธ ที่อยู่ด้านล่างด้วยโอเปอเรเตอร์ bash มันจะไม่ทำการopenเรียกระบบธรรมดา ทุบตีแทนจะสร้างซ็อกเก็ต TCP และเชื่อมต่อกับพอร์ตที่ระบุ

ที่นำมาใช้ในโหมดผู้ใช้และในบางโปรแกรมเท่านั้นที่สามารถเห็นได้ในตัวอย่างต่อไปนี้ซึ่งแสดงให้เห็นถึงความแตกต่างระหว่างการให้bashและcatพยายามที่จะเปิด/dev/tcp/::1/22

$ cat /dev/tcp/::1/22
cat: /dev/tcp/::1/22: No such file or directory
$ cat < /dev/tcp/::1/22
SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.3

ข้อแตกต่างksh93คือว่าbashจะทำการเชื่อมต่อ TCP กับตัวดำเนินการเปลี่ยนเส้นทางเท่านั้นไม่ใช่ในที่อื่นซึ่งอาจเปิดไฟล์เช่นsourceหรือสร้าง.ขึ้นภายใน


ยิ่งไปกว่านั้น GNU ยังตื่นตัวgawkในกรณีพิเศษเช่นเดียวกัน/inet{,4,6}/{tcp,udp}/$port/$remote/$rportเนื่องจากอยู่ที่ไหนสักแห่งในรอบปี 2010 (ฉันจำไม่ได้แน่นอนและไม่พบบันทึกประจำรุ่น)
dave_thompson_085

6
IMO วิธีที่ดีกว่าในการระบุจุดเกี่ยวกับ/dev/tcpว่าไม่ใช่ไฟล์ ไม่เคยมีไฟล์ชื่อนี้ ไวยากรณ์ของ Bash สำหรับการเปิดซ็อกเก็ตใช้สตริง/dev/tcp/addressเหมือนชื่อไฟล์ แต่เรียกมันว่า "ไฟล์ที่นำไปใช้ในพื้นที่ผู้ใช้" ฟังดูแปลก ๆ สิ่งที่น่าสนใจที่kshเกี่ยวกับชื่อไฟล์เหล่านั้นสำหรับทุกสิ่งไม่ใช่เพียงแค่เปลี่ยนเส้นทาง ที่อยู่ใกล้กับ "การใช้ไฟล์"
Peter Cordes

@ PeterCordes ฉันเชื่อว่า UWIN ตั้งค่าเหล่านี้เป็นไฟล์จริง และฉันคิดว่า 3dfs ก็ทำเช่นเดียวกัน จำไว้ว่าbashคัดลอกพฤติกรรมนี้เท่านั้น แต่มันมาจากที่อื่น
mikeserv

19

นอกเหนือจากโหนดอุปกรณ์ที่อธิบายไว้ในคำตอบอื่น ๆ (สร้างด้วยmknod (2)หรือจัดทำโดยdevfsบางตัว), Linux มีไฟล์ "วิเศษ" อื่น ๆ ที่จัดทำโดยระบบไฟล์เสมือนพิเศษโดยเฉพาะใน/proc/(ดูproc (5)อ่านเกี่ยวกับprocfs ) และใน/sys/(อ่านเกี่ยวกับsysfs )

ไฟล์หลอกเหล่านี้ (ซึ่งปรากฏ -eg to stat (2) - เป็นไฟล์ธรรมดาไม่ใช่อุปกรณ์) เป็นมุมมองเสมือนที่ให้โดยเคอร์เนล โดยเฉพาะอย่างยิ่งการอ่านจาก/proc/(เช่นด้วยcat /proc/$$/mapsหรือโดยเปิด (2) -ing /proc/self/statusในโปรแกรมของคุณ) โดยทั่วไปไม่เกี่ยวข้องกับ I / O ทางกายภาพใด ๆ จากดิสก์หรือเครือข่ายจึงค่อนข้างเร็ว

ในการสร้างไฟล์หลอกเพิ่มเติม/proc/คุณควรเขียนโมดูลเคอร์เนลของคุณเองแล้วโหลดมัน (ดูเช่นนี้ )


3
AFAIK ข้อมูลเกี่ยวกับการขยาย / proc ล้าสมัย ในขณะที่ยังเป็นไปได้ทางเทคนิค / proc (หรือมากกว่า procfs) ควรเก็บข้อมูลเกี่ยวกับกระบวนการทำงาน ไฟล์หลอกอื่น ๆ ทั้งหมดรวมถึงไฟล์ที่มีข้อมูลรันไทม์หรือตัวเลือกการกำหนดค่าสำหรับเคอร์เนลควรไปที่ / sys (sysfs) ยังมีไฟล์หลอกที่ไม่เกี่ยวข้องกับกระบวนการใน / proc (เช่น meminfo, cpuinfo) เพื่อเหตุผลด้านความเข้ากันได้ แต่ไฟล์หลอกใหม่ควรเข้าสู่ sysfs
Dreamer

13

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

มีประเภทไฟล์ "พิเศษ" อื่น ๆ เช่นกันรวมถึงไปป์ที่มีชื่อและฟีดและซ็อกเก็ต


9

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

A. FUSE (ระบบไฟล์ใน USErspace) ช่วยให้คุณสามารถเขียนสิ่งที่ชอบ/procโดยไม่มีความเสี่ยงของการหยุดทำงานของเคอร์เนลและทำในภาษา / รันไทม์ที่คุณเลือกเช่นGo , Node.js , Perl , PHP , Python , Ruby , Rust , เป็นต้น

นอกจากนี้ยังมีข้อได้เปรียบที่ระบบไฟล์ FUSE สามารถติดตั้งได้โดยไม่ต้องsudoทำงานเนื่องจากผู้ใช้ทำการติดตั้ง

นี่คือตัวอย่างของสิ่งที่ผู้คนเขียนโดยใช้ FUSE:

  • mp3fs (ดูไฟล์ FLAC ของคุณเป็นไฟล์ MP3 ที่สร้างขึ้นทันทีเมื่อคุณคัดลอก / คลิกแล้วลากไปยังเครื่องเล่น MP3 ของคุณ)
  • PyTagsFS (ดูสื่อของคุณในแผนผังโฟลเดอร์เสมือนที่สร้างจากแท็กข้อมูลเมตา)
  • fuse-zip (เมานต์ไฟล์ซิปเป็นโฟลเดอร์)
  • FuseISO (เมานต์ ISO โดยไม่มีสิทธิ์รูท)
  • iFUSE (Mount iDevices)
  • FuseDAV (เมานต์ WebDAV หุ้น)
  • fuse-exfat (ติดตั้งระบบไฟล์ที่จัดรูปแบบ exFAT)
  • NTFS-3G ( ไดรเวอร์ลินุกซ์ NTFS)

B.หากคุณต้องการที่จะสร้างอุปกรณ์ป้อนข้อมูลเสมือนเช่นแป้นพิมพ์เมาส์, จอยสติ๊กและอื่น ๆ (เช่น. การเขียนโปรแกรมควบคุม userspace สำหรับอุปกรณ์ USB ที่คุณกำลังพูดถึงการใช้libusb) มีuinput

ผูกมันยากที่จะหา แต่ฉันรู้ว่าพวกเขามีอยู่สำหรับGo (คีย์บอร์ดเท่านั้น) งูหลามและทับทิม (2)

ตัวอย่างของการใช้ uinput ในโลกแห่งความจริงรวมถึง:

  • G15Daemon (ไดรเวอร์ Linux สำหรับ LCD และปุ่มเล่นเกมบน Logitech G15 gaming keyboard)
  • ds4drv (ไดรเวอร์สำหรับคอนโทรลเลอร์ Sony DualShock 4)
  • xboxdrv (ไดรเวอร์ตัวควบคุม XBox 360 ทางเลือกและ Linux เทียบเท่ากับx360ceเกมที่ออกแบบมาไม่ดีอย่างเช่นRunner2: Future Legend of Rhythm Alienสามารถคิดว่าพวกเขากำลังพูดคุยกับตัวควบคุม XBox จริงเมื่อพวกเขาไม่ได้)
  • ไดรเวอร์ Wiimote รุ่นเก่าเช่นcwiidซึ่งจำเป็นต้องใช้ก่อนที่จะมีคนเขียนเคอร์เนลไดรเวอร์ Wiimote ในที่สุดดังนั้นการสนับสนุนจะพร้อมใช้งานตามค่าเริ่มต้น

C.สำหรับอุปกรณ์อักขระทั่วไปจะมีCUSE (อุปกรณ์อักขระใน USErspace) มันเป็นที่นิยมน้อยกว่ามาก

ผู้ใช้เพียงหนึ่งเดียวของ Cuse API ที่ฉันเองตระหนักถึงความเป็นโปรแกรมเดียวกันซึ่งทำให้การสร้าง: osspdซึ่งดำเนิน/dev/dsp, /dev/adspและ/dev/mixer(API ของเสียง OSS) ใน userspace เพื่อให้พวกเขาสามารถส่งผ่าน PulseAudio หรือ dmix

CUSE ผูกพันเดียวที่ฉันหาได้คือcusepyซึ่งยังไม่ได้ปรับปรุงตั้งแต่ปี 2010

D.คุณอาจไม่ต้องการไฟล์พิเศษใหม่เลย

ตัวอย่างเช่นคุณสามารถเปิดการสื่อสารแบบดิบกับอุปกรณ์ USB ใด ๆ โดยใช้libusb (รายการการเชื่อมบนหน้า) จากนั้นสื่อสารกับโปรแกรมอื่นผ่านกลไกอื่น ๆ (ซ็อกเก็ต TCP / UDP การอ่าน / เขียน stdin / stdout หรือไฟล์ปกติบนดิสก์ ฯลฯ )


1
cusepy อาจไม่ได้รับการปรับปรุงในขณะที่ (อันที่จริงมันไม่เคยได้รับการปรับปรุงมันมีเพียงหนึ่งกระทำ!) แต่มีเพียงแค่เขียนอุปกรณ์ตัวละครโดยใช้ cusepy ไม่กี่สัปดาห์ที่ผ่านมาฉันสามารถยืนยันได้ว่ามันยังทำงานได้ดี มันหายไปฟังก์ชั่นไม่กี่ที่เกี่ยวข้องกับการดำเนินการpollแต่เนื่องจาก cusepy ใช้ ctypes และการผูกที่มีการสร้างโดยอัตโนมัติขึ้นอยู่กับไฟล์ส่วนหัว C, setup.pyแก้ไขฟังก์ชั่นที่ขาดหายไปเป็นเพียงเรื่องของการเพิ่มชื่อฟังก์ชั่นที่ต้องการไปยังรายการของฟังก์ชั่นการส่งออกในการ
Aleksi Torhamo

1
อีกตัวอย่างที่น่าสนใจของการใช้ฟิวส์เป็นsshfs อนุญาตให้คุณเรียกดูระบบไฟล์รีโมตราวกับว่าเป็นโลคัลโดยใช้การเชื่อมต่อ SSH ภายใต้
Mr. Deathless

@ Mr.Deathless Yeah ฉันใช้มันจริงและตั้งใจพูดถึงมัน แต่ฉันลืมไป
ssokolow

6

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

ตัวอย่างเช่นฟังก์ชั่นการเขียน/dev/nullเพียงแค่ไม่ทำอะไรเลยละเว้นไบต์ ฟังก์ชั่นการอ่านสำหรับ/dev/randomส่งคืนตัวเลขสุ่ม


1

mount -t devtmpfs

นอกจากนี้ยังเป็นที่น่าสนใจที่จะเห็นว่าในระบบที่ทันสมัย/devเป็นปกติประเภทระบบไฟล์ที่สามารถติดตั้งได้ทุกที่ Ubuntu 16.04:

mkdir d
sudo mount -t devtmpfs none d
head -c 10 d/random
sudo umount d

สิ่งนี้เปิดใช้งานโดยCONFIG_DEVTMPFS=yและอนุญาตให้เคอร์เนลสร้างและทำลายไฟล์อุปกรณ์ได้ตามต้องการ

CONFIG_DEVTMPFS_MOUNT=y

ตัวเลือกนี้จะทำให้เมล็ดอัตโนมัติ-mount devtmpfs /devบน

drivers/base/Kconfig เอกสาร:

config DEVTMPFS_MOUNT
    bool "Automount devtmpfs at /dev, after the kernel mounted the rootfs"
    depends on DEVTMPFS
    help
      This will instruct the kernel to automatically mount the
      devtmpfs filesystem at /dev, directly after the kernel has
      mounted the root filesystem. The behavior can be overridden
      with the commandline parameter: devtmpfs.mount=0|1.
      This option does not affect initramfs based booting, here
      the devtmpfs filesystem always needs to be mounted manually
      after the rootfs is mounted.
      With this option enabled, it allows to bring up a system in
      rescue mode with init=/bin/sh, even when the /dev directory
      on the rootfs is completely empty.

file_operations

สุดท้ายคุณควรสร้างโมดูลเคอร์เนลอุปกรณ์อักขระของคุณเองเพื่อดูว่าเกิดอะไรขึ้น

นี่คือตัวอย่างที่เรียกใช้น้อยที่สุด: การทำความเข้าใจกับไฟล์อุปกรณ์อักขระ (หรืออักขระพิเศษ)

ขั้นตอนที่สำคัญที่สุดคือการตั้งค่าโครงสร้างfile_operationsเช่น:

static const struct file_operations fops = {
    .owner = THIS_MODULE,
    .read = read,
    .open = open,
};

static int myinit(void)
{
    major = register_chrdev(0, NAME, &fops);
    return 0;
}

ซึ่งมีพอยน์เตอร์ของฟังก์ชันที่เรียกใช้สำหรับการเรียกระบบที่เกี่ยวข้องกับไฟล์แต่ละครั้ง

/dev/zeroมันก็จะกลายเป็นที่ชัดเจนว่าคุณแทนที่ระบบไฟล์ที่เกี่ยวข้องกับผู้ที่เรียกร้องให้ทำสิ่งที่คุณต้องการและดังนั้นนี้เป็นวิธีที่เคอร์เนลใช้อุปกรณ์เช่น

สร้าง/devรายการโดยอัตโนมัติโดยไม่ต้องmknod

ความลึกลับสุดท้ายคือเคอร์เนลสร้าง/devรายการโดยอัตโนมัติอย่างไร

สามารถตรวจสอบกลไกได้โดยสร้างโมดูลเคอร์เนลที่ทำด้วยตัวคุณเองดังที่แสดงไว้ที่: https://stackoverflow.com/questions/5970595/how-to-create-a-device-node-from-the-init-module- https://stackoverflow.com/questions/ code-of-a-linux-kernel-module / 45531867 # 45531867และลงมาที่การdevice_createโทร


ใน OpenBSD มีสคริปต์ MAKEDEV ที่ช่วยลดความซับซ้อนนี้ให้ดูman.openbsd.org/MAKEDEV.8 ไม่แน่ใจว่าทำไม Linux ไม่ได้มีมันยกเว้นมันซับซ้อนกว่า อาจจะปรับชิ้นส่วน ตัวอย่างเช่นคุณสามารถพูด MKNOD tty และจัดการรายละเอียด
อลันคอเรย์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.