محمد نصیری
بنیانگذار انجمن تخصصی فناوری اطلاعات ایران ، هکر کلاه خاکستری ، کارشناس امنیت اطلاعات و ارتباطات

معرفی دایرکتوری های proc ، sys و dev و مفاهیم udev ، sysfs و dbus

سلام به همگی دوستان TOSINSO امروز میخایم متوجه بشیم که سیستم عامل لینوکس چجوری با تجهیزات ارتباط برقرار می کنه و نحوه کار کردن این سیستم عامل با Device ها یا همون تجهیزات چجوری هست . خوب زمانیکه صحبت از لایه سخت افزار در لینوکس هست ما با مجموعه عجیب و غریبی از کلمات روبرو هستیم کلماتی مثل procfs ، sysfs ، dbus و udev که طبیعتا خیلی برای شما آشنا نیستند .

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

البته به امید خدا در انتهای این مقاله با این مفاهیم به خوبی آشنا می شید اما یکی از نکاتی که خیلی این میون ممکنه برای شما ابهام برانگیز باشه تفاوت بین sysfs و procfs هست که بعضا ممکن هست خیلی عجیب و غریب به نظر برسه ، بنابراین اول در این مقاله ما به بررسی ماهیت procfs و sysfs و تفاوت بین اونها می پردازیم و بعد به سراغ udev و dbus و نحوه استفاده از اونها در لینوکس می رسیم.

تنظیمات سخت افزار در سیستم عامل لینوکس

دایرکتوری proc یا procfs چیست؟

خوب اول از همه به سراغ procfs میریم ، این مفهوم خیلی خیلی قدیمی هست و برمیگرده به سالهای 1990 و همون حدودها بنابراین یه مقدار دیدتون رو قدیمیتر کنید ، خوب در اون وهله زمانی ما مجبور بودیم دونه دونه پردازش ها یا Process های سیستم رو مدیریت کنیم ، خوب قبل از اینکه ادامه بدیم یک یادآوری هم بکنیم ، همه چیز در سیستم عامل لینوکس و خانواده یونیکس در قالب فایل هست و procfs هم همین هست یعنی یک فایل هست که داخلش مدیریت پردازش های CPU ما انجام میشه .

وقتی یک دستگاه یه سیستم ما متصل میشه داخل این فایل محتوایی قرار می گیره که باعث میشه ما بتونیم پردازش های مربوط به اون سخت افزار رو انجام بدیم ، خوب با توجه به حرف خودمون که همه چیز در قالب فایل ذخیره میشه بنابراین محتویات sysfs هم باید داخل یک فایل و یک فولدر قرار بگیرند که این محتویات در دایرکتوری به نام proc// در سیستم عامل لینوکس وجود داره ، توجه کنید که proc// یک فایل سیستم هست .

در تعاریف یونیکس هر فایلی که وجود داره برای خودش یک محل ایجاد شدن داره و بالاخره یه جایی ذخیره شده روی سیستم بنابراین فایل سیستم بشه میگن ، بنابراین اطلاعات مربوط به پردازش های ما هم در دایرکتوری به نام proc// در قالب file system و به عنوان procfs یا processes file system نگهداری میشه ، اما نکته در اینجاست که این دایرکتوری ها واقعی نیستند و بصورت virtual directory استفاده میشن.

خوب یک مثال می زنیم وقتی شما یک process در سیستم ایجاد می کنید این process برای خودش یک سری اطلاعات داره ، اطلاعاتی از قبیل میزان CPU و RAM مورد استفاده ، میزان uptime ای که داره و خیلی دیگه از اینجور اطلاعات که همگی اونها داخل virtual directory های proc قرار میگرند و نرم افزارها و سیستم عامل از طریق این فایل ها می تونن به اطلاعات پردازش مورد نظر دسترسی پیدا کنند.

خوب این اطلاعات برای برنامه نویس ها و kernel developer ها بسیار جالب بود ، در واقع هر اطلاعاتی که نیاز داشتند در خصوص یک نرم افزار یا یک process داشته باشند داخل این دایرکتوری وجود داشت پس با خودشون یک فکر کردن ، گفتن که این قابلیت که اطلاعات مربوط به پردازش ها رو یکجا داشته باشیم خیلی خیلی باحاله ، چرا ما چنین چیزی رو برای همه سیستم نداشته باشیم ؟ مثلا CPU و RAM و حتی هارد دیسک و ... اینجوری کلی اطلاعات در خصوص سیستم داریم که برامون مفید هست. سالها از proc استفاده می شد و کلی اطلاعات مربوط به سایر تجهیزات هم داخل این دایرکتوری شروع به ذخیره سازی کرد تا اینکه kernel 2.5 لینوکس معرفی شد.

دایرکتوری sys یا sysfs چیست ؟

خوب در این نسخه از هسته سیستم عامل لینوکس خیلی از کارهایی که مربوط به نگهداری اطلاعات فایل های سیستم و تجهیزات بود دیگه از دایرکتوری proc جدا شد و برای خودش یک virtual directory جدید شد ، این virtual directory جدید به عنوان sysfs معرفی شد و محتویات اطلاعات خودش رو داخل دایرکتوری به نام sysfs ذخیره می کرد ، نکته مهم در اینجاست که sysfs برخلاف proc اطلاعات خودش رو داخل هارد دیسک ذخیره نمی کرد بلکه داخل حافظه RAM همه اطلاعات رو نگهداری می کرد.

این یعنی با restart شدن سیستم اطلاعات موجود در sysfs هم از بین میره ، اما نکته جالب و مهمتر اینکه این دایرکتوری بصورت ویژه و اختصاصی برای نگهداری اطلاعات system استفاده میشد و به همین دلیل sysfs نامگذاری شد ، در واقع ما اطلاعات system ای رو از proc گرفتیم و وارد sysfs کردیم .

اطلاعاتی مثل اطلاعات سخت افزارها و تجهیزاتی که به سیستم متصل میشن همه و همه داخل این فایل سیستم قرار می گیرند. برای مثال شما اگر یک دستگاه رو به سیستم متصل کنید بلافاصله اطلاعات مربوط به نوع دستگاه و امکاناتش و تنظیمات و پیکربندی های دستگاه داخل این دایرکتوری قرار می گیره ، حتی آدرس های حافظه مورد استفاده و حتی IRQ هایی که قرار هست استفاده بکنه هم داخل این دایرکتوری ذخیره میشه ، دقت کنید که تفاوت اصلی proc و sys در این هست که sys جدیدتر هست و استانداردتر داره اطلاعات رو مدیریت می کنه و دسترسی به اطلاعات از روش های جدیدتری انجام میشه .

اما دقت کنید که دلیلی نیست که دیگه از proc استفاده نشه چون همچنان اطلاعات قدیمی دستگاه ها داخل prco وجود دارند و ازش همچنان استفاده میشه ، اما کاربران و به ویژه توسعه دهندگان لینوکس علاقه زیادی به پوشه sysfs به جای proc دارن ، چون راحت تر و سریعتر و استاندارد تر از proc هست . خیلی خلاصه بگم proc داداش بزرگه هست و sys داداش کوچیکه ، داداش کوچیکه جوون هست و داداش بزرگه قدیمی فامیل ، ما هنوز با داداش بزرگه کار داریم اما داداش کوچیکه بیشتر عزیزه تو فامیل چون جدیده ، دقت کنید sysfs بصورت ویژه ویژه اطلاعات device ها رو داخل خودش نگهداری می کنه و سازماندهی تر شده است.

دایرکتوری dev یا udev چیست ؟

با معرفی شدن Linux Kernel 2.6 یک مفهوم جدید به مدیریت سخت افزارها اضافه شد و آن udev بود ، چیزی که شما در سیستم عامل لینوکس در قالب دایرکتوری به نام dev// می شناسید ، حتما دقت کرده اید که زمانیکه برخی device ها در سیستم را مشاهده می کنید به شکل dev//sda// یا dev//video// یا dev//sdb// . ... نمایش داده می شوند ، این دقیقا همان مفهومی است که به هسته سیستم عامل لینوکس در نسخه 2.6 اضافه شد ، اما نکته در اینجاست که udev از کجا متوجه می شود که چه چیزی را باید در دایرکتوری dev قرار بدهد ؟ در واقع udev اطلاعاتی که قرار است در دایرکتوری dev// قرار بدهد را از دایرکتوری sys// دریافت می کند.

الان کمی توجه کنید : دقت کرده اید که نحوه نمایش تجهیزات در دایرکتوری dev// به نسبت چقدر ساده و قابل فهم است ؟ این واضح بودن به این دلیل است که اطلاعات این دایرکتوری از یک ساختار استاندارد و ساده ای به نام sysfs دریافت شده است و ساده تر قابل فهم است.

حتما اگر یک مقدار با لینوکس کار کرده باشید اینجا به این نتیجه می رسید که شما اشتباه می کنید ، دایرکتوری dev// سالها قبل از ارائه linux Kernel 2.6 وجود داشته است و چیز جدیدی نیست ، حق کاملا با شما است اما نکته در اینجاست که قبلا udev ای در کار نبود ، تمامی محتویات dev// قبل از معرفی udev فقط یک سری لینک static سخت افزار بود و برای هر بار بروز رسانی آن یکبار بایستی سیستم عامل restart می شد. مهمترین کاری که udev انجام داد dynamic کردن لینک های device ها بود که اضافه و حذف کردن آنها را به سادگی میسر کرد.

dbus چیست ؟

اما آخرین مبحث از این مقاله آموزشی : کاربرد dbus چی هست ؟ برای اینکه پاسخ این سئوال رو پیدا کنید از خودتون یک سئوال بپرسید ، آیا همه نرم افزارها از جمله سیستم عامل و application های کاربردی سیستم باید مستقیما با دایرکتوری های dev یا proc یا sys کار کنن ؟ طبیعتا خیر نیازی نیست ، این بین ما میایم یک واسط قرار میدیم که نقش دلال رو داره و واسطه بین همه این مجموعه ها و نرم افزارها هست ، الان فرض کنید که یک سخت افزار به سیستم شما اضافه میشه و شما از یک دسکتاپ به نام KDE استفاده می کنید .

این dbus هست که میره اطلاعات مربوط به سخت افزار رو از لایه های پایین دریافت می کنه و سیگنال اینکار رو به سمت Desktop Manager میفرسته و شما از محیط گرافیکی متوجه میشید که خوب یک سخت افزار جدید به سیستم اضافه شده یا حذف شده ، هر موقع اسم dbus رو شنیدید دقیقا یاد یک اتوبوس بیوفتید که قرار هست مسافرانش رو به مقصد برسونه و به محل کار مسافراش هم میگه کاری نداشته باشید مسافراتون از کجا میان شما باهاشون کار داشتید من آوردمشون ، کاری نداشته باشید هم می برمشون . امیدوارم مورد توجه شما قرار گرفته باشد.


محمد نصیری
محمد نصیری

بنیانگذار انجمن تخصصی فناوری اطلاعات ایران ، هکر کلاه خاکستری ، کارشناس امنیت اطلاعات و ارتباطات

محمد نصیری هستم ، هکر قانونمند و کارشناس امنیت سایبری ، سابقه همکاری با بیش از 50 سازمان دولتی ، خصوصی ، نظامی و انتظامی در قالب مشاور ، مدرس و مدیر پروژه ، مدرس دوره های تخصص شبکه ، امنیت ، هک و نفوذ ، در حال حاضر در ایران دیگه رسما فعالیتی غیر از مشاوره انجام نمیدم و مقیم کشور ترکیه هستم ، عاشق آموزش و تدریس هستم و به همین دلیل دوره های آموزشی که ضبط می کنم در دنیا بی نظیر هستند.

نظرات