Bash-Skript zum Backkup / Klonen von Ubuntu auf eine andere Partition

12

Ubuntu 18.04 wurde am 26. April 2018 veröffentlicht und ich möchte versuchen, meine Programme zu aktualisieren und meine Daten zu konvertieren, möchte aber keine Festschreibung vornehmen, wenn es Fehler gibt.

Ich habe Windows von 410 GB auf 385 GB verkleinert, Ubuntu 16.04 neu gestartet und gpartedeine neue 25-GB-Partition mit der Bezeichnung "Ubuntu18.04" erstellt. Ich habe rm-kernelsungefähr 20 Kernel ausgeführt und entfernt, um ungefähr 10 GB unter Ubuntu 16.04 zu eliminieren.

Jetzt möchte ich ein Skript, das die neue Partition mit 16.04 LTS füllt und eine neue Grub-Menüoption dazu erstellt. Es sollten nur relevante Verzeichnisse kopiert werden. Zum Beispiel /sys, /run, /procund /devsind virtuelle Verzeichnisse beim Booten erstellt und soll nicht kopiert werden.

Ich möchte auch /etc/fstabmit der richtigen UUID gepatcht und cronNeustartjobs deaktiviert werden, damit tägliche Sicherungen auf geklonten Daten nach dem Booten des Klons nicht ausgeführt werden.

Ich gehe davon aus, dass ich das Skript in den nächsten Wochen / Monaten mehrmals ausführen werde. Daher sollte der Klonprozess mühelos wiederholbar sein.

Das gleiche Skript kann zum Testen von Sicherheitsupdates und neuen Ubuntu Kernel Team-Updates verwendet werden, ohne die Produktionssysteme zu beeinträchtigen.

WinEunuuchs2Unix
quelle
20 Kernel benötigen 10 GB !!!? Haben Sie versehentlich die Kernel Bloated Edition installiert?
Lie Ryan
@LieRyan Es sind tatsächlich 400 MB pro Kernel und nicht 500 MB, da ich die Zahlen gerundet habe (ungefähr 20 Kernel). Um zu sehen, wie viel jeder Kernel belegt (schwankt bei meiner aktuellen Installation zwischen 394 MB und 419 MB), siehe: askubuntu.com/questions/949411/…
WinEunuuchs2Unix

Antworten:

18

Bash-Skript zum Klonen der aktiven Ubuntu-Partition zum Klonen der Partition

Das clone-ubuntu.shBash-Skript repliziert 16.04 LTS nahtlos und sicher in eine Partition, um ein Upgrade auf 18.04 LTS durchzuführen:

clone-ubuntu.png

Wichtige Punkte zu beachten:

  • Sie müssen eine leere ext4Partition erstellen, die groß genug ist, um einen Ubuntu 16.04-Klon aufzunehmen
  • Beim Aufrufen des Skripts kann clone-ubuntu.shdie Partition nicht bereitgestellt werden. Das Skript aktiviert und deaktiviert die Partition automatisch.
  • Der Befehl rsyncwird verwendet, um Dateien von /auf die Klonpartition zu kopieren . Das erste Mal, wenn Sie es ausführen clone-ubuntu.sh, dauert es einige Minuten. Wenn Sie das Skript zum zweiten Mal ausführen, werden nur Dateiänderungen aktualisiert, und es sollte weniger als eine Minute dauern.
  • Sie können dieses Skript ausführen und mehrmals neu starten. Alle neuen Daten auf dem Klonziel werden gelöscht, um die aktuellen /Dateien und Verzeichnisse zu spiegeln .
  • Alle Cron- /etc/cron.dJobs (Neustart) werden in ein neues Unterverzeichnis namens verschoben /etc/cron.d/hold. Denken Sie nach dem Booten des Klons daran, ausgeführt sudo crontab -ezu werden, um zu verhindern, dass ausgewählte Cron-Jobs ausgeführt werden.
  • Die geklonte Datei /etc/fstabwird mit der entsprechenden UUID für die Partition geändert, auf der sie sich befindet.
  • Die geklonte Datei /boot/grub/grub.cfgwird mit der entsprechenden UUID für einen erfolgreichen Klonstart geändert. Die geklonten Dateien werden in quiet splashgeändert, nosplashsodass Sie Bildlauf-Terminal-Nachrichten erhalten. Dies gibt dem visuellen Bewusstsein das Booten eines Klons anstelle einer "echten" Version.
  • update-grub wird ausgeführt, um Grub mit neuen Menüoptionen zu aktualisieren, die auf die geklonte Partition verweisen.
  • Die geklonte Datei /etc/update-manager/release-upgradeswird auf Änderung geändert Prompt=neverzu Prompt=lts. Wenn Sie den Klon starten und ausführen, do-release-upgrade -dkann Ubuntu 16.04 auf 18.04 aktualisiert werden.
  • Vor dem Klonen wird ein Bestätigungsbildschirm angezeigt (siehe nächster Abschnitt), und Sie müssen y / Y eingeben, um fortzufahren.

Bestätigungsbildschirm

Nach Auswahl einer Zielklonpartition wird zunächst der ext4Partitionstyp überprüft und ist noch nicht bereitgestellt. Wenn dieser Test bestanden wurde, wird eine Bestätigungsmeldung angezeigt:

=====================================================================
Mounting clone partition /dev/nvme0n1p8 as /mnt/clone16.04

=====================================================================
PLEASE: Carefully confirm Source (Live) and Target (Clone) partitions

SOURCE (BOOT /):  /dev/nvme0n1p5      TARGET (CLONE):  /dev/nvme0n1p8
ID:               Ubuntu              ID:              Ubuntu
RELEASE:          16.04               RELEASE:         16.04
CODENAME:         xenial              CODENAME:        xenial
DESCRIPTION:      Ubuntu 16.04.3 LTS  DESCRIPTION:     Ubuntu 16.04.3 LTS
 Size  Used Avail Use%                 Size  Used Avail Use%
  44G   17G   26G  40%                  24G   17G  5.8G  74%

NOTE: If you are recloning, new files in clone will be deleted,
      modified files are reset to current source content and,
      files deleted from clone are added back from source.

Type Y (or y) to proceed. Any other key to exit: 

In diesem Beispiel wurde ein vorheriger Klon zum erneuten Klonen ausgewählt. Der verfügbare Speicherplatz auf dem Klon ist stummgeschaltet, da wir bereits wissen, dass genügend Speicherplatz verfügbar ist.

Wenn Sie mehrere Ubuntu-Installationen haben, überprüfen Sie bitte, ob Sie die richtige Partition ausgewählt haben, um das aktuell gebootete Ubuntu, das als /(root) gemountet ist, zu klonen .

Dies ist Ihre letzte Chance zum Abbrechen, indem Sie eine beliebige Taste außer yoder drücken Y.


Ausgabeauflistung

Wenn Sie das Skript ausführen, erhalten Sie diese Ausgabe (mit Ausnahme der oben bereits aufgeführten Ausgabe):

=====================================================================
Using rsync to clone / to /dev/nvme0n1p8 mounted as /mnt/clone16.04
          6.11G  38%   86.46MB/s    0:01:07 (xfr#139123, to-chk=0/647700)   

Number of files: 647,700 (reg: 470,100, dir: 104,694, link: 72,903, special: 3)
Number of created files: 127,824 (reg: 72,472, dir: 15,825, link: 39,526, special: 1)
Number of deleted files: 73,318 (reg: 59,766, dir: 9,701, link: 3,847, special: 4)
Number of regular files transferred: 139,123
Total file size: 15.92G bytes
Total transferred file size: 6.11G bytes
Literal data: 6.11G bytes
Matched data: 0 bytes
File list size: 8.50M
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 6.14G
Total bytes received: 7.82M

sent 6.14G bytes  received 7.82M bytes  89.74M bytes/sec
total size is 15.92G  speedup is 2.59

Time to clone files: 68 Seconds

=====================================================================
Making changes in: /mnt/clone16.04/etc/update-manager/release-upgrades
     from Prompt=: never
       to Prompt=: lts
Allows running 'do-release-upgrade -d' when rebooting clone target
Consider 'do-release-upgrade -d -f DistUpgradeViewNonInteractive' This
allows you to go to bed or go to lunch whilst upgrade runs.

* * *  When you Upgrade, TURN OFF screen locking for inactivity. * * *

=====================================================================
Making changes in: /mnt/clone16.04/etc/fstab
        from UUID: f3f8e7bc-b337-4194-88b8-3a513f6be55b
          to UUID: 113f9955-a064-4ce2-9cae-74f2a9518550

=====================================================================
Making changes in: /mnt/clone16.04/boot/grub/grub.cfg
        from UUID: f3f8e7bc-b337-4194-88b8-3a513f6be55b
          to UUID: 113f9955-a064-4ce2-9cae-74f2a9518550
Also change 'quiet splash' to 'nosplash' for environmental awareness
Suggest first time booting clone you make wallpaper unique

=====================================================================
Calling 'update-grub' to create new boot menu
Generating grub configuration file ...
Found background: /home/rick/Pictures/1600x900/21.jpg
Found background image: /home/rick/Pictures/1600x900/21.jpg
Found linux image: /boot/vmlinuz-4.14.34-041434-generic
Found initrd image: /boot/initrd.img-4.14.34-041434-generic
Found linux image: /boot/vmlinuz-4.14.31-041431-generic
Found initrd image: /boot/initrd.img-4.14.31-041431-generic
Found linux image: /boot/vmlinuz-4.14.30-041430-generic
Found initrd image: /boot/initrd.img-4.14.30-041430-generic
Found linux image: /boot/vmlinuz-4.14.27-041427-generic
Found initrd image: /boot/initrd.img-4.14.27-041427-generic
Found linux image: /boot/vmlinuz-4.14.15-041415-generic
Found initrd image: /boot/initrd.img-4.14.15-041415-generic
Found linux image: /boot/vmlinuz-4.14.10-041410-generic
Found initrd image: /boot/initrd.img-4.14.10-041410-generic
Found linux image: /boot/vmlinuz-4.14.4-041404-generic
Found initrd image: /boot/initrd.img-4.14.4-041404-generic
Found linux image: /boot/vmlinuz-4.14.2-041402-generic
Found initrd image: /boot/initrd.img-4.14.2-041402-generic
Found linux image: /boot/vmlinuz-4.13.9-041309-generic
Found initrd image: /boot/initrd.img-4.13.9-041309-generic
Found linux image: /boot/vmlinuz-4.10.0-42-generic
Found initrd image: /boot/initrd.img-4.10.0-42-generic
Found linux image: /boot/vmlinuz-4.9.77-040977-generic
Found initrd image: /boot/initrd.img-4.9.77-040977-generic
Found linux image: /boot/vmlinuz-4.4.0-104-generic
Found initrd image: /boot/initrd.img-4.4.0-104-generic
Found linux image: /boot/vmlinuz-3.16.53-031653-generic
Found initrd image: /boot/initrd.img-3.16.53-031653-generic
Found Windows Boot Manager on /dev/nvme0n1p2@/EFI/Microsoft/Boot/bootmgfw.efi
Found Ubuntu 16.04.3 LTS (16.04) on /dev/nvme0n1p8
Found Windows Boot Manager on /dev/sda1@/efi/Microsoft/Boot/bootmgfw.efi
Adding boot menu entry for EFI firmware configuration
done

=====================================================================
Unmounting /dev/nvme0n1p8 as /mnt/clone16.04

rsync Statusanzeige für neuen Klon

Beim ersten Klonen rsyncwird eine Aktualisierung von 0 auf 100% aller erstellten Dateien angezeigt. Es werden keine Dateien gelöscht oder geändert, da der Klon leer ist:

clone-ubuntu.sh leer clone.gif

rsync Statusanzeige beim erneuten Klonen

Beim rsyncerneuten Klonen wird es nie getroffen, 100%da Dateien, die sich nie geändert haben, nicht kopiert werden. Der Aktualisierungsfortschritt verzögert rsyncsich, wenn nach der nächsten zu kopierenden Datei gesucht wird und neue Dateien gelöscht werden, die im Klon erstellt wurden und im Original nie vorhanden waren:

clone-ubuntu-rsync.gif


Bash-Skript - clone-ubuntu.sh

#!/bin/bash

# NAME: clone-ubuntu.sh
# PATH: /usr/local/bin
# DESC: Written for AU Q&A: /ubuntu/1028604/bash-seemless-safe-script-to-upgrade-16-04-to-18-04/1028605#1028605
# DATE: Apr 27, 2018. Modified May 6, 2018.

# UPDT: May 02 2018 - Display selected parition and get confirmation.
#       May 06 2018 - Revise `do-release-upgrade -d` instructions.
#                     Correct listing of files in empty target partition.
#       Aug 09 2018 - Add --inplace parameter to `rsync`
#                     Comment out disabling `/etc/cron.d` on clone target.
#                     Users may uncomment and/or revise to their needs.

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    notify-send --urgency=critical \ 
                "$0 cannot be run from GUI without TERM environment variable."
    exit 1
fi

# Must run as root
if [[ $(id -u) -ne 0 ]] ; then echo "Usage: sudo $0" ; exit 1 ; fi

#
# Create unqique temporary file names
#

tmpPart=$(mktemp /tmp/clone-ubuntu.XXXXX)   # Partitions list
tmpMenu=$(mktemp /tmp/clone-ubuntu.XXXXX)   # Menu list
tmpInf1=$(mktemp /tmp/clone-ubuntu.XXXXX)   # Soucre (Booted) Ubuntu Info
tmpInf2=$(mktemp /tmp/clone-ubuntu.XXXXX)   # Target (Cloned) Ubuntu Info
tmpInf3=$(mktemp /tmp/clone-ubuntu.XXXXX)   # Work file used by DistInfo ()

#
# Function Cleanup () Removes temporary files
#

CleanUp () {
    [[ -f "$tmpPart" ]] && rm -f "$tmpPart" # If we created temp files
    [[ -f "$tmpMenu" ]] && rm -f "$tmpMenu" #  at various program stages
    [[ -f "$tmpInf1" ]] && rm -f "$tmpInf1" #  then remove them before
    [[ -f "$tmpInf2" ]] && rm -f "$tmpInf2" #  exiting.
    [[ -f "$tmpInf3" ]] && rm -f "$tmpInf3"

    if  [[  -d "$TargetMnt" ]]; then        # Did we create a clone mount?
        umount "$TargetMnt" -l              # Unmount the clone
        rm  -d "$TargetMnt"                 # Remove clone directory
    fi
}

#
# Function GetUUID () gets UUIDs of source and clone target partitions in menu.
#

GetUUID () {

    SrchLine="$1"                           # menu line passed to function
    UUID_col=0                              # start column of UUID in line
    lsblk -o NAME,UUID > "$tmpPart"         # Get list of UUID's

    while read -r UUID_Line; do             # Read through UUID list

        # Establish UUID position on line
        if [[ $UUID_col == 0 ]] ; then      # First time will be heading
            UUID_col="${UUID_Line%%UUID*}"  # Establish column number
            UUID_col="${#UUID_col}"         #  where UUID appears on line
            NameLen=$(( UUID_col - 1 ))     # Max length of partition name
            continue                        # Skip to read next line
        fi

        # Check if Passed line name (/dev/sda1, /nvme01np8, etc.) matches.
        if [[ "${UUID_Line:0:$NameLen}" == "${SrchLine:0:$NameLen}" ]] ; then
            FoundUUID="${UUID_Line:UUID_col:999}"
            break                           # exit function
        fi

    done < "$tmpPart"                       # Read next line & loop back
}


#
# Function DistInfo () builds information about source & target partitions
#

DistInfo () {

    Mount="$1"                              # Mount name is '/' or $TargetMnt
    FileName="$2"                           # "$tmpInf1" or "$tmpInf2" work file
    cat "$Mount"/etc/lsb-release >> "$FileName"
    sed -i 's/DISTRIB_//g' "$FileName"      # Remove DISTRIB_ prefix.
    sed -i 's/=/:=/g' "$FileName"           # Change "=" to ":="
    sed -i 's/"//g' "$FileName"             # Remove " around "Ubuntu 16.04...".

    # Align columns from "Xxxx:=Yyyy" to "Xxxx:      Yyyy"
    cat "$FileName" | column -t -s '=' > "$tmpInf3"
    cat "$tmpInf3" > "$FileName"
}


#
# Mainline
#

lsblk -o NAME,FSTYPE,LABEL,SIZE,MOUNTPOINT > "$tmpMenu"

i=0
SPACES='                                                                     '
DoHeading=true
AllPartsArr=()      # All partitions.

# Build whiptail menu tags ($i) and text ($Line) into array

while read -r Line; do
    if [[ $DoHeading == true ]] ; then
        DoHeading=false                     # First line is the heading.
        MenuText="$Line"                    # Heading for whiptail.
        FSTYPE_col="${Line%%FSTYPE*}"           
        FSTYPE_col="${#FSTYPE_col}"         # Required to ensure `ext4`.
        MOUNTPOINT_col="${Line%%MOUNTPOINT*}"
        MOUNTPOINT_col="${#MOUNTPOINT_col}" # Required to ensure not mounted.
        continue
    fi

    Line="$Line$SPACES"                     # Pad extra white space.
    Line=${Line:0:74}                       # Truncate to 74 chars for menu.

    if [[ "${Line:MOUNTPOINT_col:4}" == "/   " ]] ; then
        GetUUID "$Line"
        SourceUUID=$FoundUUID
        # Build "/dev/Xxxxx" FS name from "├─Xxxxx" lsblk line
        SourceDev="${Line%% *}"
        SourceDev=/dev/"${SourceDev:2:999}"
    fi

    AllPartsArr+=($i "$Line")               # Menu array entry = Tag# + Text.
    (( i++ ))

done < "$tmpMenu"                           # Read next "lsblk" line.

#
# Display whiptail menu in while loop until no errors, or escape,
# or valid partion selection .
#

DefaultItem=0

while true ; do

    # Call whiptail in loop to paint menu and get user selection
    Choice=$(whiptail \
        --title "Use arrow, page, home & end keys. Tab toggle option" \
        --backtitle "Clone 16.04 for upgrade.  ONLY CLONES / PARTITION" \
        --ok-button "Select unmounted partition" \
        --cancel-button "Exit" \
        --notags \
        --default-item "$DefaultItem" \
        --menu "$MenuText" 24 80 16 \
        "${AllPartsArr[@]}" \
        2>&1 >/dev/tty)

    clear                                   # Clear screen.
    if [[ $Choice == "" ]]; then            # Escape or dialog "Exit".
        CleanUp
        exit 0;
     fi

    DefaultItem=$Choice                     # whiptail start option.
    ArrNdx=$(( $Choice * 2 + 1))            # Calculate array offset.
    Line="${AllPartsArr[$ArrNdx]}"          # Array entry into $Line.

    # Validation - Don't wipe out Windows or Ubuntu 16.04:
    # - Partition must be ext4 and cannot be mounted.

    if [[ "${Line:FSTYPE_col:4}" != "ext4" ]] ; then
        echo "Only 'ext4' partitions can be clone targets."
        read -p "Press <Enter> to continue"
        continue
    fi

    if [[ "${Line:MOUNTPOINT_col:4}" != "    " ]] ; then
        echo "A Mounted partition cannot be a clone target."
        read -p "Press <Enter> to continue"
        continue
    fi

    GetUUID "$Line"                         # Get UUID of target partition.
    TargetUUID=$FoundUUID

    # Build "/dev/Xxxxx" FS name from "├─Xxxxx" menu line
    TargetDev="${Line%% *}"
    TargetDev=/dev/"${TargetDev:2:999}"

    break                                   # Validated: Break menu loop.

done                                        # Loop while errors.

#
# Mount Clone Target partition
#

Release=$(lsb_release -rs)                  # Source version ie: '16.04'
TargetMnt="/mnt/clone$Release"

echo ""
echo "====================================================================="
echo "Mounting clone partition $TargetDev as $TargetMnt"
mkdir -p "$TargetMnt"                       # '-p' directory may already exist
mount -t auto -v $TargetDev "$TargetMnt" > /dev/null

# Confirm partition is empty. If not empty confirm it's Ubuntu. If not exit.
# If Ubuntu display prompt with the version it contains and get confirmation.

echo ""
echo "====================================================================="
echo "PLEASE: Carefully confirm Source (Live) and Target (Clone) partitions"

# Build source information (our current boot partition)
echo "SOURCE (BOOT /)=$SourceDev"  > "$tmpInf1"
DistInfo "/" "$tmpInf1"                     # /etc/lsb_release information
df -h --output=size,used,avail,pcent "$SourceDev" >> "$tmpInf1"

# Build target information (the partition selected for cloning to)
LineCnt=$(ls "$TargetMnt" | wc -l)
if (( LineCnt > 1 )) ; then 
    # More than /Lost+Found exist so it's not an empty partition.
    if [[ -f "$TargetMnt"/etc/lsb-release ]] ; then
        echo "TARGET (CLONE)=$TargetDev" > "$tmpInf2"
        DistInfo "$TargetMnt" "$tmpInf2"    # /etc/lsb_release information
    else
        # TO-DO: might be cloning /boot or /home on separate partitions.
        #        the source partition is still `/` so can display message.
        echo "Selected partition has data which is not Ubuntu OS. Aborting."
        CleanUp                             # Remove temporary files
        exit 1
    fi
else
    echo "Target (Clone) partition appears empty" > "$tmpInf2"
    echo "/Lost+Found normal in empty partition" >> "$tmpInf2"
    echo "Head of '/Clone/' files & directories:" >> "$tmpInf2"
    ls "$TargetMnt" | head -n2 >> "$tmpInf2"
fi

# Target device free bytes
df -h --output=size,used,avail,pcent "$TargetDev" >> "$tmpInf2"

# Display source and target partitions side-by-side using bold text.
echo $(tput bold)       # Set to bold text
paste -d '|' "$tmpInf1" "$tmpInf2" | column -t -s '|'
echo $(tput sgr0)       # Reset to normal text

echo "NOTE: If you are recloning, new files in clone will be deleted,"
echo "      modified files are reset to current source content and,"
echo "      files deleted from clone are added back from source."
echo ""

read -p "Type Y (or y) to proceed. Any other key to exit: " -n 1 -r
echo    # (optional) move to a new line
if [[ ! $REPLY =~ ^[Yy]$ ]] ; then
    CleanUp             # Remove temporary files
    exit 0
fi

# Copy non-virtual directories to clone. Credit to TikTak's Ask Ubuntu answer:
# /ubuntu/319805/is-it-safe-to-clone-the-current-used-disk?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

SECONDS=0
echo ""
echo "====================================================================="
echo "Using rsync to clone / to $TargetDev mounted as $TargetMnt"
rsync -haxAX --stats --delete --info=progress2 --info=name0 --inplace  \
      /* "$TargetMnt"                                                   \
      --exclude={/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/media/*,/lost+found}
# For 16GB on Samsung Pro 960: First time 98 seconds, second time 27 seconds.
rsyncTime=$SECONDS  
echo ""
echo "Time to clone files: $rsyncTime Seconds"

# Change /etc/update-manager/release-upgrades prompt from never to LTS
echo ""
echo "====================================================================="
echo "Making changes in: $TargetMnt/etc/update-manager/release-upgrades"
echo "     from Prompt=: never"
echo "       to Prompt=: lts"
echo "Allows running 'do-release-upgrade -d' when rebooting clone target"
echo "Consider 'do-release-upgrade -d -f DistUpgradeViewNonInteractive' This"
echo "allows you to go to bed or go to lunch whilst upgrade runs."
echo ""
echo "* * *  When you Upgrade, TURN OFF screen locking for inactivity. * * *"
echo ""
sed -i 's/Prompt=never/Prompt=lts/' "$TargetMnt"/etc/update-manager/release-upgrades

## This section commented out to prevent surprises. You may uncomment.
## You may want to revise to include `cron.daily`, `cron.hourly`, etc.
# Move `/etc/cron.d` reboot jobs to `/etc/cron.d/hold` to prevent running
# scripts such as daily backup or Ubuntu 16.04 specific problem fixes.
#echo ""
#echo "====================================================================="
#echo "Moving '$TargetMnt/etc/cron.d' to '.../hold' to prevent running."
#echo "After booting clone, move back individual files you want to run"
#if [[ ! -d "$TargetMnt"/etc/cron.d/hold ]]; then
#    mkdir "$TargetMnt"/etc/cron.d/hold
#fi
#cp -p  "$TargetMnt"/etc/cron.d/* "$TargetMnt"/etc/cron.d/hold/
#rm -fv "$TargetMnt"/etc/cron.d/*

# Update /etc/fstab on clone partition with clone's UUID
echo ""
echo "====================================================================="
echo "Making changes in: $TargetMnt/etc/fstab"
echo "        from UUID: $SourceUUID"
echo "          to UUID: $TargetUUID"
sed -i "s/$SourceUUID/$TargetUUID/g" "$TargetMnt"/etc/fstab

# Update /boot/grub/grub.cfg on clone partition with clone's UUID
echo ""
echo "====================================================================="
echo "Making changes in: $TargetMnt/boot/grub/grub.cfg"
echo "        from UUID: $SourceUUID"
echo "          to UUID: $TargetUUID"
echo "Also change 'quiet splash' to 'nosplash' for environmental awareness"
echo "Suggest first time booting clone you make wallpaper unique"
sed -i "s/$SourceUUID/$TargetUUID/g" "$TargetMnt"/boot/grub/grub.cfg
sed -i "s/quiet splash/nosplash/g" "$TargetMnt"/boot/grub/grub.cfg

# Update grub boot menu
echo ""
echo "====================================================================="
echo "Calling 'update-grub' to create new boot menu"
update-grub

# Unmount and exit

echo ""
echo "====================================================================="
echo "Unmounting $TargetDev as $TargetMnt"

CleanUp             # Remove temporary files

exit 0

Kopieren Sie den obigen Bash-Code und fügen Sie ihn in eine neue Datei mit dem Namen ein /usr/local/bin/clone-ubuntu.sh. Machen Sie dann die neue Datei ausführbar mit:

sudo chmod a+x /usr/local/bin/clone-ubuntu.sh

Um das Skript aufzurufen, verwenden Sie:

sudo clone-ubuntu.sh

So aktualisieren Sie den 16.04 LTS-Klon auf Ubuntu 18.04 LTS

Dies ist ein "Bonus" -Bereich, der viele Menschen interessieren kann.

Starten Sie Ihren Computer neu. Das grubMenü enthält eine neue Menüoption, die auf die geklonte Partition verweist. Sie können auch eine bestimmte Kernelversion aus dem Menü Erweiterte Optionen des Klons auswählen .

Eine Möglichkeit, das geklonte 16.04 LTS in 18.04 LTS zu konvertieren, besteht darin, Folgendes auszuführen:

sudo do-release-upgrade

Beachten Sie, dass die -dFlagge vor dem 26. Juli 2018 erforderlich war, aber nicht mehr benötigt wird.

Lesen Sie die Upgrade-Bestätigung für 18.04 sorgfältig durch .

Bevor Sie fortfahren, stellen Sie sicher, dass die inaktive Bildschirmsperre deaktiviert ist. Der Aktualisierungsvorgang kann abstürzen, wenn Ihr Computer aufgrund von Inaktivität der Tastatur zum Sperrbildschirm wechselt.

Zusammenfassung des Upgrade-Prozesses vom 18.04

Dieser Abschnitt ist maschinenspezifisch, da verschiedene Apps von verschiedenen Benutzern installiert werden. Hier ist eine kurze Zusammenfassung, die ich basierend auf Notizen und Gedächtnis gemacht habe:

  1. Bestätigung zum Fortfahren: ENTER
  2. Pakete werden entfernt: Y.
  3. Ersetzen Sie longind.conf: Y.
  4. Konfigurationsdatei '/etc/sane.d/dll.conf', Standard N, nimm Y.
  5. '/etc/NetworkManager/conf.d/default-wifi-powersave-on.conf' Nehmen Sie Standard N.
  6. Konfigurationsdatei '/etc/pulse/default.pa' Standard N, nimm Y.
  7. Konfigurationsdatei '/etc/grub.d/30_os-prober' 'Standard N, nimm N.
  8. Die Konfiguration des Grub-Menüs im Vollbildmodus wird angezeigt. Option wählen: Behalten Sie die aktuell installierte lokale Version bei
  9. Konfigurationsdatei '/etc/cron.d/anacron', Standard N, nimm Y, um zu sehen, was
  10. Mehrmals eine Fehlermeldung: /sbin/ldconfig.real: Warnung: Ignorieren der Konfigurationsdatei, die nicht geöffnet werden kann: /etc/ld.so.conf.d/x86_64-linux-gnu_EGL.conf: Keine solche Datei oder kein solches Verzeichnis
  11. Nicht standardisiert: Die Konfigurationsdatei '/etc/vnstat.conf' (Anzeigeunterschiede 1,13 gegenüber 1,18) nimmt Y.
  12. 220 Pakete werden entfernt. (kann Stunden dauern) Geben Sie Y ein
  13. Um das Upgrade abzuschließen, ist ein Neustart erforderlich. Nimm Y.

Beachten Sie Schritt 10, den die meisten Menschen niemals sehen werden. Ich habe eine alte nVidia-Treiberinstallation auf meinem Ubuntu 16.04, die ich nie vollständig entfernt habe. Es ist enthalten, weil Sie möglicherweise ähnliche alte Pakete haben, die nie vollständig entfernt wurden.

Grub ändert das Boot-Menü, um es unter UEFI zu klonen

Im Gegensatz zu 18.04-Upgrades stellte ich fest, dass das 18.04.1-Upgrade die Grub-UEFI-Konfiguration dahingehend geändert hat, dass das Grub-Menü des Klons anstelle des ursprünglichen Grub-Menüs gemäß dieser Antwort verwendet wird: Dual Boot und die Dateien /boot/grub/grub.cfg - welches ist benutzt?

$ sudo cat /boot/efi/EFI/ubuntu/grub.cfg
search.fs_uuid b40b3925-70ef-447f-923e-1b05467c00e7 root 
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg

$ sudo grub-install
Installing for x86_64-efi platform.
Installation finished. No error reported.

Das Ausführen sudo update-grubnach dem Booten der ursprünglichen Partition reicht nicht aus, um die grub.cfgvon grub geladene Partition zu ändern . Sie müssen verwenden sudo grub-install, um grub zu zwingen, die Konfiguration der ursprünglichen Partition zu verwenden.

Sowohl die ursprüngliche Partition als auch die Klonpartition können update-grubzum Verwalten ihrer eigenen /boot/grub/grub.cfgDatei verwendet werden, während des Startvorgangs kann jedoch nur eine verwendet werden.

Wenn Sie möchten, dass grub das Grub-Menü des Klons verwendet, führen Sie die obigen Schritte auf der Partition des Originals nicht aus.


Verlauf bearbeiten

Bearbeiten 6. Mai 2018 - Informationsanzeige für eine leere Klonpartition (Zielpartition) korrigiert.

Bearbeiten 26. August 2018 - Verwenden Sie die --inplaceOption für rsyncso große Dateien wie eine 2-GB-Papierkorbdatei, die beim Kopieren beim Kopieren nicht dupliziert werden. Dies kann zu einem Fehler "Nicht genügend Speicherplatz" führen. /etc/cron.dÜberschreibungen auskommentieren , da Benutzer möglicherweise ein anderes Verzeichnis behalten möchten oder möchten. Aktualisieren Sie die Anweisungen zur Verwendung do-release-upgradeohne -dFlag, da Ubuntu 18.04.1 LTS jetzt veröffentlicht ist.

WinEunuuchs2Unix
quelle
1
+1. Vielen Dank für ein nützliches Tool :-)
Sudodus
1
@sudodus Ich hoffe, dass die Leute dieses Tool verwenden, bevor sie mit dem 18.04-Upgrade voll anfangen. Zumindest können sie dies als Tutorial verwenden und die Schritte manuell mit einem Live-USB-Boot wiederholen. Es ist tragisch, so viele Fehler zu lesen, die Menschen auf dem brandneuen 18.04 haben, weil sie ohne vorherige Tests aktualisiert und durch Löschen ihrer vorherigen 16.04- , 17.04- oder 17.10- Installation verpflichtet wurden. Leider habe ich im Laufe der Jahrzehnte oft ähnliche Dinge gesehen. Vielen Dank für Ihre Abstimmung! Es hilft, die Anstrengungen zu verstärken, die in solche Bestrebungen wie clone-ubuntu.shAber ich habe dies trotzdem 4 Mal selbst verwendet!
WinEunuuchs2Unix
1
Ich habe Ihr Skript noch nicht verwendet, aber ich verstehe, dass es sehr nützlich ist und ich beabsichtige, es zu verwenden. - Ich konnte ein Upgrade von 8.04 auf 10.04 auf 12.04 durchführen, das ich lange Zeit verwendet habe. Aber als ich mich auf den Weg zum Upgrade über 14.04 auf 16.04 machte, schlug ich fehl. Ich hatte gute Backups, also habe ich eine Neuinstallation von 16.04 gemacht und später kopiert, was ich behalten wollte und auf Optimierungen, Skripte, Aliase und installierte Programme überprüft. - Übrigens arbeite ich an einem Skript, um persistente Live-Laufwerke 'home-rw' zu erstellen und zu aktualisieren . Willkommen, um es zu versuchen :-)
Sudodus
1
Kleiner Tippfehler in Ihrem Link: Ich habe alle in 8.04 LTS getestet und sollte am Ende 18.04 LTS lesen . Ihr Tool ist die Nummer 1 für viele Leute, die nicht genug Festplattenspeicher haben, um ihr Ubuntu 16.04 zu klonen. Es ist auch einfacher (wenn auch langsamer) als das Erstellen einer neuen Partition auf der Festplatte.
WinEunuuchs2Unix
Ich habe den Tippfehler behoben, danke :-) Sie haben Recht mit dem Klonen (oder Kopieren des Inhalts) auf eine Festplatte. Aber für Leute, die ihr beständiges Live-System in der Tasche tragen möchten, ist es praktisch, dies mit meinem Tool zu tun.
Sudodus
3

Probleme beim Upgrade von früheren Versionen auf 18.04 LTS

Ein Upgrade von früheren Versionen auf 18.04 LTS ist überhaupt nicht einfach. Ich weiß nicht, ob es in der Vergangenheit mehr Probleme als solche Upgrades gibt, aber Leute, die Upgrades veröffentlichen, gehen jetzt ein Risiko für sich ein. Auf der anderen Seite finden sie Fehler, und wenn die Fehler gemeldet werden , hilft dies bei der Entwicklung des Upgrade-Tools sowie beim Debuggen des Ubuntu 18.04 LTS-Systems selbst.

Dies bedeutet, dass Personen, die geduldig genug sind , um zu warten, bis das Upgrade mit der ersten Punktfreigabe (18.04.1 LTS) offiziell freigegeben wird, eine reibungslosere Fahrt erhalten .

Testen vor dem vollständigen Upgrade ...

Die hier beschriebene Methode von @ WinEunuuchs2Unix ermöglicht das Testen mit einer Kopie des realen Systems, wenn ein Upgrade auf 18.04 LTS mit Ihrem aktuellen [mehr oder weniger modifizierten] Betriebssystem mit Ihrer Computerhardware funktioniert.

Dies kann mehrere Katastrophen mit einem beschädigten Betriebssystem verhindern.

Ich habe das Skript von @ WinEunuuchs2Unix noch nicht verwendet, aber ich verstehe, dass es sehr nützlich ist und ich beabsichtige, es zu verwenden. Ich konnte ein Upgrade von 8.04 auf 10.04 auf 12.04 durchführen, das ich lange Zeit verwendet habe. Aber als ich mich aufmachte, ein Upgrade über 14.04 auf 16.04 durchzuführen, schlug ich fehl und konnte die Fehler nicht finden.

... und bei Problemen eine Neuinstallation durchführen

Ich hatte gute Backups , also habe ich eine Neuinstallation von 16.04 gemacht und später kopiert, was ich behalten wollte, und nach Optimierungen, Skripten, Aliasen und installierten Programmen gesucht. Wenn ich die Methode von @ WinEunuuchs2Unix verwendet hätte, hätte ich das Problem früh erkannt, hätte ich direkt eine Neuinstallation durchgeführt.

Aktualisieren eines dauerhaften Live-Systems

Persistente Live-Systeme werden verwendet, um sehr portable Ubuntu-Systeme zu erhalten, die manchmal zum Testen, manchmal aber auch für längere Zeit verwendet werden.

Es ist ein bekanntes Problem, dass Sie ein solches System nicht wie bei einem installierten System aktualisieren und aktualisieren sollten, da es früher oder später beschädigt wird. Darüber hinaus stecken Sie mit den Kernel- und Kerneltreibern fest, die mit der ISO-Datei geliefert werden, da sie vor dem Start des Overlay-Systems gestartet werden.

Normalerweise ist es jedoch möglich, das /homeVerzeichnis wie möglich beizubehalten, wenn Sie eine Neuinstallation mit einer separaten 'Home'-Partition durchführen. Wenn Sie eine home-rwPartition erstellen , wird diese von einem dauerhaften Live-System beim Booten automatisch gefunden und verwendet.

Ich entwickle und teste ein Shellscript, mk-persistent-live_with_home-rw , das ein persistentes Live-System mit einer home-rwPartition erstellen und später aktualisieren kann.

  • Ersetzen Sie die ISO-Datei durch eine neuere. Zumindest sollten Sie ein Upgrade durchführen, wenn eine neue ISO-Datei veröffentlicht wird. Sie können jedoch auch einmal im Monat ein LTS-System aktualisieren und die aktuellen täglichen ISO-Dateien aus dem Test-Tracker verwenden .

  • Ändern Sie grub für die neue ISO-Datei.

  • Löschen (Neuformatieren) der casper-rwDatei, in der die Änderungen des Betriebssystems gespeichert sind (Sie müssen also die Programmpakete neu installieren, die Sie dem System hinzugefügt haben).

  • Behalten Sie die home-rwPartition mit Ihren persönlichen Dateien, Einstellungen und Optimierungen bei.

  • Siehe diesen Link für weitere Details.

Zusätzlicher Link

Allgemeine Tipps für Leute, die die neueste und beste Version von Ubuntu testen möchten, finden Sie unter folgendem Link:

Wie man am Testen und Entwickeln von Ubuntu teilnimmt

Sudodus
quelle
1
Der zusätzliche Link ist eine nette Geste. Je mehr Personen Probleme melden, desto mehr Probleme werden für andere gelöst.
WinEunuuchs2Unix
1
Sehr guter Punkt für LTS-Benutzer (von Natur aus vorsichtig), auf den ersten Punkt Release 18.04.1 zu warten. Für größere Organisationen möchten sie möglicherweise weiterhin 16.04 auf eine Testpartition klonen und diese zu Schulungszwecken auf 18.04 aktualisieren. Benutzer hätten Zugriff auf Daten, an die sie gewöhnt sind. Natürlich würden IT-Mitarbeiter auch Monate vor der Veröffentlichung des ersten Punktes am 26. Juli von umfangreichen Tests mit geklonten Daten profitieren.
WinEunuuchs2Unix