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

ระบบไฟล์คืออะไร? จากคำพูดของหนึ่งในผู้มีส่วนร่วมและผู้เขียน Linux คนแรก , "ระบบไฟล์คือการจัดเก็บข้อมูลแบบลำดับชั้นที่ประกอบขึ้นตามโครงสร้างเฉพาะ" อย่างไรก็ตาม คำจำกัดความนี้เหมาะสมกับ VFAT (Virtual File Allocation Table), Git และ (). ดังนั้นสิ่งที่กำหนดสิ่งที่เป็น "ระบบไฟล์" กันแน่?
ข้อมูลพื้นฐานเกี่ยวกับระบบไฟล์
เคอร์เนล Linux มีข้อกำหนดบางประการสำหรับเอนทิตีที่สามารถพิจารณาได้ว่าเป็นระบบไฟล์ จะต้องนำวิธีการต่างๆ open(), read() и write() สำหรับวัตถุถาวรที่มีชื่อ จากมุมมองเชิงวัตถุ เคอร์เนลกำหนดระบบไฟล์ทั่วไปเป็นอินเทอร์เฟซแบบนามธรรม และฟังก์ชันขนาดใหญ่ทั้งสามนี้ถือเป็น "เสมือน" และไม่มีคำจำกัดความที่เป็นรูปธรรม ดังนั้น การใช้งานระบบไฟล์เริ่มต้นจึงเรียกว่าระบบไฟล์เสมือน (VFS)

หากเราสามารถเปิด อ่าน และเขียนไปยังเอนทิตีได้ ก็จะถือว่าเอนทิตีนั้นเป็นไฟล์ ดังที่เราเห็นได้จากตัวอย่างในคอนโซลด้านบน
ปรากฏการณ์ VFS เน้นย้ำถึงการสังเกตแบบ Unix ที่ว่า "ทุกอย่างเป็นไฟล์" ลองคิดดูว่าแปลกแค่ไหนที่ตัวอย่าง /dev/console ด้านบนแสดงให้เห็นว่าคอนโซลทำงานอย่างไร รูปภาพแสดงเซสชัน Bash แบบโต้ตอบ การส่งสตริงไปยังคอนโซล (อุปกรณ์คอนโซลเสมือน) จะแสดงสตริงบนหน้าจอเสมือน VFS มีคุณสมบัติอื่น ๆ แม้กระทั่งคนแปลกหน้า ตัวอย่างเช่น จะช่วยให้คุณสามารถค้นหาโดย .
ระบบที่คุ้นเคย เช่น ext4, NFS และ /proc มีหน้าที่สำคัญสามประการในโครงสร้างข้อมูลภาษาซีที่เรียกว่า . นอกจากนี้ ระบบไฟล์บางระบบจะขยายและกำหนดฟังก์ชัน VFS ใหม่ด้วยวิธีเชิงวัตถุที่คุ้นเคย ดังที่ Robert Love ชี้ให้เห็น VFS abstraction ช่วยให้ผู้ใช้ Linux สามารถคัดลอกไฟล์ไปยังหรือจากระบบปฏิบัติการของบุคคลที่สามหรือเอนทิตีที่เป็นนามธรรม เช่น ไปป์ โดยไม่ต้องกังวลเกี่ยวกับรูปแบบข้อมูลภายใน ในด้านผู้ใช้ (userspace) โดยใช้การเรียกระบบ กระบวนการสามารถคัดลอกจากไฟล์ไปยังโครงสร้างข้อมูลเคอร์เนลโดยใช้เมธอด read() ระบบไฟล์เดียวแล้วใช้วิธีการ write () ระบบไฟล์อื่นสำหรับเอาต์พุตข้อมูล
คำจำกัดความของฟังก์ชันที่เป็นของประเภท VFS พื้นฐานอยู่ในไฟล์ ซอร์สโค้ดเคอร์เนลในขณะที่ไดเร็กทอรีย่อย fs/ มีระบบไฟล์บางอย่าง แกนยังมีเอนทิตีเช่น cgroups, /dev и tmpfsซึ่งจำเป็นระหว่างกระบวนการบู๊ต และดังนั้นจึงกำหนดไว้ในไดเร็กทอรีย่อยของเคอร์เนล init/. สังเกตว่า cgroups, /dev и tmpfs อย่าเรียกฟังก์ชัน "บิ๊กทรี" file_operationsแต่อ่านและเขียนโดยตรงไปยังหน่วยความจำ
แผนภาพด้านล่างแสดงวิธีที่ userspace เข้าถึงระบบไฟล์ประเภทต่างๆ ที่มักติดตั้งบนระบบ Linux โครงสร้างไม่แสดง pipes, dmesg и POSIX clocksซึ่งยังใช้โครงสร้าง file_operationsเข้าถึงได้ผ่านเลเยอร์ VFS

VFS เป็น "wrapper layer" ระหว่างการเรียกระบบและการใช้งานบางอย่าง file_operationsเช่น ext4 и procfs. ฟังก์ชั่น file_operations สามารถโต้ตอบกับไดรเวอร์อุปกรณ์หรืออุปกรณ์เข้าถึงหน่วยความจำ tmpfs, devtmpfs и cgroups ไม่ได้ใช้ file_operationsแต่เข้าถึงหน่วยความจำโดยตรง
การมีอยู่ของ VFS ทำให้มีโอกาสนำรหัสกลับมาใช้ใหม่ได้ เนื่องจากระบบไฟล์แต่ละประเภทไม่จำเป็นต้องใช้วิธีพื้นฐานที่เกี่ยวข้องกับระบบไฟล์ซ้ำ การใช้โค้ดซ้ำเป็นเรื่องปกติในหมู่วิศวกรซอฟต์แวร์! อย่างไรก็ตาม หากรหัสที่ใช้ซ้ำได้ประกอบด้วย การใช้งานทั้งหมดที่สืบทอดวิธีการทั่วไปต้องทนทุกข์ทรมานจากสิ่งเหล่านี้
/tmp: คำใบ้ง่ายๆ
วิธีง่ายๆ ในการตรวจสอบว่ามี VFS อยู่ในระบบคือการพิมพ์ mount | grep -v sd | grep -v :/ซึ่งจะแสดงการติดตั้งทั้งหมด (mounted) ระบบไฟล์ที่ไม่ใช่ดิสก์ถิ่นที่อยู่และไม่ใช่ NFS ซึ่งเป็นจริงในคอมพิวเตอร์ส่วนใหญ่ หนึ่งในเมานต์ที่อยู่ในรายการ (mounts) VFS จะไม่ต้องสงสัย /tmp, ขวา?

ทุกคนรู้ว่าการจัดเก็บ / tmp บนสื่อทางกายภาพ - ความบ้าคลั่ง! .
เหตุใดจึงไม่พึงปรารถนาที่จะจัดเก็บ /tmp บนสื่อทางกายภาพ? เนื่องจากไฟล์ใน /tmp เป็นอุปกรณ์ชั่วคราวและอุปกรณ์เก็บข้อมูลช้ากว่าหน่วยความจำที่สร้าง tmpfs นอกจากนี้ สื่อกายภาพยังสึกหรอได้ง่ายเมื่อถูกเขียนทับมากกว่าหน่วยความจำ ประการสุดท้าย ไฟล์ใน /tmp สามารถมีข้อมูลที่ละเอียดอ่อน ดังนั้นการทำให้ไฟล์เหล่านี้หายไปทุกครั้งที่รีบูตเป็นคุณสมบัติที่จำเป็น
น่าเสียดายที่สคริปต์การติดตั้งการกระจาย Linux บางตัวสร้าง /tmp บนอุปกรณ์จัดเก็บข้อมูลตามค่าเริ่มต้น อย่าสิ้นหวังหากสิ่งนี้เกิดขึ้นกับระบบของคุณเช่นกัน ทำตามคำแนะนำง่ายๆ ด้วย เพื่อแก้ไขปัญหานี้ และโปรดทราบว่าหน่วยความจำที่จัดสรรไว้สำหรับ tmpfs จะไม่สามารถใช้ได้สำหรับวัตถุประสงค์อื่น กล่าวอีกนัยหนึ่ง ระบบที่มี tmpfs ขนาดยักษ์และไฟล์ขนาดใหญ่อาจทำให้หน่วยความจำไม่พอและเกิดความผิดพลาดได้ คำแนะนำอื่น: ขณะแก้ไขไฟล์ /etc/fstabโปรดจำไว้ว่าจะต้องลงท้ายด้วยบรรทัดใหม่ มิฉะนั้น ระบบของคุณจะไม่บู๊ต
/proc และ /sys
นอกเหนือจาก /tmp, VFS (ระบบไฟล์เสมือน) ที่ผู้ใช้ Linux คุ้นเคยมากที่สุดคือ /proc и /sys. (/dev อยู่ในหน่วยความจำร่วมและไม่มี file_operations). ทำไมต้องเป็นส่วนประกอบทั้งสองนี้ ลองดูในประเด็นนี้
procfs สร้างภาพรวมของเคอร์เนลและกระบวนการที่ตรวจสอบ userspace. ใน /proc เคอร์เนลจะพิมพ์ข้อมูลเกี่ยวกับสิ่งที่มีอยู่ เช่น การขัดจังหวะ หน่วยความจำเสมือน และตัวกำหนดตารางเวลา นอกจาก, /proc/sys เป็นที่ที่พารามิเตอร์กำหนดค่าด้วยคำสั่ง sysctl,ใช้ได้สำหรับ userspace. สถานะและสถิติของแต่ละกระบวนการจะแสดงในไดเร็กทอรี /proc/.

ที่นี่ /proc/meminfo เป็นไฟล์เปล่าที่ยังมีข้อมูลที่มีค่าอยู่
พฤติกรรม /proc ไฟล์แสดงให้เห็นว่าระบบไฟล์ดิสก์ VFS แตกต่างกันอย่างไร ด้านหนึ่ง /proc/meminfo มีข้อมูลที่สามารถเรียกดูได้ด้วยคำสั่ง free. อีกด้านก็ว่างเปล่า! มันทำงานอย่างไร? สถานการณ์ดังกล่าวทำให้นึกถึงบทความชื่อดังเรื่อง เขียนโดย David Mermin ศาสตราจารย์ฟิสิกส์แห่งมหาวิทยาลัย Cornell ในปี 1985 ความจริงก็คือเคอร์เนลรวบรวมสถิติหน่วยความจำเมื่อมีการร้องขอ /procและจริง ๆ แล้วในไฟล์ /proc ไม่มีอะไรเมื่อไม่มีใครมอง ดังที่กล่าวไว้ , "หลักคำสอนควอนตัมพื้นฐานกล่าวว่าการวัดโดยทั่วไปไม่ได้เปิดเผยค่าที่มีอยู่แล้วของคุณสมบัติที่กำลังวัดอยู่" (และพิจารณาคำถามเกี่ยวกับดวงจันทร์เป็นการบ้าน!)
ที่ดูว่างเปล่า procfs สมเหตุสมผลเพราะข้อมูลมีไดนามิก สถานการณ์ที่แตกต่างกันเล็กน้อยกับ sysfs. ลองเปรียบเทียบดูว่ามีไฟล์ที่มีขนาดอย่างน้อยหนึ่งไบต์กี่ไฟล์ /proc และ /sys.

Procfs มีไฟล์เดียวคือการกำหนดค่าเคอร์เนลที่ส่งออกซึ่งเป็นข้อยกเว้นเนื่องจากจำเป็นต้องสร้างเพียงครั้งเดียวต่อการบู๊ต ในทางกลับกัน ใน /sys มีไฟล์ขนาดใหญ่กว่าหลายไฟล์ ซึ่งหลายไฟล์ใช้หน่วยความจำเต็มหน้า มักจะเป็นไฟล์ sysfs มีตัวเลขหรือบรรทัดเดียว ไม่เหมือนตารางข้อมูลที่ได้จากการอ่านไฟล์ เช่น /proc/meminfo.
เป้า sysfs - จัดเตรียมคุณสมบัติการอ่าน/เขียนของสิ่งที่เคอร์เนลเรียก «kobjects» ในพื้นที่ผู้ใช้ เป้าหมายเดียว kobjects คือการนับลิงก์: เมื่อลิงก์ล่าสุดไปยัง koobject ถูกลบออก ระบบจะกู้คืนทรัพยากรที่เกี่ยวข้อง แต่ถึงอย่างไร, /sys ประกอบขึ้นเป็นส่วนใหญ่ที่มีชื่อเสียง หลักซึ่งไม่มีใครสามารถทำได้ไม่ว่าในกรณีใด ๆ . ซึ่งไม่ได้หมายความว่าไฟล์ใน sysfs จะเป็นแบบสแตติก ซึ่งจะไม่สอดคล้องกับการนับการอ้างอิงของอ็อบเจ็กต์ที่ไม่เสถียร
ABI ที่เสถียรของเคอร์เนลจะจำกัดสิ่งที่สามารถปรากฏใน /sysไม่ใช่สิ่งที่มีอยู่จริงในขณะนั้น การแสดงรายการสิทธิ์ของไฟล์ใน sysfs ให้ข้อมูลเชิงลึกเกี่ยวกับการตั้งค่าที่กำหนดได้สำหรับอุปกรณ์ โมดูล ระบบไฟล์ ฯลฯ สามารถกำหนดค่าหรืออ่าน ข้อสรุปเชิงตรรกะคือ procfs เป็นส่วนหนึ่งของ ABI ที่เสถียรของเคอร์เนลด้วย แม้ว่าจะไม่ได้ระบุไว้อย่างชัดเจนใน .

ไฟล์ใน sysfs อธิบายคุณสมบัติเฉพาะหนึ่งรายการสำหรับแต่ละเอนทิตีและสามารถอ่านได้ เขียนได้ หรือทั้งสองอย่าง "0" ในไฟล์หมายความว่าไม่สามารถถอด SSD ได้
มาเริ่มส่วนที่สองของการแปลด้วยวิธีการตรวจสอบ VFS โดยใช้เครื่องมือ eBPF และ bcc และตอนนี้เรากำลังรอความคิดเห็นของคุณและเชิญคุณตามธรรมเนียม ซึ่งครูของเราจะจัดขึ้นในวันที่ 9 เมษายน - .
ที่มา: will.com
