Bash script per eseguire il backup / clonare Ubuntu su un'altra partizione


12

Ubuntu 18.04 è uscito il 26 aprile 2018 e voglio provarlo per aggiornare i miei programmi e convertire i miei dati, ma non voglio impegnarmi in presenza di bug.

Ho ridotto Windows da 410 GB a 385 GB, riavviato Ubuntu 16.04 e sono corso gparteda creare una nuova partizione da 25 GB chiamata "Ubuntu18.04". Ho eseguito rm-kernelse rimosso circa 20 kernel per eliminare circa 10 GB su Ubuntu 16.04.

Ora voglio uno script che popolerà la nuova partizione con 16.04 LTS e creerà una nuova opzione di menu di Grub. Solo le directory pertinenti devono essere copiate. Per esempio /sys, /run, /proce /devsono directory virtuali create durante l'avvio e non deve essere copiato.

Voglio anche /etc/fstabpatchare con l'UUID corretto e cronriavviare i lavori disabilitati in modo tale che i backup giornalieri sui dati clonati non vengano eseguiti dopo l'avvio del clone.

Prevedo di eseguire la sceneggiatura più volte nelle prossime settimane / mesi. Pertanto, il processo di clonazione dovrebbe essere ripetibile senza sforzo.

Lo stesso script potrebbe essere utilizzato per testare gli aggiornamenti di sicurezza e i nuovi aggiornamenti del team del kernel Ubuntu senza influire sui sistemi di produzione.


20 kernel richiedono 10 GB !!!? Hai installato accidentalmente un'edizione gonfiata del kernel?
Sdraiati Ryan il

@LieRyan In realtà sono 400 MB per kernel e non 500 MB mentre arrotondavo i numeri (circa 20 kernel). Per vedere quanto occupa ciascun kernel (fluttua da 394 MB a 419 MB sulla mia installazione corrente, vedere: askubuntu.com/questions/949411/…
WinEunuuchs2Unix

Risposte:


19

Bash script per clonare la partizione Ubuntu attiva per clonare la partizione

Lo clone-ubuntu.shscript bash replicherà senza problemi e in modo sicuro 16.04 LTS in una partizione per l'aggiornamento a 18.04 LTS:

clone-ubuntu.png

Punti importanti da considerare:

  • È necessario creare una ext4partizione vuota abbastanza grande da contenere un clone di Ubuntu 16.04
  • Quando si chiama lo script, clone-ubuntu.shla partizione non può essere montata. Lo script monta e smonta automaticamente la partizione.
  • Il comando rsyncviene utilizzato per copiare i file dalla /partizione clone. La prima volta clone-ubuntu.shche eseguirai ci vorranno alcuni minuti. La seconda volta che si esegue lo script vengono aggiornate solo le modifiche ai file e l'operazione dovrebbe richiedere meno di un minuto.
  • È possibile eseguire questo script e riavviare più volte. Qualsiasi nuovo dato sul target clone verrà eliminato per rispecchiare i /file e le directory correnti .
  • Tutti i /etc/cron.dprocessi Cron (riavvio) vengono spostati in una nuova sottodirectory denominata /etc/cron.d/hold. Dopo l'avvio del clone ricordarsi di eseguire sudo crontab -eper impedire l'esecuzione dei lavori cron selezionati.
  • Il file clonato /etc/fstabviene modificato con l'UUID appropriato per la partizione in cui si trova.
  • Il file clonato /boot/grub/grub.cfgviene modificato con l'UUID appropriato per l'avvio corretto del clone. Il file clonato quiet splashviene modificato in nosplashmodo da ottenere messaggi di scorrimento sul terminale. Questo dà consapevolezza visiva che avvia un clone piuttosto che una versione "reale".
  • update-grub viene eseguito per aggiornare Grub con nuove opzioni di menu che puntano alla partizione clonata.
  • Il file clonato /etc/update-manager/release-upgradesviene modificato per cambiare Prompt=neverin Prompt=lts. Quando avvii il clone ed esegui do-release-upgrade -dciò, Ubuntu 16.04 può essere aggiornato a 18.04.
  • Prima di clonare viene visualizzata una schermata di conferma (mostrata nella sezione successiva) ed è necessario digitare y / Y per procedere.

Schermata di conferma

Dopo aver selezionato una partizione clone di destinazione, viene prima verificato che sia un ext4tipo di partizione e non è già montato. Se questo test viene superato, viene visualizzato un messaggio di conferma:

=====================================================================
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 questo esempio è stato selezionato un clone precedente per la ricondizionamento. Lo spazio disponibile sul clone è un punto silenzioso perché sappiamo già che c'è abbastanza spazio disponibile.

Se si dispone di più installazioni Ubuntu, verificare di aver selezionato la partizione corretta per clonare l'Ubuntu attualmente avviato, montato come /(root), su.

Questa è la tua ultima possibilità di interrompere premendo qualsiasi tasto tranne yo Y.


Elenco di output

Quando esegui lo script otterrai questo output (escluso l'output già elencato sopra):

=====================================================================
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 visualizzazione dello stato per il nuovo clone

Quando si rsyncesegue la clonazione per la prima volta, viene fornito un aggiornamento dallo 0 al 100% di tutti i file creati. Nessun file verrà eliminato o modificato poiché il clone è vuoto:

clone-ubuntu.sh vuoto clone.gif

rsync visualizzazione dello stato durante la ricondizionamento

Quando rsyncreclones non colpisce mai 100%perché i file che non sono mai stati modificati non vengono copiati. Ci saranno ritardi nell'avanzamento dell'aggiornamento come rsyncscansioni per il prossimo file da copiare e quando elimina i nuovi file creati nel clone che non sono mai esistiti nell'originale:

clone-ubuntu-rsync.gif


Bash script - 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

Copia e incolla il codice bash sopra in un nuovo file chiamato /usr/local/bin/clone-ubuntu.sh. Quindi rendere eseguibile il nuovo file usando:

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

Per chiamare lo script utilizzare:

sudo clone-ubuntu.sh

Come aggiornare il clone 16.04 LTS a Ubuntu 18.04 LTS

Questa è una sezione "bonus" che potrebbe interessare molte persone.

Riavvia il tuo computer. Il grubmenu conterrà una nuova opzione di menu che punta alla partizione clonata. Puoi anche selezionare una versione specifica del kernel dal menu Opzioni avanzate del clone .

Un modo per convertire il 16.04 LTS clonato in 18.04 LTS è eseguire:

sudo do-release-upgrade

Nota che la -dbandiera era richiesta prima del 26 luglio 2018 ma non è più necessaria.

Leggi attentamente la conferma dell'aggiornamento del 18.04 .

Prima di procedere assicurarsi che il blocco dello schermo inattivo sia disattivato. Il processo di aggiornamento potrebbe arrestarsi in modo anomalo se il computer passa alla schermata di blocco a causa dell'inattività della tastiera.

Riepilogo del processo di aggiornamento del 18.04

Questa sezione sarà specifica per la macchina perché diverse app sono installate da utenti diversi. Ecco un breve riassunto che ho fatto sulla base di note e memoria:

  1. conferma per procedere: INVIO
  2. i pacchetti saranno rimossi: Y
  3. sostituire longind.conf: Y
  4. File di configurazione '/etc/sane.d/dll.conf', N predefinito, prendere Y
  5. '/etc/NetworkManager/conf.d/default-wifi-powersave-on.conf' Prendi il valore predefinito N
  6. File di configurazione '/etc/pulse/default.pa' predefinito N, prendere Y
  7. File di configurazione '/etc/grub.d/30_os-prober' 'predefinito N, prendere N
  8. Viene visualizzato il menu di configurazione grub a schermo intero. Opzione Take: mantieni la versione locale attualmente installata
  9. File di configurazione '/etc/cron.d/anacron', N predefinito, prendere Y per vedere cosa
  10. Un messaggio di errore più volte: /sbin/ldconfig.real: avviso: ignorare il file di configurazione che non può essere aperto: /etc/ld.so.conf.d/x86_64-linux-gnu_EGL.conf: nessun file o directory
  11. Non standard: il file di configurazione '/etc/vnstat.conf' (visualizza differenze 1.13 vs 1.18) accetta Y
  12. 220 pacchetti verranno rimossi. (può richiedere ore) inserire Y
  13. Per completare l'aggiornamento, è necessario un riavvio. Prendi Y

Nota il passaggio 10 che molte persone non vedranno mai. Ho una vecchia installazione di driver nVidia sul mio Ubuntu 16.04 che non ho mai potuto rimuovere completamente. È incluso perché potresti avere pacchetti simili simili mai completamente rimossi.

Grub modifica il menu di avvio in modo che venga clonato in UEFI

A differenza degli aggiornamenti 18.04, ho scoperto che l'aggiornamento 18.04.1 ha cambiato la configurazione Grub UEFI per utilizzare il menu grub del clone invece del menu grub originale come da questa risposta: doppio avvio e i file /boot/grub/grub.cfg - quale è Usato?

$ 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.

L'esecuzione sudo update-grubdopo l'avvio della partizione originale non è sufficiente per cambiare quale grub.cfgviene caricato da grub. È necessario utilizzare sudo grub-installper forzare grub per utilizzare la configurazione della partizione originale.

Sia la partizione originale che la partizione clone possono essere utilizzate update-grubper mantenere il proprio /boot/grub/grub.cfgfile ma solo una può essere utilizzata durante l'avvio.

Naturalmente, se si desidera che grub utilizzi il menu grub di Clone, non eseguire i passaggi precedenti sulla partizione dell'originale.


Modifica cronologia

Modifica 6 maggio 2018 - Correzione della visualizzazione delle informazioni per una partizione di clone vuota (destinazione).

Modifica il 26 agosto 2018 : utilizzare l' --inplaceopzione con rsyncfile di dimensioni così grandi come un file cestino da 2 GB non viene duplicato sul clone durante il processo di copia. Ciò può causare errori "spazio su disco insufficiente". Il commento /etc/cron.desclude perché gli utenti potrebbero voler mantenere o desiderare una directory completamente diversa. Aggiorna le istruzioni da utilizzare do-release-upgradesenza -dflag perché Ubuntu 18.04.1 LTS è ora disponibile.


1
+1. Grazie per uno strumento utile :-)
sudodus

1
@sudodus Spero che le persone utilizzino questo strumento prima di completare con l'aggiornamento 18.04. Almeno possono usarlo come tutorial e ripetere i passaggi manualmente usando un avvio Live USB. È tragico leggere così tanti errori che le persone stanno riscontrando sul nuovissimo 18.04 perché si sono aggiornati senza test e si sono impegnati spazzando via la loro precedente installazione 16.04 , 17.04 o 17.10 . Purtroppo ho visto cose simili molte volte nel corso dei decenni. Grazie per il tuo voto! Aiuta a rafforzare lo sforzo fatto in sforzi come clone-ubuntu.shMa l'ho usato comunque 4 volte!
WinEunuuchs2Unix

1
Non ho ancora usato la tua sceneggiatura, ma ho capito che è molto utile e intendo usarla. - Sono stato in grado di aggiornare dall'8.04 al 10.04 al 12.04, che ho usato per molto tempo. Ma quando ho deciso di eseguire l'aggiornamento da 14.04 a 16.04 ho fallito. Avevo buoni backup, quindi ho fatto una nuova installazione di 16.04 e in seguito copiata, quello che volevo conservare e controllare eventuali modifiche, script, alias e programmi installati. - A proposito, lavoro su uno script per creare e aggiornare 'live-rw' di unità live persistenti . Benvenuti a provarlo :-)
sudodus

1
Errore di battitura nel tuo link: li ho testati tutti in 8.04 LTS , alla fine avrei dovuto leggere 18.04 LTS . Il tuo strumento è il numero 1 per molte persone che non hanno abbastanza spazio su disco fisso per clonare il loro Ubuntu 16.04. È anche più facile (anche se più lento) che creare una nuova partizione sul loro HDD.
WinEunuuchs2Unix

Ho corretto l'errore di battitura, grazie :-) Hai ragione sulla clonazione (o sulla copia del contenuto) su un HDD. Ma per le persone che vogliono portare il loro sistema live persistente in tasca, è conveniente farlo con il mio strumento.
sudodus,

3

Problemi con l'aggiornamento da versioni precedenti a 18.04 LTS

Non è affatto semplice aggiornare dalle versioni precedenti a 18.04 LTS. Non so se ci siano più problemi di tali aggiornamenti in passato, ma le persone che rilasciano aggiornamenti ora corrono un rischio per se stesse. D'altra parte trovano i bug e se vengono segnalati i bug , aiuterà a sviluppare lo strumento di aggiornamento e il debug del sistema Ubuntu 18.04 LTS stesso.

Ciò significa che le persone che sono abbastanza pazienti da attendere fino al rilascio ufficiale dell'aggiornamento con la prima versione del punto (18.04.1 LTS) avranno una guida più fluida .

Test prima di eseguire l'aggiornamento completo ...

Il metodo che @ WinEunuuchs2Unix descrive qui rende possibile testare con una copia del sistema reale, se l'aggiornamento a 18.04 LTS funzionerà con il tuo attuale sistema operativo [più o meno modificato] con l'hardware del tuo computer.

Questo può prevenire diversi disastri con sistema operativo danneggiato.

Non ho ancora usato lo script di @ WinEunuuchs2Unix, ma ho capito che è molto utile e intendo usarlo. Sono stato in grado di aggiornare dall'8.04 al 10.04 al 12.04, che ho usato per molto tempo. Ma quando ho deciso di aggiornare tramite 14.04 a 16.04 non sono riuscito e non sono riuscito a trovare gli errori.

... e in caso di problemi, eseguire una nuova installazione

Avevo dei buoni backup , quindi ho eseguito una nuova installazione di 16.04 e successive copiando ciò che volevo conservare e controllare eventuali modifiche, script, alias e programmi installati. Se avessi usato il metodo @ WinEunuuchs2Unix e avessi visto il problema in anticipo, avrei fatto una nuova installazione direttamente.

Aggiornamento di un sistema live persistente

I sistemi live persistenti vengono utilizzati per ottenere sistemi Ubuntu molto portatili, che a volte vengono utilizzati per i test ma a volte utilizzati per molto tempo.

È un problema noto che non è necessario aggiornare e aggiornare un tale sistema come si fa con un sistema installato perché prima o poi verrà danneggiato. Inoltre, sei bloccato con i driver del kernel e del kernel, forniti con il file iso, perché vengono avviati prima dell'avvio del sistema di sovrapposizione.

Ma di solito è possibile mantenere la /homedirectory, come è possibile, quando si effettua una nuova installazione con una partizione 'home' separata. Se si crea una home-rwpartizione, un sistema live persistente lo troverà e lo utilizzerà automaticamente durante l'avvio.

Sto sviluppando e testando uno shellscript, mk-persistent-live_with_home-rw , che può creare un sistema live persistente con una home-rwpartizione e che può successivamente aggiornarlo ,

  • sostituire il file ISO con uno più recente. Almeno dovresti aggiornare quando viene rilasciato un nuovo file ISO, ma puoi anche aggiornare un sistema LTS una volta al mese e utilizzare i file ISO giornalieri correnti dal tracker di test ,

  • modifica grub per il nuovo file ISO.

  • cancellare (riformattare) il casper-rwfile che memorizza le modifiche del sistema operativo (quindi è necessario reinstallare i pacchetti di programma aggiunti al sistema),

  • preservare la home-rwpartizione con i file, le impostazioni e le modifiche personali.

  • Vedi questo link per maggiori dettagli.

Link extra

I suggerimenti generali per le persone che desiderano testare la versione più recente e migliore di Ubuntu sono disponibili nel seguente link,

Come partecipare ai test e allo sviluppo di Ubuntu


1
Il link extra è un bel tocco. Più persone segnalano problemi, più problemi saranno risolti per gli altri.
WinEunuuchs2Unix

1
Ottimo punto per gli utenti LTS (cauti per natura) di attendere la prima versione del punto 18.04.1. Per le organizzazioni più grandi potrebbero ancora voler clonare 16.04 in una partizione di prova e aggiornarla a 18.04 per scopi di formazione del personale. Gli utenti avrebbero accesso ai dati a cui sono abituati. Naturalmente il personale IT trarrebbe beneficio da test approfonditi sui dati clonati mesi prima della prima pubblicazione del 26 luglio.
WinEunuuchs2Unix
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.