Tập lệnh Bash để sao lưu / sao chép Ubuntu sang phân vùng khác


12

Ubuntu 18.04 ra mắt vào ngày 26 tháng 4 năm 2018 và tôi muốn dùng thử để nâng cấp các chương trình của mình và chuyển đổi dữ liệu của mình nhưng không muốn cam kết nếu có lỗi.

Tôi đã thu nhỏ Windows từ 410 GB xuống còn 385 GB, khởi động lại Ubuntu 16.04 và chạy gpartedđể tạo phân vùng 25 GB mới có nhãn "Ubuntu18.04". Tôi đã chạy rm-kernelsvà xóa khoảng 20 hạt nhân để loại bỏ khoảng 10 GB trên Ubuntu 16.04.

Bây giờ tôi muốn một tập lệnh sẽ điền vào phân vùng mới với 16.04 LTS và tạo một tùy chọn menu Grub mới cho nó. Chỉ nên sao chép các thư mục có liên quan. Ví dụ /sys, /run, /proc/devlà thư mục ảo được tạo ra trong khi khởi động và không nên sao chép.

Tôi cũng muốn /etc/fstabvá với UUID chính xác và các croncông việc khởi động lại bị vô hiệu hóa sao cho sao lưu hàng ngày trên dữ liệu nhân bản không chạy sau khi khởi động bản sao.

Tôi dự đoán sẽ chạy tập lệnh nhiều lần trong vài tuần / tháng tới. Vì vậy, quá trình nhân bản nên dễ dàng lặp lại.

Kịch bản tương tự có thể được sử dụng để kiểm tra các bản cập nhật bảo mật và các bản cập nhật Ubuntu Kernel Team mới mà không ảnh hưởng đến các hệ thống sản xuất.


20 nhân mất 10GB !!!? Bạn đã vô tình cài đặt phiên bản kernel cồng kềnh?
Lie Ryan

@LieRyan Đó thực sự là 400 MB cho mỗi nhân chứ không phải 500 MB khi tôi làm tròn số (khoảng 20 hạt). Để xem mỗi hạt nhân chiếm bao nhiêu (dao động từ 394 MB đến 419 MB trên cài đặt hiện tại của tôi, hãy xem: askubfox.com/questions/949411/ Thẻ
WinEunuuchs2Unix

Câu trả lời:


19

Tập lệnh Bash để sao chép Phân vùng Ubuntu đang hoạt động để sao chép phân vùng

Tập clone-ubuntu.shlệnh bash sẽ sao chép liền mạch và an toàn 16.04 LTS vào phân vùng để nâng cấp lên 18.04 LTS:

clone-ub Ubuntu.png

Những điểm quan trọng cần xem xét:

  • Bạn phải tạo một ext4phân vùng trống đủ lớn để chứa bản sao Ubuntu 16.04
  • Khi gọi tập lệnh clone-ubuntu.sh, phân vùng không thể được gắn kết. Kịch bản tự động gắn kết và ngắt kết nối phân vùng.
  • Lệnh rsyncđược sử dụng để sao chép các tập tin từ /phân vùng bản sao. Lần đầu tiên bạn chạy clone-ubuntu.shnó sẽ mất một vài phút. Lần thứ hai bạn chạy tập lệnh chỉ thay đổi tập tin được cập nhật và sẽ mất ít hơn một phút.
  • Bạn có thể chạy tập lệnh này và khởi động lại nhiều lần. Bất kỳ dữ liệu mới nào trên mục tiêu nhân bản sẽ bị xóa để phản chiếu các /tệp và thư mục hiện tại .
  • Tất cả các /etc/cron.dcông việc Cron (khởi động lại) được chuyển đến một thư mục con mới được gọi là /etc/cron.d/hold. Sau khi khởi động clone nhớ chạy sudo crontab -eđể ngăn công việc cron được chọn chạy.
  • Tệp nhân bản /etc/fstabđược sửa đổi với UUID thích hợp cho phân vùng được bật.
  • Tệp nhân bản /boot/grub/grub.cfgđược sửa đổi với UUID thích hợp để khởi động nhân bản thành công. Các tập tin nhân bản quiet splashđược thay đổi thành nosplashđể bạn nhận được cuộn tin nhắn thiết bị đầu cuối. Điều này giúp nhận thức trực quan khởi động một bản sao thay vì phiên bản "Real".
  • update-grub được chạy để cập nhật Grub với các tùy chọn menu mới trỏ đến phân vùng nhân bản.
  • Các tập tin nhân bản /etc/update-manager/release-upgradesđược sửa đổi để thay đổi Prompt=neverthành Prompt=lts. Khi bạn khởi động bản sao và thực hiện do-release-upgrade -dviệc này, cho phép Ubuntu 16.04 được nâng cấp lên 18.04.
  • Trước khi nhân bản, màn hình xác nhận được hiển thị (hiển thị trong phần tiếp theo) và bạn phải nhập y / Y để tiếp tục.

Màn hình xác nhận

Sau khi chọn phân vùng nhân bản đích, trước tiên, nó được xác minh là ext4loại phân vùng và chưa được gắn kết. Nếu kiểm tra này được thông qua, một thông báo xác nhận sẽ xuất hiệ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: 

Trong ví dụ này, một bản sao trước đó đã được chọn để recloning. Không gian có sẵn trên bản sao là một điểm câm vì chúng ta đã biết có đủ không gian có sẵn.

Nếu bạn có nhiều cài đặt Ubuntu, vui lòng xác minh rằng bạn đã chọn đúng phân vùng để sao chép Ubuntu hiện đang khởi động, được gắn dưới dạng /(root), thành.

Đây là cơ hội cuối cùng để bạn hủy bỏ bằng cách nhấn bất kỳ phím nào ngoại trừ yhoặc Y.


Danh sách đầu ra

Khi bạn chạy tập lệnh, bạn sẽ nhận được đầu ra này (không bao gồm đầu ra đã được liệt kê ở trên):

=====================================================================
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 hiển thị trạng thái cho bản sao mới

Khi nhân bản lần đầu tiên, rsyncsẽ cập nhật từ 0 đến 100% tất cả các tệp được tạo. Không có tệp nào sẽ bị xóa hoặc thay đổi vì bản sao trống:

clone-ubfox.sh clone.gif trống

rsync hiển thị trạng thái khi recloning

Khi rsyncreclones nó không bao giờ truy cập 100%vì các tệp không bao giờ thay đổi sẽ không được sao chép. Sẽ có sự chậm trễ trong tiến trình cập nhật khi rsyncquét tệp tiếp theo sẽ được sao chép và khi nó xóa các tệp mới được tạo trong bản sao chưa từng tồn tại trong bản gốc:

clone-ubfox-rsync.gif


Kịch bả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

Sao chép và dán mã bash ở trên vào một tệp mới được gọi là /usr/local/bin/clone-ubuntu.sh. Sau đó làm cho tệp mới có thể thực thi được bằng cách sử dụng:

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

Để gọi tập lệnh, sử dụng:

sudo clone-ubuntu.sh

Cách nâng cấp 16.04 LTS sao chép lên Ubuntu 18.04 LTS

Đây là phần "phần thưởng" có thể khiến nhiều người quan tâm.

Khởi động lại máy của bạn. Các grubmenu sẽ chứa một tùy chọn menu trỏ mới cho phân vùng nhân bản. Bạn cũng có thể chọn một phiên bản kernel cụ thể từ menu Tùy chọn nâng cao của bản sao .

Một cách để chuyển đổi 16.04 LTS nhân bản thành 18.04 LTS là chạy:

sudo do-release-upgrade

Lưu ý -dcờ được yêu cầu trước ngày 26 tháng 7 năm 2018 nhưng không còn cần thiết nữa.

Đọc kỹ xác nhận nâng cấp 18.04 .

Trước khi tiến hành đảm bảo khóa màn hình không hoạt động được tắt. Quá trình nâng cấp có thể bị sập nếu máy tính của bạn chuyển sang màn hình khóa do bàn phím không hoạt động.

Tóm tắt quá trình nâng cấp 18.04

Phần này sẽ dành riêng cho máy vì các ứng dụng khác nhau được cài đặt bởi những người dùng khác nhau. Dưới đây là một bản tóm tắt ngắn gọn mà tôi đã thực hiện dựa trên ghi chú và bộ nhớ:

  1. xác nhận để tiến hành: ENTER
  2. các gói sẽ bị xóa: Y
  3. thay thế longind.conf: Y
  4. Tệp cấu hình '/etc/sane.d/dll.conf', mặc định N, lấy Y
  5. '/etc/NetworkManager/conf.d/default-wifi-powersave-on.conf' Hãy mặc định N
  6. Tệp cấu hình '/etc/pulse/default.pa' mặc định N, lấy Y
  7. Tệp cấu hình '/etc/grub.d/30_os-prober' 'mặc định N, lấy N
  8. Cấu hình menu grub toàn màn hình xuất hiện. Chọn tùy chọn: giữ phiên bản cục bộ hiện đang cài đặt
  9. Tệp cấu hình '/etc/cron.d/anacron', N mặc định, đưa Y để xem những gì
  10. Một thông báo lỗi nhiều lần: /sbin/ldconfig.real: Cảnh báo: bỏ qua tệp cấu hình không thể mở: /etc/ld.so.conf.d/x86_64-linux-gnu_EGL.conf: Không có tệp hoặc thư mục như vậy
  11. Không chuẩn: Tệp cấu hình '/etc/vnstat.conf' (hiển thị chênh lệch 1,13 so với 1,18) lấy Y
  12. 220 gói sẽ được gỡ bỏ. (có thể mất hàng giờ) nhập Y
  13. Để hoàn thành nâng cấp, cần phải khởi động lại. Lấy Y

Lưu ý bước 10 hầu hết mọi người sẽ không bao giờ nhìn thấy. Tôi có cài đặt trình điều khiển nVidia cũ trên Ubuntu 16.04. Tôi chưa bao giờ gỡ bỏ hoàn toàn. Nó được bao gồm bởi vì bạn có thể có các gói cũ tương tự không bao giờ được gỡ bỏ hoàn toàn.

Grub thay đổi menu khởi động để sao chép theo UEFI

Không giống như các bản nâng cấp 18.04, tôi thấy bản nâng cấp 18.04.1 đã thay đổi cấu hình Grub UEFI để sử dụng menu grub của bản sao thay vì menu grub ban đầu theo câu trả lời này: Khởi động kép và các tệp /boot/grub/grub.cfg - đó là một đã sử dụng?

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

Chạy sudo update-grubsau khi khởi động phân vùng ban đầu không đủ để thay đổi grub.cfgđược tải bởi grub. Bạn cần sử dụng sudo grub-installđể buộc grub sử dụng cấu hình của phân vùng ban đầu.

Cả phân vùng gốc và phân vùng clone đều có thể sử dụng update-grubđể duy trì /boot/grub/grub.cfgtệp riêng của chúng nhưng chỉ có thể sử dụng một tệp trong khi khởi động.

Tất nhiên, nếu bạn muốn grub sử dụng menu grub của Clone, đừng thực hiện các bước trên trên phân vùng ban đầu.


Chỉnh sửa lịch sử

Chỉnh sửa ngày 6 tháng 5 năm 2018 - Hiển thị thông tin cho phân vùng (mục tiêu) trống rỗng được sửa.

Chỉnh sửa ngày 26 tháng 8 năm 2018 - --inplaceTùy chọn sử dụng với rsynccác tệp lớn như tệp rác 2 GB không được sao chép trên bản sao trong quá trình sao chép. Điều này có thể dẫn đến lỗi "hết dung lượng đĩa". Nhận xét /etc/cron.dghi đè vì người dùng có thể muốn giữ hoặc muốn hoàn toàn một thư mục khác. Cập nhật hướng dẫn sử dụng do-release-upgrademà không cần -dgắn cờ vì Ubuntu 18.04.1 LTS hiện đã được phát hành.


1
+1. Cảm ơn về một công cụ hữu ích :-)
sudodus

1
@sudodus Tôi hy vọng mọi người sử dụng công cụ này trước khi hoàn thành với bản nâng cấp 18.04. Ít nhất họ có thể sử dụng điều này như một hướng dẫn và lặp lại các bước theo cách thủ công bằng cách sử dụng khởi động Live USB. Thật là bi thảm khi đọc rất nhiều lỗi mà mọi người đang mắc phải trên phiên bản 18.04 hoàn toàn mới vì họ đã nâng cấp mà không kiểm tra trước và cam kết bằng cách xóa sạch bản cài đặt 16.04 , 17.04 hoặc 17.10 trước đó của họ . Đáng buồn thay, tôi đã nhìn thấy những điều tương tự nhiều lần trong nhiều thập kỷ. Cảm ơn bạn đã bỏ phiếu! Nó giúp củng cố những nỗ lực đưa vào những nỗ lực như vậy clone-ubuntu.shNhưng dù sao tôi cũng đã sử dụng 4 lần này!
WinEunuuchs2Unix

1
Tôi chưa sử dụng tập lệnh của bạn, nhưng tôi hiểu rằng nó rất hữu ích và tôi dự định sử dụng tập lệnh này. - Tôi đã có thể nâng cấp từ 8.04 lên 10.04 lên 12.04, điều mà tôi đã sử dụng trong một thời gian dài. Nhưng khi tôi bắt đầu nâng cấp qua 14.04 đến 16.04 thì tôi đã thất bại. Tôi đã có các bản sao lưu tốt, vì vậy tôi đã thực hiện cài đặt mới 16.04 và sau đó được sao chép lại, những gì tôi muốn giữ và kiểm tra các chỉnh sửa, tập lệnh, bí danh và chương trình đã cài đặt. - Nhân tiện, tôi làm việc trên một kịch bản để tạo và nâng cấp các ổ đĩa trực tiếp liên tục 'home-rw' . Chào mừng bạn dùng thử :-)
sudodus

1
Lỗi đánh máy nhỏ trong liên kết của bạn: Tôi đã kiểm tra tất cả chúng trong 8.04 LTS nên đọc 18.04 LTS ở cuối. Công cụ của bạn là số 1 dành cho nhiều người không có đủ dung lượng ổ cứng để sao chép Ubuntu 16.04 của họ. Nó cũng dễ dàng hơn (mặc dù chậm hơn) so với việc tạo phân vùng mới trên ổ cứng của họ.
WinEunuuchs2Unix

Tôi đã sửa lỗi chính tả, cảm ơn :-) Bạn đã đúng về việc nhân bản (hoặc sao chép nội dung) vào ổ cứng. Nhưng đối với những người muốn mang theo hệ thống sống bền bỉ của họ trong túi của họ, thật tiện lợi khi làm điều đó với công cụ của tôi.
sudodus

3

Sự cố với việc nâng cấp từ các phiên bản trước lên 18.04 LTS

Hoàn toàn không đơn giản để nâng cấp từ các phiên bản trước lên 18.04 LTS. Tôi không biết có nhiều vấn đề hơn so với việc nâng cấp như vậy trong quá khứ không, nhưng những người thực hiện nâng cấp phát hành hiện có rủi ro cho chính họ. Mặt khác, họ tìm thấy các lỗi và nếu các lỗi được báo cáo , nó sẽ giúp phát triển công cụ nâng cấp cũng như gỡ lỗi chính hệ thống Ubuntu 18.04 LTS.

Điều này có nghĩa là những người đủ kiên nhẫn chờ đợi cho đến khi bản nâng cấp được phát hành chính thức với bản phát hành điểm đầu tiên (18.04.1 LTS) sẽ có được một chuyến đi mượt mà hơn .

Kiểm tra trước khi thực hiện nâng cấp đầy đủ ...

Phương pháp mà @ WinEunuuchs2Unix mô tả ở đây cho phép kiểm tra bản sao của hệ thống thực, nếu nâng cấp lên 18.04 LTS sẽ hoạt động với hệ điều hành [ít nhiều sửa đổi] hiện tại của bạn với phần cứng máy tính.

Điều này có thể ngăn chặn một số thảm họa với hệ điều hành bị hỏng.

Tôi chưa sử dụng tập lệnh của @ WinEunuuchs2Unix, nhưng tôi hiểu rằng nó rất hữu ích và tôi dự định sử dụng tập lệnh này. Tôi đã có thể nâng cấp từ 8.04 lên 10.04 lên 12.04, điều mà tôi đã sử dụng trong một thời gian dài. Nhưng khi tôi bắt đầu nâng cấp từ 14.04 đến 16.04, tôi đã thất bại và không thể tìm thấy lỗi.

... và nếu có vấn đề, hãy cài đặt mới

Tôi đã có bản sao lưu tốt , vì vậy tôi đã thực hiện cài đặt mới 16.04 và sau đó được sao chép, những gì tôi muốn giữ và kiểm tra các chỉnh sửa, tập lệnh, bí danh và chương trình đã cài đặt. Nếu tôi đã sử dụng phương pháp của @ WinEunuuchs2Unix, tôi đã thấy vấn đề sớm, tôi sẽ thực hiện cài đặt mới trực tiếp.

Nâng cấp hệ thống sống bền bỉ

Các hệ thống trực tiếp bền bỉ được sử dụng để có được các hệ thống Ubuntu rất di động, đôi khi được sử dụng để thử nghiệm nhưng đôi khi được sử dụng trong một thời gian dài.

Đây là một vấn đề đã biết, bạn không nên cập nhật và nâng cấp một hệ thống như bạn làm với một hệ thống đã cài đặt vì nó sẽ bị hỏng sớm hay muộn. Hơn nữa, bạn bị mắc kẹt với trình điều khiển kernel và kernel, đi kèm với tệp iso, bởi vì chúng được khởi động trước khi hệ thống lớp phủ được khởi động.

Nhưng thường có thể giữ /homethư mục, giống như bạn có thể, khi bạn thực hiện cài đặt mới với phân vùng 'nhà' riêng. Nếu bạn tạo một home-rwphân vùng, một hệ thống trực tiếp liên tục sẽ tự động tìm và sử dụng nó trong quá trình khởi động.

Tôi đang phát triển và thử nghiệm shellscript, mk-continent-live_with_home-rw , có thể tạo ra một hệ thống trực tiếp bền bỉ với một home-rwphân vùng và sau đó có thể nâng cấp nó,

  • thay thế tệp iso bằng một cái mới hơn. Ít nhất bạn nên nâng cấp khi một tệp iso mới được phát hành, nhưng bạn cũng có thể nâng cấp hệ thống LTS mỗi tháng một lần và sử dụng các tệp iso hàng ngày hiện tại từ trình theo dõi thử nghiệm ,

  • sửa đổi grub cho tập tin iso mới.

  • xóa (định dạng lại) casper-rwtệp lưu trữ các sửa đổi của hệ điều hành (vì vậy bạn phải cài đặt lại các gói chương trình mà bạn đã thêm vào hệ thống),

  • bảo vệ home-rwphân vùng với các tệp cá nhân, cài đặt và chỉnh sửa của bạn.

  • Xem liên kết này để biết thêm chi tiết.

Liên kết bổ sung

Có thể tìm thấy các mẹo chung cho những người muốn thử nghiệm phiên bản Ubuntu mới nhất và lớn nhất trong liên kết sau đây,

Cách tham gia thử nghiệm và phát triển Ubuntu


1
Các liên kết thêm là một liên lạc tốt đẹp. Càng nhiều người báo cáo vấn đề thì càng có nhiều vấn đề sẽ được giải quyết cho những người khác.
WinEunuuchs2Unix

1
Điểm rất tốt cho người dùng LTS (thận trọng về bản chất) để chờ phát hành điểm đầu tiên 18.04.1. Đối với các tổ chức lớn hơn, họ vẫn có thể muốn sao chép 16.04 vào phân vùng thử nghiệm và nâng cấp nó lên 18.04 cho mục đích đào tạo nhân viên. Người dùng sẽ có quyền truy cập vào dữ liệu mà họ quen thuộc. Tất nhiên, nhân viên CNTT sẽ được hưởng lợi từ việc thử nghiệm rộng rãi trên các tháng dữ liệu nhân bản trước ngày phát hành điểm đầu tiên vào ngày 26 tháng 7.
WinEunuuchs2Unix
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.