رفتن به محتوا
LoopX

لینوکس چیست؟

توی این درس یاد می‌گیری لینوکس دقیقاً چیست و چرا وقتی می‌گویند «لینوکس»، گاهی منظورشان فقط یک هسته (kernel) است و گاهی یک توزیع (distribution) کامل مثل Ubuntu. فرق این دو را با آزمایش واقعی می‌بینی: چهار توزیع کاملاً متفاوت که یک هسته‌ی مشترک دارند. بعد می‌فهمی GNU و «متن‌باز» یعنی چه، چهار توزیع معروف (Ubuntu، Debian، Fedora، Alpine) چه فرقی دارند و لینوکس کجاها اجرا می‌شود. دو دستور اول هم یاد می‌گیری: uname -a و cat /etc/os-release.

مسئله: لینوکس را همه‌جا می‌شنوی، ولی چیست؟

Section titled “مسئله: لینوکس را همه‌جا می‌شنوی، ولی چیست؟”

اگر تازه با کامپیوتر آشنا شده‌ای، «لینوکس» را شاید فقط به‌عنوان یک سیستم‌عامل سیاه‌رنگ با ترمینال شنیده‌ای. ولی لینوکس زیر پوست خیلی چیزها است: بیشتر سرورهای اینترنت، گوشی‌های اندروید، روتر خانه‌ات، و حتی کانتینرهایی که در درس‌های بعد (داکر) می‌سازی. اگر نفهمی لینوکس چه لایه‌هایی دارد، اسم‌ها قاطی می‌شوند: «Ubuntu لینوکس است؟» «Debian چیست؟» «کرنل چیست؟».

هسته (kernel) مثل موتور است: کار اصلی را می‌کند، یعنی با سخت‌افزار (پردازنده، حافظه، دیسک، شبکه) حرف می‌زند و منابع را بین برنامه‌ها تقسیم می‌کند. ولی با موتور تنها نمی‌شود رانندگی کرد. توزیع (distribution) مثل یک مدل ماشین کامل است: همان موتور (هسته) را می‌گیرد، بدنه، فرمان، داشبورد و ابزار (شل، دستورها، مدیر بسته، تنظیمات پیش‌فرض) را کنارش می‌گذارد و یک محصول قابل‌استفاده می‌سازد. چند شرکت مختلف می‌توانند با همان موتور ماشین‌های متفاوتی بسازند.

هسته پایین‌ترین لایه‌ی نرم‌افزاری است. ابزارهای GNU، مدیر بسته و تنظیمات پیش‌فرض روی آن می‌نشینند و مجموعه‌ی کامل را «توزیع» می‌نامیم.

مثال ۱: هسته را ببین با uname -a

Section titled “مثال ۱: هسته را ببین با uname -a”

دستور uname (مخفف unix name) اطلاعات سیستم را چاپ می‌کند. -a یعنی «همه» (all). این دستورها را در یک لینوکس واقعی (Ubuntu 24.04) اجرا کردم:

Terminal window
uname -a
خروجی
Linux pc 7.0.14-linuxkit #1 SMP PREEMPT Fri Sep 18 10:19:32 UTC 2026 aarch64 aarch64 aarch64 GNU/Linux

یک خط طولانی با چند بخش است. هر بخش را جدا بگیریم:

Terminal window
echo "نام هسته (-s): $(uname -s)"
echo "نام ماشین (-n): $(uname -n)"
echo "نسخه‌ی هسته (-r): $(uname -r)"
echo "معماری (-m): $(uname -m)"
echo "سیستم‌عامل (-o): $(uname -o)"
خروجی
نام هسته (-s): Linux
نام ماشین (-n): pc
نسخه‌ی هسته (-r): 7.0.14-linuxkit
معماری (-m): aarch64
سیستم‌عامل (-o): GNU/Linux

Linux نام هسته است، نسخه‌ی هسته (-r) شماره‌ای مثل 7.0.14-... است، و معماری (-m) نوع پردازنده را می‌گوید: x86_64 (پردازنده‌های معمولی Intel/AMD) یا aarch64 (ARM، مثل مک‌های Apple Silicon و Raspberry Pi). GNU/Linux در -o همان ترکیب «هسته‌ی لینوکس + ابزارهای GNU» است (توضیحش پایین‌تر).

مثال ۲: توزیع را ببین با /etc/os-release

Section titled “مثال ۲: توزیع را ببین با /etc/os-release”

اسم توزیع در یک فایل متنی استاندارد است. cat (مخفف concatenate) محتوای فایل را چاپ می‌کند:

Terminal window
cat /etc/os-release
خروجی
PRETTY_NAME="Ubuntu 24.04.5 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.5 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=noble
LOGO=ubuntu-logo

هر خط کلید=مقدار است: PRETTY_NAME اسم قابل‌خواندن، VERSION_ID شماره‌ی نسخه، ID شناسه‌ی کوتاه (ubuntu). چون این فایل ساختار ثابت دارد، می‌توانی مقدارش را در دستورها به کار ببری:

Terminal window
. /etc/os-release
echo "این سیستم: $PRETTY_NAME (شناسه: $ID، نسخه: $VERSION_ID)"
خروجی
این سیستم: Ubuntu 24.04.5 LTS (شناسه: ubuntu، نسخه: 24.04)

نقطه‌ی اول (.، هم‌معنی source) فایل را به‌عنوان تنظیمات می‌خواند تا متغیرهایش در shell فعلی بیاید.

مثال ۳: یک هسته، چند توزیع

Section titled “مثال ۳: یک هسته، چند توزیع”

اینجا فرق «هسته» و «توزیع» عملی می‌شود. چهار توزیع مختلف را با داکر اجرا کردم (داکر را در دوره‌ی داکر یاد می‌گیری؛ فعلاً فقط نتیجه را ببین): از هر کدام می‌پرسم هسته‌اش چیست و توزیعش چیست.

Terminal window
for img in ubuntu:24.04 debian:stable-slim fedora:latest alpine; do
docker run --rm $img sh -c '. /etc/os-release; printf "%-16s هسته: %-18s توزیع: %s %s\n" "'$img'" "$(uname -r)" "$NAME" "$VERSION_ID"'
done
خروجی
ubuntu:24.04 هسته: 7.0.14-linuxkit توزیع: Ubuntu 24.04
debian:stable-slim هسته: 7.0.14-linuxkit توزیع: Debian GNU/Linux 13
fedora:latest هسته: 7.0.14-linuxkit توزیع: Fedora Linux 44
alpine هسته: 7.0.14-linuxkit توزیع: Alpine Linux 3.24.2

هسته در هر چهار برابر است (...-linuxkit)، ولی توزیع‌ها چهار تا و متفاوت‌اند. کانتینرها هسته‌ی ماشین میزبان را قرض می‌گیرند و فقط «لایه‌ی توزیع» را با خودشان دارند. این همان نمودار لایه‌هاست، به شکل ملموس. (در یک ماشین عادی هر توزیع هسته‌ی خودش را هم دارد، ولی هسته‌ها نسخه‌هایی از همان لینوکس‌اند.)

⚡ بررسی سریع

اگر هسته‌ی دو سیستم یکی باشد ولی توزیعشان Ubuntu و Alpine باشد، چه چیزی فرق می‌کند؟

مثال ۴: توزیع‌ها در ابزار فرق دارند

Section titled “مثال ۴: توزیع‌ها در ابزار فرق دارند”

دو تفاوت عملی: مدیر بسته (برنامه نصب‌کن) و ابزارهای پایه. ببین کدام در هر توزیع هست:

Terminal window
for img in ubuntu:24.04 debian:stable-slim fedora:latest alpine; do
docker run --rm $img sh -c 'p=""; for c in apt dnf apk; do command -v $c >/dev/null && p="$p $c"; done; printf "%-16s مدیر بسته:%-5s | ls: %s\n" "'$img'" "$p" "$(ls --version 2>&1 | head -1 | cut -c1-30)"'
done
خروجی
ubuntu:24.04 مدیر بسته: apt | ls: ls (GNU coreutils) 9.4
debian:stable-slim مدیر بسته: apt | ls: ls (GNU coreutils) 9.7
fedora:latest مدیر بسته: dnf | ls: ls (GNU coreutils) 9.10
alpine مدیر بسته: apk | ls: ls: unrecognized option: versi

Ubuntu و Debian از apt، Fedora از dnf و Alpine از apk استفاده می‌کنند. و در Alpine حتی ls فرق دارد: به‌جای ابزارهای GNU از BusyBox (مجموعه‌ی کوچک‌شده) استفاده می‌کند و ls --version را نمی‌شناسد. این ریشه‌ی تفاوت‌هایی است که گاهی در مقاله‌ها می‌بینی («روی Alpine کار نمی‌کند»).

مثال ۵: اطلاعات بیشتر هسته

Section titled “مثال ۵: اطلاعات بیشتر هسته”

هسته اطلاعات خودش را در فایل‌های مجازی زیر /proc می‌گذارد (درس ساختار پوشه‌ها). یک نمونه:

Terminal window
cat /proc/version
خروجی
Linux version 7.0.14-linuxkit (root@buildkitsandbox) (gcc (Alpine 15.2.0) 15.2.0, GNU ld (GNU Binutils) 2.45.1) #1 SMP PREEMPT Fri Sep 18 10:19:32 UTC 2026

این خط می‌گوید هسته با چه کامپایلری و کی ساخته شده. و چند سؤال ساده درباره‌ی سخت‌افزار:

Terminal window
echo "تعداد هسته‌های CPU: $(nproc)"
echo "کل حافظه: $(grep MemTotal /proc/meminfo | awk '{printf "%.1f", $2/1024/1024}') گیگابایت"
خروجی
تعداد هسته‌های CPU: 8
کل حافظه: 3.8 گیگابایت

nproc تعداد پردازنده‌های قابل‌استفاده را می‌دهد و /proc/meminfo وضعیت حافظه را؛ این‌ها زنده از هسته می‌آیند، نه از یک فایل ثابت.

مثال ۶: متن‌باز یعنی چه؟

Section titled “مثال ۶: متن‌باز یعنی چه؟”

لینوکس با مجوز GPL منتشر می‌شود. یعنی هر کس می‌تواند کد را ببیند، تغییر بدهد و منتشر کند (به شرط اینکه تغییرات را هم با همان آزادی منتشر کند). متن مجوزها روی همین سیستم هست:

Terminal window
ls /usr/share/common-licenses | head -8
echo "---"
head -5 /usr/share/common-licenses/GPL-3
خروجی
Apache-2.0
Artistic
BSD
CC0-1.0
GFDL
GFDL-1.2
GFDL-1.3
GPL
---
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies

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

پشت پرده: «لینوکس» و «GNU/Linux»

Section titled “پشت پرده: «لینوکس» و «GNU/Linux»”

اسم لینوکس فقط به هسته برمی‌گردد که لینوس توروالدز در ۱۹۹۱ شروع کرد. اما هسته تنها بدون ابزار کاری نمی‌کند. ابزارهای کاربر (شل، ls، cp، grep، کامپایلر gcc، کتابخانه‌ی C و…) را پروژه‌ی GNU (از ۱۹۸۳، شروع‌شده توسط ریچارد استالمن) ساخته بود. ترکیب این دو یک سیستم‌عامل کامل شد؛ به همین دلیل بعضی‌ها دقیق‌تر می‌گویند GNU/Linux (و دستور uname -o هم همین را چاپ می‌کند).

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

توزیع خانواده مدیر بسته معمولاً برای…
Ubuntu Debian apt سرور و دسکتاپ؛ پشتیبانی بلندمدت (LTS) و مستندات فراوان؛ شروع خوب برای تازه‌کارها
Debian Debian apt سرورهای پایدار؛ پایه‌ی خیلی از توزیع‌های دیگر (از جمله Ubuntu)
Fedora Red Hat dnf دسکتاپ و توسعه با نرم‌افزار جدید؛ نسخه‌ی تازه هر چند ماه
RHEL / Rocky / Alma Red Hat dnf سرورهای سازمانی
Alpine مستقل apk کانتینرهای خیلی کوچک (ابزارهای BusyBox و musl به‌جای GNU)
Arch مستقل pacman کاربران پیشرفته؛ نصب دستی و نسخه‌های همیشه جدید
محیط نمونه
سرور و ابر بیشتر سرورهای وب، دیتابیس‌ها و سرویس‌های ابری؛ همه‌ی ماشین‌های سازمانی که کانتینر اجرا می‌کنند
موبایل اندروید هسته‌ی لینوکس دارد
دسکتاپ Ubuntu، Fedora، Mint و… (سهم کمتر از ویندوز و مک)
دستگاه‌های تعبیه‌شده روترها، تلویزیون‌های هوشمند، Raspberry Pi
ابررایانه‌ها عملاً همه‌ی ابررایانه‌های برتر
دستور کار
uname -a همه‌ی اطلاعات هسته در یک خط
uname -r فقط نسخه‌ی هسته
uname -m معماری پردازنده
cat /etc/os-release نام و نسخه‌ی توزیع
cat /proc/version جزئیات ساخت هسته

۱) قاطی کردن هسته با توزیع

Section titled “۱) قاطی کردن هسته با توزیع”

«لینوکس نسخه‌ی ۲۴.۰۴ دارم» اشتباه است؛ ۲۴.۰۴ نسخه‌ی Ubuntu است و نسخه‌ی هسته چیز دیگری است (مثلاً 6.8 یا 7.0). راه‌حل: همیشه هر دو را جدا بگو: توزیع (/etc/os-release) و هسته (uname -r).

۲) فرض کردن اینکه همه‌ی دستورها در همه‌ی توزیع‌ها یکی‌اند

Section titled “۲) فرض کردن اینکه همه‌ی دستورها در همه‌ی توزیع‌ها یکی‌اند”
Terminal window
docker run --rm alpine sh -c 'apt install curl 2>&1 | head -1; echo "--- راه درست در Alpine:"; apk --version'
خروجی
sh: apt: not found
--- راه درست در Alpine:
apk-tools 3.0.8-r0, compiled for aarch64.

apt در Alpine وجود ندارد (not found). راه‌حل: اول توزیع را بشناس (cat /etc/os-release)، بعد مدیر بسته‌ی مناسبش را به کار ببر.

۳) تایپ اشتباه در فایل os-release

Section titled “۳) تایپ اشتباه در فایل os-release”
Terminal window
cat /etc/os-relese
خروجی
cat: /etc/os-relese: No such file or directory

حروف یک فایل را اشتباه نوشتی؛ سیستم می‌گوید چنین فایل یا پوشه‌ای نیست. راه‌حل: با کلید Tab نام را کامل کن (درس ترمینال).

۴) باور اینکه «لینوکس = ویندوز بدون گرافیک»

Section titled “۴) باور اینکه «لینوکس = ویندوز بدون گرافیک»”

لینوکس برنامه‌های ویندوز را مستقیم اجرا نمی‌کند (فایل .exe نمی‌شناسد) و برنامه‌های خودش را دارد؛ فرمت فایل‌ها و مسیرها هم فرق دارد (/ به‌جای C:\). راه‌حل: با ذهن تازه شروع کن؛ همین دوره قدم‌به‌قدم می‌برد.

۵) نسخه‌ی هسته را ملاک «تازگی» توزیع دانستن

Section titled “۵) نسخه‌ی هسته را ملاک «تازگی» توزیع دانستن”

یک توزیع قدیمی‌تر هم می‌تواند اصلاحیه‌های امنیتی هسته را به نسخه‌ی خودش منتقل کند (backport). راه‌حل: به تاریخ پایان پشتیبانی توزیع نگاه کن، نه فقط عدد هسته.

✎ تمرینآسان

نام توزیع و نسخه‌ی کرنل سیستم خودت (یا همین محیط) را پیدا کن و در یک جمله بنویس. دو دستور لازم است: یکی برای هسته و یکی برای توزیع.

دیدن جواب
Terminal window
echo "هسته: $(uname -r)"
. /etc/os-release && echo "توزیع: $PRETTY_NAME"
خروجی
هسته: 7.0.14-linuxkit
توزیع: Ubuntu 24.04.5 LTS
✎ تمرینمتوسط

تمرین اصلی: پیدا کن در محیط تمرین چه توزیعی و چه معماری‌ای داری، چند هسته‌ی CPU و چقدر حافظه. نتیجه را در یک گزارش سه‌خطی چاپ کن.

دیدن جواب
Terminal window
. /etc/os-release
echo "توزیع: $PRETTY_NAME"
echo "هسته: $(uname -r) ($(uname -m))"
echo "سخت‌افزار: $(nproc) هسته‌ی CPU، $(grep MemTotal /proc/meminfo | awk '{printf "%.1f", $2/1024/1024}') گیگابایت حافظه"
خروجی
توزیع: Ubuntu 24.04.5 LTS
هسته: 7.0.14-linuxkit (aarch64)
سخت‌افزار: 8 هسته‌ی CPU، 3.8 گیگابایت حافظه
✎ تمرینسخت

ثابت کن «یک هسته، چند توزیع» درست است: برای دو توزیع دلخواه (مثلاً Debian و Alpine) هسته و توزیع را چاپ کن و در پایان با یک شرط بنویس «هسته‌ها یکی هستند» یا «متفاوت‌اند».

دیدن جواب
Terminal window
k1=$(docker run --rm debian:stable-slim uname -r)
k2=$(docker run --rm alpine uname -r)
d1=$(docker run --rm debian:stable-slim sh -c '. /etc/os-release; echo $NAME')
d2=$(docker run --rm alpine sh -c '. /etc/os-release; echo $NAME')
echo "$d1 → $k1"
echo "$d2 → $k2"
[ "$k1" = "$k2" ] && echo "هسته‌ها یکی هستند" || echo "هسته‌ها متفاوت‌اند"
خروجی
Debian GNU/Linux → 7.0.14-linuxkit
Alpine Linux → 7.0.14-linuxkit
هسته‌ها یکی هستند
؟ آزمونک
  1. کدام یک «هسته» است؟

  2. توزیع (distribution) چیست؟

  3. در آزمایش مثال ۳ چه دیدیم؟

  4. کدام دستور نام توزیع را می‌دهد؟

  5. مدیر بسته‌ی Alpine؟

  6. متن‌باز بودن لینوکس یعنی…

  • لینوکس در اصل فقط هسته است (موتور)؛ کاربر عادی با توزیع (ماشین کامل) کار می‌کند.
  • توزیع = هسته + ابزارهای کاربر (GNU) + مدیر بسته + تنظیمات پیش‌فرض.
  • چند توزیع می‌توانند هسته‌ی یکسان داشته باشند (آزمایش مثال ۳)؛ فرقشان در ابزار و بسته‌هاست.
  • uname -a هسته را و cat /etc/os-release توزیع را نشان می‌دهد.
  • لینوکس متن‌باز (GPL) است و روی سرور، موبایل، دستگاه‌های تعبیه‌شده و ابررایانه‌ها اجرا می‌شود.
  • همیشه توزیع و نسخه‌اش را بدان، چون دستورها (مثل مدیر بسته) از توزیعی به توزیع دیگر فرق می‌کنند.
برگه‌ی تقلب این درس
دستورکاری که می‌کند
uname -aهمه‌ی اطلاعات هسته
uname -rنسخه‌ی هسته
uname -mمعماری پردازنده
cat /etc/os-releaseنام و نسخه‌ی توزیع
. /etc/os-release && echo $PRETTY_NAMEنام توزیع در یک خط
cat /proc/versionجزئیات ساخت هسته
nprocتعداد هسته‌های CPU
grep MemTotal /proc/meminfoکل حافظه