Script Bash pour sauvegarder / cloner Ubuntu sur une autre partition

12

Ubuntu 18.04 est sorti le 26 avril 2018 et je veux l'essayer pour mettre à jour mes programmes et convertir mes données mais je ne veux pas valider s'il y a des bugs.

J'ai réduit Windows de 410 Go à 385 Go, redémarré Ubuntu 16.04 et couru gpartedpour créer une nouvelle partition de 25 Go intitulée «Ubuntu18.04». J'ai exécuté rm-kernelset supprimé environ 20 noyaux pour éliminer environ 10 Go sur Ubuntu 16.04.

Maintenant, je veux un script qui remplira la nouvelle partition avec 16.04 LTS et créera une nouvelle option de menu Grub. Seuls les répertoires pertinents doivent être copiés. Par exemple /sys, /run, /procet /devsont des répertoires virtuels créés lors du démarrage et ne doit pas être copié.

Je souhaite également que /etc/fstables correctifs UUID et les crontravaux de redémarrage soient désactivés de sorte que les sauvegardes quotidiennes sur les données clonées ne soient pas exécutées après le démarrage du clone.

Je prévois d'exécuter le script plusieurs fois au cours des prochaines semaines / mois. En tant que tel, le processus de clonage devrait être reproductible sans effort.

Le même script pourrait être utilisé pour tester les mises à jour de sécurité et les nouvelles mises à jour de l'équipe du noyau Ubuntu sans affecter les systèmes de production.

WinEunuuchs2Unix
la source
20 noyaux prend 10 Go !!!? Avez-vous installé accidentellement l'édition gonflée du noyau?
Lie Ryan
@LieRyan C'est en fait 400 Mo par noyau et non 500 Mo car j'ai arrondi les chiffres (environ 20 noyaux). Pour voir combien chaque noyau prend (varie de 394 Mo à 419 Mo sur mon installation actuelle, voir: askubuntu.com/questions/949411/…
WinEunuuchs2Unix

Réponses:

19

Script Bash pour cloner la partition Ubuntu active pour cloner la partition

Le clone-ubuntu.shscript bash répliquera de manière transparente et en toute sécurité 16.04 LTS dans une partition pour la mise à niveau vers 18.04 LTS:

clone-ubuntu.png

Points importants à considérer:

  • Vous devez créer une ext4partition vide suffisamment grande pour contenir un clone Ubuntu 16.04
  • Lors de l'appel du script, clone-ubuntu.shla partition ne peut pas être montée. Le script monte et démonte automatiquement la partition.
  • La commande rsyncest utilisée pour copier des fichiers depuis /la partition de clonage. La première fois que vous courrez, clone-ubuntu.shcela prendra quelques minutes. La deuxième fois que vous exécutez le script, seules les modifications de fichier sont mises à jour et cela devrait prendre moins d'une minute.
  • Vous pouvez exécuter ce script et redémarrer plusieurs fois. Toutes les nouvelles données sur la cible du clone seront supprimées pour refléter les /fichiers et répertoires actuels .
  • Toutes les /etc/cron.dtâches Cron (redémarrage) sont déplacées vers un nouveau sous-répertoire appelé /etc/cron.d/hold. Après avoir démarré le clone, n'oubliez pas d'exécuter sudo crontab -epour empêcher l'exécution des tâches cron sélectionnées.
  • Le fichier cloné /etc/fstabest modifié avec l'UUID approprié pour la partition sur laquelle il se trouve.
  • Le fichier cloné /boot/grub/grub.cfgest modifié avec l'UUID approprié pour un démarrage réussi du clone. Le fichier cloné quiet splashest modifié pour nosplashque vous obteniez une messagerie de terminal de défilement. Cela donne une prise de conscience visuelle en démarrant un clone plutôt qu'une version "réelle".
  • update-grub est exécuté pour mettre à jour Grub avec de nouvelles options de menu pointant vers la partition clonée.
  • Le fichier cloné /etc/update-manager/release-upgradesest modifié pour le changement Prompt=neverà Prompt=lts. Lorsque vous démarrez le clone et effectuez do-release-upgrade -dcette opération, Ubuntu 16.04 peut être mis à niveau vers 18.04.
  • Avant le clonage, un écran de confirmation s'affiche (illustré dans la section suivante) et vous devez taper y / Y pour continuer.

Écran de confirmation

Après avoir sélectionné une partition de clone cible, il est d'abord vérifié qu'elle est de ext4type partition et n'est pas déjà montée. Si ce test est réussi, un message de confirmation apparaît alors:

=====================================================================
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: 

Dans cet exemple, un clone précédent a été sélectionné pour reclonage. L'espace disponible sur le clone est un point muet car nous savons déjà qu'il y a suffisamment d'espace disponible.

Si vous avez plusieurs installations Ubuntu, veuillez vérifier que vous avez sélectionné la bonne partition pour cloner l'Ubuntu actuellement démarré, monté en tant que /(root) sur.

C'est votre dernière chance d'interrompre en appuyant sur n'importe quelle touche sauf you Y.


Liste de sortie

Lorsque vous exécutez le script, vous obtiendrez cette sortie (à l'exclusion de la sortie déjà répertoriée ci-dessus):

=====================================================================
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 affichage de l'état du nouveau clone

Lors du premier clonage, rsyncdonnera une mise à jour de 0 à 100% de tous les fichiers créés. Aucun fichier ne sera supprimé ou modifié car le clone est vide:

clone-ubuntu.sh vide clone.gif

rsync affichage de l'état lors du reclonage

Lorsque rsyncreclone, il ne frappe jamais 100%car les fichiers qui n'ont jamais changé ne sont pas copiés. Il y aura des retards dans la progression de la mise à jour lors de l' rsyncanalyse du fichier suivant à copier et lorsqu'il supprime de nouveaux fichiers créés dans le clone qui n'ont jamais existé dans l'original:

clone-ubuntu-rsync.gif


Script bash - 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

Copiez et collez le code bash ci-dessus dans un nouveau fichier appelé /usr/local/bin/clone-ubuntu.sh. Rendez ensuite le nouveau fichier exécutable en utilisant:

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

Pour appeler le script, utilisez:

sudo clone-ubuntu.sh

Comment mettre à niveau le clone 16.04 LTS vers Ubuntu 18.04 LTS

Il s'agit d'une section "bonus" qui peut intéresser de nombreuses personnes.

Redémarrez votre machine. Le grubmenu contiendra une nouvelle option de menu pointant vers la partition clonée. Vous pouvez également sélectionner une version spécifique du noyau dans le menu Options avancées du clone .

Une façon de convertir le 16.04 LTS cloné en 18.04 LTS est d'exécuter:

sudo do-release-upgrade

Notez que le -ddrapeau était requis avant le 26 juillet 2018 mais n'est plus nécessaire.

Lisez attentivement la confirmation de mise à niveau 18.04 .

Avant de continuer, assurez-vous que le verrouillage d'écran inactif est désactivé. Le processus de mise à niveau peut se bloquer si votre ordinateur passe à l'écran de verrouillage en raison de l'inactivité du clavier.

Résumé du processus de mise à niveau 18.04

Cette section sera spécifique à la machine car différentes applications sont installées par différents utilisateurs. Voici un bref résumé que j'ai fait sur la base des notes et de la mémoire:

  1. confirmation pour continuer: ENTER
  2. les colis seront supprimés: Y
  3. remplacer longind.conf: Y
  4. Fichier de configuration '/etc/sane.d/dll.conf', N par défaut, prendre Y
  5. '/etc/NetworkManager/conf.d/default-wifi-powersave-on.conf' Prendre N par défaut
  6. Fichier de configuration '/etc/pulse/default.pa' par défaut N, prendre Y
  7. Fichier de configuration '/etc/grub.d/30_os-prober' 'par défaut N, prendre N
  8. La configuration du menu grub en plein écran apparaît. Prenez l'option: garder la version locale actuellement installée
  9. Fichier de configuration '/etc/cron.d/anacron', N par défaut, prenez Y pour voir ce que
  10. Un message d'erreur à plusieurs reprises: /sbin/ldconfig.real: Avertissement: ignorer le fichier de configuration qui ne peut pas être ouvert: /etc/ld.so.conf.d/x86_64-linux-gnu_EGL.conf: aucun fichier ou répertoire de ce type
  11. Non standard: le fichier de configuration '/etc/vnstat.conf' (différences d'affichage 1.13 vs 1.18) prend Y
  12. 220 colis vont être supprimés. (peut prendre des heures) entrez Y
  13. Pour terminer la mise à niveau, un redémarrage est nécessaire. Prenez Y

Notez l'étape 10 que la plupart des gens ne verront jamais. J'ai une ancienne installation de pilote nVidia sur mon Ubuntu 16.04 que je n'ai jamais réussi à supprimer complètement. Il est inclus car vous pourriez avoir d'anciens packages similaires jamais entièrement supprimés.

Grub modifie le menu de démarrage pour le cloner sous UEFI

Contrairement aux mises à niveau 18.04, j'ai trouvé que la mise à niveau 18.04.1 modifiait la configuration Grub UEFI pour utiliser le menu grub du clone au lieu du menu grub d'origine selon cette réponse: double démarrage et les fichiers /boot/grub/grub.cfg - dont l'un est utilisé?

$ 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'exécution sudo update-grubaprès le démarrage de la partition d'origine ne suffit pas pour changer celle qui grub.cfgest chargée par grub. Vous devez utiliser sudo grub-installpour forcer grub à utiliser la configuration de la partition d'origine.

La partition d'origine et la partition de clonage peuvent toutes deux être utilisées update-grubpour gérer leur propre /boot/grub/grub.cfgfichier, mais une seule peut être utilisée lors du démarrage.

Bien sûr, si vous voulez que grub utilise le menu grub du Clone, ne faites pas les étapes ci-dessus sur la partition de l'original.


Modifier l'historique

Modifier le 6 mai 2018 - L'affichage des informations pour une partition de clone (cible) vide a été corrigé.

Modifier le 26 août 2018 - Utilisez l' --inplaceoption avec rsyncdes fichiers si volumineux tels qu'un fichier poubelle de 2 Go ne sont pas dupliqués sur le clone pendant le processus de copie. Cela peut entraîner une erreur «d'espace disque insuffisant». Commentez les /etc/cron.dremplacements, car les utilisateurs peuvent vouloir conserver ou souhaiter un répertoire différent. Mettez à jour les instructions à utiliser do-release-upgradesans -dindicateur car Ubuntu 18.04.1 LTS est maintenant disponible.

WinEunuuchs2Unix
la source
1
+1. Merci pour un outil utile :-)
sudodus
1
@sudodus J'espère que les gens utiliseront cet outil avant de se lancer dans la mise à niveau 18.04. À tout le moins, ils peuvent l'utiliser comme tutoriel et répéter les étapes manuellement à l'aide d'un démarrage USB en direct. Il est tragique de lire autant d'erreurs que les gens rencontrent sur le tout nouveau 18.04 parce qu'ils ont mis à niveau sans tester d'abord et commis en effaçant leur précédente installation 16.04 , 17.04 ou 17.10 . Malheureusement, j'ai vu des choses similaires plusieurs fois au cours des décennies. Merci pour votre vote positif! Cela aide à renforcer l'effort déployé dans des projets tels que clone-ubuntu.shMais je l'ai utilisé moi-même 4 fois de toute façon!
WinEunuuchs2Unix
1
Je n'ai pas encore utilisé votre script, mais je comprends qu'il est très utile et j'ai l'intention de l'utiliser. - J'ai pu passer de 8.04 à 10.04 à 12.04, que j'ai utilisé pendant longtemps. Mais quand j'ai décidé de passer du 14.04 au 16.04, j'ai échoué. J'avais de bonnes sauvegardes, j'ai donc fait une nouvelle installation de 16.04 et plus tard copiée, ce que je voulais garder et vérifier les réglages, scripts, alias et programmes installés. - Au fait, je travaille sur un script pour créer et mettre à jour des disques durs persistants 'home-rw' . Bienvenue pour l'essayer :-)
sudodus
1
Faute de frappe mineure dans votre lien: je les ai toutes testées en 8.04 LTS, il faut lire 18.04 LTS à la fin. Votre outil est le numéro 1 pour de nombreuses personnes qui n'ont pas assez d'espace sur le disque dur pour cloner leur Ubuntu 16.04. C'est aussi plus facile (bien que plus lent) que de créer une nouvelle partition sur leur disque dur.
WinEunuuchs2Unix
J'ai corrigé la faute de frappe, merci :-) Vous avez raison de cloner (ou de copier le contenu) sur un disque dur. Mais pour les personnes qui souhaitent transporter leur système live persistant dans leur poche, il est pratique de le faire avec mon outil.
sudodus
3

Problèmes de mise à niveau des versions précédentes vers 18.04 LTS

Il n'est pas du tout simple de passer des versions précédentes à 18.04 LTS. Je ne sais pas s'il y a eu plus de problèmes qu'une telle mise à niveau dans le passé, mais les gens qui mettent à jour la mise à niveau prennent maintenant un risque pour eux-mêmes. D'un autre côté, ils trouvent des bogues et si les bogues sont signalés , cela aidera à développer l'outil de mise à niveau ainsi qu'à déboguer le système Ubuntu 18.04 LTS lui-même.

Cela signifie que les personnes suffisamment patientes pour attendre la sortie officielle de la mise à niveau avec la première version (18.04.1 LTS) bénéficieront d'une conduite plus fluide .

Test avant d'effectuer la mise à niveau complète ...

La méthode décrite ici par @ WinEunuuchs2Unix permet de tester avec une copie du système réel, si la mise à niveau vers 18.04 LTS fonctionnera avec votre système d'exploitation actuel [plus ou moins modifié] avec votre matériel informatique.

Cela peut empêcher plusieurs catastrophes avec un système d'exploitation corrompu.

Je n'ai pas encore utilisé le script de @ WinEunuuchs2Unix, mais je comprends qu'il est très utile et j'ai l'intention de l'utiliser. J'ai pu passer de 8.04 à 10.04 à 12.04, que j'ai utilisé pendant longtemps. Mais quand j'ai décidé de mettre à niveau via 14.04 à 16.04, j'ai échoué et je n'ai pas pu trouver les erreurs.

... et en cas de problème, faites une nouvelle installation

J'avais de bonnes sauvegardes , j'ai donc fait une nouvelle installation de 16.04 et plus tard copiée, ce que je voulais garder et vérifier les réglages, scripts, alias et programmes installés. Si j'avais utilisé la méthode de @ WinEunuuchs2Unix, j'avais vu le problème tôt, j'aurais fait une nouvelle installation directement.

Mise à niveau d'un système live persistant

Les systèmes live persistants sont utilisés pour obtenir des systèmes Ubuntu très portables, qui sont parfois utilisés pour les tests mais parfois pendant longtemps.

C'est un problème connu, vous ne devez pas mettre à jour et mettre à niveau un tel système comme vous le faites avec un système installé, car il sera corrompu tôt ou tard. De plus, vous êtes coincé avec le noyau et les pilotes du noyau, qui viennent avec le fichier iso, car ils sont démarrés avant le démarrage du système de superposition.

Mais il est généralement possible de conserver le /homerépertoire, comme vous le pouvez, lorsque vous effectuez une nouvelle installation avec une partition «home» distincte. Si vous créez une home-rwpartition, un système live persistant la trouvera et l'utilisera automatiquement lors du démarrage.

Je développe et teste un shellscript, mk-persistent-live_with_home-rw , qui peut créer un système live persistant avec une home-rwpartition, et qui peut ensuite le mettre à niveau ,

  • remplacez le fichier iso par un nouveau. Au moins, vous devez mettre à niveau lorsqu'un nouveau fichier iso est publié, mais vous pouvez également mettre à niveau un système LTS une fois par mois et utiliser les fichiers iso quotidiens actuels du testeur tracker ,

  • modifier grub pour le nouveau fichier iso.

  • effacer (reformater) le casper-rwfichier qui stocke les modifications du système d'exploitation (vous devez donc réinstaller les packages de programme que vous avez ajoutés au système),

  • préservez la home-rwpartition avec vos fichiers personnels, paramètres et réglages.

  • Voir ce lien pour plus de détails.

Lien supplémentaire

Des conseils généraux pour les personnes qui souhaitent tester la dernière et la meilleure version d'Ubuntu peuvent être trouvés dans le lien suivant,

Comment participer aux tests et au développement d'Ubuntu

sudodus
la source
1
Le lien supplémentaire est une belle touche. Plus il y a de personnes qui signalent des problèmes, plus de problèmes seront résolus pour les autres.
WinEunuuchs2Unix
1
Très bon point pour les utilisateurs LTS (prudents par nature) d'attendre la première version du point 18.04.1. Pour les grandes organisations, ils peuvent toujours vouloir cloner 16.04 vers une partition de test et la mettre à niveau vers 18.04 à des fins de formation du personnel. Les utilisateurs auraient accès aux données auxquelles ils sont habitués. Bien sûr, le personnel informatique bénéficierait également de tests approfondis sur les données clonées des mois avant la première version du 26 juillet.
WinEunuuchs2Unix