ความแตกต่างและหน้าที่ของไดเรคทอรี่ /proc และ /sys

By | November 11, 2016

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

ในช่วงเริ่มต้นของ Unix ทางเดียวที่โปรแกรมจะเข้าถึงข้อมูลคุณสมบัติของโปรแกรมที่รันอยู่ (process attributes) ทำได้โดยการเข้าไปค้นหาโดยตรงจาก process structures โดยผ่านเคอร์เนลเมมโมรี่ (/dev/mem) ซึ่งวิธีนี้ดูโหดมาก ตัวอย่างของโปรแกรมที่ว่าก็คือ ‘ps’ ที่เราคุ้นเคยนั่นเอง

เห็นได้ชัดว่าวิธีนี้มีข้อด้อยอยู่สองอย่าง คือ การเปิดช่องให้โปรแกรมฝั่งยูสเซอร์สเปซเข้าถึงเคอร์เนลเมมโมรี่แบบดิบ (raw access) นี่เป็นสิ่งที่จะมีปัญหาเรื่องความปลอดภัยของระบบแน่ และ การเข้าถึงข้อมูลที่ว่าทำให้ต้องเกิด system calls ทุกครั้งที่มีการเรียกดูข้อมูลเหล่านี้ซึ่งก็ดูไม่ดีเท่าไหร่

ดังนั้นวิธีใหม่ในการเข้าถึง process attributes สำหรับโปรแกรมฝั่งยูสเซอร์สเปซจึงเกิดขึ้น นั่นก็คือ /proc นั่นเอง ข้อดีที่เห็นได้ชัดเจนก็คือทำให้ข้อมูลของโปรเซส สำหรับโปรแกรมฝั่งยูสเซอร์สเปซ แยกออกมาจากโครงสร้างของเคอร์เนล ทำให้ไม่มีปัญหาเวลามีการเปลี่ยนแปลงเคอร์เนล (ลองนึกถึงการเขียนโค้ดเพื่อเข้าถึงเมมโมรี่แบบดิบ แล้วคงจะเข้าใจว่าเวลาเคอร์เนลมีการเปลี่ยนแปลงแล้ว ตัวโปรแกรม ‘ps’ จะต้องแก้อะไรบ้าง)
อีกเรื่องนึงคือรูปแบบนี้รองรับการเติบโตในอนาคตด้วย

ระบบแฟ้ม /proc ถูกออกแบบสำหรับการเป็นแหล่งข้อมูลเกี่ยวกับโปรเซสต่างๆในระบบ ให้กับคำสั่งต่างๆ เช่น ‘ps’, ‘top’, ‘free’ แต่เนื่องจากความง่ายในการใช้งาน ทำให้เริ่มมีการใช้ช่องทางนี้ในรูปแบบที่หลากหลายแตกยอดมากไปกว่าจุดประสงค์แรก เช่นการเพิ่มส่วนติดต่อกับเคอร์เนลโมดูลเพื่อควบคุมดีไวซ์ไดร์เวอร์ได้โดยตรง และอื่นๆ และก่อนที่การใช้งาน /proc จะเลยเถิดมากไปกว่านี้จนกู่ไม่กลับ sysfs ก็เกิดขึ้น

ระบบแฟ้ม /sys ถูกออกแบบมาเพื่อรองรับความต้องการในส่วนนี้ รวมถึงการทำให้รูปแบบในการเข้าถึง/ควบคุม ไดร์เวอร์ออกมาเป็นรูปแบบเดียวกันสำหรับโปรแกรมฝั่งยูสเซอร์สเปซ
ในปัจจุบัน ตัวไดร์เวอร์ เฟรมเวิร์ค จะทำการสร้างโครงสร้างไดเรคทอรี่ ภายใต้ /sys อย่างอัตโนมัติตามชนิดของอุปกรณ์ หลังจากการลงทะเบียนกับเคอร์เนลเรียบร้อย (driver register)

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

หวังว่าคงเข้าใจกันมากขึ้นนะครับ

ที่มา http://unix.stackexchange.com/questions/4884/what-is-the-difference-between-procfs-and-sysfs