مشخص‌کردن و پیکربندی تنظیمات سخت‌افزار (LPIC 101.1)

برای شروع باید بگم که دوره حرفه‌ای لینوکس از قسمتای آسونی شروع نمی‌شه. تاپیک ۱۰۱ درباره‌ی «معماری سیستم» بحث می‌کنه. این تاپیک به سه بخش تقسیم میشه. بخش ۱۰۱.۱ به تنظیمات سخت‌افزاری سیستم مربوط می‌شه. سخت‌افزارهای مختلفی در ارتباط با سیستم وجود دارن. از فلش ‌USB، سی‌دی و هارد اکسترنال گرفته تا کارت صدا، کارت شبکه، CPU و غیره.

وقتی سیستم خاموشه ازش چه انتظاری دارین؟ تا حالا شده سیستم رو روشن کنید سیستم‌عامل رو نشناسه و هیچی رو صفحه نیاد؟ یه تعدادی از این سخت‌افزارها به صورت اتوماتیک کانفیگ (=تنظیم(؟)) می‌شن ولی ممکنه یه تعدادی نیاز به تنظیمات دستی داشته باشن. تنظیمات اتوماتیک توسط بخشی از سیستم به نام BIOS انجام می‌شه. احتمالا باید انتظار داشته باشید که وقتی سیستم رو روشن می‌کنید اول خودش بره رم و هارد و CPU و اینارو بشناسه. چون با سیستم خاموش که نمی‌شه تنظیمات دستی انجام داد(!). در واقع BIOS مسئول آماده‌سازی سخت‌افزارها برای بوت شدن سیستم‌عامله. عموما مقداردهی اولیه‌ی سیستم، تست حافظه و پیدا کردن سیستم‌عامل توسط BIOS انجام می‌شه. همچنین یه واسط سطح پایین تنظیمات سیستم رو برای کاربر فراهم می‌کنه. شاید تجربه نصب یه سیستم‌‌عامل از روی فلش رو داشته باشید. برای این کار وقتی سیستم رو روشن می‌کنید (Boot time) باید یه کلید مخصوص (به مدل سیستم بستگی داره مثلا F2 یا DEL) رو بزنید تا وارد بخش تنظیمات سطح پایین بشید. بعد اونجا برید بگید من می‌خوام اول بری از روی فلش سیستم‌عامل رو پیدا کنی نه از رو هارد(Boot device). این بخشی که واردش می‌شید و کارهای دیگه‌ای از جمله تغییر ساعت یا چیزای دیگه می‌تونید توش انجام بدید همون واسط سطح پایین تنظیمات سیستمه که BIOS برای شما فراهم کرده. در مورد زمان و تاریخ هم باید بگم که یه ساعت سخت‌افزاری وجود داره که وقتی شما اینجا تغییرش می‌دید BIOS میاد اون ساعت سخت‌افزاری رو عوض می‌کنه. بعد که سیستم روشن می‌شه میره از طریق سرور NTPD ساعت رو ست می‌کنه. این سرور NTPD یه سرور برای یکپارچه‌کردن زمان‌های سیستم‌های مختلفه که از طریق اینترنت سیستم‌ها خودشون رو باهاش وفق می‌دن.

خب تا اینجا حافظه‌ی پیشنهادی حاوی سیستم‌عامل (مثلا فلش USB) رو تو اولویت بالا قرار دادید. قدم بعدی برای BIOS پیدا کردن یک OS Loader (مثلا LILO) روی حافظه‌های مختلف با اولویت پیشنهادی شماست. اگه مثلا فلش اشتباهی وصل کرده باشید و BIOS نتونه از تو فلش یه OS Loader پیدا کنه میره به حافظه بعدی (مثلا اینجا هارد) و همون سیستم‌عامل قبلیتون رو بوت می‌کنه.

بعد اینکه سیستم‌عامل(در اینجا یه توزیع لینوکس) شناخته شد و واردش شدید، از تو خود سیستم‌عامل هم می‌تونید اطلاعات مربوط به سخت‌افزارهای سیستم رو ببینید. تو مسیر proc/ که یک دایرکتوری مجازیه یعنی روی دیسک نیست و میره از جاهای مختلف دیسک اطلاعات رو جمع می‌کنه میاره، منابع در حال استفاده‌ی سیستم که درایورشون فعاله رو می‌تونید ببینید. مثلا شکل زیر نشون‌دهنده‌ی اطلاعات وقفه‌های سیستم منه که هرکدوم با یه عدد مشخص شدن. حتی می‌شه دید که سیستم من ۴ تا CPU داره.

اطلاعات مربوط به وقفه(interrupt)های سیستم
اطلاعات مربوط به وقفه(interrupt)های سیستم

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

  • lsusb (list USB devices)
  • lsmod (Show the status of modules in the Linux Kernel)
  • lsdev (display information about installed hardware)
  • lspci (list all PCI devices)
  • lspcmcia (display extended PCMCIA debugging information)
  • lshw (small tool to extract detailed information on the hardware configuration)
  • lsblk (list block devices)

آقا یه اعترافی بکنم :دی این نوشته‌های تو پرانتز کار من نیست. یه دستور داریم به اسم man که میاد اطلاعات بیشتر میده درباره یه دستور دیگه. مثلا بزنید man lspcmcia یه صفحه میاد که در مورد این دستور توضیحات داده. تا جایی که من دیدم برا بیشتر دستورات کار می‌کنه.

در ادامه به سه تا مفهوم می‌پردازیم.

  • HAL
  • D-Bus
  • udev

تو لینوکس یه استاندارد برای اسم سخت افزارهای وصل شده به سیستم وجود داره. مثلا اولین کارت شبکه که وصل می‌شه اسمش می‌شه eth0 بعدیش eth1 همینجوری تا آخر. این کارها توسط لایه‌ی انتزاعی سخت‌افزار (Hardware Abstraction Layer) انجام می‌شه. چرا انتزاعی؟ چون درگیر جزئیات سخت‌افزار نمی‌شه و استاندارد اسم‌گزاری خودشو داره. HAL دیتابیس خودشو تو مسیر sys/ ذخیره می‌کنه. تو مسیر dev/ اسم‌ها به صورت انتزاعی وجود داره. خب فرض کنید یه کارت شبکه به کامپیوتر وصل کردیم. بخش‌های مختلف سیستم از کجا مطلع می‌شن؟ D-Bus مثل یه اتوبوسه که به همه‌ی بخش‌های سیستم وصله. وقتی یه سخت‌افزار جدید وصل می‌شه به نرم‌افزارهای مختلف خبر می‌ده. وظیفه‌ی udev کنترل dev/ و اجرای قانون روی اوناست. مثلا من یه فلش دارم که دوست دارم اسم مستعار روش بذارم. فلش مخصوصیه مثلا برای بک آپ. این وظیفه‌ی udev که بیاد و قانون بذاره. ولی سیستم از کجا می‌فهمه که این کدوم فلشه؟ همه‌ی سخت‌افزارها یه UUID دارن که همون شناسه‌ی یکتاست. دستور blkid شناسه‌ی تمامی سخت‌افزارهای وصل شده به سیستم رو میده. اگه قانونی گذاشته بشه تو مسیر etc/udev/rules.d/ مشخص می‌شه. توسط برنامه‌ای به اسم udevadm می‌شه از udev استفاده کرد.

یه سری از سخت‌افزارها برای اضافه‌شدن نیازی به خاموش بودن سیستم ندارن، مثل فلش. اما برای اضافه کردن یه سری دیگه نیازه که سیستم حتما خاموش باشه، مثلا کارت گرافیک. تو حالت اول اصطلاحا می‌گن سخت‌افزار Hotplug یعنی وقتی سیستم داغه می‌تونه اضافه بشه و تو حالت دوم می‌گن Coldplug.

وقتی یه سخت‌افزاری به سیستم اضافه می‌شه باید درایور اون هم به سیستم اضافه بشه. معمولا درایورها از ماژول‌های تو کرنل لینوکس استفاده می‌کنن. این ماژول‌ها تو مسیر etc/modules/ (قدیمی) یا etc/modprobe.d/ (جدید) قرار دارن. بعضی وقتا نیاز به مدیریت دستی این ماژول‌ها داریم. دستورات مدیریت ماژول‌ها اینان:

  • lsmod لیست ماژول‌ها
  • insmod module_name اضافه‌کردن ماژول
  • rmmod module_name حذف کردن ماژول

که برای حذف و اضافه‌کردن اسم ماژول موردنظر که تو مسیر etc/modules/ بود رو باید می‌نوشتیم. حالا چرا قدیمی؟ چون یه سری از این ماژول‌ها بهم وابسته بودن و این دستورات قدیمی وابستگی‌ها رو هندل نمی‌کرد و اگه مثلا یه ماژولی می‌خواستیم اضافه کنیم که به یه ماژول دیگه نیاز داشت و اون نبود خطا می‌داد و انجام نمی‌شد. و یا اگه یه ماژولی رو می‌خواستیم حذف کنیم که یه ماژول دیگه ازش استفاده می‌کرد بازم خطا می‌داد. البته lsmod هنوز هم استفاده می‌شه. insmod و rmmod هنوز جز دستورات لینوکس هستن ولی مسیر etc/modules/ وجود نداره (من از اوبونتو ۱۶.۰۴ استفاده می‌کنم). با اومدن modprobe کار خیلی راحت‌تر شده. یکی از امتیازات modprobe نسبت به قبلیا همین کنترل وابستگی بین ماژول‌هاست. دستورات modprobe ایناس:

  • modinfo [opt] module-object-file اطلاعات ماژول که باید اسم فایل ماژول داده بشه
  • modprobe module اضافه کردن ماژول
  • modprobe -r module حذف ماژول




به نظرم تا اینجا به عنوان نسخه صفرم مطلب کافیه. یه چیزهایی هم در مورد پروتکل USB تو کتاب بود که شاید بعدا اضافه کنم. سعی می‌کنم سوالات مربوط به این بخش رو پیدا کنم و با توضیحات در ادامه بذارم. این مطالب به هیچ عنوان حفظی نیست و نیاز به تمرین و به قول معروف پشت فرمون نشستن داره. یه نسخه ساده‌ی لینوکس به عنوان سیستم‌عامل مجازی (مثلا virtualbox) و ترمینال لینوکس کافیه برای تست کردن همه‌ی این دستورات. همه‌ی این کلیدواژه‌هایی که استفاده کردم قابل سرچ هستن و یه عالمه مطلب دربارشون تو اینترنت پیدا می‌شه. من بیشتر سعی کردم یه خلاصه‌ای بنویسم تا کلیت مطلب رو گفته باشم. قطعا مطلبی که نوشتم چه از نظر نوشتار چه از نظر علمی و فنی اشکالاتی داره که خوشحال می‌شم بهم گوشزد کنید.

منابعی که من برای یادگیری این مطالب استفاده کردم یکی کتاب LPI Linux Certification in a Nutshell: A Desktop Quick Reference و دیگری فیلم آموزشی جادی و وبلاگ مرتبطش است. سعی می‌کنم سوالات مرتبط رو پیدا کنم و در ادامه‌ی این نوشته بذارم. صمیمانه منتظر نظرات و انتقاداتتون هستم. اگه ایرادی چیزی هست بگید اصلاح کنم. اگه منبع خوب دیگه‌ای می‌شناسید معرفی کنید. ممنون که وقت گذاشتید و خوندید :)