Sokan Academy

نگاهی عمیق‌تر به فایل سیستم لینوکس

نگاهی عمیق‌تر به فایل سیستم لینوکس

در تمامی سیستم عامل های مبتنی بر یونیکس همچون گنو/لینوکس، گفته می‌شود که «هر چیزی در سیستم عامل یک فایل است!» یا این که حداقل «هر چیزی در سیستم عامل همچون یک فایل تلقی می گردد.» این مسأله بدان معنا است که خواه ما با فایل‌های اسناد و غیره سر و کار داشته باشیم خواه با دیوایس هایی همچون کارت صوتی، پرینتر و غیره، ما با فایل ها سر و کار داریم.

در بسیاری از سیستم عامل ها من جمله گنو/لینوکس، filesystem (فایل سیستم) ساختاری شبیه به یک «درخت» دارد که در آموزش های گذشته با این مبحث تاحدودی آشنا شدیم اما به خاطر اهمیت این موضوع، در این فصل قصد داریم ساختار درختی فایل سیستم لینوکس را به صورت عمیق‌تر مورد بررسی قرار دهیم.

در این ساختار درختی، اصلی‌ترین جایگاه به دایرکتوری root اختصاص دارد که شروع ساختار سلسله مراتبی فایل سیستم لینوکس از این دایرکتوری شروع می‌شود. دایرکتوری روت همچون «تنه درخت» است که با علامت / شناخته می شود.

    هشدار 
دایرکتوری روت را هرگز با root user اشتباه نگیرید! دایرکتوری روت محلی است که تمامی فایل‌های سیستم عامل در آن قرار دارند اما روت یوزر، کاربری است که دارای بیشترین مجوزهای دسترسی است.

به طور کلی، ساختار درختی فایل‌های لینوکسی Filesystem Hierarchy Standard یا به اختصار (FHS) نامیده می‌شود که برگرفته از ساختار فایل سیستم اولیه ی یونیکسی است که از آن جمله می‌توان به Berkeley Software Distribution یا به اختصار (BSD) اشاره کرد.

FHS به توسعه دهندگان و ادمین های سیستم‌های لینوکسی این امکان را می‌دهد تا با یک ساختار دایرکتوری استانداردی سر و کار داشته باشند که در بین سیستم‌ها و توزیع‌های مختلف یکنواختی و ثبات دارد.

لینوکس از انواع مختلفی از فایل سیستم‌ها که برایش طراحی شده‌اند پشتیبانی می‌کند اما در عین حال با فایل سیستم‌هایی از سایر سیستم عامل ها مثل Windows و MacOS نیز سازگار است. علاوه بر این، فایل سیستم‌های به مراتب قدیمی تر همچون FAT نیز در لینوکس پشتیبانی می‌شوند.

از جمله فایل سیستم‌های تحت پوشش لینوکس می‌توان به ext3، ext4، btrfs و xfs اشاره کرد که اختصاصا برای لینوکس طراحی شده اند؛ فایل سیستم‌های سایر سیستم عامل ها همچون vfat، ntfs و hfs نیز تحت پوشش قرار دارند.

پارتیشن ها در لینوکس

هر فایل سیستم روی پارتیشنی از هارد دیسک قرار می‌گیرد. کاری که پارتیشن ها انجام می‌دهند این است که کمک به سازماندهی محتویات قرار گرفته روی هارد دیسک می‌کنند. برای مثال، پکیج های مهم که برای اجرای صحیح سیستم عامل نیاز هستند معمولاً در یک پارتیشن مجزا که تحت عنوان root یا / شناخته می‌شود قرار می‌گیرند اما فایل‌های عادی که کاربران با آن‌ها سر و کار دارند، در بخشی تحت عنوان home یا ~ قرار می‌گیرند.

علاو بر این، در حین اجرای سیستم عامل، یکسری فایل‌های موقتی هستند که دائماً ایجاد شده و پاک می‌شوند که این دست فایل‌ها هم در پارتیشن مجزایی تحت عنوان tmp قرار می‌گیرند.

در این نوع پارتیشن بندی هادر دیسک، زمانی که تمامی فضای یک پارتیشن مورد استفاده قرار گیرد، هرگز اختلالی در فایل‌هایی که در سایر پارتیشن ها قرار گرفته‌اند ایجاد نخواهد کرد و همین مسئله است که باعث می شود سیستم عامل گنو/لینوکس نسبت به سایر سیستم عامل ها اصطلاحا Stable (پایدار) تر قلمداد گردد.

ماونت کردن در لینوکس

پیش از شروع استفاده از یک فایل سیستم در لینوکس، ما نیاز داریم تا آن فایل سیستم را در ساختار درختی لینوکس اصطلاحاً mount (ماونت یا جایگذاری) کنیم. به عبارت دیگر، یک دایرکتوری در روت در نظر گرفته می‌شود که فایل سیستم مد نظر داخل آن قرار می‌گیرد که چنین کاری را ماونت کردن می‌نامیم. به طور کلی، برای ماونت کردن یک فایل سیستم جدید، می بایست از دستور mount استفاده کنیم:

mount /dev/sda5 /home

دستور فوق فایل سیستمی که مرتبط با dev/sda5/ است را به Mount Point یا «محلی که می‌خواهیم ماونت شود» وصل می‌کند که همان دایرکتوری هوم است.

    نکته

صرفاً کاربران با دسترسی روت می‌توانند اقدام به ماونت کردن کنند.

در صورتی که بخواهیم این کار به صورت خودکار در حین بوت شدن سیستم رخ دهد، می بایست فایلی تحت عنوان etc/fstab/ که مخفف واژگان Filesystem Table است را ویرایش کنیم (برای آگاهی بیشتر در مورد ساختار این فایل، دستور man fstab را در ترمینال وارد کنید.)

وارد کردن دستور mount در ترمینال بدون هیچ آرگومانی، لیستی از کلیه ی فایل سیستم‌های ماونت شده و اطلاعات مرتبط با آن‌ها را در معرض دیدمان قرار می دهد:

mount

به عنوان خروجی دستور فوق داریم:

sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=1513560k,nr_inodes=208235,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=306264k,mode=755)
/dev/sda5 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=34,pgrp=1,timeout=0,minproto=5,maxproto=5,direct)
mqueue on /dev/mqueue type mqueue (rw,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime)
sunrpc on /run/rpc_pipefs type rpc_pipefs (rw,relatime)
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,relatime)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=306264k,mode=700,uid=1000,gid=1000)
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)

در صورتی هم که بخواهیم از فایل سیستم‌های ماونت شده و تایپ آن‌ها، فضای خالی آن‌ها و غیره اطلاع پیدا کنیم، می بایست دستور df -Th را در ترمینال وارد کنیم. به عنوان خروجی این دستور داریم (df مخفف واژگان Disk Free است):

Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs  1.5G     0  1.5G   0% /dev
tmpfs          tmpfs     300M  9.3M  290M   4% /run
/dev/sda5      ext4       51G   37G   11G  78% /
tmpfs          tmpfs     1.5G   59M  1.5G   4% /dev/shm
tmpfs          tmpfs     5.0M  4.0K  5.0M   1% /run/lock
tmpfs          tmpfs     1.5G     0  1.5G   0% /sys/fs/cgroup
tmpfs          tmpfs     300M  124K  299M   1% /run/user/1000

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

Network Filesystem یا به اختصار NFS به فایل سیستم شبکه در سیستم عامل گنو/لینوکس اشاره دارد. NFS به عنوان یکی از روش‌های به اشتراک گذاری دیتا مابین سیستم‌هایی است که به یک شبکه متصل هستند.

به عنوان مثال، بسیاری از ادمین های سیستم دایرکتوری هوم کاربران تحت یک شبکه را به گونه یی ماونت می‌کنند تا چندین کاربر مختلف به فایل‌های پیکربندی و تنظیمات یکسانی دسترسی داشته تا از محیط یکسانی برخوردارند گردند. در این حالت، کاربران با استفاده از سیستم‌های مختلفی می‌توانند به یک سیستم دسترسی پیدا کنند اما این در حالی است که تمامی آن‌ها از فایل‌ها و منابع واحدی برخوردار خواهند بود.

آشنایی با فایل سیستم proc در لینوکس

برخی فایل سیستم‌های لینوکسی همچون فایل سیستمی که در مسیر proc/ ماونت می‌شود که اصطلاحاً Pseudo Filesystem (سودو فایل سیستم یا فایل سیستم‌های غیر واقعی) نامیده می‌شوند. وجه تسمیه ی این فایل سیستم‌ها به این خاطر است که این فایل سیستم‌ها هیچ فضایی از هارد دیسک را آشغال نمی کنند. فایل سیستم proc/ حاوی فایل‌هایی مجازی -فایل هایی که صرفاً در حافظه ی سیستم وجود خارجی دارند- است که این امکان را می‌دهند تا بتوان دیتای متغیر مرتبط با کرنل لینوکس را مشاهده کرد.

فایل/دایرکتوری های قرار گرفته در این فایل سیستم به نوعی شبیه به ساختار کرنل لینوکس است اما هرگز حاوی هیچ گونه فایل واقعی نیست. برخی از فایل‌های مهم قرار گرفته در این فایل سیستم عبارتند از:

/proc/cpuinfo
/proc/interrupts
/proc/meminfo
/proc/mounts
/proc/partitions
/proc/version

علاوه بر این، فایل سیستم proc/ حاوی دایرکتوری ها زیرشاخه ی دیگر هم هست که نام آن‌ها برگرفته از شناسه (ID) فرایندهایی است که در سیستم در حال اجرا هستند:

/proc/<Process-ID-#>
/proc/sys

دایرکتوری دیگری تحت عنوان sys داخل فایل سیستم proc/ قرار دارد که حاوی اطلاعاتی در مورد کل سیستم به‌خصوص سخت‌افزار و تنظیمات پیکربندی سیستم است.

به طور کلی، فایل سیستم proc/ بسیار کاربردی است چرا که حاوی دیتایی است که صرفاً بسته به نیاز جمع آوری شده اما در عین حال نیاز به ذخیره شدن نداشته و هیچ فضایی از سیستم را هم اشغال نمی‌کنند.

linuxلینوکسسیستم عاملگنو/لینوکس

sokan-academy-footer-logo
کلیه حقوق مادی و معنوی این وب‌سایت متعلق به سکان آکادمی می باشد.