تضغط زر التشغيل وتنتظر. نصف دقيقة، أحيانًا أكثر، قبل أن تظهر شاشة تسجيل الدخول. على جهاز حديث بقرص SSD يجب ألا يحدث هذا، ومع ذلك يحدث، وغالبًا لسبب واحد أو اثنين محددين يمكن العثور عليهما وإصلاحهما خلال دقائق.

هذا الدليل يعرض سبع نصائح عملية لتقليل وقت إقلاع لينكس على التوزيعات التي تعتمد systemd، وهي الغالبية العظمى من التوزيعات الشائعة. كل نصيحة مرفقة بكود جاهز للنسخ، مع شرح متى تنفعك ومتى تتركها.

ملاحظة مهمة: الأرقام الظاهرة في مخرجات الأوامر أدناه أمثلة توضيحية لشكل المخرجات، وليست قياسات من جهازك. وقدر ما ستوفره من وقت يختلف من جهاز لآخر، ولا يمكن لأحد أن يعدك برقم معين قبل أن يقيس.

قبل التعديل: ما الذي يستغرق الوقت فعلًا في الإقلاع؟

إقلاع لينكس

الإقلاع ليس خطوة واحدة، بل سلسلة مراحل، وكل مرحلة لها أدواتها في التحسين:

  • الفيرموير (UEFI أو BIOS): فحص العتاد واختيار جهاز الإقلاع، قبل أن يبدأ لينكس أصلًا
  • محمّل الإقلاع: مثل GRUB أو systemd-boot، وفيه مهلة اختيار النظام
  • النواة (Kernel): تهيئة العتاد وتحميل برامج التشغيل الأساسية، وقد تتضمن مرحلة initrd
  • مساحة المستخدم (Userspace): هنا يعمل systemd ويبدأ الخدمات واحدة تلو الأخرى، وغالبًا هنا يكمن أكبر هامش للتحسين

الأمر الذي يوزّع لك الوقت بين هذه المراحل هو:

systemd-analyze time

# Illustrative output only (not measured on your machine):
# Startup finished in 6.1s (firmware) + 3.2s (loader) + 2.4s (kernel)
#                     + 21.8s (userspace) = 33.5s
# graphical.target reached after 21.7s in userspace.

حين ترى أن الجزء الأكبر في مساحة المستخدم، ركّز على النصائح من الثانية إلى الخامسة. وإن كان في الفيرموير أو المحمّل، فالنصيحتان السادسة والسابعة هما ما يعنيك.

النصيحة 1: قِس أولًا بأرقام وخريطة زمنية

أخطر خطأ في تحسين الإقلاع أن تعطّل خدمات عشوائيًا بناءً على وصفة من الإنترنت. ابدأ بثلاثة أوامر تعطيك الصورة الكاملة:

# 1) Total time per boot phase
systemd-analyze time

# 2) Units sorted by how long each one took to initialize
systemd-analyze blame | head -n 15

# 3) The chain of units that actually delayed the default target
systemd-analyze critical-chain

# 4) A visual timeline you can open in a browser
systemd-analyze plot > boot.svg

الفرق بين الأمرين الثاني والثالث جوهري. أمر blame يرتّب الوحدات بحسب مدة تهيئتها، لكن كثيرًا منها يعمل بالتوازي مع غيره، فوحدة تبدو الأبطأ قد لا تؤخر الإقلاع إطلاقًا. أما critical-chain فيعرض السلسلة التي حدّدت فعلًا زمن الوصول للهدف. اعتبر الأول تلميحًا والثاني تشخيصًا.

ويستحق التنبيه أيضًا ما يذكره التوثيق الرسمي: هذه الأوامر تحسب فقط الوقت الذي قضته الوحدة في حالة "التفعيل"، فلا تظهر فيها الوحدات التي تنتقل مباشرة إلى الحالة النشطة، كبعض وحدات الأجهزة.

احفظ قياسك الأول لتقارن به لاحقًا. هذا سكربت بسيط يحفظ لقطة من القياسات في ملف باسم تاريخ ووقت الإقلاع:

#!/bin/bash
# boot-profile.sh - save a snapshot of the current boot measurements
mkdir -p ~/boot-profiles
stamp=$(date +%F_%H-%M-%S)
out=~/boot-profiles/$stamp.txt

systemd-analyze time              >  "$out"
echo "--- blame (top 20) ---"     >> "$out"
systemd-analyze blame | head -n 20 >> "$out"
echo "--- critical-chain ---"     >> "$out"
systemd-analyze critical-chain --no-pager >> "$out"

echo "Saved to $out"

شغّله الآن وبعد كل تعديل. ومن الأوامر المفيدة أيضًا لكشف الأخطاء التي تهدر وقتًا بإعادة المحاولة:

# Units that failed during this boot
systemctl --failed

# Errors logged during the current boot
journalctl -b -p err --no-pager

النصيحة 2: عالج انتظار الشبكة (wait-online)

من أكثر أسباب بطء الإقلاع شيوعًا وحدة تنتظر اكتمال اتصال الشبكة قبل أن يكمل النظام: NetworkManager-wait-online.service مع NetworkManager، أو systemd-networkd-wait-online.service مع systemd-networkd. إن ظهرت في سلسلة critical-chain فهي المشتبه الأول.

الخطوة الأولى أن تعرف من يحتاجها فعلًا:

# Is it on the critical path?
systemd-analyze critical-chain network-online.target

# Which units are ordered after network-online.target?
systemctl list-dependencies --reverse --no-pager network-online.target

إن لم تجد شيئًا يحتاج الشبكة أثناء الإقلاع (لا تركيبات NFS أو SMB تلقائية، ولا خادم يجب أن يبدأ بعد وصول الشبكة)، فتعطيل الانتظار يوفر وقتًا بلا ضرر عادةً. وتوثيق Red Hat نفسه ينصح بتعطيلها فقط إن لم تكن بحاجة لاتصال شغّال بعد الإقلاع مباشرة. ولديك خياران:

# Option A: disable the wait entirely
sudo systemctl disable NetworkManager-wait-online.service

# Option B: keep it, but cap the wait with a drop-in override
sudo systemctl edit NetworkManager-wait-online.service

# In the editor, add (the empty ExecStart= clears the original line):
[Service]
ExecStart=
ExecStart=/usr/bin/nm-online -s -q --timeout=10

# Confirm the real path of nm-online on your distro first:
systemctl cat NetworkManager-wait-online.service

الخيار الثاني أهدأ: يحافظ على الانتظار لكن بسقف عشر ثوانٍ بدل مهلة طويلة. وإن كان الانتظار طويلًا بسبب مشكلة حقيقية، كعنوان DHCP لا يصل، فاحرص أن تعالج السبب لا أن تخفي العَرَض.

النصيحة 3: عطّل الخدمات التي لا تحتاجها

التوزيعات تفعّل خدمات لتناسب أكبر عدد من المستخدمين، وأنت لا تحتاجها كلها. جهاز مكتبي بلا طابعة لا يحتاج خدمة الطباعة عند كل إقلاع، وجهاز بلا بلوتوث لا يحتاج خدمته.

# What is enabled at boot?
systemctl list-unit-files --type=service --state=enabled

# Inspect one before touching it
systemctl status bluetooth.service
systemctl list-dependencies --reverse bluetooth.service

# Stop it now AND stop it from starting at boot
sudo systemctl disable --now bluetooth.service

# Stronger: block it from being started by anything (even as a dependency)
sudo systemctl mask ModemManager.service

# Undo either decision
sudo systemctl enable --now bluetooth.service
sudo systemctl unmask ModemManager.service

الفرق بين الأمرين: disable يمنع البدء التلقائي لكن خدمة أخرى قد تستدعيها، وmask يربطها بالفراغ فلا يشغّلها أي شيء. ابدأ بـ disable، ولا تستخدم mask إلا إذا رأيت الخدمة تعود لتعمل رغم تعطيلها.

الخدمة يمكن تعطيلها إن كنت تنبيه
bluetooth.service لا تستخدم أجهزة بلوتوث لوحات المفاتيح والسماعات اللاسلكية قد تتوقف
ModemManager.service لا تستخدم مودم شبكة جوال أو شريحة بعض أجهزة USB للإنترنت تحتاجها
cups.service لا تطبع، أو يمكنك الاكتفاء بالتفعيل عند الطلب إن توفرت وحدة cups.socket فأبقِها مفعّلة ليبدأ الطباعة عند الحاجة
avahi-daemon.service لا تعتمد على اكتشاف الأجهزة محليًا اكتشاف الطابعات وبعض أجهزة البث يعتمد عليها

وقاعدة ثابتة: لا تعطّل وحدات تبدأ بـ systemd- ولا dbus ولا udev ولا مدير الدخول الرسومي، ولا أي شيء لا تفهم وظيفته. وحدات الانتظار مثل plymouth-quit-wait.service قد تظهر في blame بأرقام كبيرة، لكنها تنتظر غالبًا انتهاء شاشة الإقلاع الرسومية، ولا تعني أنها السبب.

النصيحة 4: نظّف fstab وحدّد مهلة الأجهزة

ملف /etc/fstab يخبر النظام بما يركّبه عند الإقلاع. حين يشير سطر فيه إلى قرص غير موجود (قرص خارجي فُصل، أو قسم حُذف، أو مشاركة شبكية غير متاحة)، ينتظر systemd ظهور الجهاز حتى تنتهي مهلته الافتراضية الطويلة. وسترى هذا في blame وحدات اسمها يشبه dev-disk-by...device.

الحل لأي قرص ثانوي غير ضروري للإقلاع: أضف nofail ومهلة قصيرة:

# Find the UUID of your partitions
lsblk -f

# /etc/fstab - a secondary data disk that must not block boot
UUID=3f1c2a7e-8b4d-4e2a-9c61-5d7f0b9e2a14  /data  ext4  defaults,nofail,x-systemd.device-timeout=5s  0 2

# A network share mounted only when first accessed
//nas.local/share  /mnt/share  cifs  credentials=/root/.smbcred,_netdev,nofail,x-systemd.automount,x-systemd.idle-timeout=60  0 0
  • nofail: يكمل الإقلاع حتى لو تعذّر التركيب
  • x-systemd.device-timeout=5s: يحدّد مدة الانتظار لظهور الجهاز، وهو لا يحدّد زمن التركيب نفسه
  • x-systemd.automount: يؤجل تركيب المشاركة حتى أول وصول إليها بدل تركيبها أثناء الإقلاع

خطأ في هذا الملف قد يرميك في وضع الطوارئ عند الإقلاع القادم، فاختبر قبل أن تعيد التشغيل:

# Check fstab for errors without rebooting
sudo findmnt --verify

# Try mounting everything listed (reports problems immediately)
sudo mount -a

# Make systemd re-read the changes
sudo systemctl daemon-reload

ولا تضف nofail للأقسام الأساسية مثل الجذر (/) ولا لـ /home إن كان قسمًا مستقلًا، فالنظام يحتاجها فعلًا ليعمل.

النصيحة 5: أجّل المهام الثقيلة بمؤقتات systemd

بعض المهام لا تحتاج أن تتم في الدقيقة الأولى بعد التشغيل: فهرسة ملفات، نسخ احتياطي، مزامنة، تنظيف. حين تبدأ كلها مع الإقلاع تتزاحم على القرص والمعالج وتبطئ ظهور سطح المكتب. الحل أن تحوّلها إلى مؤقت يبدأ بعد وقت من الإقلاع.

# /etc/systemd/system/index-files.service
[Unit]
Description=Heavy file indexing job

[Service]
Type=oneshot
ExecStart=/usr/local/bin/index-files.sh
Nice=19
IOSchedulingClass=idle

# /etc/systemd/system/index-files.timer
[Unit]
Description=Run the indexing job 5 minutes after boot

[Timer]
OnBootSec=5min
Unit=index-files.service

[Install]
WantedBy=timers.target
# If the job was enabled as a boot-time service, remove that first
sudo systemctl disable index-files.service

# Activate the timer instead
sudo systemctl daemon-reload
sudo systemctl enable --now index-files.timer

# Check when it will fire
systemctl list-timers --all

الإعدادان Nice=19 وIOSchedulingClass=idle يخفضان أولوية المهمة فلا تزاحم عملك حين تبدأ. وهذا نفسه ينطبق على تطبيقات جلسة المستخدم: راجع ما يبدأ تلقائيًا بعد تسجيل الدخول.

# Boot-time analysis for your user session
systemd-analyze --user blame | head -n 15

# User services enabled at login
systemctl --user list-unit-files --state=enabled

# Desktop autostart entries (GNOME, KDE, Xfce and others)
ls ~/.config/autostart/

حدّد البرامج التي لا تحتاجها عند الدخول (مزامنة سحابية، برامج محادثة، مطلقات) وأزل بدء تشغيلها التلقائي من إعدادات بيئتك أو بحذف ملف .desktop الخاص بها من مجلد autostart.

النصيحة 6: قلّص مهلة محمّل الإقلاع وخفّف initramfs

مهلة المحمّل

مهلة GRUB الافتراضية في كثير من التوزيعات خمس ثوانٍ أو أكثر، وهي تُحسب كلها من وقتك دون أن تؤدي عملًا. تقليلها إلى ثانيتين مكسب سهل:

# /etc/default/grub
GRUB_TIMEOUT=2

# Then regenerate the config (command depends on your distro):
sudo update-grub                                    # Debian / Ubuntu / Mint
sudo grub2-mkconfig -o /boot/grub2/grub.cfg         # Fedora / openSUSE
sudo grub-mkconfig -o /boot/grub/grub.cfg           # Arch

# systemd-boot users: edit loader.conf on the ESP
# (commonly /boot/loader/loader.conf or /efi/loader/loader.conf)
timeout 2

إن كان لديك أكثر من نظام على الجهاز، فاحتفظ بمهلة كافية لتختار، ولا تُخفِ القائمة تمامًا. فتخفيض أقل من ثانيتين يوفّر القليل ويكلّفك فرصة الدخول إلى وضع الاسترداد عند الحاجة.

تخفيف initramfs

صورة initramfs تُحمَّل في الذاكرة مع النواة وتحتوي برامج تشغيل لازمة لتركيب القرص. بعض التوزيعات تضمّن فيها وحدات لكل عتاد ممكن، فتكبر الصورة وتطول مدة فكّها. يمكن تضييقها لتضمّ ما يحتاجه جهازك فقط، وضغطها بطريقة أسرع في الفكّ:

# Debian / Ubuntu: /etc/initramfs-tools/initramfs.conf
MODULES=dep
COMPRESS=lz4
# (the lz4 package may need to be installed first)
sudo update-initramfs -u

# Fedora / openSUSE (dracut): /etc/dracut.conf.d/boot-speed.conf
hostonly="yes"
sudo dracut --force

# Arch (mkinitcpio): edit /etc/mkinitcpio.conf, then
sudo mkinitcpio -P

لهذه الخطوة ثمن يجب أن تعرفه: الصورة المخصّصة لعتادك الحالي قد تفشل إن نقلت القرص إلى جهاز آخر أو غيّرت متحكم التخزين. احتفظ بنواة احتياطية وقرص إنقاذ USB، ولا تجرّب هذا على جهاز عملك الوحيد دون خطة رجوع. ثم إن مكسبها غالبًا أصغر بكثير من إصلاح wait-online أو fstab، فاتركها للنهاية.

النصيحة 7: الفيرموير والتخزين

إن رأيت في systemd-analyze time أن مرحلة الفيرموير تستغرق عدة ثوانٍ، فالمشكلة قبل لينكس. على أجهزة UEFI تستطيع الدخول لإعدادات الفيرموير مباشرة من النظام:

# Reboot straight into the UEFI setup screen
systemctl reboot --firmware-setup

# Check for firmware updates through fwupd (back up first, stay plugged in)
sudo fwupdmgr refresh
sudo fwupdmgr get-updates
sudo fwupdmgr update

# Is your boot disk a spinning HDD? (ROTA = 1 means rotational)
lsblk -d -o NAME,ROTA,SIZE,MODEL

داخل إعدادات UEFI ابحث عن:

  • خيار الإقلاع السريع (Fast Boot) وفعّله إن لم يسبب مشاكل مع أجهزتك
  • أجهزة الإقلاع غير اللازمة: عطّل الإقلاع من الشبكة (PXE) والأقراص التي لا تقلع منها
  • أي تأخير مصطنع في شاشة الشعار أو فحص الذاكرة المطوّل

وأعطِ الأولوية لتحديث الفيرموير عبر fwupd بحذر: خذ نسخة احتياطية، وصِل الشاحن، ولا تقاطع العملية. أما إن كان قرص الإقلاع تقليديًا (ROTA=1)، فالانتقال إلى SSD أكبر تحسين تجده بين كل ما في هذا المقال، ويتفوق وحده على مجموع الإعدادات الأخرى في أغلب الحالات.

كيف تتحقق من التحسن وتتراجع بأمان؟

بعد كل تعديل، أعد التشغيل وقارن مع لقطة القياس التي حفظتها:

# After the reboot
./boot-profile.sh

# Compare the new snapshot against the baseline
ls ~/boot-profiles/
diff ~/boot-profiles/OLD_STAMP.txt ~/boot-profiles/NEW_STAMP.txt

ومبدأ يوفر عليك ساعات من التخمين: غيّر شيئًا واحدًا في كل مرة. إن غيّرت خمسة أشياء ثم تحسّن الإقلاع أو تعطّل، فلن تعرف أيّها السبب. كما أن زمن الإقلاع يتفاوت قليلًا من مرة لأخرى، فخذ أكثر من قياس قبل أن تحكم.

وللتراجع: أي disable يُعكس بـ enable، وأي mask يُعكس بـ unmask، وأي ملف تعديل (drop-in) يُحذف بأمر systemctl revert:

# Remove all your local overrides for a unit and restore the default
sudo systemctl revert NetworkManager-wait-online.service

قواعد أمان قبل أي تعديل

  • خذ نسخة احتياطية من /etc/fstab و/etc/default/grub قبل تعديلهما
  • جهّز قرص إنقاذ USB للتوزيعة نفسها، يفيد إن أخطأت في ملف إقلاع
  • لا تعطّل ما لا تفهمه: ابحث عن اسم الخدمة وراجع من يعتمد عليها بأمر list-dependencies --reverse
  • راجع توثيق توزيعتك: أسماء الملفات وأوامر التحديث تختلف، وما يصلح على أوبونتو قد لا يصلح كما هو على فيدورا
  • لا تنفّذ أوامر لصقتها من الإنترنت قبل فهمها، خصوصًا ما يتضمن sudo أو rm

جدول: أوامر تختلف بحسب التوزيعة

المهمة Debian / Ubuntu / Mint Fedora Arch openSUSE
إعادة توليد إعداد GRUB update-grub grub2-mkconfig -o /boot/grub2/grub.cfg grub-mkconfig -o /boot/grub/grub.cfg grub2-mkconfig -o /boot/grub2/grub.cfg
إعادة بناء initramfs update-initramfs -u dracut --force mkinitcpio -P dracut -f
ملف إعداد initramfs /etc/initramfs-tools/initramfs.conf /etc/dracut.conf.d/ /etc/mkinitcpio.conf /etc/dracut.conf.d/

جدول: الأثر والمخاطرة لكل نصيحة

التقدير هنا نوعي لا رقمي، لأن الأثر الفعلي يعتمد على جهازك وعلى ما إذا كانت المشكلة موجودة عندك أصلًا:

النصيحة الأثر المحتمل المخاطرة الصعوبة
1. القياس لا يسرّع بذاته، لكنه يوجّه كل ما بعده لا مخاطرة سهلة
2. wait-online كبير إن كان على المسار الحرج منخفضة، ما لم تعتمد خدمات على الشبكة سهلة
3. الخدمات غير الضرورية متوسط، يختلف حسب ما تعطّل متوسطة إن عطّلت ما لا تفهمه سهلة إلى متوسطة
4. fstab كبير إن وُجدت أقراص غائبة، وإلا لا شيء متوسطة، خطأ فيه قد يوقف الإقلاع متوسطة
5. المؤقتات وبدء الجلسة متوسط في سرعة ظهور سطح المكتب منخفضة متوسطة
6. المحمّل وinitramfs صغير إلى متوسط متوسطة إلى مرتفعة في initramfs متوسطة إلى متقدمة
7. الفيرموير وSSD كبير إن كان القرص تقليديًا أو الفيرموير بطيئًا تحديث الفيرموير فيه مخاطرة سهلة إلى متوسطة

المصادر والتوثيق الرسمي

أسئلة شائعة

كم ثانية سأوفّر فعليًا؟
لا يمكن تحديد رقم قبل القياس. من لديه wait-online أو قرص غائب في fstab قد يوفّر عشرات الثواني، ومن جهازه سليم قد لا يوفر إلا ثانية أو اثنتين. لذلك ابدأ بالقياس لا بالتعديل.

هل تعطيل الخدمات آمن؟
آمن حين تعطّل خدمة تعرف وظيفتها وتتأكد أن شيئًا لا يعتمد عليها، وتستطيع التراجع بأمر واحد. يصبح خطرًا حين تعطّل بالتخمين أو تعطّل وحدات النظام الأساسية.

ما الفرق بين disable وmask؟
disable يمنع البدء التلقائي فقط، وmask يمنع أي تشغيل للخدمة حتى لو استدعتها خدمة أخرى. ابدأ بـ disable.

هل SSD أهم من كل هذه النصائح؟
إن كان قرص الإقلاع تقليديًا، فنعم في أغلب الحالات: الانتقال إلى SSD يتفوق عادة على مجموع التعديلات البرمجية. أما إن كان لديك SSD بالفعل، فالنصائح السابقة هي ما تبقى لك.

هل تنطبق هذه النصائح على توزيعات بلا systemd؟
لا. أوامر systemctl وsystemd-analyze خاصة بـ systemd. توزيعات مثل antiX وDevuan وAlpine وVoid تستخدم أنظمة تشغيل خدمات أخرى بأدوات وأوامر مختلفة.