systemd در Debian
آموزش کامل systemd در Debian: دستورات systemctl، journalctl، unitها، targetها، تحلیل زمان بوت و پیکربندی سرویسها.
systemd سیستم init پیشفرض Debian از نسخهٔ ۸ (Jessie) به بعد است. این سیستم مسئول راهاندازی سرویسها، مدیریت نشستها، لاگگذاری و بسیاری از وظایف سیستمی است. در این آموزش با دستورهای اصلی و مفاهیم کلیدی systemd آشنا میشوید.
systemd چیست؟
systemd یک «مجموعهٔ نرمافزاری» است که شامل init سیستم، logger، login manager، network manager و بسیاری ابزار دیگر است. در Debian، systemd بهطور پیشفرض نصب و فعال است و جایگزین سیستمهای قدیمی SysV init شده است.
init پیشفرض Debian
برخلاف Gentoo که به شما اجازه میدهد بین systemd و OpenRC یکی را انتخاب کنید، Debian بهطور پیشفرض از systemd استفاده میکند. در Debian 12، systemd نسخهٔ 252 است.
| ویژگی | systemd | SysV init (قدیمی) |
|---|---|---|
| بوت موازی | بله | خیر |
| Logger داخلی | journald | syslog جداگانه |
| مدیریت نشست | logind | ندارد |
| وابستگی سرویسها | خودکار | دستی |
| سرعت بوت | سریع | کندتر |
دستور systemctl
systemctl ابزار اصلی مدیریت سرویسها در systemd است:
# شروع سرویس
sudo systemctl start ssh
# توقف سرویس
sudo systemctl stop ssh
# راهاندازی مجدد
sudo systemctl restart ssh
# بارگذاری مجدد پیکربندی بدون قطع
sudo systemctl reload ssh
# فعالسازی برای بوت (معادل chkconfig on)
sudo systemctl enable ssh
# خروجی:
# Synchronizing state of ssh.service with SysV service script...
# Created symlink /etc/systemd/system/multi-user.target.wants/ssh.service → /lib/systemd/system/ssh.service.
# غیرفعالسازی از بوت
sudo systemctl disable ssh
# شروع و فعالسازی همزمان
sudo systemctl enable --now ssh
# مشاهدهٔ وضعیت
systemctl status ssh
# خروجی:
# ● ssh.service - OpenBSD Secure Shell server
# Loaded: loaded (/lib/systemd/system/ssh.service; enabled; preset: enabled)
# Active: active (running) since ... ago
# Docs: man:sshd(8)
# man:sshd_config(5)
# Main PID: 1234 (sshd)
# ...
# لیست همهٔ سرویسها
systemctl list-units --type=service
# لیست سرویسهای در حال اجرا
systemctl list-units --type=service --state=running
# لیست تمام سرویسهای نصبشده
systemctl list-unit-files --type=serviceenable + now
دستور systemctl enable --now ssh سرویس را هم بلافاصله شروع میکند و هم برای بوت بعدی فعال میسازد. این معادل دو دستور enable و start بهصورت جداگانه است.
journalctl — مشاهدهٔ لاگها
systemd از journald برای ثبت رخدادها استفاده میکند. این لاگها باینری هستند (نه متنی ساده) و با journalctl خوانده میشوند:
# همهٔ لاگها از بوت فعلی
journalctl
# لاگهای یک سرویس خاص
journalctl -u ssh
# لاگهای یک ساعت گذشته
journalctl --since "1 hour ago"
# لاگهای امروز
journalctl --since today
# پیگیری زنده (مانند tail -f)
journalctl -f
# لاگهای بوت قبلی
journalctl --list-boots
# خروجی:
# -1 2026-06-29 09:23:11 ... 2026-06-29 22:11:45
# 0 2026-06-30 08:15:33 ...
journalctl -b -1 # بوت قبلی
# فقط خطاهای سطح error و بالاتر
journalctl -p err
# ۵۰ خط آخر یک سرویس
journalctl -u ssh -n 50journald در برابر syslog
journald لاگها را بهصورت باینری ذخیره میکند و امکان فیلتر پیشرفته فراهم میکند. اما در Debian معمولاً rsyslog هم فعال است تا لاگهای متنی کلاسیک (مانند /var/log/syslog و /var/log/auth.log) را هم نگه دارد. این یعنی هر دو روش برای مشاهدهٔ لاگ در دسترس است.
Unitهای کلیدی در Debian
این جدول مهمترین unitهایی است که در Debian معمولاً فعال میشوند:
| Unit | بسته | کاربرد |
|---|---|---|
ssh.service | openssh-server | سرور SSH |
networking.service | ifupdown | شبکهٔ کلاسیک (سرور) |
NetworkManager.service | network-manager | شبکهٔ گرافیکی (دسکتاپ) |
systemd-timesyncd.service | داخلی | همگامسازی زمان (NTP سبک) |
cron.service | cron | زمانبند وظایف |
rsyslog.service | rsyslog | لاگ متنی کلاسیک |
nginx.service | nginx | وبسرور Nginx |
apache2.service | apache2 | وبسرور Apache |
postgresql.service | postgresql | دیتابیس PostgreSQL |
docker.service | docker.io | Docker |
Targetها (نسخهٔ systemd از runlevelها)
systemd از مفهوم «target» بهجای runlevel استفاده میکند. هر target مجموعهای از unitها است:
| Target | معادل SysV runlevel | کاربرد |
|---|---|---|
poweroff.target | 0 | خاموشکردن سیستم |
rescue.target | 1 | حالت تککاربره (rescue) |
multi-user.target | 3 | چندکاربره بدون گرافیک (سرور) |
graphical.target | 5 | چندکاربره با گرافیک (دسکتاپ) |
reboot.target | 6 | ریبوت سیستم |
default.target | — | target پیشفرض |
# مشاهدهٔ target پیشفرض
systemctl get-default
# خروجی:
# graphical.target
# تغییر target پیشفرض (سرور بدون گرافیک)
sudo systemctl set-default multi-user.target
# تغییر موقت target (بدون ریبوت)
sudo systemctl isolate multi-user.target
# بوت به حالت rescue
sudo systemctl rescueتحلیل زمان بوت با systemd-analyze
ابزار systemd-analyze زمان بوت را تحلیل میکند:
# زمان کل بوت
systemd-analyze
# خروجی:
# Startup finished in 5.221s (firmware) + 2.104s (loader)
# + 1.890s (kernel) + 3.234s (userspace) = 12.450s
# graphical.target reached after 3.123s in userspace
# زمان هر سرویس (پر-abuse)
systemd-analyze blame | head
# خروجی:
# 1.234s NetworkManager-wait-online.service
# 845ms dev-sda1.device
# 612ms systemd-udevd.service
# 412ms ssh.service
# ...
# درخت وابستگی بحرانی
systemd-analyze critical-chain
# خروجی:
# graphical.target @3.123s
# └─multi-user.target @3.120s
# └─sshd.service @412ms +45ms
# └─network.target @411ms
# └─NetworkManager.service @310ms +100msغیرفعالکردن سرویسهای کند
اگر NetworkManager-wait-online.service زمان زیادی میبرد و به آن نیاز ندارید، میتوانید آن را غیرفعال کنید:
sudo systemctl disable NetworkManager-wait-online.serviceاین سرویس فقط برای اطمینان از اتصال شبکه پیش از ادامهٔ بوت است؛ برای دسکتاپ خانگی معمولاً ضروری نیست.
پیکربندی unitها
فایلهای unit در سه مسیر قرار دارند (به ترتیب اولویت):
/etc/systemd/system/— پیکربندی مدیر سیستم (بالاترین اولویت)/run/systemd/system/— فایلهای موقت runtime/lib/systemd/system/— فایلهای نصبشده توسط بستهها
برای سفارشیسازی یک unit، آن را با systemctl edit باز کنید:
# سفارشیسازی سرویس SSH
sudo systemctl edit ssh.service
# این یک فایل drop-in در /etc/systemd/system/ssh.service.d/ میسازد
# محتوای نمونه:
# [Service]
# ExecStart=
# ExecStart=/usr/sbin/sshd -D -p 2222
# بارگذاری مجدد systemd
sudo systemctl daemon-reload
sudo systemctl restart sshمثال: ساخت تایمر بهجای cron
# تعریف سرویس
sudo tee /etc/systemd/system/backup.service <<EOF
[Unit]
Description=Backup service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
EOF
# تعریف تایمر
sudo tee /etc/systemd/system/backup.timer <<EOF
[Unit]
Description=Daily backup
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
EOF
# فعالسازی
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timerهرگز فایل /lib را مستقیم ویرایش نکنید
فایلهای unit در /lib/systemd/system/ با بهروزرسانی بسته بازنویسی میشوند. همیشه از systemctl edit استفاده کنید؛ این دستور یک فایل drop-in در /etc/systemd/system/ میسازد و تغییرات شما حفظ میشوند.
مدیریت زمان و hostname
systemd ابزارهای مدیریت زمان و hostname را هم فراهم میکند:
# تنظیم hostname
sudo hostnamectl set-hostname debian-server
# تنظیم timezone
sudo timedatectl set-timezone Asia/Tehran
# مشاهدهٔ وضعیت زمان
timedatectl status
# Local time: Mon 2026-06-30 12:00:00 +0330
# Universal time: Mon 2026-06-30 08:30:00 UTC
# Time zone: Asia/Tehran (+0330, +0330)
# System clock synchronized: yes
# NTP service: active
# RTC in local TZ: no
# فعالکردن NTP
sudo timedatectl set-ntp trueخطاهای رایج
۱. سرویس failed در بوت
systemctl status ssh
# Active: failed (Result: exit-code)راهحل:
# مشاهدهٔ لاگ کامل
journalctl -u ssh -n 50
# بررسی فایل unit
systemctl cat ssh
# تست دستی
sudo /usr/sbin/sshd -t # تست پیکربندی SSH۲. daemon-reload لازم است
پس از ویرایش فایل unit، اگر daemon-reload اجرا نکنید، تغییرات اعمال نمیشوند:
sudo systemctl daemon-reload
sudo systemctl restart ssh۳. سرویس در حالت activating گیر میکند
# بررسی وابستگیها
systemctl list-dependencies ssh
# بررسی لاگ زنده
journalctl -u ssh -f۴. زمان بوت بسیار طولانی
# پیدا کردن سرویسهای کند
systemd-analyze blame | head -20
# غیرفعالکردن سرویسهای غیرضروری
sudo systemctl disable NetworkManager-wait-online.service
sudo systemctl mask plymouth-quit-wait.servicemask در برابر disable
disable فقط سرویس را از بوت حذف میکند اما هنوز قابل start دستی است. mask سرویس را کاملاً غیرفعال میکند و حتی start دستی هم ممکن نیست. برای سرویسهایی که هرگز نمیخواهید اجرا شوند، از mask استفاده کنید.
خلاصه و مرحلهٔ بعد
systemd در Debian قلب مدیریت سرویسها، لاگگذاری و بوت است. با systemctl سرویسها را مدیریت میکنید، با journalctl لاگها را میبینید و با systemd-analyze عملکرد بوت را تحلیل میکنید. این ابزارها جایگزین دستورات قدیمی مانند service، chkconfig و /var/log/messages شدهاند.
بهعنوان گام بعدی:
- آموزش SSH را برای مدیریت سرویس SSH با systemd ببینید
- آموزش تنظیم شبکه را برای شبکه با systemd-networkd بخوانید
- آموزش نصب سرور را برای نصب اولیه مرور کنید
این صفحه در تاریخ ۹ تیر ۱۴۰۵ بهروزرسانی شده است.