Μείωση χρόνου εκκίνησης (boot time) σε Ubuntu 16.04


Ως απάντηση, ή ως συνέχεια, στη πρόσφατη δημοσίευση του Salih περί αύξησης της ταχύτητας εκκίνησης του λειτουργικού (boot time) μιας και το δοκίμασε σε Arch Linux, απ’ ότι κατάλαβα, όπου τα πράγματα είναι κατά πολύ διαφορετικά από το Ubuntu.

Το dracut είναι ένα πρόγραμμα το οποίο δεν περιλαμβάνεται από προεπιλογή στο Ubuntu και κάνοντας το εγκατάσταση, σε μερικές περιπτώσεις, δημιουργεί προβλήματα με τα πακέτα τα οποία αφαιρεί (πχ ubuntu-minimal). Τα προβλήματα αυτά ίσως γίνουν ακόμη μεγαλύτερα σε διανομές οι οποίες βασίζονται στο Ubuntu και έχουν περαιτέρω αλλάξει κάποιες ρυθμίσεις (πχ Linux Mint). Τα προβλήματα αυτά ίσως να μη φανούν αμέσως αλλά σε κάποια αναβάθμιση του συστήματος. Ίσως να μη φανούν και καθόλου, αλλά ο κίνδυνος εγκυμονεί.

Παρότι σε αυτή τη δημοσίευση θα δούμε τη προσθήκη προγραμμάτων (πχ e4rat) ή ακόμη και custom πυρήνα (με υποστήριξη lz4), αυτά δεν είναι απαραίτητα. Είναι προαιρετικά εάν κάποιος θέλει να τα δοκιμάσει.

Υπηρεσίες που εκκινούν

Το systemd διαθέτει κάποια εργαλεία που μας βοηθούν να δούμε τι υπηρεσίες εκκινούν κατά τη διάρκεια της εκκίνησης του λειτουργικού και πόσο χρόνο καταναλώνουν για να εκκινήσουν.
Με την εντολή

systemd-analyze

θα δούμε απλά το χρόνο εκκίνησης ως kernel space, userspace και συνολικά.
Δίνοντας

systemd-analyze blame

θα δούμε περισσότερες πληροφορίες για τη διάρκεια εκκίνησης των υπηρεσιών.
Επίσης η

systemd-analyze critical-chain

θα μας δώσει μια ακόμη πιο σαφή πληροφόρηση για το χρόνο εκκίνησης εφαρμογών, ενώ με κόκκινο θα είναι σημειωμένες εκείνες που απαιτούν περισσότερο χρόνο. Ο χρόνος αυτός θα αναγράφεται μετά το σύμβολο +
Τέλος,
αν θέλουμε να έχουμε μια εικόνα (svg) με τη διαδικασία εκκίνησης, η παρακάτω εντολή παράγει μια τέτοια εικόνα

systemd-analyze plot > plot.svg

Ανοίγουμε το plog.svg με ένα πρόγραμμα που μπορεί να διαβάσει εικόνες svg (πχ Gimp, Inkscape…κλπ)

Χρειαζόμαστε όλες αυτές τις υπηρεσίες να εκκινούν μαζί με το σύστημά μας; Ποιες καταναλώνουν τον περισσότερο χρόνο; Με τις παραπάνω εντολές μπορούμε να τις εντοπίσουμε , δηλαδή όσες δεν χρειαζόμαστε και όσες αργούν αρκετά για να εκκινήσουν και να τις απενεργοποιήσουμε.

Ένας νεοεισερχόμενος ή με μικρή εμπειρία στο Linux, είναι επόμενο να μη γνωρίζει ποιες υπηρεσίες πρέπει να απενεργοποιήσει. Γι’ αυτό, χρησιμοποιήστε τις παραπάνω εντολές (κατά προτίμηση την systemd-analyze blame ή το plot) και γράψτε μας στα σχόλια τα αποτελέσματα.
Εναλλακτικά μπορείτε να χρησιμοποιήσετε και τη παρακάτω εντολή, σε συνδυασμό πχ με την blame, ώστε να δούμε τις ενεργοποιημένες υπηρεσίες και να προτείνουμε ποιες μπορείτε να απενεργοποιήσετε.

systemctl list-unit-files | grep -i enabled

Δυο υπηρεσίες που εκκινούν και που μπορούμε να απενεργοποιήσουμε για παράδειγμα, από αυτές που μου έρχονται τώρα στη μνήμη, είναι η rc-local και το snapd. Αν κάποιος θέλει να το προχωρήσει ακόμη παραπέρα, μπορεί να απενεργοποιήσει και τις υπηρεσίες του NetworkManager, με τη πιο πιθανή κατάληξη βέβαια να μην έχει δίκτυο μετά την εκκίνηση, αλλά να πρέπει να κάνει εκκίνηση την υπηρεσία μόνος του. Αυτό ορισμένοι το χρησιμοποιούν και ως extra Security Layer καθώς για να εκκινήσουν οι υπηρεσίες δικτύου πρέπει κάποιος να γνωρίζει τον κωδικό του χρήστη (ή υπερχρήστη).

Οι υπηρεσίες απενεργοποιούνται με δυο τρόπους:

1) Με την εντολή disable

sudo systemctl disable "όνομα.service"

2) Με την εντολή mask

sudo systemctl mask "όνομα.service"

Η δεύτερη εντολή έρχεται να βοηθήσει εκεί που η πρώτη δεν μπορεί. Μερικές υπηρεσίες είτε εξαρτώνται από sockets (όνομα.socket), οπότε ακόμη και να τις κάνουμε disable μπορεί να ενεργοποιηθούν αυτόματα μέσω του socket, άλλες πάλι δεν διαθέτουν εκείνο το μηχανισμό ώστε να απενεργοποιηθούν με disable. Όπου λοιπόν δεν πίπτει disable πίπτει mask.

Παράδειγμα:

sudo systemctl mask rc-local
sudo systemctl mask snapd 
sudo systemctl disable NetworkManager.service
sudo systemctl disable NetworkManager-wait-online.service

Splash Screen και system messages

Όσο και να φανεί περίεργο σε κάποιον, η splash screen καθώς και κάποια μηνύματα που ενδεχομένως να εμφανίζονται κατά τη διάρκεια της εκκίνησης, καταναλώνουν δευτερόλεπτα. Η splash screen, όπως και τα μηνύματα συστήματος, εμφανίζονται με σκοπό να τα δει ο χρήστης, δεν εμφανίζονται για πλάκα.
Γι’ αυτό το λόγο είναι έτσι ρυθμισμένος ο μηχανισμός ώστε να καθυστερεί, έστω και λίγο, για να προλάβει ο χρήστης να δει αυτά τα μηνύματα ή την όμορφη splash screen.

Για να απενεργοποιήσουμε τη Splash Screen και να κάνουμε Suppress τα μηνύματα συστήματος πρέπει να επεξεργαστούμε ένα αρχείο, το /etc/default/grub. Ανοίγοντας το με τον αγαπημένο μας editor και φυσικά με δικαιώματα διαχειριστή, βρίσκουμε τη γραμμή GRUB_CMDLINE_LINUX_DEFAULT και την αλλάζουμε στη παρακάτω:

GRUB_CMDLINE_LINUX_DEFAULT="quiet loglevel=2"

αποθηκεύουμε το αρχείο και έπειτα τρέχουμε

sudo update-grub

Προσέξτε ότι η σειρά έχει σημασία. Δηλαδή πρώτα το quiet και έπειτα το loglevel.

e4rat (μόνο HDD)

Το e4rat είναι ένα εργαλείο που ΔΕΝ συμπεριλαμβάνεται καν στα αποθετήρια του Ubuntu, τα αποτελέσματα του οποίου όμως είναι άκρως εντυπωσιακά.
Αυτό που κάνει το εργαλείο αυτό είναι να επιταχύνει τους χρόνους ανάγνωσης του σκληρού δίσκου μεταφέροντας τα αρχεία εκκίνησης στην αρχή. Υπάρχει μια ολόκληρη διαδικασία για να το ενεργοποιήσει κάποιος και ένας εκτενής οδηγός μαζί με σχόλια και συγκρίσεις υπάρχει στο φόρουμ της Ελληνικής Κοινότητας του Ubuntu.

Προσέξτε ότι το e4rat απευθύνεται ΜΟΝΟ σε HDD δίσκους (όχι SSD) και μόνο σε σύστημα αρχείων ext4. Πάντως αν αποφασίσετε να το ενεργοποιήσετε θα δείτε σημαντική διαφορά στο χρόνο εκκίνησης με τις πιθανότητες όμως για ένα Kernel Panic να αυξάνονται.
Γι’ αυτό το λόγο, καθώς και για ότι θα αναφέρουμε στην επόμενη παράγραφο, να έχετε πάντα έναν πυρήνα ως backup, ώστε αν κάτι πάει στραβά να μπορείτε να κάνετε εκκίνηση από αυτόν. Το Ubuntu κρατάει από μόνο του έναν ή και παραπάνω πυρήνες ως backup.

 

Υποστήριξη LZ4 kernel compression στο Ubuntu

Εδώ τα πράγματα είναι ξεκάθαρα σε ότι αφορά την ταχύτητα συμπίεσης και αποσυμπίεσης σε σχέση με άλλους compressors. Ο LZ4 είναι ο ταχύτερος όλων με συγκριτικά να έχουν δείξει διαφορές έως και 75% σε σχέση με τον default gzip.

Σε άλλες διανομές, πχ στο Arch Linux που ο Salih δοκίμασε, η ενεργοποίηση του LZ4 είναι σχετικά εύκολη. Όχι όμως και στο Ubuntu.
Εδώ πρέπει καταρχήν να έχουμε εγκατεστημένο έναν πυρήνα με υποστήριξη LZ4, όχι ως απλό module αλλά, ως built in module. Για όσους ασχολούνται με kernel compile να αλλάξουν το CONFIG_CRYPTO_LZ4=m σε (=y).

Ο πυρήνας αυτός είναι διαθέσιμος στο παρακάτω αποθετήριο:
https://launchpad.net/~nick-athens30/+archive/ubuntu/xenial

Και τον προσθέτουμε στο σύστημά μας με τις παρακάτω εντολές

sudo add-apt-repository ppa:nick-athens30/xenial
sudo apt-get update
sudo apt-get install linux-lz4

Αφού κάνουμε εγκατάστση τον πυρήνα, πριν κάνουμε boot από αυτόν, κάνουμε και τα παρακάτω.

Εγκατάσταση του πακέτου liblz4-tool

sudo apt-get install liblz4-tool

Έπειτα επεξεργαζόμαστε ένα αρχείο συστήματος το mkinitramfs για να προσθέσουμε μια γραμμή.
Με τον αγαπημένο μας editor (πχ gedit) ανοίγουμε το αρχείο

gksudo gedit /usr/sbin/mkinitramfs

Βρίσκουμε τη γραμμή που γράφει

[ "${compress}" = lzop ] && compress="lzop -9"

και ακριβώς από πάνω προσθέτουμε τη παρακάτω γραμμή:

[ "${compress}" = lz4 ] && compress="lz4 -9 -z -l"

Αποθηκεύουμε και κλείνουμε το αρχείο.

Έπειτα επεξεργαζόμαστε το αρχείο

gksudo gedit /etc/initramfs-tools/initramfs.conf

και αλλάζουμε το COMPRESS=gzip σε COMPRESS=lz4

Μετά φορτώνουμε το module

sudo modprobe -v lz4

Και κάνουμε επεξεργασία σε άλλα δυο αρχεία.

gksudo gedit /etc/initramfs-tools/modules

και προσθέτουμε μέσα τα παρακάτω, το ένα κάτω από το άλλο

lz4
lz4_compress

αποθηκεύουμε.

Επίσης,

gksudo gedit /etc/modules

και προσθέτουμε τα ίδια, με την ίδια σειρά

lz4
lz4_compress

Αποθηκεύουμε.

Τέλος, δημιουργούμε την εικόνα μόνο για τον καινούριο πυρήνα τον οποίο κάναμε εγκατάσταση.

sudo update-initramfs -c -t -k 4.12.0-30-lz4

Η παραπάνω έκδοση πυρήνα θα αλλάζει, θα αναβαθμίζεται. Δείτε ποια έκδοση γίνεται εγκατάσταση και αλλάξτε την αναλόγως.

Αυτόν που ήδη βρισκόμαστε τον αφήνουμε στην ησυχία του. Σε περίπτωση kernel panic ή οτιδήποτε άλλο, να μπορούμε να κάνουμε εκκίνηση.

TIP (lz4 zswap)

Μιας και ασχολούμαστε με την συμπίεση LZ4 και όσοι από εσάς χρησιμοποιείτε zswap, έχει γράψει σχετικό άρθρο ο Salih παλιότερα, μπορείτε να ενεργοποιήσετε και τη συμπίεση lz4 στη zswap προσθέτοντας κάποιες παραμέτρους στο αρχείο /etc/default/grub

gksudo gedit /etc/default/grub

και αλλάζουμε τη γραμμή

GRUB_CMDLINE_LINUX_DEFAULT="quiet loglevel=2"

σε

GRUB_CMDLINE_LINUX_DEFAULT="quiet loglevel=2 zswap.enabled=1 zswap.compressor=lz4"

αποθηκεύουμε και έπειτα τρέχουμε

sudo update-grub

και στην επόμενη εκκίνηση δίνοντας ένα

dmesg | grep -i zswap

θα πρέπει να μας επιστρέψει μεταξύ άλλων

zswap: loaded using pool lz4/zbud

Επίλογος

Ο οδηγός αυτός απευθύνεται εν μέρη σε νεοεισερχόμενους χρήστες στο Ubuntu. Σίγουρα απευθύνεται σε όσους από εμάς αρέσκονται να σκαλίζουν το σύστημά τους.
Πάντα να έχετε έναν πυρήνα ως backup, ειδικά εάν χρησιμοποιήσετε τη συμπίεση lz4 ή το e4rat.
Να έχετε επίσης υπόψη σας ότι σε μελλοντική αναβάθμιση πυρήνα ίσως να προκύψει ένα ωραιότατο kernel panic.
Θα ήταν συνετό, αφού ενεργοποιήσετε το lz4 για τον πυρήνα που το υποστηρίζει και δημιουργήσετε την εικόνα, έπειτα να αλλάξετε πάλι το COMPRESS σε gzip, όπως ήταν από προεπιλογή, στο αρχείο initramfs.conf.

Σημειώνετε πάντα τα βήματα που κάνετε ώστε αν χρειαστεί να κάνετε revert κάποια από αυτά, να ξέρετε αμέσως πιο αρχείο να επεξεργαστείτε.

Για κάποιον που θα χρησιμοποιήσει ακόμη και τη πρώτη παράγραφο μόνο, με την απενεργοποίηση υπηρεσιών, σίγουρα θα δει διαφορά.
Για κάποιον όμως που θα χρησιμοποιήσει όλα τα παραπάνω, η διαφορά που θα δει θα είναι αξιοσημείωτη.

Όλα τα παραπάνω είναι δοκιμασμένα σε Ubuntu 16.04 LTS. Περιμένω να λειτουργήσουν εξίσου σε Ubuntu Flavors και Derivatives (πχ Linux Mint), αλλά δεν έχουν δοκιμαστεί εκεί.

Για τη σύγκριση των αποτελεσμάτων τρέξτε, πριν εφαρμόσετε οτιδήποτε, την εντολή

systemd-analyze plot > plot-before.svg

Αφού εφαρμόσετε κάποια από (ή όλα) τα παραπάνω, τρέξτε

systemd-analyze plot > plot-after.svg

και συγκρίνετε τα αποτελέσματα.

Εάν έχετε να προσθέσετε κάτι σε αυτόν τον οδηγό γράψτε το στα σχόλια και θα προστεθεί, αφού βέβαια δοκιμαστεί.


Until next time …
Thanks for reading!

Advertisements

5 thoughts on “Μείωση χρόνου εκκίνησης (boot time) σε Ubuntu 16.04

  1. Πριν 3 μέρες εγκατέστησα το Dracut στο Ubuntu 16.02, ακολουθώντας «κατά γράμμα» τις οδηγίες και διαπίστωσα βελτίωση στον χρόνο εκκίνησης του desktop (HP-Compaq-Elite-8300) από τα 58s στα 37s…, ΑΛΛΑ σήμερα, αναγκάστηκα να απεγκαταστήσω το Dracut, επειδή στις αναβαθμίσεις του Synaptic εμφανιζόταν «εσωτερικό πρόβλημα» και έστελνε bags στην Canonical.

  2. καλησπερα!

    Μια ερωτηση .το lz4 αφορα το συνολικο decompress του kernel ? δηλαδη και του ramdisk ?

    1. Ναι. Εφόσον το compress γίνεται στη συνολική εικόνα του πυρήνα, συμπεριλαμβανομένου και του RamDisk.
      Επίσης, εάν ο πυρήνας δεν έχει built in υποστήριξη lz4 τότε θα δεις ότι κολλάει (kernel panic) ακριβώς εκεί, δηλαδή στο RamDisk (unable to mount rootfs …κλπ).

  3. μου λετε αν θελετε την διαφορα μεταξυ απλό module και built in module και τι σημαινει kernel panic;
    ΕΥΧΑΡΙΣΤΩ

    1. Ηλία, το kernel panic είναι κάτι σαν την μπλε οθόνη των windows να το πούμε λαϊκά. Χρησιμοποιείται σαν όρος στα συστήματα τύπου unix (Linux,Unix,BSD).

      Τα modules ή αρθρώματα είναι αρχεία κώδικα τα οποία επεκτείνουν τις λειτουργίες του πυρήνα. Κάποια από αυτά υπάρχουν ήδη στον πυρήνα (built in modules) και ενεργοποιούνται με κλήση αυτών κατά την εκκίνηση του. Την άλλη κατηγορία των modules πρέπει να τα χτίσουμε και να τα εισάγουμε στον πυρήνα προκειμένου να τα «καλέσουμε». H δεύτερη διαδικασία δεν είναι τόσο εύκολη όσο ακούγεται και καταφεύγουμε σε αυτή όταν μια συσκευή hardware αρνείται πεισματικά να παίξει.

Απορίες, παρατηρήσεις, ιδέες... Ελεύθερα ! Πες την άποψή σου... έστω και Ανώνυμα:

Εισάγετε τα παρακάτω στοιχεία ή επιλέξτε ένα εικονίδιο για να συνδεθείτε:

Λογότυπο WordPress.com

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό WordPress.com. Αποσύνδεση / Αλλαγή )

Φωτογραφία Twitter

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Twitter. Αποσύνδεση / Αλλαγή )

Φωτογραφία Facebook

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Facebook. Αποσύνδεση / Αλλαγή )

Φωτογραφία Google+

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Google+. Αποσύνδεση / Αλλαγή )

Σύνδεση με %s