Από πού προέρχεται αυτή η διαμόρφωση; [Debian/Ubuntu]

Ο σκοπός αυτής της ανάρτησης είναι να δείξει μια τεχνική εντοπισμού σφαλμάτων στο debian/ubuntu που σχετίζεται με την "εύρεση της πηγής" στο αρχείο διαμόρφωσης συστήματος.

Παράδειγμα δοκιμής: μετά από πολύ χλευασμό του αντιγράφου tar.gz του εγκατεστημένου λειτουργικού συστήματος και μετά την επαναφορά του και την εγκατάσταση ενημερώσεων, λαμβάνουμε το μήνυμα:

update-initramfs: Generating /boot/initrd.img-4.15.0-54-generic
W: initramfs-tools configuration sets RESUME=/dev/mapper/U1563304817I0-swap
W: but no matching swap device is available.
I: The initramfs will attempt to resume from /dev/dm-1
I: (/dev/mapper/foobar-swap)
I: Set the RESUME variable to override this.

Στόχος: κατανοήστε από πού προήλθε αυτή η τιμή (U1563304817I0) και πώς να την αλλάξετε σωστά. Αυτό είναι το πρώτο παράδειγμα που συναντήθηκε, όχι ιδιαίτερα ενδιαφέρον από μόνο του, αλλά βολικό για να δείξουμε πρακτικές μεθόδους εργασίας με Linux.

Βήμα νούμερο 1: Από πού προήλθε το RESUME;

# cd /etc
# grep -r RESUME
initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swap

Εμείς αναδρομικά (-r) αναζητήστε μια αναφορά αυτής της μεταβλητής στον κατάλογο /etc (όπου βρίσκονται οι περισσότερες από τις ρυθμίσεις παραμέτρων). Βρίσκουμε το απόσπασμα conf.d, το οποίο χρησιμοποιείται ξεκάθαρα από το πακέτο initramfs-tools.

Από πού είναι αυτό το απόσπασμα;

Υπάρχουν τρεις επιλογές:

  1. Μαγικό τεχνούργημα (κάποιος το έβαλε και το ξέχασε)
  2. Config από το πακέτο
  3. Διαμόρφωση που δημιουργείται από κάποιο σενάριο από πακέτα συστήματος

Ας ελέγξουμε το Νο. 2 (ως το πιο απλό):

 dpkg -S initramfs-tools/conf.d/resume
dpkg-query: no path found matching pattern *initramfs-tools/conf.d/resume*

dpkg -S μας επιτρέπει να κάνουμε αναζήτηση στη βάση δεδομένων των εγκατεστημένων αρχείων και να βρούμε σε ποιο πακέτο ανήκει το αρχείο. Ακολουθεί ένα παράδειγμα επιτυχημένης αναζήτησης:

dpkg -S resolv.conf
manpages: /usr/share/man/man5/resolv.conf.5.gz
systemd: /lib/systemd/resolv.conf

Ας επιστρέψουμε στο καθήκον μας: αρχείο initramfs-tools/conf.d/resume δεν είναι εγκατεστημένο στο σύστημα από το πακέτο. Ίσως δημιουργείται στο σενάριο postinst/preinst του πακέτου; Ας ελέγξουμε την έκδοση με αριθμό 3.

# cd /var/lib/dpkg/info/
# grep -r initramfs-tools/conf.d/resume *
initramfs-tools-core.postrm:    rm -f /etc/initramfs-tools/conf.d/resume

Στον κατάλογο /var/lib/dpkg/info/ υπάρχουν μη συσκευασμένες εκδόσεις όλων των «μετααρχείων» πακέτων (σενάρια εγκατάστασης/αφαίρεσης, περιγραφές πακέτων κ.λπ.). Παραδόξως, αυτό το αρχείο αφαιρείται στο postrm (κατά την απεγκατάσταση) του πακέτου initramfs-tools-core. Ας δούμε τα περιεχόμενα του postinst του... Καμία σχέση με τον κατάλογο conf.d.

Ας δούμε τα αρχεία που περιλαμβάνονται στη συσκευασία initramfs-tools-core.

# dpkg -L initramfs-tools-core
...
/usr/share/initramfs-tools/hooks/resume
...

Ομάδα dpkg -L σας επιτρέπει να προβάλετε όλα τα αρχεία που βρίσκονται στο σύστημα από το καθορισμένο πακέτο. Έχω επισημάνει ένα αρχείο που είναι ενδιαφέρον για μελέτη. Η εξέταση του αρχείου δείχνει πώς χρησιμοποιείται αυτή η μεταβλητή, αλλά δεν δείχνει από πού προέρχεται.

debconf

Αποδεικνύεται ότι αυτό είναι τεχνούργημα κάποιου. Του οποίου? Πριν βουτήξουμε στο πρόγραμμα εγκατάστασης, ας ρίξουμε μια ματιά σε μια άλλη σημαντική υποδομή του Debian - απαντήσεις σε ερωτήσεις. Κάθε φορά που ένα πακέτο κάνει μια ερώτηση και σε πολλές περιπτώσεις όταν δεν κάνει ερώτηση αλλά χρησιμοποιεί την προεπιλεγμένη επιλογή, τόσο η ερώτηση όσο και η απάντηση καταγράφονται σε μια ειδική βάση δεδομένων στο Debian που ονομάζεται debconf. Μπορούμε να δούμε τη βάση δεδομένων των απαντήσεων (και ακόμη και να τις ορίσουμε πριν εγκαταστήσουμε το ίδιο το πακέτο - debconf-set-selections), για αυτό χρειαζόμαστε ένα βοηθητικό πρόγραμμα debconf-get-selections από τη σύνθεση debconf-utils. Δυστυχώς δεν βρέθηκε κάτι ενδιαφέρον :(debconf-get-selections |grep -i resume επέστρεψε άδειο).

debian-installer

Ο εγκαταστάτης έχει τη δική του βάση δεδομένων με απαντήσεις σε ερωτήσεις: /var/log/installer/cdebconf/questions.dat. Δυστυχώς, επίσης δεν υπάρχει λέξη για το βιογραφικό μας.
Αλλά υπάρχουν κούτσουρα κοντά, συμ. syslog, όπου είναι γραμμένο ολόκληρο το αρχείο καταγραφής εγκατάστασης. Το πακέτο βασικού προγράμματος εγκατάστασης αναφέρεται εκεί και σε αυτό σελίδα μπορούμε να δούμε τον σύνδεσμο προς τις πρώτες ύλες.

Μέσα σε αυτά μπορούμε εύκολα να βρούμε την απάντηση στην ερώτησή μας:

  resume="$(mapdevfs "$resume_devfs")"; then
...
    if [ "$do_initrd" = yes ]; then
     ...
            resumeconf=$IT_CONFDIR/resume
....
                echo "RESUME=$resume" >> $resumeconf

Το mapdevfs είναι ένα βοηθητικό πρόγραμμα με σαφή σκοπό και η λειτουργία που μας ενδιαφέρει είναι get_resume_partition, το οποίο διαβάζει /proc/swaps και επιλέγει το μεγαλύτερο εκεί. Το Swap προέρχεται από τον partman.

Η απάντηση στην δοκιμαστική μας εργασία: το αρχείο δημιουργείται από το πρόγραμμα εγκατάστασης στο /target τη στιγμή της εγκατάστασης, π.χ. μιλάμε για γνωστό, αλλά τεχνούργημα. Δεν υπάρχει κανένας ή τίποτα στα υπάρχοντα πακέτα στο σύστημα που να μπορεί να αλλάξει αυτό το αρχείο.

Ανακεφαλαίωση

  1. dpkg και debconf είναι οι κύριες μέθοδοι για την εύρεση παρόχων αρχείων.
  2. Η αναζήτηση στο /var/lib/dpkg/info σάς επιτρέπει να βλέπετε λειτουργίες σε αρχεία κατά τη φάση εγκατάστασης.
  3. Το πρόγραμμα εγκατάστασης μπορεί να δημιουργήσει αρχεία τεχνουργημάτων που στη συνέχεια δεν αλλάζουν ποτέ από κανέναν (εκτός από τον χρήστη) και αυτό μπορεί να φανεί στον κώδικα του προγράμματος εγκατάστασης.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο