/ proc / * ทำงานอย่างไร


61

มีไฟล์จำนวนมากใน /proc, ชอบ /proc/cpuinfo, /proc/meminfo, /proc/devices และอื่น ๆ ซึ่งเมื่อเปิดจะส่งคืนข้อมูลระบบ

ไฟล์เหล่านี้ดูเหมือนจะไม่มีอยู่จริงในขณะที่กำลังทำงาน file ที่พวกเขาเพียงบอกว่าพวกเขาว่างเปล่า

$ file /proc/cpuinfo
/proc/cpuinfo: empty

ไฟล์เหล่านี้ทำงานอย่างไร

คำตอบ:


72

จริงๆแล้วมันค่อนข้างง่ายอย่างน้อยถ้าคุณไม่ต้องการรายละเอียดการใช้งาน

ก่อนอื่นบน Linux ระบบไฟล์ทั้งหมด (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ... ) ถูกนำมาใช้ในเคอร์เนล บางคนอาจลดการทำงานของรหัสผู้ใช้ผ่าน FUSE และบางคนมาในรูปแบบของโมดูลเคอร์เนลเท่านั้น ZFS ดั้งเดิม เป็นตัวอย่างที่น่าสังเกตของหลังเนื่องจากข้อ จำกัด สิทธิ์ใช้งาน) แต่อย่างใดยังมีองค์ประกอบเคอร์เนล นี่เป็นพื้นฐานที่สำคัญ

เมื่อโปรแกรมต้องการอ่านจากไฟล์มันจะทำการเรียกไลบรารี่ของระบบต่างๆ open(), read(), close() ลำดับ (อาจจะด้วย seek() โยนทิ้งเพื่อวัดผลที่ดี) เคอร์เนลใช้พา ธ และชื่อไฟล์ที่ให้มาและผ่านระบบไฟล์และเลเยอร์ I / O อุปกรณ์จะแปลสิ่งเหล่านี้เป็นการร้องขอการอ่านแบบฟิสิคัล

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

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

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

มันทำงานในลักษณะเดียวกันถ้าคุณเขียนค่าลงไฟล์ ที่ระดับเคอร์เนลซึ่งแปลเป็นชุดของ open(), seek(), write(), close() การโทรซึ่งจะถูกส่งผ่านไปยังไดรเวอร์ระบบไฟล์ อีกครั้งในกรณีนี้รหัส procfs

เหตุผลเฉพาะที่คุณเห็น file การคืน empty คือไฟล์จำนวนมากที่เปิดเผยโดย procfs ถูกเปิดเผยด้วย ขนาด 0 ไบต์ ขนาด 0 ไบต์น่าจะเป็นการเพิ่มประสิทธิภาพทางด้านเคอร์เนล (ไฟล์จำนวนมากใน / proc เป็นแบบไดนามิกและสามารถเปลี่ยนแปลงความยาวได้อย่างง่ายดายแม้จากการอ่านหนึ่งไปยังอีกการอ่านต่อไป อาจมีราคาแพงมาก) ไปตามความเห็นต่อคำตอบนี้ซึ่งคุณสามารถตรวจสอบในระบบของคุณเองโดยใช้งานผ่าน strace หรือเครื่องมือที่คล้ายกัน file ประเด็นแรก stat() เรียกใช้เพื่อตรวจจับไฟล์พิเศษใด ๆ จากนั้นใช้โอกาสหากขนาดไฟล์ถูกรายงานเป็น 0 ให้ยกเลิกและรายงานว่าไฟล์นั้นว่างเปล่า

พฤติกรรมนี้ได้รับการบันทึกไว้จริงและสามารถเป็นได้ แทนที่โดยการระบุ -s หรือ --special-files บน file การภาวนา แม้ว่าตามที่ระบุไว้ในหน้าคู่มือที่อาจมีผลข้างเคียง ข้อความด้านล่างมาจากไฟล์ BSD 5.11 หน้าคนลงวันที่ 17 ตุลาคม 2011

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


5
เมื่อคุณดูด้วย strace file /proc/version หรือ ltrace -S /proc/versionการเพิ่มประสิทธิภาพค่อนข้างเล็ก มันเป็น stat() โทรก่อนและพบว่าขนาดเป็น 0 จึงข้ามการ open() - แต่ก่อนหน้านั้นโหลดไฟล์มายากลหลายไฟล์
ott--

2
@ ott-- นั่นคือลำดับเหตุการณ์ที่แปลก แต่มัน อาจ เกี่ยวข้องกับความจริงที่ว่าคุณสามารถส่งชื่อไฟล์หลายชื่อ file. วิธีนี้ไฟล์โหลดไฟล์เวทย์ล่วงหน้าจากนั้นประมวลผลพารามิเตอร์บรรทัดคำสั่งตามพารามิเตอร์ แทนที่จะย้ายไฟล์เมจิกโหลดลงใน "ทำสิ่งนี้ก่อนที่จะพยายามกำหนดประเภทของไฟล์ นี้ โดยเฉพาะอย่างยิ่งส่วนหนึ่งของรหัสซึ่งจะเพิ่มความซับซ้อน stat() และการทำหน้าที่เกี่ยวกับมูลค่าส่งคืนนั้นไม่เป็นอันตราย เพิ่มความซับซ้อนในการติดตามความเสี่ยงของรัฐภายในเพิ่มเติมแนะนำข้อบกพร่อง
a CVn

@ ott-- จริงๆแล้วเหตุผล file รายงาน“ ไฟล์ว่างเปล่า” เป็นเพราะมีการโทร stat เพื่อตรวจหาไฟล์พิเศษ (ชื่อ pipes, อุปกรณ์, ... ) และใช้โอกาสนี้ในการหยุดการประมวลผลไฟล์เปล่า file -s /proc/version รายงาน“ ข้อความ ASCII”
Gilles

4
@Gilles -s ควรใช้สำหรับอุปกรณ์พิเศษ block / char ในที่สุดฉันก็มองไปที่ file แหล่งที่มาและในตอนท้ายของ fsmagic.c ฉันเห็นคำอธิบายนี้ว่าทำไมจึงกลับมา ASCII text แทน empty: If stat() tells us the file has zero length, report here that the file is empty, so we can skip all the work of opening and reading the file. But if the -s option has been given, we skip this optimization, since on some systems, stat() reports zero size for raw disk partitions.
ott--

15

ในไดเรกทอรีนี้คุณสามารถควบคุมวิธีที่เคอร์เนลดูอุปกรณ์ปรับการตั้งค่าเคอร์เนลเพิ่มอุปกรณ์ลงในเคอร์เนลและลบออกอีก ในไดเรกทอรีนี้คุณสามารถดูการใช้งานหน่วยความจำและ I / O สถิติ.

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

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

ตั้งแต่ /proc ระบบไฟล์เป็นระบบไฟล์เสมือนและอยู่ในหน่วยความจำระบบใหม่ /proc ระบบไฟล์ถูกสร้างขึ้นทุกครั้งที่เครื่อง Linux รีบูต

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

เลเยอร์ในระบบไฟล์

Enter image description here

ตัวอย่าง:

  • ภายใน /procมีไดเรกทอรีสำหรับกระบวนการทำงานแต่ละกระบวนการตั้งชื่อด้วยรหัสกระบวนการ ไดเร็กทอรีเหล่านี้มีไฟล์ที่มีข้อมูลที่เป็นประโยชน์เกี่ยวกับกระบวนการเช่น:
    • exe: ซึ่งเป็นลิงค์สัญลักษณ์ไปยังไฟล์บนดิสก์ที่กระบวนการเริ่มต้น
    • cwd: ซึ่งเป็นลิงก์สัญลักษณ์ไปยังไดเรกทอรีทำงานของกระบวนการ
    • wchan: ซึ่งเมื่ออ่านแล้วจะส่งคืนช่องสัญญาณที่รอกระบวนการเปิด
    • maps: ซึ่งเมื่ออ่านแล้วจะส่งคืนแม็พหน่วยความจำของกระบวนการ
  • /proc/uptime ส่งคืน uptime เป็นสองค่าทศนิยมในไม่กี่วินาทีคั่นด้วยช่องว่าง:
    • จำนวนเวลาตั้งแต่เคอร์เนลเริ่มต้น
    • ระยะเวลาที่เคอร์เนลว่าง
  • /proc/interrupts: สำหรับข้อมูลที่เกี่ยวข้องกับการขัดจังหวะ
  • /proc/modules: สำหรับรายการของโมดูล

สำหรับข้อมูลเพิ่มเติมโดยละเอียด ผู้ชาย proc หรือ kernel.org .


ถ้าคุณต้องบูทจากแผ่นซีดีบูทและดูที่ไดเรคทอรี่นั้นในฮาร์ดไดรฟ์คุณจะเห็นว่ามันว่างเปล่า " ที่ไม่เฉพาะเจาะจงกับ / proc โดยทั่วไปจะเป็นจุดเชื่อมต่อใด ๆ ที่ระบบไฟล์พื้นฐานไม่ได้เมา หากคุณบู๊ตจากซีดีบูตตัวเดิมและทำสิ่งที่ต้องการ mount -t procfs procfs /mnt/procคุณจะเห็นเคอร์เนล / proc ที่กำลังทำงานอยู่
a CVn

5

คุณถูกต้องพวกเขาไม่ใช่ไฟล์จริง

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

ไฟล์ใน /proc ไม่มีอยู่จริงทุกที่ แต่เคอร์เนลทำปฏิกิริยากับไฟล์ที่คุณอ่านและเขียนภายในและแทนที่จะเขียนลงในที่เก็บข้อมูลจะรายงานข้อมูลหรือทำอะไร

ในทำนองเดียวกันไฟล์ใน /dev ไม่ใช่ไฟล์ในความหมายดั้งเดิม (แม้ว่าในบางระบบไฟล์ใน /dev อาจมีอยู่จริงบนดิสก์พวกเขาไม่ได้มีอะไรมากมายนอกจากอุปกรณ์ที่อ้างถึง) - ช่วยให้คุณสามารถพูดคุยกับอุปกรณ์ที่ใช้ไฟล์ Unix ปกติ I / O API API - หรืออะไรก็ตามที่ใช้มัน


1
มันเหมือนกับ * nix ที่มากกว่าไฟล์เท่านั้นที่สามารถรักษาความปลอดภัยได้ เนื่องจากรายการควบคุมการเข้าถึงยังคงอยู่ในระบบไฟล์จึงสะดวกในการรักษาความปลอดภัยทรัพยากรที่มีสิทธิพิเศษโดยใช้กลไกทั่วไปที่ให้ไว้แล้วโดยไดรเวอร์ระบบไฟล์ สิ่งนี้ทำให้การติดตั้งเครื่องมือที่เข้าถึงโครงสร้างเคอร์เนลง่ายขึ้นและทำให้พวกเขาสามารถทำงานได้โดยไม่ต้องมีการยกระดับสิทธิ์โดยแทนที่จะอ่านจากไฟล์เสมือนระบบไฟล์ proc
Pekka

3

ข้างใน /proc ไดเรกทอรีมีเนื้อหาสองประเภทคือไดเรกทอรีที่มีหมายเลขแรกและประเภทที่สองคือไฟล์ข้อมูลระบบ

/proc เป็นระบบไฟล์เสมือน ตัวอย่างเช่นถ้าคุณทำ ls -l /proc/statคุณจะสังเกตเห็นว่ามันมีขนาด 0 ไบต์ แต่หากคุณเป็น "cat / proc / stat" คุณจะเห็นเนื้อหาบางส่วนภายในไฟล์

ทำ ls -l /procและคุณจะเห็นไดเรกทอรีจำนวนมากที่มีเพียงตัวเลข ตัวเลขเหล่านี้แสดงถึง ID กระบวนการ (PID) ไฟล์ภายในไดเรกทอรีที่มีหมายเลขนี้สอดคล้องกับกระบวนการที่มี PID นั้น

ไฟล์บางไฟล์ซึ่งมีให้ภายใต้ /procมีข้อมูลระบบเช่น cpuinfo, meminfo และ loadavg

คำสั่ง Linux บางคำสั่งอ่านข้อมูลจากสิ่งเหล่านี้ /proc ไฟล์และแสดงมัน ตัวอย่างเช่น ฟรี คำสั่งอ่านข้อมูลหน่วยความจำจาก /proc/meminfo ไฟล์จัดรูปแบบและแสดง

เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับบุคคล /proc ไฟล์ทำ“ man 5 FILENAME”

/proc/cmdline – Kernel command line
/proc/cpuinfo – Information about the processors.
/proc/devices – List of device drivers configured into the currently running kernel.
/proc/dma – Shows which DMA channels are being used at the moment.
/proc/fb – Frame Buffer devices.
/proc/filesystems – File systems supported by the kernel.
/proc/interrupts – Number of interrupts per IRQ on architecture.
/proc/iomem – This file shows the current map of the system’s memory for its various devices
/proc/ioports – provides a list of currently registered port regions used for input or output communication with a device
/proc/loadavg – Contains load average of the system
The first three columns measure CPU utilization of the last 1, 5, and 10 minute periods.
The fourth column shows the number of currently running processes and the total number of processes.
The last column displays the last process ID used.
/proc/locks – Displays the files currently locked by the kernel
Sample line:
1: POSIX ADVISORY WRITE 14375 08:03:114727 0 EOF
/proc/meminfo – Current utilization of primary memory on the system
/proc/misc – This file lists miscellaneous drivers registered on the miscellaneous major device, which is number 10
/proc/modules – Displays a list of all modules that have been loaded by the system
/proc/mounts – This file provides a quick list of all mounts in use by the system
/proc/partitions – Very detailed information on the various partitions currently available to the system
/proc/pci – Full listing of every PCI device on your system
/proc/stat – Keeps track of a variety of different statistics about the system since it was last restarted
/proc/swap – Measures swap space and its utilization
/proc/uptime – Contains information about uptime of the system
/proc/version – Version of the Linux kernel, gcc, name of the Linux flavor installed.

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

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