على الرغم من كون نظام لينيكس سريع ومصمم بشكل ممتاز إلا أنه في بعض المرات ومثل أي نظام آخر قد يتعرض للمشاكل التي يمكن حلها بسهولة في حال معرفتها. هذه المشاكل على الرغم من كونها غير متعلقة مباشرة بالنظام الا انها تد تتسبب بعمل تعارضات مع النظام مما يؤدي الى بطئ إقلاع النظام. بسبب كون لينيكس مفتوح المصدر، الوصول للمشاكل يعتبر أمر سهل جدا ومباشر ولا يتطلب أكثر من برنامج واحد و بضع أوامر.
قبل الدخول في شرح البرنامج يجب أن نشدد على موضوع الأقراص الصلبة وتأثيرها في عملية الإقلاع. في حال كان لديك قرص صلب عادي من نوع HDD، سيكون الإقلاع لديك بطيئ وهذا أمر طبيعي جدا. في هذه الحالة قد يستغرق النظام ما بين دقيقة و دقيقة ونصف حتى يُنهي عملية الإقلاع. بالمقارنة، من يملك قرص SSD أو NVMe قد يُنهي عملية الإقلاع ما بين 10 – 40 ثانية.
من المهم جدا أن تعلم أن فشل أحد الأقراص في العمل أو التنصيب خلال الإقلاع قد يعطل العملية ويطيلها بشكل كبير جدا لتصل الى دقيقتين على الأقل. حل هذه المشكلة يكون من خلال تغيير القرص في حال كان معطوب، أو فصله من النظام، أو التأكد من خيارات التنصيب وكوابل الطاقة والبيانات المتصلة بالقرص أو اللوحة الأم.
برنامج systemd-analyze
في حال انك مثل معظم الناس، سيكون نظامك من نوع systemd. كيف تعلم أنه ليس systemd؟ ستعلم ذلك لوحدك. جميع الأنظمة تعمل بنظام systemd ما عدا الأنظمة التي تختارها أنت بشكل خاص لتحتوي على شيء غير systemd. المهم! في حال كان نظامك من نوع systemd، برنامج systemd-analyze هو الحل الأفضل لتحليل زمن إقلاع نظامك وسبب تأخر أي عملية فيه.
البرنامج جزء من أي نظام من نوع systemd ولا يحتاج تثبيت.
معرفة زمن الإقلاع
للتعرف على زمن الإقلاع الأخير لنظامك، يمكنك تنفيذ الامر التالي في الطرفية:
systemd-analyze
ناتج هذا الأمر هو التالي بالنسبة لجهازي:
[ahmad@Ahmad-PC ~]$ systemd-analyze
Startup finished in 12.387s (firmware) + 10.145s (loader) + 2.674s (kernel) + 5.015s (userspace) = 30.222s
graphical.target reached after 2.135s in userspace
تفسير الأمر:
- 12.387s (firmware) هذه تعني أن نظام UEFI استغرق 12.3 ثانية.
- 10.145s (loader) هذه تعني أن محمل الإقلاع استغرق 10.1 ثانية.
- 2.674s (kernel) هذه تعني أن النواة استغرقت 2.6 ثانية.
- 5.015s (userspace) هذه تعني أن كل ما يتعلق بي كمستخدم استغرق 5 ثواني.
من خلال هذا الأمر نرى أن العتاد الخاص بي استغرق تقريبا 22 ثانية ليعمل، ونظام لينيكس بالكامل استغرق 7 ثواني اضافية.
ملاحظة جانبية: نظام Coreboot مفتوح المصدر البديل لنظام UEFI قادر على اختصار الـ 22 ثانية الى أقل من 5 ثواني. نتمنى أن نرى هذا النظام متوفر في عدد أكبر من الأجهزة في المستقبل.
معرفة زمن تشغيل كل عملية في النظام خلال بدء التشغيل
لمعرفة الزمن المستغرق لتشغيل كل عملية تخص واجهة المستخدم، يمن تنفيذ الامر التالي:
systemd-analyze blame
هنا يتم ترتيب العمليات من التي استغرقت وقت أكبر الى الأقل استغراقا للوقت. نرى في جهازي أن عملية تشغيل الشبكة وإجراء اتصال بالإنترنت كانت هي الأبطأ واستغرقت 3.5 ثانية.
[ahmad@Ahmad-PC ~]$ systemd-analyze blame
3.581s NetworkManager-wait-online.service
2.359s man-db.service
886ms systemd-logind.service
822ms lvm2-monitor.service
657ms snapd.service
462ms systemd-random-seed.service
450ms dev-nvme0n1p2.device
425ms apparmor.service
394ms upower.service
301ms systemd-udevd.service
282ms tlp.service
268ms systemd-journald.service
133ms [email protected]
125ms org.cups.cupsd.service
116ms systemd-journal-flush.service
112ms polkit.service
96ms ldconfig.service
82ms udisks2.service
81ms run-media-ahmad-Data.mount
71ms avahi-daemon.service
71ms logrotate.service
71ms run-media-ahmad-Games.mount
69ms systemd-modules-load.service
68ms systemd-tmpfiles-clean.service
66ms NetworkManager.service
58ms systemd-udev-trigger.service
52ms ModemManager.service
34ms [email protected]
27ms boot-efi.mount
27ms systemd-sysusers.service
22ms systemd-journal-catalog-update.service
19ms systemd-fsck@dev-disk-by\x2duuid-06ED\x2dA3F9.service
16ms systemd-tmpfiles-setup.service
15ms systemd-tmpfiles-setup-dev.service
15ms systemd-binfmt.service
13ms netdata.service
13ms [email protected]
13ms colord.service
12ms snapd.apparmor.service
11ms dev-hugepages.mount
11ms dev-mqueue.mount
10ms linux-module-cleanup.service
10ms sys-kernel-debug.mount
10ms sys-kernel-tracing.mount
9ms tmp.mount
8ms kmod-static-nodes.service
8ms systemd-update-done.service
6ms systemd-update-utmp.service
6ms systemd-remount-fs.service
5ms systemd-sysctl.service
5ms systemd-user-sessions.service
4ms sys-fs-fuse-connections.mount
3ms rtkit-daemon.service
2ms proc-sys-fs-binfmt_misc.mount
1ms sys-kernel-config.mount
884us snapd.socket
تحليل سبب بطء العملية
أعتقد ان من يعاني من بطئ بدء التشغيل سيكون هذا هو القسم الأهم بالنسبة له. في نظام systemd أنت قادر على معرفة أدق التفاصيل، والأمر التالي يعطيك كل عملية فرعية تمت من خلال العملية الرئيسية ويعطيك تفاصيل وقتها بدقة تصل الى نانو ثانية:
systemd-analyze critical-chain
للاستفادة من الأمر السابق في تحليل عملية معينة، يجب كتابة اسم العملية بعد الأمر كما في المثال التالي:
systemd-analyze critical-chain NetworkManager-wait-online.service
وهذه نتيجة الأمر لدي:
[ahmad@Ahmad-PC ~]$ systemd-analyze critical-chain NetworkManager-wait-online.service
The time when unit became active or started is printed after the "@" character.
The time the unit took to start is printed after the "+" character.
NetworkManager-wait-online.service +3.581s
└─NetworkManager.service @1.240s +66ms
└─dbus.service @1.236s
└─basic.target @1.232s
└─sockets.target @1.232s
└─snapd.socket @1.231s +884us
└─sysinit.target @1.228s
└─sys-fs-fuse-connections.mount @3.368s +4ms
└─systemd-modules-load.service @220ms +69ms
└─systemd-journald.socket @211ms
└─-.mount @195ms
└─system.slice @195ms
└─-.slice @195ms
عند إشارة @ هو زمن تشغيل الخدمة، و عند اشارة الزائد هو الزمن الذي استغرقته الخدمة للعمل بشكل كامل. مثلا خدمة FUSE استغرقت 3.3 ثانية للبدء و استغرقت 4 أجزاء من الثانية لتكتمل وتسمح للنظام بالانتقال الى المهمة التالية.