Σελίδα 1 από 1

Script για διόρθωση «σπασμένων» αναβαθμίσεων/ενημερώσεων

ΔημοσίευσηΔημοσιεύτηκε: 25 Οκτ 2015, 12:30
από fkol k4
Αν και όχι συχνά, μερικές φορές συμβαίνει κάτι να πάει στραβά σε μια αναβάθμιση ή ενημέρωση και κάτι «σπάει» στο λειτουργικό

Με αφορμή το πρόσφατο σπάσιμο στη δική μου αναβάθμιση λοιπόν, είπα να αυτοματοποιήσω λιγάκι τη διαδικασία με ένα απλό σκριπτάκι ώστε να μη χρειάζεται να ψάχνω τι έσπασε, τουλάχιστον όσον αφορά το βασικό προεγκαταστημένο σύστημα.
Και μιας που το έφτιαξα, το ποστάρω εδώ μήπως θελήσει να το χρησιμοποιήσει και κάποιος άλλος που θα βρεθεί σε παρόμοια θέση.
Το σκριπτάκι αυτό κάνει για όλα τα επίσημα flavours του Ubuntu (Ubuntu, Kubuntu, Xubuntu, Lubuntu, Ubuntu GNOME, Ubuntu MATE, UbuntuKylin, UbuntuStudio, Mythbuntu, Edubuntu).
Οι ενέργειες που κάνει είναι οι παρακάτω:

  • Βρίσκει την έκδοση του λειτουργικού (πχ 14.04) και την αρχιτεκτονική του (64 ή 32 bit).
  • Τρέχει κάποιες εντολές apt-get για την ενημέρωση και τον καθαρισμό του συστήματος.
  • Κατεβάζει το αρχείο manifest της έκδοσης. Αυτό είναι ένα αρχείο που περιγράφει όλα τα προεγκαταστημένα πακέτα που θα έπρεπε να έχει το λειτουργικό.
  • Επανεγκαθιστά όλα τα παραπάνω πακέτα.

Αυτό σημαίνει πως αν έχει σπάσει κάποιο κομμάτι από το βασικό σύστημα, αυτό θα επανεγκατασταθεί (ίσως να χρειαστεί να τρέξει το σκριπτ δύο φορές).
Παρακάτω το σκριπτ:
Spoiler: show
Μορφοποιημένος Κώδικας: Επιλογή όλων
#! /bin/bash

# Type: Bash script

# Tries to repair basic Ubuntu (and official flavours) installation
# by reinstalling default packages.

# Copyright (C) 2015 fkol-k4 ( https://github.com/fkol-k4 )

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation version 2.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.


## Script functions
function txt_formatting() {
# text formatting options
bold='\e[1m'
underline='\e[4m'
reset='\e[0m'
}

function usage_msg() {
# script usage message
clear
txt_formatting
echo -e "$bold
No or invalid parameter!
$reset
Please try again running the script with a proper parameter...
$bold
Usage:$reset $scriptname <flavour>
$bold
Available flavours:$reset ubuntu
kubuntu
xubuntu
lubuntu
ubuntu-gnome
ubuntu-mate
ubuntukylin
ubuntustudio
edubuntu
mythbuntu
$underline$bold
Example:$reset $scriptname ubuntu-mate
"
exit 1
}

function get_manifest() {
# build info for necessary manifest file & url
name="$(lsb_release -sc)"
version="$(lsb_release -sr)"
if [[ $(arch) == x86_64 ]]; then
sys_arch="amd64"
else
sys_arch="i386"
fi
# build manifest file url
if [[ $1 == "ubuntu" ]]; then
manifest_url="http://releases.ubuntu.com/$name/$flavour-$version-desktop-$sys_arch.manifest"
elif [[ $1 =~ ^("kubuntu"|"xubuntu"|"lubuntu"|"ubuntu-gnome"|"ubuntu-mate"|"ubuntukylin"|"ubuntustudio")$ ]]; then
manifest_url="http://cdimage.ubuntu.com/$flavour/releases/$name/release/$flavour-$version-desktop-$sys_arch.manifest"
elif [[ $1 == "mythbuntu" ]] || [[ $1 == "edubuntu" ]]; then
manifest_url="http://cdimage.ubuntu.com/$flavour/releases/$name/release/$flavour-$version-dvd-$sys_arch.manifest"
else
usage_msg
fi
# make workfolder
mkdir -p /tmp/repair
cd /tmp/repair/
rm -rf ./*.manifest
# download manifest file
wget "$manifest_url"
cd "$HOME"
}

function apt_repair() {
sudo apt-get update
sudo apt-get --yes --force-yes dist-upgrade
sudo apt-get --yes clean
sudo apt-get --yes autoclean
sudo apt-get --yes --purge autoremove
sudo apt-get --yes --force-yes --fix-missing install
sudo apt-get --yes --force-yes --fix-broken install
sudo dpkg --configure -a
}

function install_basics() {
# define basic packages list
manifest_file=$(ls /tmp/repair/ | grep manifest)
package_list=($(cat "/tmp/repair/$manifest_file" | awk '$0 {print $1}'))
# install basic packages
for package in ${package_list[@]}; do
sudo apt-get --yes --force-yes --no-install-recommends --reinstall install "$package"
done
}


## Main script
# global variables
export scriptname=$0
export flavour=$1

if [ $# -lt 1 ]; then
# run on no parameter
usage_msg
fi
get_manifest $flavour
apt_repair
install_basics

Για να το χρησιμοποιήσετε:
  • Αντιγράφετε σε έναν κειμενογράφο τον κώδικα.
  • Το σώζετε με ένα όνομα της επιλογής σας.
  • Το μετατρέπετε σε εκτελέσιμο αρχείο.
  • Μεταφέρεστε στον φάκελο που το αποθηκεύσατε.
  • Τρέχετε το σκριπτάκι βάζοντας ως παράμετρο το flavour του λειτουργικού σας.
    Για παράδειγμα, αν έχετε αποθηκεύσει το σκριπτάκι ως repair και έχετε εγκαταστημένο το Ubuntu GNOME. τότε δίνετε από το τερματικό την εντολή
    Κώδικας: Επιλογή όλων
    ./repair ubuntu-gnome
    ** Αν τρέξετε το σκριπτάκι χωρίς παράμετρο (πχ σκέτο ./repair), θα σας βγάλει ένα μήνυμα με το ποιες είναι οι διαθέσιμες παράμετροι.


Για όποιον βαριέται να αντιγράφει, μπορεί να κατεβάσει το σκριπτάκι από το αποθετήριο στο Github όπου βρίσκεται στον προσωπικό του φάκελο και να το χρησιμοποιεί από εκεί με την παρακάτω εντολή:
Κώδικας: Επιλογή όλων
wget -O repair https://raw.githubusercontent.com/fkol-k4/generic_files/master/systemfiles-ubuntu/usr/local/bin/custom/custom_repair-basics; chmod +x repair


Για όποιον επιπλέον βαριέται να μεταφέρεται στον φάκελο με το script και θέλει να το εκτελεί από οπουδήποτε, με την παρακάτω το script θα κατέβει στο /usr/local/bin/ το οποίο βρίσκεται στο $PATH του λειτουργικού, οπότε πλέον καλείται από οπουδήποτε και χωρίς το πρόθεμα ./, δηλ. απλά με repair ubuntu-gnome:
Κώδικας: Επιλογή όλων
sudo su -c 'mkdir -p /usr/local/bin; wget -O /usr/local/bin/repair https://raw.githubusercontent.com/fkol-k4/generic_files/master/systemfiles-ubuntu/usr/local/bin/custom/custom_repair-basics; chmod +x /usr/local/bin/repair'


Σημειώσεις:
  • Το script δεν διορθώνει τα πάντα φυσικά, αλλά τα προεγκαταστημένα πακέτα καλύπτουν πολλές βασικές λειτουργίες οπότε μπορεί να χρησιμοποιηθεί για πολλές περιπτώσεις
  • Μπορείτε να τρέξετε το σκριπτάκι στην εγκατάστασή σας ακόμα και αν δεν έχετε κανένα πρόβλημα. Δεν κάνει ζημιά στην εγκατάσταση, κατεβάζει όμως πολλά πακέτα και τα επανεγκαθιστά ένα-ένα οπότε είναι και αρκετά χρονοβόρο αλλά και ιντερνετοβόρο (sic), οπότε ίσως να θέλετε να το αποφύγετε
  • Δώστε σαν παράμετρο το σωστό flavour. Αν πχ έχετε εγκαταστημένο Xubuntu, δώστε 'xubuntu' για παράμετρο. Αν δώσετε άλλο (πχ kubuntu), δεν θα διαγράψει μεν αυτό που ήδη έχετε, θα εγκαταστήσει όμως ολόκληρο το άλλο flavour. Εκτός αν θέλετε και τα δύο, οπότε τότε είναι εντάξει.
  • Δυστυχώς μιας και για τις άλλες Ubuntu - based διανομές (πχ Linux Mint, elementaryOS κτλ) δεν βρήκα δημοσιευμένα αρχεία manifest, το script δεν γίνεται να λειτουργήσει γι αυτές. Επίσης δεν γίνεται να λειτουργήσει σε εγκαταστάσεις τις οποίες κάποιος έχει χτίσει κομμάτι-κομμάτι (τουλάχιστον όχι χωρίς κάποιες μετατροπές), αν και χρήστες με τέτοιες εγκαταστάσεις το χρειάζονται λιγότερο.
  • Patches - bug reports are welcome!!!
  • Το δημοσιεύω στα Γενικά μιας και δεν ξέρω που ακριβώς πρέπει να πάει (οδηγός δεν είναι και έργο λογισμικού δεν το λες κιόλας...). Αν βρείτε καλύτερη θέση, ξέρετε... ;)

Re: Script για διόρθωση «σπασμένων» αναβαθμίσεων/ενημερώσεων

ΔημοσίευσηΔημοσιεύτηκε: 28 Οκτ 2015, 23:38
από Learner
Πολύ καλό και χρήσιμο. :thumbup:
Μήπως να το μεταφέρουμε στους οδηγούς με τίτλο, πχ "Διόρθωση «σπασμένων» αναβαθμίσεων/ενημερώσεων" ;

Βέβαια εξ' όσων γνωρίζω, το αρχείο manifest περιέχει πακέτα που περιλαμβάνονται στην live έκδοση του Ubuntu και κάποια από αυτά αφαιρούνται όταν τελειώσει η εγκατάσταση. Δεν ξέρω γιατί, ίσως τα θεωρούν αχρείαστα. Προς το παρόν όμως δεν βλέπω άλλη καλύτερη λύση.
Ίσως θα μπορούσες να εξετάσεις το ενδεχόμενο να διαβάζει local το αρχείο /var/log/installer/initial-status.gz το οποίο περιέχει τα πακέτα που έγιναν εγκατάσταση την πρώτη φορά; δεν ξέρω όμως τι παίζει με τις αναβαθμίσεις (δηλαδή αν κάνεις αναβάθμιση από μια διανομή σε επόμενη τι γίνεται με αυτό το αρχείο).

Re: Script για διόρθωση «σπασμένων» αναβαθμίσεων/ενημερώσεων

ΔημοσίευσηΔημοσιεύτηκε: 29 Οκτ 2015, 07:23
από Tassos10
Πολύ ωραίος μεγάλε..! Μπράβο! ;)
Φαίνεται ωραία δουλίτσα, μπράβο σου! :)

Εγώ είδα από εδώ τον κώδικα σου , αλλά βλέπω πως έχεις ανεβάσεις και άλλα πράγματα.. ωραίος.

Re: Script για διόρθωση «σπασμένων» αναβαθμίσεων/ενημερώσεων

ΔημοσίευσηΔημοσιεύτηκε: 29 Οκτ 2015, 20:12
από fkol k4
Learner έγραψε:Πολύ καλό και χρήσιμο. :thumbup:
Μήπως να το μεταφέρουμε στους οδηγούς με τίτλο, πχ "Διόρθωση «σπασμένων» αναβαθμίσεων/ενημερώσεων" ;

Βέβαια εξ' όσων γνωρίζω, το αρχείο manifest περιέχει πακέτα που περιλαμβάνονται στην live έκδοση του Ubuntu και κάποια από αυτά αφαιρούνται όταν τελειώσει η εγκατάσταση. Δεν ξέρω γιατί, ίσως τα θεωρούν αχρείαστα. Προς το παρόν όμως δεν βλέπω άλλη καλύτερη λύση.
Ίσως θα μπορούσες να εξετάσεις το ενδεχόμενο να διαβάζει local το αρχείο /var/log/installer/initial-status.gz το οποίο περιέχει τα πακέτα που έγιναν εγκατάσταση την πρώτη φορά; δεν ξέρω όμως τι παίζει με τις αναβαθμίσεις (δηλαδή αν κάνεις αναβάθμιση από μια διανομή σε επόμενη τι γίνεται με αυτό το αρχείο).

Ενδιαφέρον, δεν το είχα υπόψη μου το αρχείο αυτό.
Το κοίταξα, αλλά δυστυχώς δεν νομίζω πως κάνει για πηγή.
Στο δικό μου πχ αν και η εγκατάσταση μετά την αναβάθμιση είναι πλέον 15.10, περιγράφονται τα πακέτα που εγκαταστάθηκαν με την 15.04 (πχ linux-image-extra-3.19.0-15-generic), οπότε εκεί δημιουργείται πρόβλημα, μιας και δεν θα ψάχνουμε πακέτα της τρέχουσας έκδοσης.
Μια πρόχειρη λύση είναι να φιλτράρουμε από τη λίστα κάποια standard πακέτα που ξέρουμε πως δεν θέλουμε να εγκατασταθούν. πχ Ubiquity.
Θα το κοιτάξω και θα ενημερώσω και το θέμα.
Όσο για οδηγό, δεν ξέρω... ψιλο«χασάπικη» λύση είναι εδώ που τα λέμε, απλά καλό είναι να είναι στα υπόψιν!
Tassos10 έγραψε:Πολύ ωραίος μεγάλε..! Μπράβο! ;)
Φαίνεται ωραία δουλίτσα, μπράβο σου! :)

Εγώ είδα από εδώ τον κώδικα σου , αλλά βλέπω πως έχεις ανεβάσεις και άλλα πράγματα.. ωραίος.

Ευχαριστώ.
Έχω ανεβάσει κυρίως πράγματα που μου χρησιμεύουν για το στήσιμο του δικού μου συστήματος, όπως έξτρα βοηθητικά σκριπτάκια, εικονίδια με την interetοφάτσα μου (!), dotfiles κτλ, έχω προσπαθήσει όμως να μην κάνω τη ζωή δύσκολη και σε κάποιον άλλον που θα τα βρει χρήσιμα και θα θελήσει να τα χρησιμοποιήσει με λίγες μετατροπές.
Δυστυχώς ειδικά τον τελευταίο καιρό δεν έχω ασχοληθεί όσο θα έπρεπε (ή όσο θα ήθελα).

Re: Script για διόρθωση «σπασμένων» αναβαθμίσεων/ενημερώσεων

ΔημοσίευσηΔημοσιεύτηκε: 13 Νοέμ 2016, 04:44
από eliasps
Καιρό είχα να συναντήσω πρόβλημα στην εγκατάστασή μου με broken packages το οποίο δεν κατάφερα με τίποτα να διορθώσω. Συνήθως σε τέτοιες περιπτώσεις πάω για format αλλά δεν έχω καμία όρεξη. Πάνω στην απελπισία μου θυμήθηκα τη λέξη "manifest" που είχε αναφέρει κάποτε ο Φίλιππος σχετικά με την διόρθωση πακέτων και ήρθα για ειδική αναζήτηση στο forum με λέξη κλειδί το "manifest" και username "fkol k4". Life-saver...

Εν ολίγοις, όλα τα πακέτα του συστήματος (ή σχεδόν όλα), και μιλάω για core πακέτα αναβαθμίστηκαν από experimental αποθετήριο που πρόσθεσα και όταν τελικά το αφαίρεσα επικρατούσε χάος. Το script πιθανότατα θα αντικαταστήσει τις εκδόσεις των πακέτων σε όλο το σύστημα, ούτε αύριο δεν θα τελειώσει. Αλλά από το να κάνω πάλι format, καλύτερα να κοιμάμαι και αυτό να δουλεύει!

Ευχαριστώ!