توی این درس یاد میگیری فایلسیستم لینوکس یک درخت واحد است که از ریشه (/) شروع میشود، و هر پوشهی اصلی کار مشخصی دارد: تنظیمات در /etc، دادههای متغیر مثل لاگها در /var، پوشهی کاربرها در /home، برنامهها در /usr، فایلهای موقت در /tmp و نرمافزارهای اضافه در /opt. با ls /، ls /etc و cat /proc/cpuinfo همه را با چشم خودت میبینی، و میفهمی چرا میگویند «همهچیز فایل است»: حتی پردازنده، حافظه و دستگاهها فایلاند (/proc و /dev).
مسئله: فایلها کجا هستند؟
Section titled “مسئله: فایلها کجا هستند؟”در ویندوز درایوهای C: و D: داری و برنامهها در Program Files هستند. در لینوکس درایو جدا نداری: همهچیز زیر یک پوشهی ریشه است و هر چیزی جای مشخصی دارد. اگر این نقشه را ندانی، نمیدانی تنظیمات nginx کجاست، لاگها کجا میروند یا چرا دیسک پر شده. اگر بدانی، روی هر سرور لینوکسی نیمهگمشده نیستی.
تشبیه: ساختمان با طبقههای مشخص
Section titled “تشبیه: ساختمان با طبقههای مشخص”یک ساختمان اداری خوب طبقهبندی دارد: طبقهی تنظیمات و قفلها (/etc)، انبار دادههای در حال تغییر (/var)، دفتر هر کارمند (/home)، انبار ابزار مشترک (/usr) و میز موقت (/tmp). همهی ساختمانهای لینوکس این طرح را دارند، پس هر جا بروی، نقشه آشناست.
مثالهای عملی
Section titled “مثالهای عملی”مثال ۱: ریشه، ls /
Section titled “مثال ۱: ریشه، ls /”دستور ls (مخفف list) محتوای یک پوشه را فهرست میکند. / خودِ ریشه است:
ls /binbin.usr-is-mergedbootdevetchomeliblib.usr-is-mergedmediamntoptprocrootrunsbinsbin.usr-is-mergedsrvsystmpusrvar-F به آخر اسمها نشانه میگذارد: / یعنی پوشه، @ یعنی لینک نمادین (بهزودی در درس لینکها):
ls -F /bin@bin.usr-is-merged/boot/dev/etc/home/lib@lib.usr-is-merged/media/mnt/opt/proc/root/run/sbin@sbin.usr-is-merged/srv/sys/tmp/usr/var/اسمهایی که @ دارند (bin@، lib@، sbin@) لینکاند. در Ubuntu جدید، /bin و /lib و /sbin فقط میانبر به /usr/bin و /usr/lib و /usr/sbin هستند (مهاجرت «usr merge»):
ls -ld /bin /lib /sbinlrwxrwxrwx 1 root root 7 Apr 22 2024 /bin -> usr/binlrwxrwxrwx 1 root root 7 Apr 22 2024 /lib -> usr/liblrwxrwxrwx 1 root root 8 Apr 22 2024 /sbin -> usr/sbinl ابتدای هر خط یعنی لینک، و -> به مقصد اشاره میکند. (پوشههای ...usr-is-merged ردپای همین مهاجرتاند.) یک نمای درختی هم داریم:
tree -L 1 -d / | head -14/├── bin -> usr/bin├── bin.usr-is-merged├── boot├── dev├── etc├── home├── lib -> usr/lib├── lib.usr-is-merged├── media├── mnt├── opt├── proc├── rootمثال ۲: /etc، تنظیمات
Section titled “مثال ۲: /etc، تنظیمات”etc را «editable text configuration» هم میخوانند: همهی تنظیمات سیستم و بیشتر برنامهها اینجا فایلهای متنیاند، و چون متنیاند با هر ویرایشگری باز میشوند.
ls /etc | head -20X11adduser.confalternativesapparmor.daptbash.bashrcbash_completion.dbindresvport.blacklistbinfmt.dca-certificatesca-certificates.confcloudcredstorecredstore.encryptedcron.dcron.dailycron.hourlycron.monthlycron.weeklycron.yearlyچند فایل مهم:
echo "--- /etc/hostname (نام ماشین):"; cat /etc/hostnameecho "--- /etc/hosts (نام ← IP محلی):"; cat /etc/hosts | head -4echo "--- /etc/passwd (کاربرها؛ سه خط اول):"; head -3 /etc/passwdecho "--- /etc/os-release (توزیع):"; head -2 /etc/os-release--- /etc/hostname (نام ماشین):pc--- /etc/hosts (نام ← IP محلی):127.0.0.1 localhost::1 localhost ip6-localhost ip6-loopbackfe00:: ip6-localnetff00:: ip6-mcastprefix--- /etc/passwd (کاربرها؛ سه خط اول):root:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinbin:x:2:2:bin:/bin:/usr/sbin/nologin--- /etc/os-release (توزیع):PRETTY_NAME="Ubuntu 24.04.5 LTS"NAME="Ubuntu"هر برنامهی بزرگ پوشهی خودش را دارد (/etc/ssh، /etc/nginx، /etc/apt). برای تغییر رفتار یک سرویس معمولاً یکی از این فایلها را ویرایش میکنی (و برای محافظت، قبل از آن یک کپی بگیر).
مثال ۳: /home و ~، پوشهی تو
Section titled “مثال ۳: /home و ~، پوشهی تو”هر کاربر عادی یک پوشهی خانه دارد (/home/نام) و ~ (و $HOME) به آن اشاره میکند. کاربر root جداست: /root.
ls /homeecho "پوشهی من: $HOME (همان ~)"ls -ld /home/ali /rootecho "--- محتوای خانهی من (با فایلهای مخفی):"ls -a ~aliubuntuپوشهی من: /home/ali (همان ~)drwxr-xr-x 2 ali ali 4096 Oct 3 19:21 /home/alidrwx------ 1 root root 4096 Oct 3 09:34 /root--- محتوای خانهی من (با فایلهای مخفی):....bash_logout.bashrc.profileفایلهایی که با . شروع میشوند مخففاند (مثل .bashrc، .profile): تنظیمات شخصی کاربر؛ ls معمولی نشانشان نمیدهد و ls -a (all) نشان میدهد. توجه به دسترسی: /root با drwx------ فقط برای خود root است، و /home برای همه قابلخواندن.
تنظیمات شخصی کاربر (مثل .bashrc) کجاست؟
تنظیمات سیستم در /etc؛ تنظیمات هر کاربر در پوشهی خانهی خودش.
مثال ۴: /var، دادهی متغیر
Section titled “مثال ۴: /var، دادهی متغیر”var (variable) دادهای است که با کار کردن سیستم تغییر میکند: لاگها، کش، صفها و دادهی دیتابیسها.
ls /varecho "--- /var/log (لاگها):"ls /var/log | head -8echo "--- /var/lib (دادهی برنامهها):"ls /var/lib | head -8backupscacheliblocallocklogmailoptrunspooltmpwww--- /var/log (لاگها):READMEalternatives.logaptbootstrap.logbtmpdpkg.logfaillogjournal--- /var/lib (دادهی برنامهها):aptdbusdpkggitlogrotateman-dbmiscnginxوقتی دیسک پر میشود، اولین جایی که نگاه میکنی /var (بیشتر /var/log و /var/lib) است. اگر یک سرویس لاگها را نچرخاند، میتواند دیسک را پر کند.
مثال ۵: /usr، برنامهها
Section titled “مثال ۵: /usr، برنامهها”usr (قدیم: user) محل برنامهها و کتابخانهها است:
ls /usrecho "--- تعداد برنامههای /usr/bin: $(ls /usr/bin | wc -l)"ls /usr/bin | head -10 | tr '\n' ' '; echoecho "--- /usr/share (راهنما، مجوزها، ...):"ls /usr/share | head -8 | tr '\n' ' '; echobingamesincludeliblibexeclocalsbinsharesrc--- تعداد برنامههای /usr/bin: 624[ aarch64-linux-gnu-addr2line aarch64-linux-gnu-ar aarch64-linux-gnu-as aarch64-linux-gnu-c++filt aarch64-linux-gnu-dwp aarch64-linux-gnu-elfedit aarch64-linux-gnu-gold aarch64-linux-gnu-gp-archive aarch64-linux-gnu-gp-collect-app--- /usr/share (راهنما، مجوزها، ...):X11 applications apport awk base-files base-passwd bash-completion binfmtsدستورهایی که تا الآن زدی (ls، cat، uname) فایلهایی در /usr/bin هستند؛ ببین:
which ls cat uname/usr/bin/ls/usr/bin/cat/usr/bin/uname/usr/local برای نرمافزارهایی است که خودت نصب میکنی (نه با مدیر بسته)، تا با بستههای توزیع قاطی نشوند. /opt هم برای نرمافزارهای کامل و مستقل (مثلاً یک برنامهی تجاری که همهچیزش را در یک پوشه آورده): /opt/برنامه/....
مثال ۶: /tmp، فایلهای موقت
Section titled “مثال ۶: /tmp، فایلهای موقت”ls -ld /tmp /var/tmpecho "سلام" > /tmp/test-lx.txtcat /tmp/test-lx.txtrm /tmp/test-lx.txtdrwxrwxrwt 1 root root 4096 Oct 3 19:58 /tmpdrwxrwxrwt 1 root root 4096 Oct 3 19:18 /var/tmpسلام/tmp برای فایلهای موقت است؛ همه میتوانند در آن بنویسند (drwxrwxrwt، حرف t آخر یعنی sticky bit که در درس دسترسیهای ویژه میخوانی). محتوایش ممکن است با ریبوت پاک شود، پس چیز مهم آنجا نگذار. /var/tmp موقتی است ولی بین ریبوتها میماند.
مثال ۷: /proc، پنجرهای به هسته
Section titled “مثال ۷: /proc، پنجرهای به هسته”/proc پوشهای است که اصلاً روی دیسک نیست: هسته آن را زنده میسازد تا اطلاعاتش را به شکل فایل نشان بدهد.
head -4 /proc/cpuinfo | cut -c1-60echo "--- حافظه:"head -3 /proc/meminfoecho "--- زمان روشن بودن (ثانیه):"cat /proc/uptimeecho "--- پروسهی خودم (شماره $$):"head -2 /proc/$$/statusprocessor : 0BogoMIPS : 48.00Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomicCPU implementer : 0x61--- حافظه:MemTotal: 4010356 kBMemFree: 145876 kBMemAvailable: 1654808 kB--- زمان روشن بودن (ثانیه):89853.85 488082.55--- پروسهی خودم (شماره 11787):Name: bashUmask: 0022هر عددی که در /proc میبینی (مثل /proc/1234) پروسهای با همان شماره است. یک نکتهی جالب: این فایلها حجم صفر نشان میدهند ولی محتوا دارند، چون در لحظه ساخته میشوند:
ls -l /proc/cpuinfofile /proc/cpuinfoecho "ولی محتوا: $(wc -l < /proc/cpuinfo) خط"-r--r--r-- 1 root root 0 Oct 3 08:33 /proc/cpuinfo/proc/cpuinfo: emptyولی محتوا: 72 خطمثال ۸: /dev، دستگاهها هم فایلاند
Section titled “مثال ۸: /dev، دستگاهها هم فایلاند”دیسک، ترمینال، حتی «هیچ» یک فایل است:
ls /dev | head -20 | tr '\n' ' '; echoecho "--- /dev/null (سیاهچاله):"echo "این متن گم میشود" > /dev/nullecho "هیچچیز چاپ نشد؛ کد خروج: $?"echo "--- /dev/zero (منبع بیپایان بایت صفر):"head -c 8 /dev/zero | od -c | head -1echo "--- /dev/urandom (بایت تصادفی؛ ۴ بایت):"head -c 4 /dev/urandom | od -An -tx1 | wc -wcore fd full mqueue null ptmx pts random shm stderr stdin stdout tty urandom zero--- /dev/null (سیاهچاله):هیچچیز چاپ نشد؛ کد خروج: 0--- /dev/zero (منبع بیپایان بایت صفر):0000000 \0 \0 \0 \0 \0 \0 \0 \0--- /dev/urandom (بایت تصادفی؛ ۴ بایت):4/dev/null هر چه بنویسی را دور میریزد (برای ساکت کردن خروجی)، /dev/zero بایت صفر بیپایان میدهد و /dev/urandom بایت تصادفی. اینها «فایل ویژه» هستند، و دیسکها (/dev/sda، /dev/nvme0n1) هم همینطورند.
مثال ۹: «همهچیز فایل است»، نوع فایلها
Section titled “مثال ۹: «همهچیز فایل است»، نوع فایلها”دستور file نوع هر چیزی را میگوید:
file /etc/hostname /dev/null /bin /usr/bin /etc/os-releaseecho "--- یک برنامهی واقعی:"file /usr/bin/ls | cut -c1-80/etc/hostname: ASCII text/dev/null: character special (1/3)/bin: symbolic link to usr/bin/usr/bin: directory/etc/os-release: symbolic link to ../usr/lib/os-release--- یک برنامهی واقعی:/usr/bin/ls: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamیک فایل متنی، یک دستگاه (character special)، لینکهای نمادین، پوشه، و یک برنامهی اجرایی (ELF). در لینوکس همه با یک رابطهی ساده (باز کردن، خواندن، نوشتن) کار میکنند و برای همین ابزارهای متنی ساده (cat، grep، echo) روی همهچیز میچرخند: دستور cat /proc/cpuinfo با پردازنده حرف میزند.
پشت پرده: درخت واحد و mount
Section titled “پشت پرده: درخت واحد و mount”در ویندوز هر دیسک حرف خودش را دارد. در لینوکس یک درخت واحد از / داریم و دیسکها و پارتیشنها را روی یکی از پوشهها سوار (mount) میکنند. مثلاً دیسک دوم میتواند روی /data یا /mnt/backup سوار شود و برای برنامهها فقط یک پوشه به نظر برسد. حتی /proc و /dev و /tmp (که ممکن است در حافظه باشد) همینطور «سوار شده»اند:
mount | grep -E " on (/proc|/dev|/sys|/tmp) " | cut -c1-90 | head -5proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)tmpfs on /dev type tmpfs (rw,nosuid,size=65536k,mode=755)sysfs on /sys type sysfs (ro,nosuid,nodev,noexec,relatime)bash: /proc/cpuinfo: Permission deniedنمایش دقیقتر و دیسکها در درس منابع سیستم میآید. پس «مسیر یک فایل» فقط یک آدرس در درخت است، و اینکه روی کدام دیسک (یا در حافظه یا از راه شبکه) باشد، جزئیات پشت پرده است.
استاندارد FHS (Filesystem Hierarchy Standard) تعیین میکند چه چیزی کجا برود تا همهی توزیعها شبیه هم باشند؛ همین است که یک مقالهی «تنظیمات nginx در /etc/nginx» روی Ubuntu و Debian و Fedora یکی است.
جدولهای مرجع
Section titled “جدولهای مرجع”| پوشه | محتوا | مثال |
|---|---|---|
/ |
ریشهی درخت | — |
/bin, /sbin, /lib |
میانبر به /usr/... (در Ubuntu جدید) |
/bin → usr/bin |
/boot |
فایلهای راهاندازی (هسته، GRUB) | vmlinuz |
/dev |
دستگاهها | /dev/null، /dev/sda |
/etc |
تنظیمات (متنی) | /etc/hostname، /etc/ssh/sshd_config |
/home |
پوشهی کاربرها | /home/ali |
/root |
پوشهی خانهی root | — |
/usr |
برنامهها، کتابخانهها، مستندات | /usr/bin/ls |
/usr/local |
نرمافزار نصبشده توسط خود مدیر | — |
/opt |
نرمافزار اضافه و مستقل | /opt/google |
/var |
دادهی متغیر | /var/log، /var/lib |
/tmp |
فایلهای موقت | — |
/proc |
اطلاعات هسته و پروسهها (مجازی) | /proc/cpuinfo |
/sys |
اطلاعات و تنظیمات دستگاهها (مجازی) | /sys/class/net |
/run |
دادهی زمان اجرا (از آخرین بوت) | /run/systemd |
/mnt, /media |
محل سوار کردن دیسکها | /mnt/backup |
/srv |
دادهی سرویسهایی که سرور ارائه میدهد | /srv/www |
| دستور | کار |
|---|---|
ls / |
فهرست ریشه |
ls -F / |
با نشانهی نوع (/ پوشه، @ لینک) |
ls -a ~ |
شامل فایلهای مخفی |
tree -L 1 -d / |
نمای درختی یک سطح، فقط پوشهها |
file X |
نوع فایل |
cat /proc/cpuinfo |
اطلاعات پردازنده |
اشتباهات رایج
Section titled “اشتباهات رایج”۱) نوشتن فایل مهم در /tmp
Section titled “۱) نوشتن فایل مهم در /tmp”/tmp ممکن است پاک شود (ریبوت یا پاکسازی خودکار). راهحل: فایلهای ماندگار در /home یا /var/lib یا /srv.
۲) ویرایش /proc بهعنوان فایل معمولی
Section titled “۲) ویرایش /proc بهعنوان فایل معمولی”echo hi > /proc/cpuinfoفایلهای /proc اجازهی نوشتن معمولی نمیدهند (Permission denied)؛ بعضی (مثل /proc/sys) با root برای تنظیم هسته به کار میروند. راهحل: /proc را فقط بخوان (مگر آگاهانه و با مستندات).
۳) فکر کردن «/etc فقط برای root است»
Section titled “۳) فکر کردن «/etc فقط برای root است»”cat /etc/hostnamels -l /etc/shadowpc-rw-r----- 1 root shadow 665 Oct 3 19:21 /etc/shadowخواندن بیشتر فایلهای /etc برای همه آزاد است (مثل hostname)، ولی بعضی مثل /etc/shadow (رمزها) محدود به rootاند (دقت به دسترسی -rw-r-----). راهحل: هر وقت Permission denied دیدی دسترسیها را با ls -l بخوان (درس دسترسیها).
۴) نگاه کردن در مسیر ویندوزی
Section titled “۴) نگاه کردن در مسیر ویندوزی”ls C:\Usersls: cannot access 'C:Users': No such file or directoryدر لینوکس درایو C: نیست و جداکننده / است (نه \). راهحل: مسیرها /home/ali/.... و حروف کوچک/بزرگ مهماند (/Home پوشهی دیگری است).
۵) فراموش کردن -a و گم شدن فایلهای مخفی
Section titled “۵) فراموش کردن -a و گم شدن فایلهای مخفی”echo "ls معمولی:"; ls ~echo "--- ls -a:"; ls -a ~ls معمولی:--- ls -a:....bash_logout.bashrc.profileپوشهی خانهی این محیط تازه است، پس ls ~ هیچچیز نشان نمیدهد؛ ولی ls -a سه فایل تنظیمات مخفی را نشان میدهد. ممکن است فکر کنی پوشه خالی است در حالی که فایلهای مهم (مثل .bashrc) آنجاست. راهحل: ls -a.
فایل تنظیمات hostname را پیدا کن و محتوایش را ببین؛ بگو در کدام پوشه است و چرا.
دیدن جواب
ls -l /etc/hostnamecat /etc/hostname-rw-r--r-- 1 root root 3 Oct 3 08:33 /etc/hostnamepcدر /etc است چون تنظیمات سیستم همانجا نگه داشته میشود.
تمرین اصلی: برای هر مورد پوشهی درست را با یک دستور نشان بده: (۱) لاگهای سیستم (۲) تنظیمات SSH (۳) دستور ls (۴) تعداد هستههای CPU. برای هر کدام فقط یک ls یا cat یا which بنویس.
دیدن جواب
echo "۱) لاگها:"; ls /var/log | head -3echo "۲) تنظیمات SSH:"; ls /etc/ssh | head -3echo "۳) برنامهی ls:"; which lsecho "۴) هستههای CPU:"; grep -c ^processor /proc/cpuinfo۱) لاگها:READMEalternatives.logapt۲) تنظیمات SSH:modulissh_configssh_config.d۳) برنامهی ls:/usr/bin/ls۴) هستههای CPU:8یک «گزارش نقشهی سیستم» بساز: برای هر یک از پوشههای /etc، /var، /usr، /home، /tmp، /proc تعداد آیتمهای داخلش را چاپ کن (با ls | wc -l) و برای هر کدام یک جملهی توضیح بنویس. از یک حلقهی سادهی for استفاده کن.
دیدن جواب
for d in /etc /var /usr /home /tmp /proc; do printf "%-6s %4s آیتم\n" "$d" "$(ls $d | wc -l)"done/etc 139 آیتم/var 12 آیتم/usr 9 آیتم/home 2 آیتم/tmp 27 آیتم/proc 65 آیتممثلاً /proc بهخاطر پروسههای در حال اجرا (پوشههای عددی) تعدادش نسبتاً زیاد است و /home فقط کاربرهای عادی را دارد.
آزمونک
Section titled “آزمونک”تنظیمات سیستم و برنامهها معمولاً در کدام پوشه است؟
etc = تنظیمات (فایلهای متنی).
لاگها و دادهی متغیر (مثل دیتابیس) کجاست؟
/var/log برای لاگها و /var/lib برای دادهی برنامهها.
/proc چیست؟
روی دیسک نیست؛ نمای هسته است.
نوشتن چیزی در /dev/null چه میکند؟
برای ساکت کردن خروجی به کار میرود.
اصل «همهچیز فایل است» یعنی…
برای همین cat روی /proc/cpuinfo کار میکند.
فایلهایی که با نقطه شروع میشوند را کدام flag نشان میدهد؟
ls -a همهی فایلها را (با مخفیها) نشان میدهد.
جمعبندی
Section titled “جمعبندی”- لینوکس یک درخت واحد از
/دارد (نه درایو جدا)؛ دیسکها روی پوشهها mount میشوند. /etcتنظیمات،/varدادهی متغیر (لاگ و دیتابیس)،/homeکاربرها،/usrبرنامهها،/tmpموقت،/optنرمافزار مستقل./procو/sysنمای زندهی هستهاند و/devدستگاهها؛/dev/nullسیاهچاله است.- همهچیز فایل است: برای همین ابزارهای ساده روی همهچیز کار میکنند.
- فایلهای مخفی با
.شروع میشوند و باls -aدیده میشوند. - استاندارد FHS چیدمان را بین توزیعها یکسان نگه میدارد.
| دستور | کاری که میکند |
|---|---|
ls / | فهرست ریشه |
ls -F / | با نشانهی نوع |
ls /etc | تنظیمات |
cat /etc/hostname | نام ماشین |
ls /var/log | لاگها |
cat /proc/cpuinfo | اطلاعات CPU |
ls -a ~ | پوشهی خانه با فایلهای مخفی |
tree -L 1 -d / | درخت یکسطحی از پوشهها |
file /dev/null | نوع فایل |