จะเกิดอะไรขึ้นเมื่อฉันรันคำสั่ง cat / proc / cpuinfo


86

cat /proc/cpuinfoเกิดอะไรขึ้นเมื่อผมเขียน นั่นคือไพพ์ที่มีชื่อ (หรืออย่างอื่น) กับระบบปฏิบัติการที่อ่านข้อมูล CPU ได้ทันทีและสร้างข้อความนั้นทุกครั้งที่ฉันเรียกมัน


คำตอบ:


72

เมื่อใดก็ตามที่คุณอ่านไฟล์ภายใต้/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 คือ

  1. proc(5)หน้าคน ;
  2. /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และเพื่อน ๆ


59

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เป็นเพียงไฟล์ปกติหรืออย่างน้อยก็น่าจะเป็นไฟล์เดียว ลองขุดลึกลงไป

ดำน้ำลึก

# 1 - ด้วย ls ..

เมื่อมองดูไฟล์ด้วยตัวเองมันจะดูเหมือนเป็น "แค่ไฟล์"

$ ls -l /proc/cpuinfo 
-r--r--r--. 1 root root 0 Mar 26 22:45 /proc/cpuinfo

แต่ลองมองให้ใกล้ เราได้คำใบ้แรกของเราว่ามันพิเศษสังเกตขนาดของไฟล์คือ 0 ไบต์

# 2 - ด้วยสถิติ ..

ถ้าตอนนี้เรามองไปที่ไฟล์โดยใช้เราจะได้รับคำใบ้ต่อไปของเราว่ามีบางสิ่งที่พิเศษเกี่ยวกับstat/proc/cpuinfo

เรียกใช้ # 1
$ 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

อ้างอิง


1
เจ๋ง :) นี่เป็นสิ่งแรกที่ฉันพยายามเมื่อฉันเห็นคำถาม:strace -o catcpuproc.txt cat /proc/cpuinfo
mkc

1
คำตอบที่ดี! บน linux หากคุณต้องการขุดให้ลึกลงไปแหล่งที่มาของระบบไฟล์ proc จะอยู่ใน fs / proc ในเคอร์เนลซอร์ส คุณจะเห็นว่ามี fs / proc / cpuinfo.c แต่น่าเสียดายที่มันค่อนข้างว่างเปล่าเนื่องจากการยกของหนักกระจายไปทั่วซุ้มประตู / เนื่องจากขึ้นอยู่กับสถาปัตยกรรม สำหรับตัวอย่างที่ง่ายกว่าดู fs / proc / uptime.c โดยการมองที่ไฟล์เราสามารถเดาได้ว่า uptime_proc_show คือสิ่งที่ทำให้เราได้รับข้อมูลที่เราต้องการและเราสามารถสำรวจมันได้มากขึ้นโดยการดำน้ำในฟังก์ชั่นที่เรียกใช้ เพื่อทำความเข้าใจกับอินเตอร์เฟส seq_file และวิธีการใช้งานใน procfs โปรดดู:
Steven D

1
linux.com/learn/linux-training/…และlwn.net/Articles/22355 (วันที่บิต)
Steven D

1
@slm: +1, คำตอบที่ดี แต่สำหรับฉันคำใบ้แรกมันเป็นไฟล์พิเศษคือขนาดของมัน ^^ 0 ไบต์ แต่คุณสามารถเก็บของได้เยอะ (เหมือนไฟล์ไพพ์)
Olivier Dulac

@OlivierDulac - จุดดี ฉันได้ทำการแก้ไขเพิ่มเติมตามความคิดเห็นของคุณ LMK ถ้าฉันสามารถทำการปรับปรุงเพิ่มเติมได้ ขอบคุณ
slm

14

คำตอบที่ได้รับจาก @slm นั้นครอบคลุมมาก แต่ฉันคิดว่าคำอธิบายที่ง่ายกว่าอาจมาจากการเปลี่ยนมุมมอง

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

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

ตัวอย่างของระบบไฟล์ที่ไม่ได้ใช้อุปกรณ์เก็บข้อมูล (อย่างน้อยโดยตรง) คือ:

  • ระบบไฟล์ที่ใช้ค้นหาข้อมูลหรือคำนวณ Proc เป็นตัวอย่างเนื่องจากได้รับข้อมูลจากโมดูลเคอร์เนลต่างๆ ตัวอย่างสุดขั้วคือπfs (github.com/philipl/pifs)
  • ระบบไฟล์ FUSE ทั้งหมดซึ่งจัดการข้อมูลด้วยโปรแกรม userspace ปกติ
  • ระบบไฟล์ที่แปลงข้อมูลของระบบไฟล์อื่นแบบ on-the-fly ตัวอย่างเช่นการเข้ารหัสการบีบอัดหรือแม้แต่การแปลงรหัสเสียง (khenriks.github.io/mp3fs/)

Plan9 OS ( http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs ) เป็นตัวอย่างที่ยอดเยี่ยมของการใช้ไฟล์เป็นอินเตอร์เฟสการเขียนโปรแกรมทั่วไป

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