ساختار دایرکتوریهای لینوکس و مسیر فایلهای مهم سیستمی
وقتی برای نخستین بار با SSH به یک سرور لینوکسی وصل میشوید و دستور ls / را میزنید، فهرستی از نامهای کوتاه و ناآشنا جلوی چشمتان ظاهر میشود: bin، etc، proc، var و چند مورد دیگر. تفاوت بنیادی لینوکس با ویندوز همینجاست؛ خبری از درایو C و D نیست و همه چیز — از هسته سیستمعامل گرفته تا فلشی که همین حالا به سرور وصل کردهاید — زیر یک درخت واحد به نام ریشه یا / قرار میگیرد.
آنچه در ادامه میآید نقشه همان درخت است: هر دایرکتوری ریشه چه کاری میکند، فایلهای سیستمی مهم کجا هستند، پیکربندی شبکه در کدام فایلها نگهداری میشود و کدام مسیرهایی که هنوز در آموزشهای قدیمی میبینید در توزیعهای امروزی دیگر معتبر نیستند.
دیاگرام ساختار دایرکتوریهای لینوکس
یک توزیع استاندارد لینوکس ساختاری به شرحی که در تصویر زیر میبینید دارد. این چیدمان قراردادی و تصادفی نیست؛ از سندی به نام FHS یا Filesystem Hierarchy Standard پیروی میکند و به همین دلیل است که مسیر فایلهای اصلی در CentOS، AlmaLinux، Rocky Linux، Debian و Ubuntu کموبیش یکسان است.
هر یک از پوشههای فوق حاوی اطلاعات مهمی هستند که 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 ببینید همان مسیر روی سرور شما واقعاً وجود دارد یا نه.
