Skrypt Bash, aby wykonać kopię zapasową / sklonować Ubuntu na inną partycję

12

Ubuntu 18.04 wyszedł 26 kwietnia 2018 r. I chcę go wypróbować, aby zaktualizować moje programy i przekonwertować moje dane, ale nie chcę zatwierdzać, jeśli występują błędy.

Zmniejszyłem system Windows z 410 GB do 385 GB, ponownie uruchomiłem Ubuntu 16.04 i pobiegłem, gpartedaby utworzyć nową partycję 25 GB oznaczoną „Ubuntu18.04”. Uruchomiłem rm-kernelsi usunąłem około 20 jąder, aby wyeliminować około 10 GB na Ubuntu 16.04.

Teraz chcę skrypt, który zapełni nową partycję 16.04 LTS i utworzy dla niej nową opcję menu Grub. Należy kopiować tylko odpowiednie katalogi. Na przykład /sys, /run, /proci /devsą katalogi wirtualne tworzone podczas startu i nie powinny być kopiowane.

Chcę także /etc/fstabzałatać poprawny UUID i cronwyłączyć zadania ponownego uruchamiania, aby codzienne kopie zapasowe sklonowanych danych nie były uruchamiane po uruchomieniu klonu.

Przewiduję uruchomienie skryptu wiele razy w ciągu najbliższych kilku tygodni / miesięcy. Jako taki proces klonowania powinien być łatwo powtarzalny.

Ten sam skrypt można wykorzystać do testowania aktualizacji bezpieczeństwa i nowych aktualizacji zespołu jądra Ubuntu bez wpływu na systemy produkcyjne.

WinEunuuchs2Unix
źródło
20 jąder zajmuje 10 GB !!! Czy przypadkowo zainstalowałeś nadętą wersję jądra?
Lie Ryan
@LieRyan W rzeczywistości to 400 MB na jądro, a nie 500 MB, gdy zaokrąglałem liczby (około 20 jąder). Aby zobaczyć, ile zajmuje każde jądro (waha się od 394 MB do 419 MB w mojej bieżącej instalacji, zobacz :. askubuntu.com/questions/949411/…
WinEunuuchs2Unix

Odpowiedzi:

19

Skrypt Bash do klonowania aktywnej partycji Ubuntu w celu klonowania partycji

clone-ubuntu.shSkrypt bash bezproblemowo i bezpiecznie replikować 16.04 LTS do partycji uaktualniania do 18.04 LTS:

clone-ubuntu.png

Ważne punkty do rozważenia:

  • Musisz utworzyć pustą ext4partycję wystarczająco dużą, aby pomieścić klon Ubuntu 16.04
  • Podczas wywoływania skryptu clone-ubuntu.shpartycja nie może zostać zamontowana. Skrypt automatycznie montuje i odmontowuje partycję.
  • Polecenie rsyncsłuży do kopiowania plików z /partycji klonowania. Przy pierwszym uruchomieniu clone-ubuntu.shzajmie to kilka minut. Przy drugim uruchomieniu skryptu tylko zmiany plików są aktualizowane i powinno to zająć mniej niż minutę.
  • Możesz uruchomić ten skrypt i uruchomić ponownie wiele razy. Wszelkie nowe dane w celu klonowania zostaną usunięte, aby odzwierciedlić bieżące /pliki i katalogi.
  • Wszystkie /etc/cron.dzadania Cron (restart) są przenoszone do nowego podkatalogu o nazwie /etc/cron.d/hold. Po uruchomieniu klon należy pamiętać o uruchomieniu, sudo crontab -eaby uniemożliwić uruchomienie wybranych zadań cron.
  • Sklonowany plik /etc/fstabjest modyfikowany odpowiednim UUID dla partycji, na której się znajduje.
  • Sklonowany plik /boot/grub/grub.cfgjest modyfikowany odpowiednim UUID w celu pomyślnego uruchomienia klonowania. Sklonowane pliki quiet splashsą zmieniane na nosplash, abyś mógł przewijać wiadomości terminala. Daje to świadomość wizualną podczas uruchamiania klonowania zamiast wersji „rzeczywistej”.
  • update-grub uruchamia się, aby zaktualizować Gruba o nowe opcje menu wskazujące na sklonowaną partycję.
  • Sklonowany plik /etc/update-manager/release-upgradesjest modyfikowany, aby zmienić Prompt=neverna Prompt=lts. Gdy uruchomisz klon i wykonasz do-release-upgrade -dto, możesz zaktualizować Ubuntu 16.04 do 18.04.
  • Przed klonowaniem wyświetlony zostanie ekran potwierdzenia (pokazany w następnej sekcji) i aby kontynuować, należy wpisać y / Y.

Ekran potwierdzenia

Po wybraniu docelowej partycji klonowania jest najpierw weryfikowana jako ext4typ partycji i nie jest jeszcze zamontowana. Jeśli test zostanie zaliczony, pojawi się komunikat potwierdzający:

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

W tym przykładzie do klonowania wybrano poprzedni klon. Dostępna przestrzeń na klonie jest wyciszona, ponieważ wiemy już, że dostępna jest wystarczająca ilość miejsca.

Jeśli masz wiele instalacji Ubuntu, sprawdź, czy wybrałeś odpowiednią partycję, aby sklonować aktualnie uruchomione Ubuntu, zamontowane jako /(root).

To Twoja ostatnia szansa na przerwanie, naciskając dowolny klawisz oprócz ylub Y.


Lista wyników

Po uruchomieniu skryptu otrzymasz następujące dane wyjściowe (z wyjątkiem danych wyjściowych wymienionych powyżej):

=====================================================================
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 wyświetlanie statusu nowego klonu

Klonowanie po raz pierwszy rsyncspowoduje aktualizację od 0 do 100% wszystkich utworzonych plików. Żadne pliki nie zostaną usunięte ani zmienione, ponieważ klon jest pusty:

clone-ubuntu.sh pusty clone.gif

rsync wyświetlanie statusu podczas ponownego klonowania

Podczas rsyncponownego klonowania nigdy nie trafia, 100%ponieważ pliki, które nigdy nie uległy zmianie, nie są kopiowane. Będą opóźnienia w postępie aktualizacji, ponieważ rsyncskanowanie do następnego pliku, który ma zostać skopiowany, i kiedy usuwa nowe pliki utworzone w klonie, który nigdy nie istniał w oryginale:

clone-ubuntu-rsync.gif


Skrypt 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

Skopiuj i wklej powyższy kod bash do nowego pliku o nazwie /usr/local/bin/clone-ubuntu.sh. Następnie uczyń nowy plik wykonywalnym za pomocą:

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

Aby wywołać skrypt, użyj:

sudo clone-ubuntu.sh

Jak zaktualizować klon 16.04 LTS do Ubuntu 18.04 LTS

To sekcja „bonusowa”, która może zainteresować wiele osób.

Uruchom ponownie komputer. grubMenu będzie zawierać nową opcję menu wskazując na klonowanych partycji. Możesz także wybrać konkretną wersję jądra z menu Zaawansowane opcje klonu .

Jednym ze sposobów konwersji sklonowanego 16.04 LTS na 18.04 LTS jest uruchomienie:

sudo do-release-upgrade

Uwaga: -dflaga była wymagana przed 26 lipca 2018 r., Ale nie jest już konieczna.

Przeczytaj uważnie potwierdzenie aktualizacji 18.04 .

Przed kontynuowaniem upewnij się, że nieaktywne blokowanie ekranu jest wyłączone. Proces aktualizacji może ulec awarii, jeśli komputer przejdzie do ekranu blokady z powodu nieaktywności klawiatury.

Podsumowanie procesu aktualizacji 18.04

Ta sekcja będzie dotyczyła konkretnego komputera, ponieważ różni użytkownicy instalują różne aplikacje. Oto krótkie podsumowanie, które stworzyłem na podstawie notatek i pamięci:

  1. potwierdzenie, aby kontynuować: ENTER
  2. pakiety zostaną usunięte: Y
  3. zamień longind.conf: Y
  4. Plik konfiguracyjny „/etc/sane.d/dll.conf”, domyślnie N, weź Y
  5. „/etc/NetworkManager/conf.d/default-wifi-powersave-on.conf” Domyślnie N
  6. Plik konfiguracyjny „/etc/pulse/default.pa” domyślnie N, weź Y
  7. Plik konfiguracyjny „/etc/grub.d/30_os-prober” domyślnie N, weź N
  8. Zostanie wyświetlona pełna konfiguracja menu grub. Wybierz opcję: zachowaj zainstalowaną wersję lokalną
  9. Plik konfiguracyjny „/etc/cron.d/anacron”, domyślnie N, weź Y, aby zobaczyć co
  10. Wiele razy komunikat o błędzie: /sbin/ldconfig.real: Ostrzeżenie: ignorowanie pliku konfiguracyjnego, którego nie można otworzyć: /etc/ld.so.conf.d/x86_64-linux-gnu_EGL.conf: Brak takiego pliku lub katalogu
  11. Niestandardowy: plik konfiguracyjny „/etc/vnstat.conf” (różnice w wyświetlaniu 1.13 vs. 1.18) przyjmuje Y
  12. 220 paczek zostanie usuniętych. (może to potrwać kilka godzin) wpisz Y
  13. Aby zakończyć aktualizację, wymagane jest ponowne uruchomienie. Weź Y

Zwróć uwagę na krok 10, którego większość ludzi nigdy nie zobaczy. Mam starą instalację sterownika nVidia na moim Ubuntu 16.04, której nigdy nie udało mi się całkowicie usunąć. Jest dołączony, ponieważ możesz mieć podobne stare pakiety, które nigdy nie zostaną całkowicie usunięte.

Grub zmienia menu startowe na klonowane w UEFI

W przeciwieństwie do aktualizacji 18.04 zauważyłem, że aktualizacja 18.04.1 zmieniła konfigurację Grub UEFI, aby używać menu gruba zamiast oryginalnego menu grub zgodnie z następującą odpowiedzią: Podwójny rozruch i pliki /boot/grub/grub.cfg - który to jest używany?

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

Uruchamianie sudo update-grubpo uruchomieniu oryginalnej partycji nie wystarczy, aby zmienić grub.cfgładowany przez gruba. Musisz użyć, sudo grub-installaby zmusić gruba do użycia konfiguracji oryginalnej partycji.

Zarówno oryginalna partycja, jak i klonowana partycja mogą używać update-grubwłasnego /boot/grub/grub.cfgpliku, ale tylko jeden może być używany podczas rozruchu.

Oczywiście, jeśli chcesz, aby grub korzystał z menu gruba Clone, nie rób powyższych kroków na partycji oryginału.


Edytuj historię

Edytuj 6 maja 2018 r. - Poprawiono wyświetlanie informacji o pustej partycji sklonowanej (docelowej).

Edytuj 26 sierpnia 2018 r. - Użyj --inplaceopcji w przypadku rsynctak dużych plików, takich jak plik kosza o pojemności 2 GB, nie są duplikowane podczas klonowania podczas kopiowania. Może to prowadzić do błędu „brak miejsca na dysku”. Komentowanie /etc/cron.dzastępuje, ponieważ użytkownicy mogą chcieć zachować lub chcieć inny katalog w ogóle. Zaktualizuj instrukcje, aby używać do-release-upgradebez -dflagi, ponieważ Ubuntu 18.04.1 LTS jest już wydany.

WinEunuuchs2Unix
źródło
1
+1. Dzięki za przydatne narzędzie :-)
sudodus
1
@sudodus Mam nadzieję, że ludzie skorzystają z tego narzędzia, zanim w pełni skorzystają z aktualizacji 18.04. Przynajmniej mogą użyć tego jako samouczka i powtórzyć kroki ręcznie za pomocą rozruchu Live USB. Tragicznie jest czytać tak wiele błędów, które ludzie napotykają na zupełnie nową wersję 18.04, ponieważ dokonali aktualizacji bez uprzedniego przetestowania i popełnili błąd, usuwając poprzednią instalację 16.04 , 17.04 lub 17.10 . Niestety wiele razy widziałem podobne rzeczy przez dziesięciolecia. Dziękuję za wasze głosowanie! Pomaga wzmocnić wysiłek włożony w takie wysiłki, clone-ubuntu.shjakkolwiek Ale i tak wykorzystałem to 4 razy!
WinEunuuchs2Unix
1
Nie korzystałem jeszcze z twojego skryptu, ale rozumiem, że jest on bardzo przydatny i zamierzam go użyć. - Byłem w stanie zaktualizować wersję z 8.04 do 10.04 do 12.04, z której korzystałem przez długi czas. Ale kiedy zdecydowałem się na aktualizację przez 14.04 do 16.04, nie udało mi się. Miałem dobre kopie zapasowe, więc zrobiłem nową instalację 16.04, a później skopiowałem to, co chciałem zachować i sprawdziłem, czy nie ma poprawek, skryptów, aliasów i zainstalowanych programów. - Nawiasem mówiąc, pracuję nad skryptem do tworzenia i aktualizacji trwałych dysków „home-rw” . Zapraszamy do wypróbowania :-)
sudodus
1
Niewielka literówka w twoim linku: Przetestowałem je wszystkie w 8,04 LTS, na końcu powinien przeczytać 18,04 LTS . Twoje narzędzie to numer 1 dla wielu osób, które nie mają wystarczającej ilości miejsca na dysku twardym, aby sklonować swoje Ubuntu 16.04. Jest to również łatwiejsze (choć wolniejsze) niż tworzenie nowej partycji na dysku twardym.
WinEunuuchs2Unix
Naprawiłem literówkę, dzięki :-) Masz rację co do klonowania (lub kopiowania zawartości) na dysk twardy. Ale dla osób, które chcą nosić swój trwały system na żywo w kieszeni, wygodnie jest to zrobić za pomocą mojego narzędzia.
sudodus
3

Problemy z aktualizacją z poprzednich wersji do 18.04 LTS

Aktualizacja z poprzednich wersji do 18.04 LTS wcale nie jest łatwa. Nie wiem, czy w przeszłości było więcej problemów niż taka aktualizacja, ale ludzie, którzy aktualizują wersję, teraz ryzykują . Z drugiej strony znajdują błędy i jeśli zostaną zgłoszone , pomoże to w opracowaniu narzędzia aktualizacyjnego, a także w debugowaniu samego systemu Ubuntu 18.04 LTS.

Oznacza to, że ludzie, którzy są wystarczająco cierpliwi, aby czekać, aż aktualizacja zostanie oficjalnie wydana wraz z pierwszym wydaniem punktowym (18.04.1 LTS) , uzyskają płynniejszą jazdę .

Testowanie przed wykonaniem pełnej aktualizacji ...

Metoda opisana tutaj przez @ WinEunuuchs2Unix umożliwia testowanie z kopią prawdziwego systemu, jeśli aktualizacja do 18.04 LTS będzie działać z twoim obecnym [mniej lub bardziej zmodyfikowanym] systemem operacyjnym ze sprzętem komputerowym.

Może to zapobiec kilku katastrofom z uszkodzonym systemem operacyjnym.

Nie korzystałem jeszcze ze skryptu @ WinEunuuchs2Unix, ale rozumiem, że jest on bardzo przydatny i zamierzam go użyć. Byłem w stanie zaktualizować wersję z 8.04 do 10.04 do 12.04, z której korzystałem przez długi czas. Ale kiedy zdecydowałem się na aktualizację przez 14.04 do 16.04, nie udało mi się i nie mogłem znaleźć błędów.

... a jeśli wystąpią problemy, wykonaj nową instalację

Miałem dobre kopie zapasowe , więc zrobiłem nową instalację 16.04, a później skopiowałem to, co chciałem zachować i sprawdziłem, czy nie ma poprawek, skryptów, aliasów i zainstalowanych programów. Gdybym użył metody @ WinEunuuchs2Unix, zobaczyłbym problem wcześnie, zrobiłbym nową instalację bezpośrednio.

Aktualizacja trwałego systemu na żywo

Trwałe systemy na żywo są używane do uzyskania bardzo przenośnych systemów Ubuntu, które czasem są używane do testowania, a czasem przez długi czas.

Znanym problemem jest to, że nie należy aktualizować i aktualizować takiego systemu, jak w przypadku zainstalowanego systemu, ponieważ prędzej czy później ulegnie on uszkodzeniu. Ponadto utknąłeś z jądrem i sterownikami jądra, które są dostarczane z plikiem ISO, ponieważ są one uruchamiane przed uruchomieniem systemu nakładania.

Ale zwykle możliwe jest zachowanie /homekatalogu, tak jak to możliwe, podczas nowej instalacji z oddzielną partycją „home”. Jeśli utworzysz home-rwpartycję, trwały system na żywo znajdzie ją i użyje automatycznie podczas rozruchu.

Rozwijam i testuję skrypt powłoki , mk-persistent-live_with_home-rw , który może utworzyć trwały system na żywo z home-rwpartycją, a następnie może go zaktualizować ,

  • zamień plik ISO na nowszy. Przynajmniej powinieneś zaktualizować, kiedy zostanie wydany nowy plik ISO, ale możesz także uaktualnić system LTS raz w miesiącu i korzystać z bieżących codziennych plików ISO z modułu śledzenia testów ,

  • zmodyfikuj grub dla nowego pliku ISO.

  • wyczyść (ponownie sformatuj) casper-rwplik, który przechowuje modyfikacje systemu operacyjnego (więc musisz ponownie zainstalować pakiety programu, które dodałeś do systemu),

  • zachowaj home-rwpartycję z osobistymi plikami, ustawieniami i poprawkami.

  • Zobacz ten link, aby uzyskać więcej informacji.

Dodatkowy link

Ogólne wskazówki dla osób, które chcą przetestować najnowszą i najlepszą wersję Ubuntu, można znaleźć pod następującym linkiem:

Jak wziąć udział w testowaniu i rozwoju Ubuntu

sudodus
źródło
1
Dodatkowy link to miły akcent. Im więcej osób zgłasza problemy, tym więcej problemów można rozwiązać dla innych.
WinEunuuchs2Unix
1
Bardzo dobry punkt dla użytkowników LTS (z natury ostrożny), aby czekać na wydanie pierwszego punktu 18.04.1. W przypadku większych organizacji mogą nadal chcieć sklonować 16.04 na partycję testową i uaktualnić ją do 18.04 w celu szkolenia personelu. Użytkownicy mieliby dostęp do danych, do których są przyzwyczajeni. Oczywiście pracownicy IT skorzystaliby z obszernych testów sklonowanych danych kilka miesięcy przed wydaniem pierwszego punktu 26 lipca.
WinEunuuchs2Unix