Bash script para hacer una copia de seguridad / clonar Ubuntu a otra partición

12

Ubuntu 18.04 salió el 26 de abril de 2018 y quiero probarlo para actualizar mis programas y convertir mis datos, pero no quiero comprometerme si hay errores.

Reduje Windows de 410 GB a 385 GB, reinicié Ubuntu 16.04 y corrí gpartedpara crear una nueva partición de 25 GB con la etiqueta "Ubuntu18.04". Ejecuté rm-kernelsy eliminé unos 20 núcleos para eliminar unos 10 GB en Ubuntu 16.04.

Ahora quiero un script que llene la nueva partición con 16.04 LTS y le cree una nueva opción de menú Grub. Solo se deben copiar los directorios relevantes. Por ejemplo /sys, /run, /procy /devson directorios virtuales creados durante el arranque y no debe ser copiada.

También quiero /etc/fstabparchear con el UUID correcto y cronreiniciar los trabajos deshabilitados, de modo que las copias de seguridad diarias de los datos clonados no se ejecuten después de iniciar el clon.

Anticipo ejecutar el script muchas veces durante las próximas semanas / meses. Como tal, el proceso de clonación debe repetirse sin esfuerzo.

El mismo script podría usarse para probar actualizaciones de seguridad y nuevas actualizaciones de Ubuntu Kernel Team sin afectar los sistemas de producción.

WinEunuuchs2Unix
fuente
¡¡¡20 granos toman 10GB !!!? ¿Instalaste accidentalmente la edición hinchada del kernel?
Lie Ryan
@LieRyan En realidad es de 400 MB por núcleo y no de 500 MB, ya que redondeé los números (alrededor de 20 núcleos). Para ver cuánto ocupa cada kernel (fluctúa de 394MB a 419MB en mi instalación actual, consulte: askubuntu.com/questions/949411/…
WinEunuuchs2Unix

Respuestas:

19

Bash script para clonar partición activa de Ubuntu para clonar partición

El clone-ubuntu.shscript bash replicará sin problemas y con seguridad 16.04 LTS en una partición para actualizar a 18.04 LTS:

clone-ubuntu.png

Puntos importantes a considerar:

  • Debe crear una ext4partición vacía lo suficientemente grande como para contener un clon de Ubuntu 16.04
  • Al llamar al script, clone-ubuntu.shla partición no se puede montar. El script automáticamente monta y desmonta la partición.
  • El comando rsyncse usa para copiar archivos de /la partición clonada. La primera vez que lo ejecutes clone-ubuntu.shte llevará unos minutos. La segunda vez que ejecuta el script, solo se actualizan los cambios en el archivo y debería tomar menos de un minuto.
  • Puede ejecutar este script y reiniciar varias veces. Cualquier dato nuevo en el objetivo de clonación se eliminará para reflejar los /archivos y directorios actuales .
  • Todos los /etc/cron.dtrabajos de Cron (reinicio) se mueven a un nuevo subdirectorio llamado /etc/cron.d/hold. Después de iniciar el clon, recuerde ejecutar sudo crontab -epara evitar que se ejecuten trabajos cron seleccionados.
  • El archivo clonado /etc/fstabse modifica con el UUID apropiado para la partición en la que se encuentra.
  • El archivo clonado /boot/grub/grub.cfgse modifica con el UUID apropiado para un arranque clonado exitoso. El archivo clonado quiet splashse cambia a nosplashpara que reciba mensajes de terminal de desplazamiento. Esto le da a la conciencia visual el arranque de un clon en lugar de la versión "Real".
  • update-grub se ejecuta para actualizar Grub con nuevas opciones de menú que apuntan a la partición clonada.
  • El archivo clonado /etc/update-manager/release-upgradesse modifica para el cambio Prompt=nevera Prompt=lts. Cuando inicia el clon y realiza do-release-upgrade -desto, permite que Ubuntu 16.04 se actualice a 18.04.
  • Antes de clonar se muestra una pantalla de confirmación (se muestra en la siguiente sección) y debe escribir y / Y para continuar.

Pantalla de confirmación

Después de seleccionar una partición de clonación objetivo, primero se verifica que sea del ext4tipo de partición y aún no está montada. Si se pasa esta prueba, aparece un mensaje de confirmación:

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

En este ejemplo, se ha seleccionado un clon anterior para la reclonación. El espacio disponible en el clon es un punto de silencio porque ya sabemos que hay suficiente espacio disponible.

Si tiene varias instalaciones de Ubuntu, verifique que haya seleccionado la partición correcta para clonar el Ubuntu actualmente arrancado, montado como /(root), en.

Esta es su última oportunidad de abortar presionando cualquier tecla excepto yo Y.


Listado de salida

Cuando ejecutas el script obtendrás esta salida (excluyendo la salida ya mencionada anteriormente):

=====================================================================
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 visualización de estado para nuevo clon

Al clonar por primera vez, rsyncdará una actualización del 0 al 100% de todos los archivos creados. No se eliminarán ni cambiarán archivos ya que el clon está vacío:

clone-ubuntu.sh empty clone.gif

rsync visualización de estado al reclinar

Cuando se rsyncreclona nunca llega 100%porque los archivos que nunca cambiaron no se copian. Habrá demoras en el progreso de la actualización como rsyncescaneos para el próximo archivo que se copiará y cuando elimine nuevos archivos creados en el clon que nunca existieron en el original:

clone-ubuntu-rsync.gif


Guión 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

Copie y pegue el código bash anterior en un nuevo archivo llamado /usr/local/bin/clone-ubuntu.sh. Luego haga que el nuevo archivo sea ejecutable usando:

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

Para llamar al script use:

sudo clone-ubuntu.sh

Cómo actualizar 16.04 LTS clon a Ubuntu 18.04 LTS

Esta es una sección de "bonificación" que puede interesar a muchas personas.

Reinicia tu máquina. El grubmenú contendrá una nueva opción de menú que apunta a la partición clonada. También puede seleccionar una versión específica del núcleo desde el menú de Opciones avanzadas del clon .

Una forma de convertir el 16.04 LTS clonado a 18.04 LTS es ejecutar:

sudo do-release-upgrade

Tenga en cuenta que la -dbandera se requería antes del 26 de julio de 2018, pero ya no es necesaria.

Lea la confirmación de actualización de 18.04 cuidadosamente .

Antes de continuar, asegúrese de que el bloqueo de pantalla inactivo esté apagado. El proceso de actualización podría fallar si su computadora pasa a la pantalla de bloqueo debido a la inactividad del teclado.

Resumen del proceso de actualización 18.04

Esta sección será específica de la máquina porque diferentes usuarios instalan diferentes aplicaciones. Aquí hay un breve resumen que hice basado en notas y memoria:

  1. confirmación para continuar: ENTER
  2. los paquetes serán eliminados: Y
  3. reemplace longind.conf: Y
  4. Archivo de configuración '/etc/sane.d/dll.conf', predeterminado N, tome Y
  5. '/etc/NetworkManager/conf.d/default-wifi-powersave-on.conf' Toma el valor predeterminado N
  6. Archivo de configuración '/etc/pulse/default.pa' predeterminado N, tome Y
  7. Archivo de configuración '/etc/grub.d/30_os-prober' 'predeterminado N, tome N
  8. Aparece la configuración del menú de grub de pantalla completa. Opción de tomar: mantener la versión local instalada actualmente
  9. Archivo de configuración '/etc/cron.d/anacron', predeterminado N, tome Y para ver qué
  10. Un mensaje de error varias veces: /sbin/ldconfig.real: Advertencia: ignorando el archivo de configuración que no se puede abrir: /etc/ld.so.conf.d/x86_64-linux-gnu_EGL.conf: No existe dicho archivo o directorio
  11. No estándar: el archivo de configuración '/etc/vnstat.conf' (muestra las diferencias 1.13 frente a 1.18) toma Y
  12. Se eliminarán 220 paquetes. (puede tomar horas) ingrese Y
  13. Para finalizar la actualización, se requiere un reinicio. Toma Y

Tenga en cuenta el paso 10 que la mayoría de la gente nunca verá. Tengo una vieja instalación del controlador nVidia en mi Ubuntu 16.04 que nunca pude eliminar por completo. Se incluye porque es posible que tenga paquetes antiguos similares que nunca se hayan eliminado completamente.

Grub cambia el menú de arranque para clonar bajo UEFI

A diferencia de las actualizaciones 18.04, encontré que la actualización 18.04.1 cambió la configuración de Grub UEFI para usar el menú grub del clon en lugar del menú grub original según esta respuesta: arranque dual y los archivos /boot/grub/grub.cfg, cuál es ¿usado?

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

Ejecutar sudo update-grubdespués de arrancar la partición original no es suficiente para cambiar lo que grub.cfgcarga Grub. Debe usar sudo grub-installpara forzar a grub a usar la configuración de la partición original.

Tanto la partición original como la partición de clonación pueden usarse update-grubpara mantener su propio /boot/grub/grub.cfgarchivo, pero solo una puede usarse durante el arranque.

Por supuesto, si desea que grub use el menú de grub de Clone, no realice los pasos anteriores en la partición del original.


Editar historial

Edición 6 de mayo de 2018 : se corrigió la visualización de información para una partición de clon (objetivo) vacía.

Editar 26 de agosto de 2018 : la --inplaceopción de uso con rsyncarchivos tan grandes como un archivo basura de 2 GB no se duplica en el clon durante el proceso de copia. Esto puede provocar un error de "falta de espacio en disco". Los comentarios se /etc/cron.danulan porque los usuarios pueden querer mantener o querer un directorio completamente diferente. Actualice las instrucciones para usar do-release-upgradesin -dbandera porque Ubuntu 18.04.1 LTS ahora se lanzó.

WinEunuuchs2Unix
fuente
1
+1. Gracias por una herramienta útil :-)
sudodus
1
@sudodus Espero que la gente use esta herramienta antes de completar la actualización 18.04. Como mínimo, pueden usar esto como un tutorial y repetir los pasos manualmente usando un arranque USB en vivo. Es trágico leer tantos errores que las personas están teniendo en el nuevo 18.04 porque se actualizaron sin probar primero y se comprometieron al eliminar su instalación anterior 16.04 , 17.04 o 17.10 . Lamentablemente, he visto cosas similares muchas veces a lo largo de las décadas. ¡Gracias por tu voto positivo! Ayuda a reforzar el esfuerzo realizado en esfuerzos como clone-ubuntu.shPero, de todos modos, ¡lo he usado 4 veces!
WinEunuuchs2Unix
1
Todavía no he usado su script, pero entiendo que es muy útil y tengo la intención de usarlo. - Pude actualizar de 8.04 a 10.04 a 12.04, que utilicé durante mucho tiempo. Pero cuando me propuse actualizar a través de 14.04 a 16.04 fallé. Tenía buenas copias de seguridad, así que realicé una nueva instalación de 16.04 y luego copié lo que quería conservar y verifiqué ajustes, scripts, alias y programas instalados. - Por cierto, trabajo en un script para crear y actualizar unidades en vivo persistentes 'home-rw' . Bienvenido a probarlo :-)
sudodus
1
Error tipográfico menor en su enlace: Los probé todos en 8.04 LTS y debería leer 18.04 LTS al final. Su herramienta es la número 1 para muchas personas que no tienen suficiente espacio en el disco duro para clonar su Ubuntu 16.04. También es más fácil (aunque más lento) que crear una nueva partición en su HDD.
WinEunuuchs2Unix
Arregle el error tipográfico, gracias :-) Tiene razón acerca de la clonación (o copia del contenido) en un HDD. Pero para las personas que desean llevar su persistente sistema en vivo en su bolsillo, es conveniente hacerlo con mi herramienta.
sudodus
3

Problemas con la actualización de versiones anteriores a 18.04 LTS

No es del todo sencillo actualizar desde versiones anteriores a 18.04 LTS. No sé si hay más problemas que tales actualizaciones en el pasado, pero las personas que lanzan la actualización ahora se arriesgan . Por otro lado, encuentran errores y si se informan los errores , ayudará a desarrollar la herramienta de actualización, así como a depurar el sistema Ubuntu 18.04 LTS.

Esto significa que las personas que sean lo suficientemente pacientes como para esperar hasta que se publique oficialmente la actualización con el primer lanzamiento de punto (18.04.1 LTS) obtendrán un viaje más suave .

Prueba antes de hacer la actualización completa ...

El método que @ WinEunuuchs2Unix describe aquí hace posible probar con una copia del sistema real, si la actualización a 18.04 LTS funcionará con su sistema operativo actual [más o menos modificado] con el hardware de su computadora.

Esto puede evitar varios desastres con el sistema operativo dañado.

Todavía no he usado el script de @ WinEunuuchs2Unix, pero entiendo que es muy útil y tengo la intención de usarlo. Pude actualizar de 8.04 a 10.04 a 12.04, que utilicé durante mucho tiempo. Pero cuando me propuse actualizar a través de 14.04 a 16.04 fallé y no pude encontrar los errores.

... y si hay problemas, realice una instalación nueva

Tenía buenas copias de seguridad , así que realicé una nueva instalación de 16.04 y luego copié lo que quería mantener y verifiqué ajustes, scripts, alias y programas instalados. Si hubiera utilizado el método @ WinEunuuchs2Unix, había visto el problema antes, habría realizado una nueva instalación directamente.

Actualización de un sistema en vivo persistente

Los sistemas en vivo persistentes se usan para obtener sistemas Ubuntu muy portátiles, que a veces se usan para pruebas pero a veces se usan durante mucho tiempo.

Es un problema conocido, que no debe actualizar y actualizar un sistema como lo hace con un sistema instalado porque se dañará tarde o temprano. Además, está atascado con el núcleo y los controladores del núcleo, que vienen con el archivo iso, porque se inician antes de que se inicie el sistema de superposición.

Pero generalmente es posible mantener el /homedirectorio, como puede hacerlo, cuando realiza una instalación nueva con una partición 'home' separada. Si crea una home-rwpartición, un sistema en vivo persistente lo encontrará y usará automáticamente durante el arranque.

Estoy desarrollando y probando un shellscript, mk-persistent-live_with_home-rw , que puede crear un sistema en vivo persistente con una home-rwpartición, y que luego puede actualizarlo ,

  • reemplace el archivo iso con uno más nuevo. Al menos, debe actualizar cuando se lance un nuevo archivo iso, pero también puede actualizar un sistema LTS una vez al mes y usar los archivos iso diarios actuales del rastreador de pruebas ,

  • modificar grub para el nuevo archivo iso.

  • Limpie ( casper-rwvuelva a formatear) el archivo que almacena las modificaciones del sistema operativo (por lo que debe reinstalar los paquetes de programas que agregó al sistema),

  • preserva la home-rwpartición con tus archivos personales, configuraciones y ajustes.

  • Vea este enlace para más detalles.

Enlace extra

Los consejos generales para las personas que desean probar la última y mejor versión de Ubuntu se pueden encontrar en el siguiente enlace,

Cómo participar en pruebas y desarrollo de Ubuntu

sudodus
fuente
1
El enlace extra es un buen toque. Cuantas más personas reporten problemas, más problemas se resolverán para otros.
WinEunuuchs2Unix
1
Muy buen punto para los usuarios de LTS (cautelosos por naturaleza) para esperar el primer lanzamiento del punto 18.04.1. Para organizaciones más grandes, es posible que aún quieran clonar 16.04 en una partición de prueba y actualizarla a 18.04 para fines de capacitación del personal. Los usuarios tendrían acceso a los datos a los que están acostumbrados. Por supuesto, el personal de TI también se beneficiaría de pruebas exhaustivas en datos clonados antes del 26 de julio, primer lanzamiento.
WinEunuuchs2Unix