منبع اصلی نوشتار زیر در این لینک قرار دارد

سیستم فایل proc چیست – بخش نخست

سیستم فایل proc/ یک سیستم فایل مجازی است که در حافظه اصلی قرار دارد و به محض بوت شدن ایجاد شده و توسط کرنل خوانده/نوشته و کنترل می شود و پس از خاموش شدن سیستم از بین خواهد رفت و بعد از راه اندازی مجدد سیستم یا روشن شدن مجدد سیستم، از نو ایجاد و فایل های آن مقدار دهی می شوند. بسیاری از ابزار ها از فایل های درون این دایرکتوری استفاده می کنند. محتوای درون این دایرکتوری از دو نوع هستند: دایرکتوری های عددی که هر کدام مربوط به یک فرایند می باشد و همچنین دایرکتوری های غیر عددی و دومین نوع محتوا فایل ها می باشند.همانطور که گفتم proc یک سیستم فایل واقعی نیست و یک سیستم فایل مجازی است و اگر دستور ls -l را اجرا کنید خواهید دید که حجم یا اندازه فایل ها و دایرکتوری های آن صفر است.

دایرکتوری های عددی به ازای هر فرایند هستند و درون آنها نیز فایل ها و دایرکتوری های دیگری مطابق با همان فرایند وجود دارد. عدد دایرکتوری مربوط به شناسه آن فرایند است. همچنین فایل های درون خود دایرکتوری proc/ نیز اطلاعات خاصی از وضعیت فعلی سیستم را دارند که توسط کرنل نوشته/خوانده و یا کنترل می شود. این فایل ها (چه در زیر خود دایرکتوری proc/ یا چه در دایرکتوری های دیگر) توسط برنامه ها مورد استفاده قرار می گیرند، بطور مثال دستور hostname فایل زیر را می خواند تا HOSTNAME را نشان دهد.

cat /proc/sys/kernel/hostname

و حال بخواهید بطور موقتی نام ماشین را تغییر دهید می توانید یا از دستور hostname example.com استفاده کنید یا از دستور زیر استفاده کنید

echo example.com > /proc/sys/kernel/hostname

اما این تغییر فایل دایمی نیست و به محض خاموش یا Restart شدن از میان خواهد رفت. فایل های درون دایرکتوری های proc/ همگی تنها خواندنی هستند و تنها کرنل می تواند آنها را تغییر دهد. یعنی تمامی کاربران به جز root دسترسی read only دارند و کاربر root می تواند بصورت بالا با دستور echo آنها را تغییر دهد یا اینکه با استفاده از دستور هایی بتوان آنها را خواند.

stat -c%A /proc/sys/kernel/hostname

فایل هایی را که می توان تغییر داد به دو گونه هستند، فایلی که رشته ای را قبول می کند مانند آنچه که درباره فایل hostname گفته شد و فایل هایی که یک مقدار باینری یعنی 0 یا 1 را می گیرند، مانند فایل ip_forward که می توانید از این مطلب بخوانید. بطور خاص دستور sysctl برای تغییر فایل های درون دایرکتوری proc/sys/ استفاده می شود.

آشنایی با فایل ها و دایرکتوری های درون دایرکتوری proc/ 

در ادامه شاخص ترین این فایل ها و دایرکتوری ها را معرفی می شوند. فهرستی از بارزترین فایل ها :

  • فایل cmdline : این فایل حاوی پارامتر های پاس داده شده به کرنل در زمان شروع کار کرنل است. یک خروجی ساده از آن بصورت زیر است.

cat /proc/cmdline

BOOT_IMAGE=/boot/vmlinuz-3.8.0-29-generic root=UUID=10a2e5bb-99cf-4220-b019-612b87ff6039 ro

یک توزیع لینوکسی ممکن است یک یا دو هسته (کرنل) کامپایل شده دشاته باشد. زمانی که به بوت لودر می رسید با یکی از این کرنل های کامپایل شده را انتخاب کنید. (این مطلب را بخوانید). پس از انتخاب یک هسته کوچک انتخاب شده و سپس سیستم راه اندازی می شود. (این مطلب را بخوانید). BOOT_IMAGE نشان دهنده همین هسته است که شما از میان دو هسته برای راه اندازی سیستم انتخاب کرده ای. یعنی در حال حاظر با کدام هسته به سیستم Login کرده اید.

root تعیین کننده دایرکتوری است که image ها (یا همان کرنل ها) در آن قرار دارند. به عبارتی نشان دهنده دایرکتوری boot/ می باشد. (این مطلب را بخوانید). همچنین برای آشنایی با UUID می توانید این مطلب را بخوانید. ro نیز یعنی دیوایس در زمان بوت شدن بصورت read only بوت شده است.

  • فایل cpuinfo : اطلاعات کاملی از پردازنده را نشان می دهد. مانند نام سازنده و نام مدل پردازنده و میزان حافظه cache موجود را نشان می دهد.
less /proc/cpuinfo
  • فایل crypto : تمام الگوریتم های رمز نگاری مورد استفاده کرنل را نشان می دهد.

less /proc/crypto

  • فایل devices: تمام دیوایس های کراکتری و بلاکی پیکربندی شده و ماژول آنها در کرنل شده است را نشان می دهد.
 less /proc/devices
  • فایل filesystem : فهرستی از سیستم فایل های پشتیبانی شده در کرنل لینوکس (کرنل کنونی که با آن سیستم را بوت کرده اید) را نشان می دهد.
less /proc/filesystem
ستون نخست در خروجی دستور بالا نشان می دهد که ایا سیستم فایل به یک دیوایس بلاکی، mount شده است یا نه. اگر عبارت nodev باشد یعنی اینکه سیستم فایل به دیوایسی متصل نشده است. مانند proc که بعنوان یک سیستم فایل واقعی نیست بلکه یک سیستم فایل مجازی در حافظه اصلی است و به هیچ دیواسی هم متصل نشده است. ستون دوم هم نام سیستم فایل است. این فایل مورد استفاده دستور mount قرار می گیرد در صورتی که نوع سیستم فایل را در دستور mount مشخص نکنیم.
  • فایل interrupts : تعداد وقفه های داده شده به سیستم را نشان می دهد.

less /proc/interrupts

  • فایل kmesg : این فایل پیام های صادره از کرنل را نگه می دارد و مورد استفاده دستوری مثل dmesg یا klog می بشاد.

less /proc/kmesg

  • فایل loadavg : دستور uptime این فایل را می خواند تا در خروجی خود میانگین یک، پنج و پانزده دقیقه پیش بار سیستم را نشان دهد که معادل سه عدد نسخت در خروجی زیر است. چهارمین عدد نیز تعداد فرایند های فعال و تعداد کل فرایند های موجود در سیستم را نشان می دهد. آخرین عدد نیز آخرین فرایند استفاده شده را نشان می دهد. (آخرین شناسه استفاده شده)

cat /proc/loadavg

دستور زیر را اجرا کنید. خواهید دید که این فایل تنها بصورت read only است و هیچ فردی حتی root نمی تواند این فایل را تغییر دهد و تنها توسط کرنل قابل تغییر است. در صورتی که کاربر root می توانست دو فایل قبلی یعنی ip_forward و hostname را تغییر دهد. اما هیچ فرد دیگری حتی اگر عضو گروه root هم باشد نمی تواند روی هیچ فایلی در کل دایرکتوری و زیر دایرکتوری های proc/ بنویسد و تنها حق read را دارد.

ls -l /proc/loadavg

  • فایل meminfo : اطلاع های کاملی از حافظه اصلی موجود در سیستم را نشان می دهد. دستوری مانند free از این فایل برای شکل دهی خروجی خود استفاده می کند.

less /proc/meminfo

  • فایل modules : فهرست تمامی ماژول های بار شده در سیستم را نشان می دهد. این فایل توسط دستور lsmod مورد استفاده قرار می گیرد.
less /proc/modules
ستون نخست نام ماژول، دمین ستون میزان حافظه ماژول، سومین ستون چند نمونه از ماژول در حال حاضر لود شده اند. عدد 0 نشان دهنده ماژول لود نشده است، چهارمین ستون وابستگی ماژول را به دیگر ماژول برای برای عملکردش نشان می دهد، پنجمین ستون وضعیت لود ماژول را نشان می دهد که می تواند یکی از مقادیر، Live,Loading و Unloading باشد و ششمین ستون اطلاع های آفست های حافظه را برای ماژول لود شده نشان می دهد.
  • فایل mounts : این فایل نقاط اتصال کنونی (تمامی اتصال ها که بصورت دائمی در فایل etc/fstab/ و یا موقتی توسط دستور mount) را نشان می دهد. اگر دستور mount بدون هیچ سوئیچی استفاده شود این فایل را نشان خواهد داد.

less /proc/mounts

نخستین ستون نام دیوایس mount شده و دومین ستون نام دایرکتوری که بر روی آن متصل شده است. (نقطه اتصال). ستون سوم نوع سیستم فایل، ستون چهارم وضعیت ro یا rw بودن، ستون پنجم و ششم مطابق با ستون های پنج و ششم فایل etc/mtab/ می باشد.

  • فایل partitions : نشان دهنده پارتیشن های موجود بر روی سیستم.

less /proc/partitions

less /proc/swaps

  • فایل uptime : میزان زمان up بودن سیستم پس از آخرین restart را نشان می دهد. نخستین ستون نشان دهنده میزان زمان up بودن پس از آخرین restart بر حسب ثانیه و ستون دوم میزان زمان idle یا بی کار بودن سیستم بر حسب ثانیه.
cat /proc/uptime 
  • فایل version : این فایل نسخه کرتل و کامپایلر gcc را نشان می دهد.

cat /proc/version

فهرستی از دایرکتوری های درون دایرکتوری proc/

  •  دایرکتوری های عددی مربوط به هر فرایند : این دایرکتوری ها مطابق با هر فرایند (شناسه هر فرایند) بوده و فایل ها و دایرکتوری های درون آنها مربوط به همان فرایند است. تمامی فایل ها و دایرکتوری های درون این دایرکتوری ها متعلق به مالک آن فرایند است. بطور مثال کاربری به نام amirnamipc1 دستور htop را اجرا می کند و شناسه آن دستور 3868 است، پس دایرکتوری 3868 ایجاد شده و خود دایرکتوری و تمامی محتوای آن مربوط به کاربر amirnamipc1 خواهد بود. پس از خاتمه یافتن فرایند دایرکتوری معادل آن نیز حذف خواهد شد.
ls -l 1
دستور بالا محتوای دایرکتوری ععد 1 مربوط به فرایند init را نشان می دهد. در تمامی دایرکتوری های عدد چندین فایل و دایرکتوری همنام وجود دارند که محتوای آنها مطابق با فرایند خودشان است.
  • فایل cmdline زیر هر دایرکتوری عددی : این فایل شامل دستوری است که فرایند را ایجاد کرده است. بطور مثال فایل proc/1/cmdline/ دستوری که فرایند با شناسه 1 را ایجاد نموده است.  که خروجی آن خط sbin/init/ است.

less /proc/1/cmdline

  • دایرکتوری cwd : یک Link به دایرکتوری کنونی که دستور در آن اجرا شده است. بطور مثال برای فریاند 1 مربوط به دستور sbin/init/ ، دایرکتوری cwd آن لینک به دایرکتوری / است. یا برای فرایندی که توسط amirnamipc1 ایجاد شده  شناسه آن 3868 است و این شناسه مربوط به دستور htop و در دایرکتوری خانگی کاربر یعنی home/amirnamipc1/ اجرا شده، پس دایرکتوری proc/3868/cwd/ لینک به دایرکتوری home/amirnamipc1/ خواهد بود.
  • فایل environ : متغیر های محیطی مربوط به فرایند ها.
  • فایل fd : مشخص کننده File Descriptor فایل ها. خروجی زیر را دقت کنید :

از تصویر بالا مشخص است که فرایند با شناسه 4073، Standard Input, Standard Output و Error Input را بر روی ترمینال tty1 نشان می دهد. توجه کنید که در لینوکس و هر سیستم عامل دیگر یونیکس همه چیز فایل است، حتی ترمینال ها. و چهارمین خط تصویر بالا، یک سوکت نیز برای فایل باز شده است.

netstat | grep 33446

unix  2      [ ]         DGRAM                    33446

  • فایل maps : این فایل شامل نگاشت های حافظه برای فرایند و کتابخانه های مورد استفاده آن است.
  • دایرکتوری root : یک لینک به دایرکتوری فرایند.
  • فایل stat : وضعیت فرایند را نشان می دهد. خروجی آن غیر قابل درک است.

cat /proc/1/stat

  • فایل statm : وضعیت حافظه اختصاص داده شده به فرایند را نشان می دهد.

cat /proc/1/statm

عدد نخست میزان حجم برنامه به کلیوبایت ، دومین عدد میزان بخش های حافظه برای فرایند به کیلوبایت، سومین عدد میزان صفحه های اشتراک شده، چهارمین عدد تعداد صفحه های مربوط به کد برنامه، پنجمین عدد تعداد صفحه های مربوط به داده و پشته فرایند، ششمین ععد مربوط به صفحه های کتاب خانه های مورد استفاده فرایند و هفتمین عد مربوط به صفحات dirty فرایند.

بعنوان توضیح اجمالی، در بحث مدیریت حافظه، حافظه به تکه هایی هم اندازه به نام صفحه تقسیم می شود. صفحه ها هم اندازه و اندازه ای ثابت دارند و فرایندی برای قرار گیری در حافظه باید در این صفحه ها تکه تکه شود. فرض کنید میزان اندازه هر صفحه 2048 کیلوبایت است پس برنامه به اندازه n کلیو بایت برای قرار گیری در حافظه باید به n/2048 تکه تبدیل شده تا در حافظه قرار گیرد. هر فرایند از کد، داده و پشته تشکیل شده است که هر کدام از صفحات مربوطه با خروجی ععدی بالا مشخص هستند و همچنین هر فرایند بخش مشترکی دارد که با دیگر فرایند مورد استفاده قرار می گیرد و هر فرایند یا دستور از کتابخانه های موجود در دایرکتوری lib/ استفاده می کند.

  • فایل status : خروجی همان دو فایل بالا ست اما خواناتر است.

cat /proc/1/status



برچسب ها : , , , , , ,

به سیاره لینوکس امتیاز دهید

به اين صفحه امتياز دهيد