Bash script เพื่อ backkup / clone Ubuntu ไปยังพาร์ติชั่นอื่น


12

Ubuntu 18.04ออกมาเมื่อวันที่ 26 เมษายน 2018 และฉันต้องการลองอัพเกรดโปรแกรมและแปลงข้อมูลของฉัน แต่ไม่ต้องการยอมรับหากมีข้อบกพร่อง

ฉันหด Windows จาก 410 GB เป็น 385 GB รีบูต Ubuntu 16.04 และวิ่งgpartedไปสร้างพาร์ทิชันใหม่ 25 GB ชื่อ "Ubuntu18.04" ฉันวิ่งrm-kernelsและนำเมล็ดออกประมาณ 20 เม็ดเพื่อกำจัดประมาณ 10 GB บน Ubuntu 16.04

ตอนนี้ฉันต้องการสคริปต์ที่จะเติมพาร์ติชันใหม่ด้วย 16.04 LTS และสร้างตัวเลือกเมนู Grub ใหม่ ควรคัดลอกไดเรกทอรีที่เกี่ยวข้องเท่านั้น ตัวอย่างเช่น/sys, /run, /procและ/devไดเรกทอรีเสมือนที่สร้างขึ้นในระหว่างการบูตและไม่ควรคัดลอก

ฉันยังต้องการ/etc/fstabแพตช์ด้วย UUID ที่ถูกต้องและcronปิดการใช้งานการรีบูตเช่นว่าการสำรองข้อมูลรายวันเกี่ยวกับข้อมูลโคลนจะไม่ทำงานหลังจากบูตโคลน

ฉันคาดว่าจะเรียกใช้สคริปต์ได้หลายครั้งในอีกไม่กี่สัปดาห์ / เดือน เช่นกระบวนการโคลนควรทำซ้ำได้อย่างง่ายดาย

สคริปต์เดียวกันนี้สามารถใช้สำหรับทดสอบการรักษาความปลอดภัยและการอัพเดต Ubuntu Kernel Team ใหม่โดยไม่ส่งผลกระทบต่อระบบการผลิต


20 เม็ดใช้เวลา 10GB !!! คุณบังเอิญติดตั้งเคอร์เนลรุ่น bloated?
โกหก

@LieRyan จริง ๆ แล้วคือ 400MB ต่อเคอร์เนลและไม่ใช่ 500 MB ตามที่ฉันปัดเศษตัวเลข (ประมาณ 20 เมล็ด) เพื่อดูว่าเคอร์เนลแต่ละตัวใช้เวลาเท่าใด (ผันผวนจาก 394MB ถึง 419MB ในการติดตั้งปัจจุบันของฉันดู:. askubuntu.com/questions/949411/…
WinEunuuchs2Unix

คำตอบ:


19

ทุบตีสคริปต์เพื่อโคลนพาร์ทิชัน Ubuntu ที่ใช้งานเพื่อโคลนพาร์ทิชัน

clone-ubuntu.shสคริปต์ทุบตีจะได้อย่างลงตัวและปลอดภัยซ้ำ 16.04 LTS เข้าไปในพาร์ทิชันสำหรับการอัพเกรด 18.04 LTS นี้:

โคลน ubuntu.png

ประเด็นสำคัญที่ควรพิจารณา:

  • คุณต้องสร้างext4พาร์ติชั่นที่ว่างเปล่าให้ใหญ่พอที่จะเก็บUbuntu 16.04 ไว้
  • เมื่อเรียกใช้สคริปต์clone-ubuntu.shพาร์ติชันจะไม่สามารถติดตั้งได้ สคริปต์จะเมาต์และ unmount พาร์ติชันโดยอัตโนมัติ
  • คำสั่ง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 ที่บู๊ตอยู่ในปัจจุบันซึ่งติดตั้งเป็น/(รูท) เป็น

นี่เป็นโอกาสสุดท้ายของคุณจะยกเลิกโดยการกดปุ่มใด ๆ ยกเว้นหรือyY


รายการเอาท์พุท

เมื่อคุณเรียกใช้สคริปต์คุณจะได้รับผลลัพธ์นี้ (ไม่รวมผลลัพธ์ที่แสดงรายการไว้ด้านบน):

=====================================================================
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 แสดงสถานะเมื่อ recloning

เมื่อrsyncreclones มันไม่เคยกระทบ100%เพราะไฟล์ที่ไม่เคยเปลี่ยนจะไม่ถูกคัดลอก จะมีความล่าช้าในการดำเนินการอัปเดตเมื่อrsyncสแกนไฟล์ถัดไปที่จะคัดลอกและเมื่อลบไฟล์ใหม่ที่สร้างในโคลนที่ไม่เคยมีอยู่ในต้นฉบับ:

โคลนอูบุนตู-rsync.gif


สคริปต์ทุบตี - 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

/usr/local/bin/clone-ubuntu.shคัดลอกและวางโค้ดทุบตีข้างต้นเป็นไฟล์ใหม่ที่เรียกว่า จากนั้นสร้างไฟล์ปฏิบัติการใหม่โดยใช้:

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

วิธีเรียกใช้สคริปต์:

sudo clone-ubuntu.sh

วิธีอัพเกรดโคลน LTS 16.04 เป็น Ubuntu 18.04 LTS

นี่คือส่วน "โบนัส" ที่อาจทำให้คนสนใจ

รีบูตเครื่องของคุณ grubเมนูจะมีการชี้ตัวเลือกเมนูใหม่ให้กับพาร์ทิชันโคลน คุณยังสามารถเลือกรุ่นเคอร์เนลที่ต้องการได้จากเมนูตัวเลือกขั้นสูงของโคลน

วิธีหนึ่งในการแปลงโคลน 16.04 LTS เป็น 18.04 LTS คือการเรียกใช้:

sudo do-release-upgrade

โปรดทราบว่า-dจำเป็นต้องมีการตั้งค่าสถานะก่อนวันที่ 26 กรกฎาคม 2018 แต่ไม่จำเป็นอีกต่อไป

อ่านยืนยัน 18.04 อัพเกรดอย่างรอบคอบ

ก่อนดำเนินการต่อต้องแน่ใจว่าการปิดหน้าจอไม่ทำงานนั้นปิดอยู่ กระบวนการอัพเกรดอาจล้มเหลวหากคอมพิวเตอร์ของคุณไปที่หน้าจอล็อคเนื่องจากไม่มีการใช้งานคีย์บอร์ด

สรุปกระบวนการอัพเกรด 18.04

ส่วนนี้จะเฉพาะเครื่องเนื่องจากมีการติดตั้งแอพที่แตกต่างกันโดยผู้ใช้ที่แตกต่างกัน นี่คือบทสรุปสั้น ๆ ที่ฉันทำตามบันทึกและหน่วยความจำ:

  1. ยืนยันการดำเนินการ: ENTER
  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 เพื่อใช้เมนูด้วงของโคลนแทนเมนูด้วงเดิมตามคำตอบนี้: การบูทคู่และไฟล์ /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ถูกโหลดโดยด้วง คุณต้องใช้sudo grub-installเพื่อบังคับให้ด้วงใช้การกำหนดค่าของพาร์ติชันดั้งเดิม

ทั้งพาร์ติชันดั้งเดิมและพาร์ติชันโคลนสามารถใช้update-grubเพื่อรักษา/boot/grub/grub.cfgไฟล์ของตัวเองแต่สามารถใช้เพียงพาร์ติชันเดียวระหว่างการบู๊ต

แน่นอนถ้าคุณต้องการให้ด้วงใช้เมนูด้วงของ Clone อย่าทำตามขั้นตอนด้านบนพาร์ติชั่นดั้งเดิม


แก้ไขประวัติ

แก้ไข 6 พฤษภาคม 2018 - แสดงข้อมูลสำหรับพาร์ติชันโคลน (เป้าหมาย) ที่ถูกแก้ไข

แก้ไข 26 สิงหาคม 2018 - ใช้--inplaceตัวเลือกกับrsyncไฟล์ที่มีขนาดใหญ่เช่นไฟล์ขยะ 2 GB ซึ่งไม่ซ้ำกันในระหว่างการคัดลอก สิ่งนี้อาจทำให้เกิดข้อผิดพลาด "ออกจากพื้นที่ดิสก์" /etc/cron.dลบล้างความคิดเห็นเนื่องจากผู้ใช้อาจต้องการเก็บไว้หรือต้องการไดเรกทอรีที่แตกต่างกันโดยสิ้นเชิง อัปเดตคำแนะนำการใช้do-release-upgradeโดยไม่-dตั้งค่าสถานะเนื่องจาก Ubuntu 18.04.1 LTS วางจำหน่ายแล้ว


1
+1 ขอบคุณสำหรับเครื่องมือที่มีประโยชน์ :-)
sudodus

1
@ Sudodus ฉันหวังว่าผู้คนจะใช้เครื่องมือนี้ก่อนที่จะเต็มไปด้วยการอัพเกรด 18.04 อย่างน้อยที่สุดพวกเขาสามารถใช้สิ่งนี้เป็นบทช่วยสอนและทำซ้ำขั้นตอนด้วยตนเองโดยใช้การบูตแบบ 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 และคัดลอกมาใหม่ภายหลังสิ่งที่ฉันต้องการเก็บและตรวจสอบเพื่อปรับแต่งสคริปต์สคริปต์ชื่อแทนและโปรแกรมที่ติดตั้ง - โดยวิธีการที่ผมทำงานในสคริปต์เพื่อสร้างและอัพเกรดไดรฟ์ที่มีชีวิตถาวรบ้าน-RW ' ยินดีต้อนรับสู่ลอง :-)
sudodus

1
พิมพ์ผิดเล็กน้อยในลิงก์ของคุณ: ฉันทดสอบทั้งหมดใน 8.04 LTSควรอ่าน18.04 LTSในตอนท้าย เครื่องมือของคุณคือหมายเลข 1 สำหรับหลาย ๆ คนที่มีพื้นที่ HDD ไม่เพียงพอในการโคลน Ubuntu 16.04 นอกจากนี้ยังง่ายกว่า (แม้ว่าจะช้ากว่า) กว่าการสร้างพาร์ติชันใหม่บน HDD
WinEunuuchs2Unix

ฉันแก้ไขข้อผิดพลาดขอบคุณ :-) คุณพูดถูกเกี่ยวกับการโคลนนิ่ง (หรือคัดลอกเนื้อหา) ไปยัง HDD แต่สำหรับผู้ที่ต้องการพกพาระบบถ่ายทอดสดถาวรในกระเป๋าของพวกเขาสะดวกในการใช้เครื่องมือของฉัน
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' แยกต่างหาก หากคุณสร้างhome-rwพาร์ติชันระบบถ่ายทอดสดแบบถาวรจะค้นหาและใช้พาร์ติชันโดยอัตโนมัติระหว่างการบู๊ต

ฉันกำลังพัฒนาและทดสอบ shellscript, MK-ถาวร-live_with_home-RW , ที่สามารถสร้างระบบการมีชีวิตอยู่ถาวรกับhome-rwพาร์ทิชันและในภายหลังว่าสามารถอัพเกรดมัน

  • แทนที่ไฟล์ iso ด้วยไฟล์ใหม่กว่า อย่างน้อยคุณควรอัพเกรดเมื่อไฟล์ ISO ใหม่ออก แต่คุณยังสามารถอัพเกรดระบบ LTS เดือนละครั้งและใช้ไฟล์ ISO รายวันในปัจจุบันจากการติดตามการทดสอบ ,

  • แก้ไขด้วงสำหรับไฟล์ iso ใหม่

  • เช็ด (ฟอร์แมตใหม่) casper-rwไฟล์ที่เก็บการดัดแปลงของระบบปฏิบัติการ (ดังนั้นคุณต้องติดตั้งแพ็กเกจโปรแกรมที่คุณเพิ่มเข้าไปในระบบอีกครั้ง)

  • รักษาhome-rwพาร์ติชันด้วยไฟล์ส่วนบุคคลการตั้งค่าและการปรับแต่งของคุณ

  • ดูลิงค์นี้สำหรับรายละเอียดเพิ่มเติม

ลิงค์เสริม

คำแนะนำทั่วไปสำหรับผู้ที่ต้องการทดสอบ Ubuntu รุ่นล่าสุดและยิ่งใหญ่ที่สุดสามารถพบได้ในลิงค์ต่อไปนี้

จะมีส่วนร่วมในการทดสอบและพัฒนา Ubuntu อย่างไร


1
ลิงค์พิเศษเป็นสัมผัสที่ดี ผู้คนจำนวนมากที่รายงานปัญหายิ่งมีปัญหามากขึ้นที่จะแก้ไขให้คนอื่น
WinEunuuchs2Unix

1
จุดที่ดีมากสำหรับผู้ใช้ LTS (ระมัดระวังโดยธรรมชาติ) เพื่อรอจุดแรกที่ปล่อย 18.04.1 สำหรับองค์กรขนาดใหญ่พวกเขาอาจยังต้องการโคลน 16.04 เป็นพาร์ติชันทดสอบและอัปเกรดเป็น 18.04 เพื่อการฝึกอบรมพนักงาน ผู้ใช้จะสามารถเข้าถึงข้อมูลที่พวกเขาคุ้นเคย แน่นอนว่าเจ้าหน้าที่ไอทีจะได้รับประโยชน์จากการทดสอบอย่างกว้างขวางเกี่ยวกับข้อมูลโคลนเดือนก่อนวันที่ 26 กรกฎาคมเป็นวันแรก
WinEunuuchs2Unix
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.