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

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

سرفصل موضوعات

در هسته هر محیط سرور مدرن، زیرساخت cloud سازمانی و ابزارهای مدیریت سیستم، سیستم‌عامل Linux قرار دارد. چه در حال ساخت database cluster با high availability باشید، چه در حال نوشتن script برای automated deployment، یا مدیریت شبکه های پیچیده enterprise، درک ساختار پایه و layout مربوط به Linux file system از اهمیت بالایی برخوردار است. بر خلاف سیستم‌عامل‌هایی که از drive letter برای مشخص کردن storage device های مستقل استفاده می‌کنند، Linux تمام فایل‌ها، directory ها، قطعات hardware و process ها را در قالب یک درخت ساختاریافته و یکپارچه (hierarchical tree) نمایش می‌دهد. تمامی منابع از یک نقطه مبدا به نام root directory شاخه‌بندی می‌شوند. تسلط بر این ساختار تنها یک تمرین حفظیات نیست، بلکه اساسی‌ترین مهارت لازم برای navigation، تنظیمات، troubleshooting و تامین امنیت در هر محیط Linux است.

قانون عمومی Everything is a File

پایه و فلسفه طراحی Linux بر یک اصل ساده اما بسیار قدرتمند استوار است: همه چی فایل است. سندهای متنی، فایل‌های configuration سیستم، برنامه‌های executable، تجهیزات hardware، پارتیشن‌های physical storage، سوکت‌های شبکه و حتی process های در حال اجرا، همگی در این درخت ساختاریافته به عنوان file یا directory node نمایندگی می‌شوند. این انتزاع (abstraction) هوشمندانه به مدیران سیستم و script ها اجازه می‌دهد تا با قطعات نرم‌افزاری و سخت‌افزاری مختلف از طریق command line utility های استاندارد و یکسان تعامل داشته باشند. درک نحوه سازماندهی این بخش‌ها بر اساس Filesystem Hierarchy Standard که به اختصار FHS نامیده می‌شود، آنچه را که در ابتدا ساختاری پیچیده به نظر می‌رسد به یک معماری منطقی و شفاف تبدیل می‌کند.

نقش و اهمیت Filesystem Hierarchy Standard

برای درک کامل علت این نوع سازماندهی در Linux، باید پیشینه Filesystem Hierarchy Standard بررسی شود. استاندارد FHS که توسط Linux Foundation نگهداری می‌شود، دستورالعمل‌هایی را تعیین می‌کند تا توسعه‌دهندگان نرم‌افزار، نگه‌دارندگان distribution ها و مدیران سیستم بتوانند یکپارچگی را در distribution های مختلف Linux حفظ کنند. چه روی Debian، Ubuntu، Red Hat Enterprise Linux، Fedora، Alpine یا CentOS کار کنید، ساختار اصلی directory ها قابل پیش‌بینی و ثابت باقی می‌ماند. این استانداردسازی تضمین می‌کند که system script ها، binary executable ها، manual page ها و configuration file ها در مکان‌های مشخصی قرار گیرند و مدیریت سیستم در distribution های مختلف به‌صورت هموار و scalable انجام شود.

مبدا اصلی: Root Directory

نقطه شروع مطلق برای هر file path در Linux، همان root directory است که با یک forward slash نمایش داده می‌شود. برخلاف Windows که در آن drive های مختلف حروف مجزایی مانند C drive یا D drive دریافت می‌کنند، Linux تمامی storage partition ها، optical drive ها، network mount ها و virtual file system ها را ذیل همین root directory یکپارچه متصل می‌کند. زمانی که یک storage device جدید به سیستم اضافه می‌شود، حرف جدیدی دریافت نمی‌کند؛ بلکه روی یک مسیر directory مشخص در درخت root موجود mount می‌شود. این نوع طراحی، لایه سخت‌افزار را از نرم‌افزار مجزا می‌کند و به مدیران سیستم اجازه می‌دهد بدون شکستن file path های مورد استفاده برنامه ها و script ها، storage disk ها یا RAID array ها را بازسازمانی کنند.

معرف بخش‌های اصلی در Directory Structure

در لایه زیرین root directory مجموعه دقیقی از directory های اصلی قرار دارند که هر کدام وظیفه عملیاتی مشخصی را ایفا می‌کنند. شناخت کاربرد هر directory به مهندسان کمک می‌کند تا در زمان قطعی سیستم log file ها را سریع‌تر پیدا کنند، روند installation نرم‌افزارها را بررسی کنند، دسترسی‌های امنیتی را اعمال نمایند و policy های مربوط به backup را پیاده‌سازی کنند.
  • /boot: تمام فایل‌های لازم برای شروع به کار سیستم‌عامل در فاز boot اولیه، شامل kernel image ها، initramfs و تنظیمات bootloader مانند GRUB را نگهداری می‌کند.
  • /bin: شامل binary executable های اصلی برای عملیات پایه سیستم، recovery و نگهداری در حالت single user است، مانند دستورات پایه ls، cp، mv، cat و bash.
  • /sbin: شامل system binary هایی است که اختصاصاً برای مدیران سیستم طراحی شده‌اند و ابزارهای مدیریت disk formatting، کنترل firewall و مدیریت شبکه را در بر می‌گیرد.
  • /etc: تقریباً تمام configuration file های متنی سیستم را متمرکز می‌کند و فرایند backupگیری، version control و replicate کردن تنظیمات سرور را آسان می‌سازد.
  • /home: محیط کاری ایزوله برای کاربران عادی سیستم است که شامل پوشه‌های شخصی، اسناد و تنظیمات hidden برنامه‌ها برای هر کاربر می‌شود.
  • /root: به عنوان home directory اختصاصی برای superuser عمل می‌کند و در لایه root قرار دارد تا حتی در صورت failure در سایر volume ها، دسترسی مدیریتی حفظ شود.
  • /tmp: فایل‌های موقت و کم‌عمر ایجاد شده توسط برنامه‌ها و installation script ها را نگهداری می‌کند و معمولاً پس از هر reboot به‌صورت خودکار پاکسازی می‌شود.
  • /var: داده‌های متغیری که در طول کارکرد سیستم تغییر می‌کنند را نگهداری می‌کند، مانند print spool ها، lock file ها، state های package manager و log file های تشخیصی.
  • /usr: شامل utility های read only کاربران، binary های ثانویه برنامه‌ها، library های پویا و documentation های نصب شده توسط package manager است.
  • /opt: به عنوان یک فضای ایزوله برای نصب نرم‌افزارهای اختیاری، بسته های مستقل و نرم‌افزارهای proprietary کاربرد دارد.
  • /usr/local: فضایی اختصاصی برای نرم‌افزارهای compile شده به‌صورت دستی و binary های custom فراهم می‌کند تا از overwrite شدن آن‌ها توسط update های سیستم جلوگیری شود.
  • /mnt: یک mount point موقت برای مدیران سیستم است تا hard drive های خارجی یا network file system ها را هنگام نگهداری متصل کنند.
  • /media: به عنوان محل mount خودکار برای رسانه‌های ذخیره‌سازی قابل حمل مانند USB flash drive ها و کارت‌های حافظه در محیط‌های desktop استفاده می‌شود.
  • /srv: شامل داده‌های اختصاصی مربوط به service های خاص سیستم است، مانند فایل‌های web server، FTP repository ها یا نسخه های control repository.
  • /run: اطلاعات مربوط به runtime state، فایل‌های process ID و Unix domain socket های ایجاد شده از زمان آخرین boot سیستم را نگهداری می‌کند.

قدرت Virtual File System ها

سیستم‌های مدرن Linux وابستگی شدیدی به virtual file system های پویا دارند که روی disk های فیزیکی وجود ندارند، بلکه به‌صورت درون‌حافظه‌ای (in-memory) توسط kernel ایجاد می‌شوند. دو نمونه اصلی از این سیستم‌ها proc و sys هستند.
مسیر proc که مخفف process file system است، یک pseudo file system است که به عنوان پنجره‌ای مستقیم به درون kernel در حال اجرا عمل می‌کند. اگرچه proc به صورت مجموعه‌ای از پوشه‌ها و فایل‌ها دیده می‌شود، اما هیچ فضای فیزیکی روی disk مصرف نمی‌کند. در عوض، فایل‌های داخل proc نشان‌دهنده data structure های زنده kernel، معیار سنجش hardware و اطلاعات مربوط به process های در حال اجرا هستند. به هر process فعال یک numeric directory بر اساس Process ID اختصاص می‌یابد. بررسی این پوشه‌ها به مدیران سیستم اجازه می‌دهد environment variable ها، file descriptor ها، میزان مصرف memory و аргумент‌های اجرا را در لحظه بررسی کنند. همچنین فایل‌هایی مانند proc cpuinfo و proc meminfo جزئیات کاملی از CPU و RAM ارائه می‌دهند.
به همین ترتیب، مسیر sys نشان‌دهنده sysfs virtual file system است که برای ارائه یک مدل ساختاریافته از قطعات سخت‌افزاری و device driver ها معرفی شد. در حالی که proc روی process ها و آمار runtime تمرکز دارد، sys یک دیدگاه hierarchical از دستگاه‌های فیزیکی، kernel module ها، تنظیمات power management و bus architecture متصل به ماشین ارائه می‌دهد. مدیران سیستم و ابزارهای خودکار از sys برای تنظیم hardware، بررسی ساختار سخت‌افزار و تغییر dynamic پارامترهای kernel بدون نیاز به reboot استفاده می‌کنند.

مفهوم Device Node ها و Abstraction در سطح سیستم

رابط‌های سخت‌افزاری و device های سیستم به صورت file node در پوشه dev قرار می‌گیرند. پوشه dev که مخفف devices است، شامل فایل‌های ویژه‌ای است که به عنوان interface برای device driver ها عمل می‌کنند. در Linux، storage drive ها با نام‌هایی مثل sda یا nvme0n1، کنسول‌های terminal با نام tty و pseudo device های خاص برای امور کاربردی تعریف می‌شوند. از نمونه‌های مهم می‌توان به dev null اشاره کرد که داده‌ها را دریافت و حذف می‌کند، dev zero که جریانی نامحدود از بایت‌های صفر تولید می‌کند و dev urandom که منبع تولید اعداد تصادفی امن است. تعامل با این فایل‌ها امکان نوشتن مستقیم داده روی storage، clone کردن disk یا پاکسازی امن داده‌ها را فراهم می‌سازد.

Library ها و کدهای مشترک

کدهای مشترک و قابلیت‌های مورد نیاز binary های سیستم در directory های library مانند lib، lib64 و usr lib ذخیره می‌شوند. این پوشه‌ها شامل فایل‌های dynamic library هستند که عملکردی مشابه dynamic link library در سایر سیستم‌عامل‌ها دارند. هنگام اجرای یک binary executable، این فایل‌ها به‌صورت پویا لینک می‌شوند تا تابع‌های مشترک مانند تخصیص حافظه یا محاسبات ریاضی را اجرا کنند. تمرکز library ها در مسیرهای مشخص از دوباره‌نویسی کدها جلوگیری کرده، حجم disk را کاهش می‌دهد و روند patch های امنیتی را ساده می‌سازد.

امنیت، Permission ها و سازماندهی فایل‌ها

درک layout پوشه‌ها در Linux مزیت بزرگی هنگام تنظیم امنیت، access control list ها و permission model ها محسوب می‌شود. در Linux، دسترسی‌ها بر اساس user ownership، group ownership و permission bit های خواندن، نوشتن و اجرا اعمال می‌شوند. از آنجا که binary های حساس در پوشه‌های محافظت‌شده مانند sbin و usr sbin قرار دارند، کاربران عادی بدون دسترسی‌های بالاتر مانند sudo نمی‌توانند دستوراتی که state سیستم را تغییر داده یا routing سخت‌افزار را عوض می‌کنند، اجرا نمایند.

استراتژی‌های Partitioning برای محیط‌های Enterprise

برنامه‌ریزی برای storage architecture و استراتژی‌های partitioning کاملاً وابسته به شناخت کامل Linux file system hierarchy است. در deployment های سرورهای enterprise، قرار دادن تمام directory ها روی یک partition واحد کاری پرریسک است. اگر یک logging daemon دچار مشکل شده و gigabyte ها فایل log در var log بنویسد، یا اگر کاربری فایل‌های سنگین در home آپلود کند، تمام فضای partition پر شده و باعث crash کردن kernel یا عدم پذیرش connection های جدید می‌شود. برای جلوگیری از این مشکلات، مهندسان مجرب Linux بخش‌های حساس را روی storage drive ها، logical volume ها یا network mount های مجزا قرار می‌دهند.
یک طراحی استاندارد enterprise معمولاً بخش‌های root filesystem، boot، var، home و tmp را با استفاده از Logical Volume Manager به volume های مجزا تقسیم می‌کند. ایزوله‌سازی var تضمین می‌کند که افزایش حجم log file ها باعث از دسترس خارج شدن root filesystem نشود. همچنین تنظیم mount flag های خاص روی tmp و home مانند noexec برای غیرفعال کردن اجرای binary یا nosuid برای جلوگیری از افزایش دسترسی، امنیت سیستم را در برابر malware ها افزایش می‌دهد. تفکیک home روی یک storage volume مجزا این امکان را می‌دهد که بدون از دست رفتن داده‌های کاربران، سیستم‌عامل را re-install یا upgrade کرد.

نحوه تشخیص Absolute Path و Relative Path

بررسی نحوه آدرس‌دهی فایل‌ها یکی دیگر از مفاهیم کلیدی در کار با Linux directory tree است. مسیرها می‌توانند به‌صورت absolute path یا relative path تعریف شوند. یک absolute path موقعیت کامل یک فایل یا پوشه را دقیقاً از root slash مشخص می‌کند، صرف‌نظر از اینکه کاربر در چه مسیر کاری قرار دارد. برای مثال، آدرس‌دهی یک فایل تنظیمات شبکه از مسیر /etc/netplan/01-netconfig.yaml تضمین می‌کند که سیستم بدون توجه به محل اجرای دستور، دقیقاً همان فایل را پیدا کند.
در مقابل، یک relative path موقعیت یک فایل یا پوشه را نسبت به مسیر فعلی کاربر (current working directory) در جلسه terminal می‌سنجد. مسیرهای نسبی از علامت‌های نقطه استفاده می‌کنند؛ یک نقطه نشان‌دهنده مسیر فعلی و دو نقطه نشان‌دهنده parent directory در لایه بالاتر است. تسلط بر جابه‌جایی میان این مسیرها به توسعه‌دهندگان و مدیران سیستم کمک می‌کند تا script های خودکار قابل حمل بنویسند، workload های containerized را مدیریت کنند و navigation در command line را بهبود ببخشند.

فرصت‌های شغلی در زیرساخت‌های Enterprise

توسعه نرم‌افزار، integration سیستم‌ها و مدیریت زیرساخت‌های IT در هاب‌های فناوری جهان وابستگی شدیدی به مهارت‌های مهندسی Linux دارد. برای متخصصانی که قصد دارند مسیر شغلی خود را در enterprise IT، cloud engineering یا systems architecture پیش ببرند، تسلط بر زیرساخت Linux فرصت‌های شغلی زیادی ایجاد می‌کند. تقاضا برای جذب مهندسان مسلط به مدیریت high availability server architecture در بازارهای در حال رشد بسیار بالا است. متخصصانی که به دنبال بررسی شرایط کاری بین‌المللی هستند، مواردی مانند حقوق لینوکس را هنگام ارزیابی موقعیت‌های شغلی بررسی می‌کنند، چرا که مراکز بزرگ فناوری سرمایه‌گذاری سنگینی روی جذب متخصصان زیرساخت انجام می‌دهند.
تامین امنیت و نگهداری از زیرساخت‌های حساس نیازمند نظارت فنی مداوم، monitoring فعال و رفع سریع مشکلا است. زمانی که مجموعه های بزرگ با قطعی‌های غیرمنتظره، آسیپ‌پذیری‌های امنیتی یا افت کارایی database روبرو می‌شوند، به مهندسانی نیاز دارند که درک عمیقی از محیط Linux داشته باشند. چه در زمان مدیریت یک file system آسیب‌دیده، چه در بازسازی boot sequence یا بهینه‌سازی عملکرد network socket، دسترسی به بهترین بسترهای پشتیبانی دواپس و متخصصان زیرساخت cloud تضمین می‌کند که خدمات سازمان به‌صورت پایدار، امن و پرسرعت باقی بمانند.

تفاوت Symbolic Link و Hard Link

مفهوم symbolic link و hard link بخش مهم دیگری از معماری Linux file system را تشکیل می‌دهد. یک hard link اشاره‌گر مستقیم به inode واقعی روی disk فیزیکی است، جایی که داده‌های فایل ذخیره شده‌اند. از آنجا که hard link مستقیماً به داده‌های inode اشاره دارد، ایجاد آن فضای جدیدی روی disk اشغال نمی‌کند و حذف فایل اصلی باعث از بین رفتن دسترسی hard link به داده‌ها نمی‌شود. با این حال، hard link ها نمی‌توانند بین partition ها یا file system های مختلف تعریف شوند. در مقابل، symbolic link ها که symlink نیز نامیده می‌شوند، مانند یک shortcut عمل کرده و به یک file path نام دیگر اشاره می‌کنند. این لینک‌ها می‌توانند بین partition ها و network mount های مختلف ایجاد شوند و برای مدیریت نسخه های نرم‌افزاری و پوشه‌های پویا بسیار کاربردی هستند.

تکامل File System و معماری UsrMerge

دیستروهای مدرن Linux همواره پیاده‌سازی Filesystem Hierarchy Standard را بهبود می‌دهند تا سرعت، امنیت و مدیریت سیستم ساده‌تر شود. ادغام پوشه‌های bin، sbin، lib و lib64 در پوشه usr که با نام پروژه UsrMerge شناخته می‌شود، یکی از مهم‌ترین تغییرات معماری در سال‌های اخیر است. با یکپارچه‌سازی binary های boot در پوشه usr و جایگزینی پوشه‌های قدیمی با symbolic link، میزان redundancy کاهش یافته، backupگیری ساده‌تر شده و امکان update یکپارچه برای کل پوشه usr به‌صورت read only فراهم می‌شود.

نتیجه‌گیری

در نهایت، Linux file system hierarchy یک نمونه برجسته از طراحی ساختاریافته نرم‌افزار است. با سازماندهی تمام تجهیزات سخت‌افزاری، معیارهای process، تنظیمات سیستم، فایل‌های binary و فایل‌های کاربر در یک ساختار پیش‌بینی‌پذیر و استاندارد، Linux محیطی بی‌نظیر برای پایداری، خودکارسازی و توسعه‌پذیری فراهم می‌کند. برای هر مدیر سیستم، متخصص DevOps و مهندس cloud، تسلط بر این directory layout کلید اصلی کنترل کامل روی سیستم‌عامل است. درک محل قرارگیری فایل‌ها، علت وجود آن‌ها و نحوه تعامل آن‌ها با kernel به متخصصان این امکان را می‌دهد تا راه‌کارهای فنی سریع‌تر، امن‌تر و پایدارتری را پیاده‌سازی کنند.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

بیشتر بدانید: