systemd در Ubuntu
آموزش کامل systemd در Ubuntu: دستورات systemctl، journalctl، unitها، targetها، تحلیل زمان بوت و پیکربندی سرویسها.
systemd سیستم init پیشفرض Ubuntu از نسخهٔ ۱۵.۰۴ (۲۰۱۵) به بعد است. این سیستم مسئول راهاندازی سرویسها، مدیریت نشستها، لاگگذاری و بسیاری از وظایف سیستمی است. در این آموزش با دستورهای اصلی و مفاهیم کلیدی systemd آشنا میشوید.
systemd چیست؟
systemd یک «مجموعهٔ نرمافزاری» است که شامل init سیستم، logger، login manager، network manager و بسیاری ابزار دیگر است. در Ubuntu، systemd بهطور پیشفرض نصب و فعال است و جایگزین سیستمهای قدیمی SysV init و Upstart شده است.
init پیشفرض Ubuntu
Ubuntu از نسخهٔ ۱۵.۰۴ به بعد به systemd مهاجرت کرد. در Ubuntu 24.04 LTS، systemd نسخهٔ ۲۵۵ است. این مهاجرت بهجای Upstart (سیستم init قبلی Canonical) انجام شد.
| ویژگی | 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
# فعالسازی برای بوت
sudo systemctl enable ssh
# غیرفعالسازی از بوت
sudo systemctl disable ssh
# شروع و فعالسازی همزمان
sudo systemctl enable --now ssh
# مشاهدهٔ وضعیت
systemctl status ssh
# خروجی:
# ● ssh.service - OpenBSD Secure Shell server
# Loaded: loaded (/usr/lib/systemd/system/ssh.service; enabled; preset: enabled)
# Active: active (running) since ... ago
# Docs: man:sshd(8)
# 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
journalctl -b -1 # بوت قبلی
# فقط خطاهای سطح error و بالاتر
journalctl -p err
# ۵۰ خط آخر یک سرویس
journalctl -u ssh -n 50journald در برابر syslog
journald لاگها را بهصورت باینری در /var/log/journal/ ذخیره میکند. در Ubuntu، rsyslog هم معمولاً فعال است تا لاگهای متنی کلاسیک (مانند /var/log/syslog و /var/log/auth.log) را نگه دارد. این یعنی هر دو روش برای مشاهدهٔ لاگ در دسترس است.
Unitهای کلیدی در Ubuntu
| Unit | بسته | کاربرد |
|---|---|---|
ssh.service | openssh-server | سرور SSH |
networkd.service | داخلی | شبکهٔ systemd-networkd |
NetworkManager.service | network-manager | شبکهٔ گرافیکی (دسکتاپ) |
netplan.service | netplan.io | اعمال پیکربندی Netplan |
systemd-timesyncd.service | داخلی | همگامسازی زمان (NTP سبک) |
cron.service | cron | زمانبند وظایف |
rsyslog.service | rsyslog | لاگ متنی کلاسیک |
nginx.service | nginx | وبسرور Nginx |
apache2.service | apache2 | وبسرور Apache |
docker.service | docker-ce | Docker |
snapd.service | snapd | سرویس Snap |
Targetها (نسخهٔ systemd از runlevelها)
systemd از مفهوم «target» بهجای runlevel استفاده میکند:
| 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 (در Ubuntu Desktop)
# multi-user.target (در Ubuntu Server)
# تغییر target پیشفرض (سرور بدون گرافیک)
sudo systemctl set-default multi-user.target
# تغییر موقت target (بدون ریبوت)
sudo systemctl isolate multi-user.target
# بوت به حالت rescue
sudo systemctl rescueتحلیل زمان بوت با 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
# زمان هر سرویس
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
# نمودار SVG از زمان بوت
systemd-analyze plot > boot.svgغیرفعالکردن سرویسهای کند
اگر NetworkManager-wait-online.service زمان زیادی میبرد و به آن نیاز ندارید، میتوانید آن را غیرفعال کنید:
sudo systemctl disable NetworkManager-wait-online.serviceاین سرویس برای اطمینان از اتصال شبکه پیش از ادامهٔ بوت است؛ برای دسکتاپ خانگی معمولاً ضروری نیست.
پیکربندی unitها
فایلهای unit در سه مسیر قرار دارند (به ترتیب اولویت):
/etc/systemd/system/— پیکربندی مدیر سیستم (بالاترین اولویت)/run/systemd/system/— فایلهای موقت runtime/usr/lib/systemd/system/— فایلهای نصبشده توسط بستهها (در Ubuntu 24.04 به بعد) یا/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 > /dev/null <<'EOF'
[Unit]
Description=Backup service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
EOF
# تعریف تایمر
sudo tee /etc/systemd/system/backup.timer > /dev/null <<'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هرگز فایل /usr/lib را مستقیم ویرایش نکنید
فایلهای unit در /usr/lib/systemd/system/ با بهروزرسانی بسته بازنویسی میشوند. همیشه از systemctl edit استفاده کنید؛ این دستور یک فایل drop-in در /etc/systemd/system/ میسازد و تغییرات شما حفظ میشوند.
مدیریت زمان و hostname
systemd ابزارهای مدیریت زمان و hostname را هم فراهم میکند:
# تنظیم hostname
sudo hostnamectl set-hostname ubuntu-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
# فعالکردن 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۳. زمان بوت بسیار طولانی
# پیدا کردن سرویسهای کند
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 استفاده کنید.
۴. سرویس در حالت activating گیر میکند
# بررسی وابستگیها
systemctl list-dependencies ssh
# بررسی لاگ زنده
journalctl -u ssh -f۵. snapd سرویس کندی است
اگر snapd.service یا snapd.seeded.service زمان زیادی از بوت را میگیرد:
# غیرفعالکردن snap seeded check (در صورت عدم نیاز به snap در بوت)
sudo systemctl mask snapd.seeded.serviceخلاصه و مرحلهٔ بعد
systemd در Ubuntu قلب مدیریت سرویسها، لاگگذاری و بوت است. با systemctl سرویسها را مدیریت میکنید، با journalctl لاگها را میبینید و با systemd-analyze عملکرد بوت را تحلیل میکنید.
بهعنوان گام بعدی:
- آموزش SSH را برای مدیریت سرویس SSH با systemd ببینید
- آموزش تنظیم شبکه را برای Netplan و NetworkManager بخوانید
- آموزش مدیریت کاربران را برای logind و sudo ببینید
این صفحه در تاریخ ۹ تیر ۱۴۰۵ بهروزرسانی شده است.