Сценарій Bash для резервного копіювання / клонування Ubuntu на інший розділ


12

Ubuntu 18.04 вийшов 26 квітня 2018 року, і я хочу спробувати його оновити свої програми та конвертувати мої дані, але не хочу вчинити, якщо є помилки.

Я скоротив Windows з 410 ГБ до 385 ГБ, перезавантажив Ubuntu 16.04 і побіг gpartedстворити новий розділ розміром 25 ГБ з написом "Ubuntu18.04". Я запустив rm-kernelsі видалив близько 20 ядер, щоб усунути близько 10 Гб на Ubuntu 16.04.

Тепер я хочу сценарій, який заповнить новий розділ 16.04 LTS і створить для нього новий варіант меню Grub. Копіювати слід лише відповідні каталоги. Наприклад /sys, /run, /procі /devвіртуальні каталоги , створені під час завантаження і не повинні бути скопійовані.

Я також хочу, щоб /etc/fstabвиправлено відповідні завдання UUID та cronперезавантажити відключені завдання, щоб щоденні резервні копії на клоновані дані не запускалися після завантаження клону.

Я очікую запуск сценарію багато разів протягом наступних декількох тижнів / місяців. Таким чином, процес клонування повинен бути легко повторюваним.

Цей же сценарій може бути використаний для тестування оновлень безпеки та нових оновлень команди Ubuntu Kernel Team, не впливаючи на виробничі системи.


20 ядер займає 10 Гб !!!? Ви випадково встановили випущене ядро?
Лі Лі Раян

@LieRyan Це фактично 400 Мб на ядро, а не 500 Мб, як я округлював числа (близько 20 ядер). Щоб побачити, скільки забирає кожне ядро ​​(коливається від 394 Мб до 419 МБ у моїй поточній установці, див .: Askubuntu.com/questions/949411/…
WinEunuuchs2Unix

Відповіді:


19

Сценарій Bash для клонування активного розділу Ubuntu для клонування розділу

clone-ubuntu.shСкрипт Баш буде легко і безпечно реплицировать 16.04 LTS в розділ для поновлення до 18.04 LTS:

clone-ubuntu.png

Важливі моменти, які слід врахувати:

  • Ви повинні створити порожній ext4розділ достатньо великий, щоб вмістити клон Ubuntu 16.04
  • Під час виклику сценарію clone-ubuntu.shрозділ неможливо встановити. Сценарій автоматично монтує і демонтує розділ.
  • Команда rsyncвикористовується для копіювання файлів з /розділу клонування. Перший раз, коли ви запустите, clone-ubuntu.shце займе кілька хвилин. Вдруге, коли ви запускаєте сценарій, лише оновлення файлів оновлюються, і це займе менше хвилини.
  • Ви можете запустити цей сценарій і перезавантажити кілька разів. Будь-які нові дані про ціль клонування будуть видалені, щоб відобразити поточні /файли та каталоги.
  • Усі завдання Cron /etc/cron.d(перезавантажуються) переміщуються в новий підкаталог під назвою /etc/cron.d/hold. Після завантаження клон не забудьте запустити, sudo crontab -eщоб запобігти запуску вибраних завдань cron.
  • Клонований файл /etc/fstabмодифікується відповідним UUID для розділу, на якому він знаходиться.
  • Клонований файл /boot/grub/grub.cfgмодифікується відповідним UUID для успішного завантаження клону. Клонований файл quiet splashзмінено, щоб nosplashви отримали прокрутку термінальних повідомлень. Це дає візуальну поінформованість завантаження клону, а не "Реальну" версію.
  • update-grub запускається для оновлення Grub новими параметрами меню, що вказують на клонований розділ.
  • Клонували файл /etc/update-manager/release-upgradesмодифікується для зміни Prompt=neverдо Prompt=lts. Коли ви завантажуєте клон і виконуєте do-release-upgrade -dце, дозволяє Ubuntu 16.04 бути оновлений до 18.04.
  • Перед клонуванням відображається екран підтвердження (показаний у наступному розділі), і для вступу потрібно ввести y / Y.

Екран підтвердження

Після вибору цільового клонування розділу спочатку перевіряється як ext4тип розділу та ще не встановлений. Якщо цей тест пройдений, тоді з'являється повідомлення про підтвердження:

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

У цьому прикладі попередній клон був обраний для повторного повторного використання. Наявний простір у клоні - це приглушена точка, оскільки ми вже знаємо, що є достатньо місця.

Якщо у вас є кілька установок Ubuntu, переконайтесь, що ви вибрали правильний розділ для клонування поточного завантаженого Ubuntu, встановленого як /(root).

Це ваш останній шанс зробити аборт, натиснувши будь-яку клавішу, крім yабо Y.


Перелік результатів

Запустивши сценарій, ви отримаєте цей вихід (виключаючи вихід, вже перелічений вище):

=====================================================================
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 відображення статусу нового клону

При першому клонуванні rsyncдасть оновлення від 0 до 100% усіх створених файлів. Жоден файл не буде видалений або змінений, оскільки клон порожній:

clone-ubuntu.sh порожній clone.gif

rsync відображення статусу при повторному переході

Під час rsyncповторного виклику він ніколи не потрапляє, 100%оскільки файли, які ніколи не змінювалися, не копіюються. У процесі оновлення відбудеться затримка, оскільки rsyncсканування наступного файлу, який потрібно скопіювати, і коли він видалить нові файли, створені в клоні, які ніколи не існували в оригіналі:

clone-ubuntu-rsync.gif


Сценарій 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

Скопіюйте та вставте bash-код у новий файл, який називається /usr/local/bin/clone-ubuntu.sh. Потім зробіть новий файл виконуваним за допомогою:

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

Щоб викликати сценарій, використовуйте:

sudo clone-ubuntu.sh

Як оновити клон 16.04 LTS до Ubuntu 18.04 LTS

Це розділ "бонус", який може зацікавити багатьох людей.

Перезавантажте машину. У grubменю буде міститися нова опція меню, що вказує на клонований розділ. Ви також можете вибрати конкретну версію ядра з меню Додаткові параметри клону .

Один із способів перетворення клонованого 16.04 LTS в 18.04 LTS - це запуск:

sudo do-release-upgrade

Зауважте, -dпрапор був потрібний до 26 липня 2018 року, але він більше не потрібен.

Уважно прочитайте підтвердження оновлення 18.04 .

Перш ніж продовжити, переконайтесь, що блокування екрана неактивне. Процес оновлення може вийти з ладу, якщо ваш комп'ютер перейде на екран блокування через неактивність клавіатури.

Підсумок процесу оновлення 18.04

Цей розділ буде специфічним для машини, оскільки різні програми встановлюються різними користувачами. Ось короткий підсумок, який я склав на основі нотаток та пам’яті:

  1. підтвердження для продовження: Введіть
  2. пакети будуть видалені: Y
  3. замінити longind.conf: Y
  4. Файл конфігурації '/etc/sane.d/dll.conf', за замовчуванням N, прийняти Y
  5. '/etc/NetworkManager/conf.d/default-wifi-powersave-on.conf' Візьміть за замовчуванням N
  6. Файл конфігурації '/etc/pulse/default.pa' за замовчуванням N, прийняти Y
  7. Файл конфігурації '/etc/grub.d/30_os-prober' 'за замовчуванням N, прийняти N
  8. З'являється конфігурація меню на весь екран. Візьміть варіант: збережіть локальну версію, яку зараз встановлено
  9. Конфігураційний файл '/etc/cron.d/anacron', за замовчуванням N, візьміть Y, щоб побачити що
  10. Повідомлення про помилку кілька разів: /sbin/ldconfig.real: Попередження: ігнорування файлу конфігурації, який неможливо відкрити: /etc/ld.so.conf.d/x86_64-linux-gnu_EGL.conf: Немає такого файлу чи каталогу
  11. Нестандартне: файл конфігурації '/etc/vnstat.conf' (різниці в дисплеї 1,13 проти 1,18) приймає Y
  12. 220 пакетів збираються вилучити. (може зайняти години) введіть Y
  13. Для завершення оновлення потрібен перезапуск. Візьміть Y

Зауважте, крок 10 більшість людей ніколи не побачить. У мене на старій установці драйверів nVidia на моєму Ubuntu 16.04 мені не вдалося повністю видалити. Він включений, оскільки у вас можуть бути подібні старі пакунки, які ніколи не видаляються повністю.

Grub змінює меню завантаження, щоб клонуватись під UEFI

На відміну від оновлень 18.04, я знайшов, що оновлення 18.04.1 змінило конфігурацію Grub UEFI, щоб використовувати меню grune клона замість оригінального меню grub відповідно до цієї відповіді: Подвійне завантаження та файли /boot/grub/grub.cfg - який саме використаний?

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

Запуск sudo update-grubпісля завантаження оригінального розділу недостатньо, щоб змінити grub.cfgзавантажений grub. Вам потрібно використовувати sudo grub-installпримусити grub використовувати оригінальну конфігурацію розділу.

Як оригінальний розділ, так і розділ клонування можуть використовуватись update-grubдля підтримки власного /boot/grub/grub.cfgфайлу, але під час завантаження може бути використаний лише один.

Звичайно, якщо ви хочете, щоб користувач використовував меню grune Clone, не виконайте вищезазначених кроків на розділі оригіналу.


Редагування історії

Редагувати 6 травня 2018 р. - Відображення інформації про порожній клонний (цільовий) розділ виправлено.

Редагувати 26 серпня 2018 р. - Використовуйте --inplaceпараметр із rsyncнастільки великими файлами, як файл сміття 2 Гб, не дублюється на клоні під час копіювання. Це може призвести до помилки "з місця на диску". Прокоментуйте /etc/cron.dвідміни, оскільки користувачі можуть хотіти взагалі зберігати або хотіти іншого каталогу. Оновіть інструкції для використання do-release-upgradeбез -dпрапора, оскільки тепер випущено Ubuntu 18.04.1 LTS.


1
+1. Дякуємо за корисний інструмент :-)
sudodus

1
@sudodus Я сподіваюся, що люди користуються цим інструментом, перш ніж пройти повне оновлення з оновленням 18.04. Як мінімум, вони можуть використовувати це як навчальний посібник і повторювати дії вручну, використовуючи Live USB завантажувач. Трагічно читати так багато помилок, які виникають у людей на абсолютно новому 18.04, тому що вони модернізувались, не тестуючи спочатку, і чинили їх, витираючи попередню інсталяцію 16.04 , 17.04 або 17.10 . На жаль, я подібні речі бачив багато разів протягом десятиліть. Дякую за Ваш голос! Це допомагає посилити зусилля, докладені до таких починань, clone-ubuntu.shале я все одно використовував це 4 рази!
WinEunuuchs2Unix

1
Я ще не використовував ваш сценарій, але розумію, що він дуже корисний, і я маю намір його використовувати. - Мені вдалося оновити з 8.04 до 10.04 до 12.04, якими я користувався довгий час. Але коли я взявся за оновлення через 14.04 до 16.04, я не зміг. У мене були хороші резервні копії, тому я зробив нову інсталяцію 16.04 і пізніше скопіював те, що хотів зберегти та перевірив на настройки, сценарії, псевдоніми та встановлені програми. - До речі, я працюю над сценарієм, щоб створити та оновити стійкі живі диски 'home-rw' . Ласкаво просимо спробувати :-)
sudodus

1
Невелика друкарська помилка у вашому посиланні: я перевірив їх у 8.04 LTS, в кінці слід прочитати 18.04 LTS Ваш інструмент - це номер 1 для багатьох людей, у яких недостатньо місця на жорсткому диску, щоб клонувати їх Ubuntu 16.04. Це також простіше (хоча і повільніше), ніж створити новий розділ на їх жорсткому диску.
WinEunuuchs2Unix

Я виправив помилку, дякую :-) Ви маєте рацію щодо клонування (або копіювання вмісту) на жорсткий диск. Але людям, які хочуть носити свою стійку живу систему в кишені, це зручно робити за допомогою мого інструменту.
sudodus

3

Проблеми з оновленням попередніх версій до 18.04 LTS

Оновити з попередніх версій до 18.04 LTS зовсім не просто. Я не знаю, чи існувало більше проблем, ніж таке оновлення в минулому, але люди, які випускають оновлення, зараз ризикують самі. З іншого боку, вони знаходять помилки, і якщо про помилки повідомляється , це допоможе розробити інструмент оновлення, а також налагодити саму систему Ubuntu 18.04 LTS.

Це означає, що люди, які є досить терплячими, чекають, поки оновлення офіційно буде випущено з першим пунктом випуску (18.04.1 LTS), пройдуть більш плавно .

Тестування перед повним оновленням ...

Метод, який описано тут @ WinEunuuchs2Unix, дає можливість протестувати з копією реальної системи, якщо оновлення до 18.04 LTS буде працювати з вашою поточною [більш-менш модифікованою] операційною системою з комп'ютерним обладнанням.

Це може запобігти декілька катастроф із пошкодженою операційною системою.

Я ще не використовував сценарій @ WinEunuuchs2Unix, але розумію, що це дуже корисно, і я маю намір його використовувати. Мені вдалося оновити з 8.04 до 10.04 до 12.04, якими я користувався довгий час. Але коли я налаштувався на оновлення через 14.04 до 16.04, я не зміг і не зміг знайти помилки.

... і якщо виникнуть проблеми, зробіть свіжу установку

У мене були хороші резервні копії , тому я зробив нову інсталяцію 16.04 і пізніше скопіював, що хотів зберегти та перевіряв на твіки, сценарії, псевдоніми та встановлені програми. Якби я використав метод @ WinEunuuchs2Unix, я бачив проблему рано, я б зробив нову інсталяцію безпосередньо.

Оновлення стійкої живої системи

Стійкі живі системи використовуються для отримання дуже портативних систем Ubuntu, які іноді використовуються для тестування, але іноді використовуються протягом тривалого часу.

Відома проблема, що не слід оновлювати та модернізувати таку систему, як у вас із встановленою системою, оскільки вона рано чи пізно може пошкодитися. Крім того, ви застрягли з драйверами ядра та ядра, які постачаються із файлом iso, оскільки вони запускаються до запуску накладної системи.

Але зазвичай можна зберігати /homeкаталог, як можна, коли ви робите свіжу установку з окремим "домашнім" розділом. Якщо ви створюєте home-rwрозділ, стійка система живого пошуку знайде та використовуватиме її автоматично під час завантаження.

Я розробляю і тестую оболонку, mk-persistent-live_with_home-rw , яка може створити стійку живу систему з home-rwрозділом, і згодом її можна оновити ,

  • замініть iso файл на новий. Принаймні, вам слід оновити, коли виходить новий ізо-файл, але ви також можете оновити систему LTS раз на місяць та використовувати поточні щоденні iso-файли із тестового трекера ,

  • змінити grub для нового ISO-файлу.

  • стерти (переформатувати) casper-rwфайл, у якому зберігаються модифікації операційної системи (тому ви повинні повторно встановити програмні пакети, які ви додали до системи),

  • збережіть home-rwрозділ з вашими особистими файлами, налаштуваннями та налаштуваннями.

  • Дивіться це посилання для отримання більш детальної інформації.

Додаткове посилання

Загальні поради для людей, які хочуть протестувати останню і найкращу версію Ubuntu, можна знайти за наступним посиланням,

Як брати участь у тестуванні та розробці Ubuntu


1
Додатковий посилання - приємний штрих. Чим більше людей, які повідомляють про проблеми, тим більше проблем буде вирішено для інших.
WinEunuuchs2Unix

1
Дуже хороший момент для користувачів LTS (обережно за своєю природою) чекати першого випуску пункту 18.04.1. Для великих організацій вони все ще можуть клонувати 16.04 до тестового розділу та оновити його до 18.04 для цілей навчання персоналу. Користувачі мали б доступ до даних, до яких вони звикли. Звичайно, ІТ-співробітники отримали б користь від обширного тестування на дані про клоновані місяці до першого липня 26 липня.
WinEunuuchs2Unix
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.