cat /proc/cpuinfo
เกิดอะไรขึ้นเมื่อผมเขียน นั่นคือไพพ์ที่มีชื่อ (หรืออย่างอื่น) กับระบบปฏิบัติการที่อ่านข้อมูล CPU ได้ทันทีและสร้างข้อความนั้นทุกครั้งที่ฉันเรียกมัน
cat /proc/cpuinfo
เกิดอะไรขึ้นเมื่อผมเขียน นั่นคือไพพ์ที่มีชื่อ (หรืออย่างอื่น) กับระบบปฏิบัติการที่อ่านข้อมูล CPU ได้ทันทีและสร้างข้อความนั้นทุกครั้งที่ฉันเรียกมัน
คำตอบ:
เมื่อใดก็ตามที่คุณอ่านไฟล์ภายใต้/proc
สิ่งนี้จะเรียกใช้รหัสบางอย่างในเคอร์เนลซึ่งคำนวณข้อความเพื่ออ่านเป็นเนื้อหาไฟล์ ความจริงที่ว่าเนื้อหาถูกสร้างขึ้นในทันทีอธิบายว่าทำไมไฟล์เกือบทั้งหมดมีเวลารายงานในขณะนี้และขนาดของพวกเขารายงานเป็น 0 - ที่นี่คุณควรอ่าน 0 ว่า "ไม่รู้" แตกต่างจากระบบไฟล์ทั่วไประบบไฟล์ที่ติดตั้งอยู่ใน/proc
นั้นเรียกว่าprocfsไม่โหลดข้อมูลจากดิสก์หรือสื่อบันทึกข้อมูลอื่น (เช่น FAT, ext2, zfs, …) หรือผ่านเครือข่าย (เช่น NFS, Samba, ... ) และไม่เรียกรหัสผู้ใช้ (ต่างจากFUSE )
Procfs มีอยู่ในส่วนที่ไม่ใช่ BSD ส่วนใหญ่ มันเริ่มต้นชีวิตของพวกเขาใน Bell Labs ของ AT&T ในUNIX รุ่นที่ 8เพื่อรายงานข้อมูลเกี่ยวกับกระบวนการ (และps
มักจะเป็นเครื่องพิมพ์ที่สวยสำหรับการอ่านข้อมูล/proc
) ส่วนใหญ่การใช้งาน procfs มีไฟล์หรือไดเรกทอรีที่เรียกว่า/proc/123
ในการรายงานข้อมูลเกี่ยวกับกระบวนการที่มี PID 123 ลินุกซ์ขยายระบบแฟ้ม proc ที่มีรายการอื่น ๆ /proc/cpuinfo
อีกมากมายที่รายงานสถานะของระบบรวมทั้งตัวอย่างของคุณ
ในอดีต Linux /proc
ได้รับไฟล์ต่าง ๆ ที่ให้ข้อมูลเกี่ยวกับไดรเวอร์ แต่การใช้งานนี้เลิกใช้แล้ว/sys
และ/proc
ตอนนี้วิวัฒนาการช้า รายการที่ชอบ/proc/bus
และ/proc/fs/ext4
ยังคงอยู่ที่พวกเขาจะเข้ากันได้ย้อนหลัง /sys
แต่อินเตอร์เฟซที่คล้ายกันใหม่จะถูกสร้างขึ้นภายใต้ ในคำตอบนี้ฉันจะเน้น Linux
จุดเริ่มต้นที่หนึ่งและสองของคุณสำหรับเอกสารเกี่ยวกับ/proc
บน Linux คือ
proc(5)
หน้าคน ;/proc
ระบบแฟ้มในเอกสาร kernelจุดเริ่มต้นที่สามของคุณเมื่อเอกสารที่ไม่ครอบคลุมถึงมันจะอ่านแหล่งที่มา คุณสามารถดาวน์โหลดซอร์สบนเครื่องของคุณ แต่นี่เป็นโปรแกรมขนาดใหญ่และLXRซึ่งเป็นตัวอ้างอิงโยงของ Linux เป็นตัวช่วยที่สำคัญมาก (มีหลายรุ่นของ LXR; หนึ่งตัวที่ทำงานlxr.linux.no
ได้ดีที่สุด แต่น่าเสียดายที่เว็บไซต์มักจะถูกลง) จำเป็นต้องมีความรู้เล็กน้อยเกี่ยวกับ C แต่คุณไม่จำเป็นต้องเป็นโปรแกรมเมอร์เพื่อติดตามค่าลึกลับ .
การจัดการหลักของ/proc
รายการอยู่ในfs/proc
ไดเรกทอรี ไดรเวอร์ใด ๆ สามารถลงทะเบียนรายการใน/proc
(แม้ว่าตามที่ระบุไว้ข้างต้นตอนนี้เลิกใช้แล้ว/sys
) ดังนั้นหากคุณไม่พบสิ่งที่คุณกำลังมองหาให้fs/proc
มองไปที่อื่น include/linux/proc_fs.h
ไดร์เวอร์เรียกฟังก์ชั่นในการประกาศ เคอร์เนลเวอร์ชันมากถึง 3.9มีฟังก์ชั่นcreate_proc_entry
และโปรแกรมเสริม (โดยเฉพาะcreate_proc_read_entry
) และเคอร์เนลเวอร์ชัน3.10 ขึ้นไปให้บริการเฉพาะproc_create
และproc_create_data
(และอีกไม่กี่)
การ/proc/cpuinfo
เป็นตัวอย่างการค้นหา"cpuinfo"
นำคุณไปเรียกร้องให้ในproc_create("cpuinfo, …")
fs/proc/cpuinfo.c
คุณจะเห็นว่ารหัสนั้นเป็นรหัสสำเร็จรูปมาก: เนื่องจากไฟล์ส่วนใหญ่ที่อยู่ภายใต้การ/proc
ถ่ายโอนข้อมูลข้อความบางส่วนมีฟังก์ชั่นผู้ช่วยที่จะทำเช่นนั้น มีเพียงseq_operations
โครงสร้างและเนื้อจริงอยู่ในcpuinfo_op
โครงสร้างข้อมูลซึ่งขึ้นอยู่กับสถาปัตยกรรมซึ่งโดยปกติจะกำหนดไว้ในarch/<architecture>/kernel/setup.c
(หรือบางครั้งเป็นไฟล์อื่น) การ x86 arch/x86/kernel/cpu/proc.c
เป็นตัวอย่างที่เรากำลังนำไปสู่การ มีฟังก์ชั่นหลักคือshow_cpuinfo
ซึ่งพิมพ์เนื้อหาไฟล์ที่ต้องการ ส่วนที่เหลือของโครงสร้างพื้นฐานนั้นอยู่ที่นั่นเพื่อดึงข้อมูลไปยังกระบวนการอ่านที่ความเร็วที่ร้องขอ คุณสามารถดูข้อมูลที่ถูกประกอบในการบินจากข้อมูลในตัวแปรต่างๆใน kernel รวมทั้งจำนวนน้อยคำนวณเกี่ยวกับการบินเช่นความถี่ซีพียู
ส่วนใหญ่/proc
เป็นข้อมูลต่อกระบวนการ/proc/<PID>
มา รายการเหล่านี้ได้รับการจดทะเบียนในfs/proc/base.c
ในtgid_base_stuff
อาร์เรย์ ; ฟังก์ชั่นบางอย่างที่ลงทะเบียนที่นี่ถูกกำหนดไว้ในไฟล์อื่น ลองมาดูตัวอย่างของวิธีการสร้างรายการเหล่านี้:
cmdline
ถูกสร้างโดยproc_pid_cmdline
ในไฟล์เดียวกัน มันจะหาข้อมูลในกระบวนการและพิมพ์ออกมาclear_refs
ซึ่งแตกต่างจากรายการที่เราได้เห็นจนถึงตอนนี้เขียนได้ แต่ไม่สามารถอ่านได้ ดังนั้นproc_clear_refs_operations
โครงสร้างจะกำหนดclear_refs_write
ฟังก์ชัน แต่ไม่มีฟังก์ชันอ่านcwd
คือลิงก์สัญลักษณ์ (ลิงก์ที่น่าอัศจรรย์เล็กน้อย) ซึ่งประกาศโดยproc_cwd_link
ซึ่งจะค้นหาไดเรกทอรีปัจจุบันของกระบวนการและส่งคืนเป็นเนื้อหาลิงก์fd
เป็นไดเรกทอรีย่อย การดำเนินงานในไดเรกทอรีที่ตัวเองกำหนดไว้ในproc_fd_operations
โครงสร้างข้อมูล (พวกเขากำลังสำเร็จรูปยกเว้นสำหรับฟังก์ชั่นที่ระบุรายการที่proc_readfd
ซึ่งระบุไฟล์ที่เปิดกระบวนการ) ในขณะที่การดำเนินงานในรายการอยู่ใน`proc_fd_inode_operationsอีกพื้นที่ที่สำคัญของการ/proc
เป็นซึ่งเป็นอินเตอร์เฟซที่ตรงไปยัง/proc/sys
sysctl
การอ่านจากรายการในลำดับชั้นนี้ส่งคืนค่าของค่า sysctl ที่สอดคล้องกันและการเขียนตั้งค่า sysctl จุดรายการสำหรับ sysctl fs/proc/proc_sysctl.c
อยู่ใน Sysctls มีระบบการลงทะเบียนของตัวเองกับregister_sysctl
และเพื่อน ๆ
strace
เมื่อพยายามที่จะได้รับความเข้าใจในสิ่งที่จัดเรียงของเวทมนตร์ที่เกิดขึ้นเบื้องหลังเพื่อนที่ดีที่สุดของคุณ การเรียนรู้ที่จะใช้งานเครื่องมือนี้เป็นหนึ่งในสิ่งที่ดีที่สุดที่คุณสามารถทำได้เพื่อรับการชื่นชมที่ดีขึ้นสำหรับเวทมนตร์ที่กำลังเกิดขึ้นเบื้องหลัง
$ strace -s 200 -m strace.log cat /proc/cpuinfo
...
read(3, "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 37\nmodel name\t: Intel(R) Core(TM) i5 CPU M 560 @ 2.67GHz\nstepping\t: 5\nmicrocode\t: 0x4\ncpu MHz\t\t: 1199.000\ncache size\t: 3072 KB\nphy"..., 65536) = 3464
write(1, "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 37\nmodel name\t: Intel(R) Core(TM) i5 CPU M 560 @ 2.67GHz\nstepping\t: 5\nmicrocode\t: 0x4\ncpu MHz\t\t: 1199.000\ncache size\t: 3072 KB\nphy"..., 3464) = 3464
read(3, "", 65536) = 0
close(3) = 0
...
จากเอาต์พุตด้านบนคุณจะเห็นว่า/proc/cpuinfo
เป็นเพียงไฟล์ปกติหรืออย่างน้อยก็น่าจะเป็นไฟล์เดียว ลองขุดลึกลงไป
เมื่อมองดูไฟล์ด้วยตัวเองมันจะดูเหมือนเป็น "แค่ไฟล์"
$ ls -l /proc/cpuinfo
-r--r--r--. 1 root root 0 Mar 26 22:45 /proc/cpuinfo
แต่ลองมองให้ใกล้ เราได้คำใบ้แรกของเราว่ามันพิเศษสังเกตขนาดของไฟล์คือ 0 ไบต์
# 2 - ด้วยสถิติ ..ถ้าตอนนี้เรามองไปที่ไฟล์โดยใช้เราจะได้รับคำใบ้ต่อไปของเราว่ามีบางสิ่งที่พิเศษเกี่ยวกับstat
/proc/cpuinfo
$ stat /proc/cpuinfo
File: ‘/proc/cpuinfo’
Size: 0 Blocks: 0 IO Block: 1024 regular empty file
Device: 3h/3dInode: 4026532023 Links: 1
Access: (0444/-r--r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:proc_t:s0
Access: 2014-03-26 22:46:18.390753719 -0400
Modify: 2014-03-26 22:46:18.390753719 -0400
Change: 2014-03-26 22:46:18.390753719 -0400
Birth: -
เรียกใช้ # 2
$ stat /proc/cpuinfo
File: ‘/proc/cpuinfo’
Size: 0 Blocks: 0 IO Block: 1024 regular empty file
Device: 3h/3dInode: 4026532023 Links: 1
Access: (0444/-r--r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:proc_t:s0
Access: 2014-03-26 22:46:19.945753704 -0400
Modify: 2014-03-26 22:46:19.945753704 -0400
Change: 2014-03-26 22:46:19.945753704 -0400
Birth: -
สังเกตเห็นว่าการเข้าถึงแก้ไขและเปลี่ยนเวลา? พวกเขาเปลี่ยนไปสำหรับการเข้าถึงแต่ละครั้ง นี่เป็นสิ่งที่แปลกมากที่ทั้ง 3 คนจะเปลี่ยนเช่นนั้น เว้นแต่จะแก้ไขแอตทริบิวต์การประทับเวลาของไฟล์โดยทั่วไปแล้วจะยังคงเหมือนเดิม
# 3 - พร้อมไฟล์ ..อีกหนึ่งร่องรอยที่ไฟล์นี้เป็นไฟล์อื่นนอกจากไฟล์ปกติ:
$ file /proc/cpuinfo
/proc/cpuinfo: empty
หากเป็นการรวมตัวของไพพ์ที่ระบุชื่อมันจะแสดงคล้ายกับไฟล์ใดไฟล์หนึ่งต่อไปนี้:
$ ls -l /dev/initctl /dev/zero
prw-------. 1 root root 0 Mar 26 20:09 /dev/initctl
crw-rw-rw-. 1 root root 1, 5 Mar 27 00:39 /dev/zero
$ file /dev/initctl /dev/zero
/dev/initctl: fifo (named pipe)
/dev/zero: character special
ถ้าเราสัมผัสemptyfile
, /proc/cpuinfo
ไม่ปรากฏว่าจะมากขึ้นเช่นไฟล์แล้วท่อ:
$ touch emptyfile
$ ls -l emptyfile
-rw-rw-r--. 1 saml saml 0 Mar 27 07:40 emptyfile
$ file emptyfile
emptyfile: empty
# 4 - พร้อมเมาท์ ..
ดังนั้น ณ จุดนี้เราจำเป็นต้องถอยห่างออกไปเล็กน้อย เรากำลังดูไฟล์เฉพาะ แต่บางทีเราควรจะดูที่ระบบไฟล์ที่ไฟล์นี้อยู่ และสำหรับสิ่งนี้เราสามารถใช้mount
คำสั่ง
$ mount | grep " /proc "
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
proc
ตกลงดังนั้นประเภทระบบแฟ้มเป็นประเภท ดังนั้น/proc
เป็นประเภทระบบไฟล์ที่แตกต่างกันนั่นคือคำใบ้ของเราว่าไฟล์ภายใต้/proc
นั้นมีความพิเศษ พวกเขาไม่ได้เป็นเพียงการเรียกใช้ไฟล์ mill ของคุณ ดังนั้นเรามาดูข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่ทำให้proc
ระบบไฟล์พิเศษ
ดูที่mount
หน้าคนของ:
ระบบไฟล์ proc ไม่ได้เชื่อมโยงกับอุปกรณ์พิเศษและเมื่อติดตั้งคำหลักที่กำหนดเองเช่น proc สามารถใช้แทนข้อกำหนดของอุปกรณ์ได้ (ตัวเลือกตามธรรมเนียมไม่มีใครโชคดีน้อยกว่า: ข้อความแสดงข้อผิดพลาดที่ว่า "ไม่ว่าง" จาก umount อาจสร้างความสับสน)
และถ้าเราดูที่proc
หน้าคน:
ระบบไฟล์ proc เป็นระบบไฟล์หลอกซึ่งใช้เป็นส่วนต่อประสานกับโครงสร้างข้อมูลเคอร์เนล มันเป็นเรื่องปกติที่ / proc ส่วนใหญ่เป็นแบบอ่านอย่างเดียว แต่ไฟล์บางไฟล์อนุญาตให้เปลี่ยนเคอร์เนลได้
ลงไปอีกเล็กน้อยในหน้าคนเดียวกัน:
/ proc / cpuinfo
นี่เป็นคอลเล็กชันของรายการที่ขึ้นกับ CPU และสถาปัตยกรรมระบบสำหรับแต่ละรายการที่แตกต่างกัน รายการทั่วไปสองรายการคือตัวประมวลผลซึ่งให้หมายเลข CPU และโบกออม ค่าคงที่ระบบที่คำนวณในระหว่างการเริ่มต้นเคอร์เนล เครื่อง SMP มีข้อมูลสำหรับ CPU แต่ละตัว คำสั่ง lscpu (1) รวบรวมข้อมูลจากไฟล์นี้
ที่ด้านล่างของหน้าคนที่มีการอ้างอิงถึงเอกสารเคอร์เนลที่คุณสามารถหาที่นี่หัวข้อ: ระบบแฟ้ม proc / การอ้างอิงจากเอกสารนั้น:
ระบบไฟล์ proc ทำหน้าที่เป็นส่วนต่อประสานกับโครงสร้างข้อมูลภายในในเคอร์เนล สามารถใช้เพื่อรับข้อมูลเกี่ยวกับระบบและเปลี่ยนพารามิเตอร์เคอร์เนลที่รันไทม์ (sysctl)
แล้วเราเรียนรู้อะไรที่นี่? ให้ดีที่/proc
เรียกว่าระบบแฟ้มหลอกและ "อินเตอร์เฟซไปยังโครงสร้างข้อมูลภายใน" มันอาจจะปลอดภัยที่จะคิดว่ารายการที่อยู่ในนั้นไม่ได้เป็นไฟล์ที่เกิดขึ้นจริง
ฉันจะปิดด้วยคำพูดนี้ซึ่งเห็นได้ชัดว่าเคยเป็นรุ่นก่อนหน้าของ man 5 proc
ประมาณ 2004 แต่ด้วยเหตุผลใดก็ตามจะไม่รวม หมายเหตุ:ฉันไม่แน่ใจว่าทำไมมันถูกลบออกเพราะมันอธิบายได้ดีว่าอะไร/proc
คือ:
ไดเร็กทอรี / proc บนระบบ GNU / Linux จัดเตรียมระบบไฟล์เช่นอินเตอร์เฟสไปยังเคอร์เนล สิ่งนี้อนุญาตให้แอ็พพลิเคชันและผู้ใช้ดึงข้อมูลจากและตั้งค่าในเคอร์เนลโดยใช้การดำเนินการ I / O ระบบไฟล์ปกติ
ระบบไฟล์ proc บางครั้งถูกอ้างถึงว่าเป็นข้อมูลกระบวนการระบบไฟล์หลอก มันไม่ได้มีไฟล์ `` ของจริง '' แต่ข้อมูลระบบรันไทม์ (เช่นหน่วยความจำระบบ, อุปกรณ์ที่ติดตั้ง, การกำหนดค่าฮาร์ดแวร์ ฯลฯ ) ด้วยเหตุนี้จึงถือได้ว่าเป็นศูนย์ควบคุมและข้อมูลสำหรับเคอร์เนล ความจริงแล้วยูทิลิตี้ระบบจำนวนมากเป็นเพียงการโทรไปยังไฟล์ในไดเรกทอรีนี้ ตัวอย่างเช่นคำสั่ง lsmod ซึ่งแสดงรายการโมดูลที่โหลดโดยเคอร์เนลนั้นโดยทั่วไปเหมือนกับ 'cat / proc / modules' ในขณะที่ lspci ซึ่งแสดงรายการอุปกรณ์ที่เชื่อมต่อกับบัส PCI ของระบบนั้นเหมือนกับ 'cat / proc / PCI' โดยการแก้ไขไฟล์ที่อยู่ในไดเรกทอรีนี้คุณสามารถเปลี่ยนพารามิเตอร์เคอร์เนลในขณะที่ระบบกำลังทำงาน
ที่มา: ระบบไฟล์ proc pseudo
strace -o catcpuproc.txt cat /proc/cpuinfo
คำตอบที่ได้รับจาก @slm นั้นครอบคลุมมาก แต่ฉันคิดว่าคำอธิบายที่ง่ายกว่าอาจมาจากการเปลี่ยนมุมมอง
ในการใช้งานแบบวันต่อวันเราสามารถคิดว่าไฟล์เป็นสิ่งที่มีอยู่จริงเช่น ชิ้นข้อมูลที่เก็บไว้ในอุปกรณ์บางอย่าง สิ่งนี้ทำให้ไฟล์เช่น / proc / cpuinfo ลึกลับและสับสนมาก แต่ก็ทำให้รู้สึกทั้งหมดที่สมบูรณ์แบบถ้าเราคิดว่าของไฟล์ที่เป็นอินเตอร์เฟซ ; วิธีในการส่งข้อมูลเข้าและออกจากบางโปรแกรม
โปรแกรมที่ส่งและรับข้อมูลในลักษณะนี้คือระบบไฟล์หรือไดรเวอร์ (ขึ้นอยู่กับวิธีที่คุณกำหนดเงื่อนไขเหล่านี้ซึ่งอาจเป็นคำจำกัดความที่กว้างเกินไปหรือแคบเกินไป) จุดสำคัญคือบางโปรแกรมใช้อุปกรณ์ฮาร์ดแวร์ในการจัดเก็บและดึงข้อมูลที่ส่งผ่านอินเทอร์เฟซนี้ แต่ไม่ใช่ทั้งหมด
ตัวอย่างของระบบไฟล์ที่ไม่ได้ใช้อุปกรณ์เก็บข้อมูล (อย่างน้อยโดยตรง) คือ:
Plan9 OS ( http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs ) เป็นตัวอย่างที่ยอดเยี่ยมของการใช้ไฟล์เป็นอินเตอร์เฟสการเขียนโปรแกรมทั่วไป