دسته بندی:

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

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

وقتی برای نخستین بار با SSH به یک سرور لینوکسی وصل می‌شوید و دستور ls / را می‌زنید، فهرستی از نام‌های کوتاه و ناآشنا جلوی چشمتان ظاهر می‌شود: bin، etc، proc، var و چند مورد دیگر. تفاوت بنیادی لینوکس با ویندوز همین‌جاست؛ خبری از درایو C و D نیست و همه چیز — از هسته سیستم‌عامل گرفته تا فلشی که همین حالا به سرور وصل کرده‌اید — زیر یک درخت واحد به نام ریشه یا / قرار می‌گیرد.

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

دیاگرام ساختار دایرکتوری‌های لینوکس

یک توزیع استاندارد لینوکس ساختاری به شرحی که در تصویر زیر می‌بینید دارد. این چیدمان قراردادی و تصادفی نیست؛ از سندی به نام FHS یا Filesystem Hierarchy Standard پیروی می‌کند و به همین دلیل است که مسیر فایل‌های اصلی در CentOS، AlmaLinux، Rocky Linux، Debian و Ubuntu کم‌وبیش یکسان است.

Linux-Directory-Structure

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

دایرکتوری‌های اصلی ریشه و کاربرد آن‌ها

  • /bin : فایل‌های اجرایی باینری پایه‌ای که هم کاربر عادی و هم فرایند boot و حالت تعمیر (single-user mode) به آن‌ها نیاز دارند؛ دستوراتی مثل cat، ls، cp، df و tar. (دستورهایی مثل du، wc و rpm که در فهرست‌های قدیمی زیر /bin آورده می‌شوند در واقع در /usr/bin هستند؛ همان‌طور که پایین‌تر می‌بینید امروز این دو مسیر عملاً یکی شده‌اند.) توجه کنید که history یک باینری مستقل نیست و دستور داخلی (builtin) شل bash محسوب می‌شود.
  • /boot : فایل‌های مهم فرایند بارگذاری سیستم‌عامل و هسته لینوکس، شامل ایمیج کرنل، initramfs و فایل‌های بوت‌لودر.
  • /dev : فایل‌های دستگاه برای تمام دیوایس‌های موجود روی سخت‌افزار؛ دیسک، ترمینال، حافظه و مانند آن. این دایرکتوری در سیستم‌های امروزی توسط udev به‌صورت پویا ساخته می‌شود و محتوایش روی دیسک ذخیره نمی‌شود.
  • /etc : یکی از اصلی‌ترین مکان‌های مورد مراجعه هر لینوکس‌کار. کلیه تنظیمات سیستمی اینجا قرار می‌گیرند. معمولاً هر برنامه در این دایرکتوری برای خود یک زیرشاخه می‌سازد و تنظیمات سطح سیستم را آنجا نگه می‌دارد.
  • /home : دایرکتوری شخصی کاربران. هرگاه یوزر جدیدی در سیستم تعریف شود، پوشه‌ای هم‌نام همان یوزر در این مسیر ساخته می‌شود که فایل‌های شخصی و تنظیمات کاربری او را نگه می‌دارد.
  • /lib و /lib64 : ماژول‌های کرنل و کتابخانه‌های اشتراکی (shared library) لازم برای بوت سیستم و اجرای دستورات موجود در ریشه فایل‌سیستم.
  • /lost+found : محل قرار گرفتن قطعات فایل‌های آسیب‌دیده‌ای که ابزار تعمیر فایل‌سیستم پیدا می‌کند اما نمی‌داند به کدام دایرکتوری تعلق داشته‌اند؛ مثلاً پس از خاموش شدن ناگهانی سرور. روی فایل‌سیستم‌های خانواده ext (ext3/ext4) این دایرکتوری همان موقع ساخت فایل‌سیستم ایجاد می‌شود و fsck از آن استفاده می‌کند. روی XFS — که فایل‌سیستم پیش‌فرض RHEL، AlmaLinux و Rocky است — از ابتدا وجود ندارد و فقط در صورت نیاز توسط xfs_repair ساخته می‌شود؛ روی XFS ابزار تعمیر xfs_repair است، نه fsck.
  • /media : نقطه اتصال خودکار رسانه‌های جداشدنی. برای نمونه اگر با یوزر tarimehr وارد سیستم شده باشید و فلشی به نام myusb وصل کنید، مسیر /media/tarimehr/myusb را خواهید دید.
  • /mnt : مسیری عمومی برای mount کردن دستی. برخلاف /media، این مسیر معمولاً فقط توسط مدیر سیستم یا کاربر root و به‌صورت موقت استفاده می‌شود.
  • /opt : محل نصب نرم‌افزارهای وندورهای مستقل و بسته‌هایی که خارج از مدیر بسته توزیع نصب می‌شوند. نام آن مخفف optional است.
  • /proc : یک فایل‌سیستم مجازی که وضعیت لحظه‌ای کرنل و پروسه‌ها را به شکل فایل نمایش می‌دهد. محتویات آن روی دیسک نوشته نمی‌شود و در حافظه ساخته می‌شود.
  • /sys : فایل‌سیستم مجازی دیگری (sysfs) که ساختار دستگاه‌ها، درایورها و پارامترهای کرنل را در قالب فایل در اختیار می‌گذارد. در متن‌های قدیمی‌تر معمولاً از آن نامی برده نشده، ولی امروز بخش زیادی از تنظیمات سخت‌افزاری از همین‌جا خوانده و نوشته می‌شود.
  • /root : دایرکتوری خانگی کاربر root است و نباید آن را با ریشه فایل‌سیستم یعنی / اشتباه گرفت.
  • /run : اطلاعات مربوط به وضعیت جاری سیستم از آخرین بوت به بعد؛ مواردی مثل PID فایل دیمن‌ها، سوکت‌ها و کاربران واردشده. این مسیر یک tmpfs در حافظه است و با هر بوت خالی می‌شود. مسیر قدیمی /var/run امروز فقط یک لینک به /run است.
  • /sbin : باینری‌های مدیریتی مورد نیاز مدیر سیستم و حالت Maintenance؛ مانند fdisk، swapon، reboot و iptables.
  • /srv : طبق FHS محل داده‌های سرویس‌هایی است که سرور ارائه می‌کند. برخی توزیع‌ها از آن استفاده می‌کنند و برخی آن را خالی می‌گذارند.
  • /tmp : دایرکتوری موقت سیستم که همه کاربران به آن دسترسی نوشتن دارند. محتوای آن موقتی است و در بسیاری از توزیع‌ها با هر بوت یا با یک زمان‌بندی مشخص پاک می‌شود؛ پس هرگز چیزی که به آن نیاز دارید در /tmp نگه ندارید.
  • /usr : این دایرکتوری و زیرشاخه‌هایش حاوی کتابخانه‌ها، اسناد، برنامه‌ها و حتی سورس برنامه‌های نصب‌شده روی سیستم هستند.
  • /var : همان‌طور که از نام آن یعنی variable حدس زده می‌شود، فایل‌هایی را نگه می‌دارد که انتظار می‌رود در کارکرد عادی سیستم دائماً تغییر کنند؛ لاگ‌های سیستم، صف ایمیل، صف چاپ، کش بسته‌ها و دیتابیس‌ها.

یک تغییر مهم: /bin و /usr/bin امروز یکی هستند

در آموزش‌های قدیمی تأکید می‌شود که /bin دستورات ضروری بوت و /usr/bin دستورات غیرضروری را نگه می‌دارد. این تفکیک در توزیع‌های امروزی عملاً از بین رفته است. در RHEL 7 و بعد از آن، در Ubuntu از ۱۹.۰۴، در Debian از نسخه ۱۲ و در توزیع‌های مشتق از آن‌ها، مسیرهای /bin، /sbin، /lib و /lib64 فقط لینک نمادین (symlink) به معادل خودشان داخل /usr هستند. چون این تغییر بسته به نسخه و به اینکه سیستم نصب تازه بوده یا ارتقا یافته فرق می‌کند، به‌جای فرض کردن، در سرور خودتان بررسی کنید:

ls -ld /bin /sbin /lib /lib64

اگر خروجی با lrwxrwxrwx شروع شود و به usr/bin اشاره کند، سرور شما usr-merge شده است. در این حالت فایل واقعی همیشه زیر /usr است و مسیرهای بالا فقط برای سازگاری با اسکریپت‌های قدیمی نگه داشته شده‌اند. (روی معماری‌هایی مثل ARM ممکن است اصلاً /lib64 وجود نداشته باشد و برای همان یک مسیر پیغام «No such file or directory» بگیرید؛ این طبیعی است.)

فایل‌های مهم در /boot و /dev

  • /boot/vmlinuz-* : فایل کرنل لینوکس. معمولاً برای هر نسخه کرنل نصب‌شده یک فایل جداگانه با شماره نسخه در انتهای نام وجود دارد.
  • /boot/initramfs-*.img : فایل‌سیستم موقتی که کرنل در ابتدای بوت بارگذاری می‌کند تا درایورهای لازم برای دسترسی به دیسک اصلی را داشته باشد. در Debian و Ubuntu نام آن initrd.img-* است.
  • /dev/sda، /dev/nvme0n1، /dev/vda : فایل دستگاه دیسک‌ها. نام‌گذاری قدیمی /dev/hda و /dev/hdb مربوط به دیسک‌های IDE بود و سال‌هاست منسوخ شده است؛ امروز دیسک‌های SATA و SAS با sd*، دیسک‌های NVMe با nvme* و دیسک مجازی سرورهای مجازی مبتنی بر KVM با vd* شناخته می‌شوند.
  • /dev/sr0 : فایل دستگاه درایو نوری. مسیر قدیمی /dev/hdc برای CD-ROM دیگر استفاده نمی‌شود.
  • /dev/null، /dev/zero، /dev/urandom : دستگاه‌های مجازی پرکاربرد در اسکریپت‌نویسی؛ به‌ترتیب برای دور ریختن خروجی، تولید بایت صفر و تولید داده تصادفی.

برای دیدن دیسک‌ها و پارتیشن‌های واقعی سرور به‌جای حدس زدن از روی نام فایل‌ها، از این دستور استفاده کنید:

lsblk

فایل‌های پیکربندی مهم در /etc

راه‌اندازی سرویس‌ها و بوت

/etc/init.d/ اسکریپت‌های راه‌انداز سرویس‌ها در سیستم قدیمی SysV init را نگه می‌دارد. اگر روی سروری با CentOS 6 یا قدیمی‌تر کار می‌کنید هنوز فعال است، اما در تمام توزیع‌های امروزی جای آن را systemd گرفته است. یونیت‌فایل‌های سرویس‌ها در /usr/lib/systemd/system/ (نصب‌شده توسط بسته‌ها) و /etc/systemd/system/ (تنظیمات و بازنویسی‌های مدیر سیستم) قرار دارند.

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

/etc/init.d/httpd restart
service httpd restart

امروز باید بنویسید:

systemctl restart httpd
systemctl status httpd
systemctl enable --now httpd
  • /etc/inittab : در گذشته پروسه‌های INIT و سطح اجرای پیش‌فرض (runlevel) را تعیین می‌کرد. در systemd این فایل دیگر کاربردی ندارد و مفهوم runlevel جای خود را به target داده است. برای دیدن و تغییر حالت پیش‌فرض:
    systemctl get-default
    systemctl set-default multi-user.target

    اول get-default را بگیرید و مقدار فعلی را یادداشت کنید. دستور دوم را فقط وقتی بزنید که واقعاً می‌خواهید حالت پیش‌فرض عوض شود؛ روی سروری که محیط گرافیکی دارد، این دستور از بوت بعدی رابط گرافیکی را بالا نمی‌آورد.

  • /etc/rc.d/ و /etc/rc.d/init.d/ : اسکریپت‌های مربوط به سطوح اجرا در SysV init. همان وضعیت /etc/init.d/ را دارند و امروز فقط برای سازگاری باقی مانده‌اند. تنها فایلی که هنوز در برخی توزیع‌ها به‌صورت رسمی استفاده می‌شود /etc/rc.d/rc.local است که آن هم توسط یک یونیت systemd اجرا می‌شود و باید مجوز اجرا داشته باشد.
  • /etc/grub.conf و /boot/grub/menu.lst : فایل کانفیگ نسخه قدیمی بوت‌لودر GRUB (GRUB Legacy). امروز GRUB 2 جایگزین آن شده است. در GRUB 2 فایل تولیدشده را مستقیماً ویرایش نمی‌کنید؛ تنظیمات را در /etc/default/grub و /etc/grub.d/ می‌نویسید و سپس فایل نهایی را می‌سازید:
    # RHEL / CentOS / AlmaLinux / Rocky
    grub2-mkconfig -o /boot/grub2/grub.cfg
    
    # Debian / Ubuntu
    update-grub

    در سیستم‌های UEFI مسیر فایل نهایی بسته به توزیع و نسخه فرق می‌کند و ممکن است زیر /boot/efi/EFI/ باشد؛ پیش از اجرای دستور، مسیر واقعی را با ls بررسی کنید. چون یک فایل grub.cfg خراب سرور را بوت‌نشدنی می‌کند، حتماً اول از فایل فعلی نسخه پشتیبان بگیرید (مثلاً cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak) و اگر سرور اجاره‌ای است، پیش از ریبوت مطمئن شوید به کنسول یا KVM-over-IP دسترسی دارید.

  • /etc/lilo.conf : فایل کانفیگ بوت‌لودر LILO. این بوت‌لودر سال‌هاست در توزیع‌های اصلی کنار گذاشته شده و روی یک سرور امروزی با آن روبه‌رو نخواهید شد. اگر در آموزشی به آن برخوردید، معادل امروزی‌اش GRUB 2 است.
  • /etc/fstab : فهرست فایل‌سیستم‌هایی که باید هنگام بوت mount شوند، به‌همراه نقطه اتصال (mount point) و گزینه‌های آن‌ها. توصیه امروزی این است که به‌جای نام دستگاه از UUID= استفاده کنید، چون نام دستگاه‌ها بین بوت‌ها می‌تواند جابه‌جا شود. UUID دیسک‌ها را با blkid ببینید. یک اشتباه در این فایل می‌تواند مانع بوت شدن سرور شود، پس اول یک نسخه پشتیبان بگیرید و قبل از ریبوت صحت فایل را بررسی کنید:
    cp /etc/fstab /etc/fstab.bak
    findmnt --verify
    mount -a

    findmnt --verify خود فایل را بدون mount کردن چیزی بررسی می‌کند و mount -a واقعاً تلاش می‌کند همه ردیف‌ها را mount کند؛ اگر این دستور بدون خطا تمام شد، ریبوت امن‌تر است. توجه کنید که mount -a همه خطاها را نمی‌گیرد (مثلاً ردیف‌های swap یا گزینه nofail را) و اگر مقصد یک اشتراک شبکه‌ای در دسترس نباشد ممکن است دستور معلق بماند.

  • /etc/mtab : فهرست فایل‌سیستم‌های mount شده. در سیستم‌های امروزی این فایل دیگر مستقل نیست و یک symlink به /proc/self/mounts است. برای خواندن خواناتر آن از findmnt استفاده کنید.
  • /etc/crontab و /etc/cron.d/ : زمان‌بندی اجرای دستورات در بازه‌های مشخص. کرون‌های شخصی هر کاربر جدا هستند و با crontab -e ویرایش می‌شوند. جایگزین مدرن آن در systemd، تایمرها (systemctl list-timers) هستند که هر دو در کنار هم قابل استفاده‌اند.
  • /etc/modprobe.d/ و /etc/modules-load.d/ : تنظیمات و بارگذاری ماژول‌های کرنل. فایل قدیمی /etc/modules.conf (و پیش از آن /etc/conf.modules) منسوخ است و در توزیع‌های امروزی وجود ندارد.

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

  • /etc/passwd : برخلاف تصور رایج، این فایل رمز عبور را نگه نمی‌دارد. اطلاعات حساب کاربران شامل نام کاربری، UID، GID، مسیر خانگی و شل پیش‌فرض در آن ذخیره می‌شود و برای همه کاربران قابل خواندن است.
  • /etc/shadow : هش رمز عبور کاربران و سیاست‌های انقضای پسورد اینجاست. این فایل فقط برای root قابل خواندن است و همین جداسازی، دلیل امنیتی وجود آن است.
  • /etc/group : اطلاعات گروه‌ها و عضویت کاربران در آن‌ها.
  • /etc/sudoers و /etc/sudoers.d/ : تعیین اینکه چه کاربری چه دستوری را با sudo می‌تواند اجرا کند. این فایل را هرگز با ویرایشگر معمولی باز نکنید؛ فقط با visudo، چون یک خطای نگارشی می‌تواند دسترسی sudo را برای همه از بین ببرد. فایل‌های داخل /etc/sudoers.d/ را هم با visudo -f /etc/sudoers.d/نام-فایل ویرایش کنید تا پیش از ذخیره اعتبارسنجی شوند.
  • /etc/skel/ : الگوی فایل‌هایی که هنگام ساخت کاربر جدید در دایرکتوری خانگی او کپی می‌شوند.
  • /etc/securetty : فهرست ترمینال‌هایی که ورود مستقیم root از آن‌ها مجاز است. این مکانیزم قدیمی است و در توزیع‌های جدید خانواده RHEL دیگر ارائه نمی‌شود. کنترل واقعی ورود root از راه دور امروز با گزینه PermitRootLogin در /etc/ssh/sshd_config انجام می‌شود.
  • /etc/hosts.allow و /etc/hosts.deny : فهرست هاست‌هایی که دسترسی آن‌ها به سرویس‌های محلی مجاز یا سلب شده است. این دو فایل به کتابخانه TCP Wrappers وابسته‌اند که در RHEL 8 و نسخه‌های بعدی حذف شده است. برای محدود کردن دسترسی روی سرورهای امروزی از firewalld یا nftables و از تنظیمات خود سرویس استفاده کنید. (در متن‌های قدیمی گاهی این فایل به‌اشتباه host.deny نوشته می‌شود؛ نام درست hosts.deny است.)
  • /etc/issue و /etc/issue.net : پیام پیش از ورود؛ اولی روی کنسول محلی نمایش داده می‌شود و دومی برای ورودهای شبکه‌ای در نظر گرفته شده است. توجه کنید که SSH به‌صورت پیش‌فرض هیچ بنری نشان نمی‌دهد و تا وقتی در /etc/ssh/sshd_config گزینه Banner /etc/issue.net را فعال نکنید، محتوای این فایل به کاربر SSH نمایش داده نمی‌شود.
  • /etc/motd : مخفف message of the day؛ پیامی که کاربران بعد از ورود موفق می‌بینند. در توزیع‌های جدید /etc/motd.d/ و در Ubuntu اسکریپت‌های /etc/update-motd.d/ هم به آن اضافه می‌شوند.

پیکربندی شبکه و فایل‌های مربوط به آن

پیکربندی شبکه در خانواده RedHat و CentOS به‌طور سنتی روی چند فایل مشخص تکیه داشت. این فایل‌ها هنوز مهم‌اند، اما بخشی از آن‌ها امروز توسط سرویس‌های دیگری مدیریت می‌شوند و ویرایش دستی‌شان لزوماً نتیجه نمی‌دهد.

/etc/hosts

عملکرد اصلی این فایل resolve کردن Hostname‌ها به‌صورت محلی و بدون مراجعه به DNS است. صرف‌نظر از نوع شبکه، این فایل باید ردیف مربوط به localhost با مقدار 127.0.0.1 را داشته باشد. روی سیستم‌های امروزی ردیف IPv6 هم در کنار آن قرار می‌گیرد:

127.0.0.1   localhost localhost.localdomain
::1         localhost localhost.localdomain

حذف یا خراب کردن این دو خط باعث کند شدن یا خطای عجیب بسیاری از سرویس‌ها می‌شود، پس پیش از ویرایش حتماً یک نسخه پشتیبان بگیرید.

/etc/resolv.conf

این فایل آدرس IP سرورهای DNS و دامنه جستجو (search domain) را مشخص می‌کند و ساختار ساده‌ای دارد:

search example.com
nameserver 192.168.1.1
nameserver 8.8.8.8

نکته‌ای که در متن‌های قدیمی نیست: روی سرورهای امروزی این فایل معمولاً به‌صورت خودکار تولید می‌شود. اگر NetworkManager یا systemd-resolved فعال باشد، تغییرات دستی شما با اولین ریست شبکه یا بوت بعدی از بین می‌رود و در بسیاری از توزیع‌ها /etc/resolv.conf اصلاً یک symlink است. قبل از ویرایش، وضعیت آن را بررسی کنید:

ls -l /etc/resolv.conf
resolvectl status

دستور اول همه‌جا کار می‌کند؛ دستور دوم فقط وقتی وجود دارد که بسته systemd-resolved نصب و فعال باشد (در Ubuntu معمولاً هست، در نصب پیش‌فرض RHEL و AlmaLinux و Rocky معمولاً نیست) و اگر نبود پیغام «command not found» می‌گیرید که مشکلی ایجاد نمی‌کند.

راه درست، تنظیم DNS در همان پروفایل کانکشن است، مثلاً با nmcli در خانواده RHEL یا در فایل Netplan در Ubuntu.

/etc/sysconfig/network

این فایل در خانواده RedHat اطلاعات مسیریابی و میزبان را برای همه شبکه‌های مرتبط تعیین می‌کرد. توجه داشته باشید که از RHEL 7 به بعد، نام میزبان دیگر از این فایل خوانده نمی‌شود؛ نام هاست در /etc/hostname نگهداری می‌شود و راه درست تغییر آن این است:

hostnamectl set-hostname server1.example.com
/etc/sysconfig/network-scripts/ifcfg-<interface-name>

برای هر کارت شبکه یا network interface یک فایل پیکربندی جداگانه با نام ifcfg- به‌علاوه نام اینترفیس وجود داشت که تنظیمات اختصاصی همان اینترفیس (IP، netmask، gateway، حالت DHCP یا static) را نگه می‌داشت. این روش هنوز روی CentOS 7 کار می‌کند، اما:

  • در RHEL 8 و توزیع‌های هم‌خانواده، اسکریپت‌های network-scripts منسوخ اعلام شدند و مدیریت شبکه به NetworkManager سپرده شد.
  • در RHEL 9، AlmaLinux 9 و Rocky Linux 9 بسته network-scripts دیگر ارائه نمی‌شود. پروفایل‌های کانکشن به‌شکل فایل‌های keyfile با پسوند .nmconnection در مسیر /etc/NetworkManager/system-connections/ ذخیره می‌شوند. چون این فایل‌ها ممکن است رمز Wi-Fi یا اطلاعات احراز هویت داشته باشند، مجوزشان 600 و مالکشان root است؛ یعنی فقط با کاربر root قابل خواندن‌اند. اگر دستی ویرایششان کردید، این مجوز را تغییر ندهید و بعد از ویرایش nmcli connection reload را بزنید.

ابزار خط فرمان استاندارد برای کار با آن‌ها nmcli است:

nmcli connection show
nmcli device status

در Ubuntu Server از نسخه ۱۸.۰۴ به بعد، پیکربندی شبکه در فایل‌های YAML زیر مسیر /etc/netplan/ نوشته و با netplan apply اعمال می‌شود. روی سروری که فقط از راه SSH به آن دسترسی دارید، به‌جای netplan apply از netplan try استفاده کنید؛ این دستور تنظیمات را موقتاً اعمال می‌کند و اگر ظرف چند ثانیه تأیید نکنید خودش به تنظیمات قبلی برمی‌گردد، بنابراین یک اشتباه در فایل شبکه، سرور را از دسترس خارج نمی‌کند. در Debian روش سنتی /etc/network/interfaces همچنان رایج است.

برای دیدن وضعیت فعلی اینترفیس‌ها و مسیریابی هم به‌جای ifconfig و route — که هر دو متعلق به بسته قدیمی net-tools هستند و در نصب پیش‌فرض بسیاری از توزیع‌های امروزی اصلاً وجود ندارند — از ابزار ip استفاده کنید:

ip addr show
ip route show

یک فایل دیگر که در همین دسته جای می‌گیرد /etc/exports است؛ فهرست دایرکتوری‌هایی که سرور از طریق NFS در شبکه به اشتراک می‌گذارد.

محیط شل و سایر فایل‌های /etc

  • /etc/profile : تنظیمات سراسری محیط شل که هنگام login shell اجرا می‌شود.
  • /etc/profile.d/ : اسکریپت‌هایی که پس از ورود اجرا می‌شوند. اگر می‌خواهید متغیر محیطی یا alias سراسری اضافه کنید، ساختن یک فایل .sh جدید در این مسیر بسیار امن‌تر از دست بردن در خود /etc/profile است.
  • /etc/bashrc : مکانی برای مواردی که فقط برای bash اجرا می‌شود، مانند تعریف alias و function. در Debian و Ubuntu نام این فایل /etc/bash.bashrc است.
  • /etc/os-release : نام و نسخه توزیع به شکل ماشین‌خوان. در خانواده RHEL فایل /etc/redhat-release هم همین اطلاعات را به شکل متنی نشان می‌دهد.
  • /etc/printcap : اطلاعات پرینتر در سیستم چاپ قدیمی. مدیریت چاپ امروز با CUPS و از طریق /etc/cups/ انجام می‌شود.
  • /etc/termcap : فایل ASCII که رفتار ترمینال، کنسول و پرینترها در آن تعریف شده بود. جایگزین امروزی آن پایگاه داده terminfo در /usr/share/terminfo است.
  • /etc/X11/ : تنظیمات محیط گرافیکی X Window. روی سرورها معمولاً نصب نیست و در دسکتاپ‌های جدید بخش زیادی از کار به Wayland منتقل شده است.
  • /etc/ssh/sshd_config : تنظیمات سرویس SSH؛ مهم‌ترین فایل امنیتی یک سرور اجاره‌ای. پس از هر تغییر، پیش از ریستارت سرویس با /usr/sbin/sshd -t صحت نگارش آن را بررسی کنید (مسیر کامل را بنویسید، چون /usr/sbin همیشه در PATH کاربر عادی نیست). مهم‌تر از آن: هنگام دست بردن در این فایل، نشست SSH فعلی خود را باز نگه دارید و تغییر را در یک نشست دوم و جداگانه امتحان کنید. اگر تنظیمات اشتباه باشد، نشست باز همچنان کار می‌کند و می‌توانید عقب‌گرد کنید؛ در غیر این صورت ممکن است دسترسی خودتان به سرور را از دست بدهید.

فایل‌ها و مسیرهای مهم در /usr

  • /usr/bin : برنامه‌های عمومی سیستم و ابزارهایی که کاربران معمولی اجرا می‌کنند.
  • /usr/sbin : دستورات مدیریتی مخصوص Super User برای مدیریت سیستم.
  • /usr/include : فایل‌های هدر زبان C که هنگام کامپایل برنامه‌ها لازم می‌شوند.
  • /usr/lib و /usr/lib64 : کتابخانه‌های مشترک برنامه‌ها.
  • /usr/share : داده‌های مستقل از معماری؛ صفحات man، فایل‌های info، آیکون‌ها و مستندات بسته‌ها.
  • /usr/local : محل نصب نرم‌افزارهایی که خودتان از سورس کامپایل می‌کنید. مدیر بسته توزیع به این مسیر دست نمی‌زند، بنابراین نصب دستی در اینجا با به‌روزرسانی سیستم تداخل پیدا نمی‌کند.

‏/proc: پنجره‌ای به وضعیت لحظه‌ای سیستم

فایل‌های زیر روی دیسک وجود ندارند و هر بار که آن‌ها را می‌خوانید، کرنل مقدار لحظه‌ای را تولید می‌کند. برای دیدن محتوایشان کافی است از cat استفاده کنید.

  • /proc/cpuinfo : مشخصات پردازنده و تعداد هسته‌ها.
  • /proc/meminfo : وضعیت مصرف حافظه. خروجی خواناتر آن را با free -h می‌گیرید.
  • /proc/filesystems : فایل‌سیستم‌هایی که کرنل در حال حاضر پشتیبانی می‌کند.
  • /proc/interrupts : اطلاعات وقفه‌های سخت‌افزاری فعلی.
  • /proc/ioports : پورت‌های ورودی/خروجی استفاده‌شده توسط دستگاه‌های سرور.
  • /proc/modules : ماژول‌های در حال استفاده کرنل. معادل خواناتر آن دستور lsmod است.
  • /proc/mounts : فایل‌سیستم‌های mount شده. (نام درست این فایل جمع است؛ در متن‌های قدیمی گاهی proc/mount نوشته شده که وجود ندارد.)
  • /proc/swaps : فضاهای Swap فعال و میزان استفاده از آن‌ها.
  • /proc/version : نسخه کرنل و کامپایلری که با آن ساخته شده است. برای اطلاعات خلاصه‌تر uname -a را اجرا کنید.
  • /proc/loadavg و /proc/uptime : بار سیستم و مدت روشن بودن آن؛ دو فایلی که هنگام بررسی کندی سرور اول از همه به سراغشان می‌روید. سه عدد اول /proc/loadavg میانگین بار در ۱، ۵ و ۱۵ دقیقه گذشته است.

‏/var و لاگ‌های سیستم

وقتی سرویسی روی سرور بالا نمی‌آید یا سایت خطا می‌دهد، پاسخ تقریباً همیشه در /var/log است.

  • /var/log/messages : پیام‌های عمومی تولیدشده توسط syslog، از جمله پیام‌های زمان بوت. این مسیر مربوط به خانواده RHEL است؛ در Debian و Ubuntu معادل آن /var/log/syslog است.
  • /var/log/secure (خانواده RHEL) و /var/log/auth.log (Debian و Ubuntu) : لاگ احراز هویت و ورود به سیستم؛ اولین جایی که برای بررسی تلاش‌های ناموفق ورود SSH باید نگاه کنید.
  • /var/log/wtmp : تاریخچه ورود و خروج کاربران. این فایل باینری است و با cat خوانده نمی‌شود؛ از دستور last استفاده کنید. برای دیدن تاریخچه ریبوت‌ها هم last reboot کارساز است.
  • /var/log/btmp : تلاش‌های ناموفق ورود، که با دستور lastb خوانده می‌شود.
  • /var/log/lastlog : آخرین زمان ورود هر کاربر به سیستم — نه اطلاعات آخرین بوت، که خطای رایجی در متن‌های فارسی است. این فایل هم باینری است و با دستور lastlog خوانده می‌شود.
  • /var/log/httpd/ (خانواده RHEL) و /var/log/apache2/ (Debian و Ubuntu) : لاگ دسترسی و خطای وب‌سرور Apache.
  • /var/spool/ : صف‌های در انتظار پردازش؛ ایمیل‌های ارسال‌نشده، کارهای cron و اسناد در صف چاپ.
  • /var/lib/ : داده‌های پایدار سرویس‌ها؛ برای نمونه دیتابیس MySQL/MariaDB به‌طور پیش‌فرض در /var/lib/mysql قرار می‌گیرد.

در توزیع‌های مبتنی بر systemd، بخش بزرگی از لاگ‌ها علاوه بر فایل‌های بالا در ژورنال باینری systemd هم ثبت می‌شود. اگر فایل موردنظرتان در /var/log نبود یا خالی بود، سراغ این دستورها بروید:

journalctl -xe
journalctl -b
journalctl -u sshd

نام یونیت را با توزیع تطبیق دهید: سرویس SSH در خانواده RHEL sshd و در Debian و Ubuntu ssh نام دارد. فهرست کامل یونیت‌ها را با systemctl list-units --type=service ببینید.

چند دستور برای گشتن در این ساختار

به‌جای حفظ کردن مسیرها، بهتر است چند دستور را بلد باشید تا هر بار خودتان مسیر درست را پیدا کنید:

ls -lh /                 # نگاه کلی به ریشه فایل‌سیستم
df -h                    # فضای آزاد هر فایل‌سیستم
du -sh /var/log/*        # پیدا کردن پوشه‌ای که دیسک را پر کرده
findmnt                  # درخت فایل‌سیستم‌های mount شده
whereis systemctl        # مسیر باینری، سورس و man یک دستور
stat /etc/passwd         # مالک، مجوز و زمان تغییر یک فایل
man hier                 # توضیح رسمی ساختار دایرکتوری‌ها روی همین سرور

دستور آخر مهم‌ترین آن‌هاست: صفحه راهنمای hier روی هر سروری، ساختار دایرکتوری‌های همان توزیع را توضیح می‌دهد و از هر مقاله‌ای به‌روزتر است.

جمع‌بندی

ساختار فایل‌سیستم لینوکس پس از چند بار کار کردن با آن منطقی به نظر می‌رسد: تنظیمات در /etc، داده‌های متغیر و لاگ‌ها در /var، برنامه‌ها در /usr و وضعیت لحظه‌ای کرنل در /proc و /sys. نکته‌ای که باید در ذهن داشته باشید این است که بخشی از مسیرهایی که در آموزش‌های قدیمی می‌بینید — /etc/init.d، /etc/inittab، /etc/grub.conf، /etc/modules.conf، /dev/hda و اسکریپت‌های network-scripts — روی سرورهای امروزی یا حذف شده‌اند یا فقط برای سازگاری باقی مانده‌اند. پیش از اجرای هر دستوری که مسیر می‌سازد یا فایل سیستمی را تغییر می‌دهد، ابتدا با ls -l ببینید همان مسیر روی سرور شما واقعاً وجود دارد یا نه.