Bash script untuk backkup / clone Ubuntu ke partisi lain

12

Ubuntu 18.04 keluar tanggal 26 April 2018 dan saya ingin mencobanya untuk memutakhirkan program saya dan mengonversi data saya tetapi tidak ingin melakukan jika ada bug.

Saya telah menyusutkan Windows dari 410 GB menjadi 385 GB, reboot Ubuntu 16.04 dan berlari gparteduntuk membuat partisi 25 GB baru berlabel "Ubuntu18.04". Saya berlari rm-kernelsdan menghapus sekitar 20 kernel untuk menghilangkan sekitar 10 GB di Ubuntu 16.04.

Sekarang saya ingin skrip yang akan mengisi partisi baru dengan 16,04 LTS dan membuat opsi menu Grub baru untuk itu. Hanya direktori yang relevan yang boleh disalin. Sebagai contoh /sys, /run, /procdan /devadalah direktori virtual yang dibuat selama boot dan tidak boleh disalin.

Saya juga ingin /etc/fstabditambal dengan UUID yang benar dan cronpekerjaan reboot dinonaktifkan sehingga cadangan harian pada data yang dikloning tidak berjalan setelah mem-boot klon.

Saya mengantisipasi menjalankan skrip berkali-kali selama beberapa minggu / bulan ke depan. Dengan demikian proses kloning harus diulangi dengan mudah.

Skrip yang sama dapat digunakan untuk menguji pembaruan keamanan dan pembaruan Tim Kernel Ubuntu baru tanpa mempengaruhi sistem produksi.

WinEunuuchs2Unix
sumber
20 kernel membutuhkan 10GB !!!? Apakah Anda tidak sengaja menginstal edisi kernel bengkak?
Lie Ryan
@ LieRyan Ini sebenarnya 400MB per kernel dan bukan 500 MB saat saya membulatkan angka (sekitar 20 kernel). Untuk melihat seberapa banyak setiap kernel menghabiskan (berfluktuasi dari 394MB ke 419MB pada instalasi saya saat ini, lihat:. Askubuntu.com/questions/949411/...
WinEunuuchs2Unix

Jawaban:

19

Bash script untuk mengkloning Ubuntu Partition to clone partisi yang aktif

The clone-ubuntu.shbash script mulus akan dan aman mereplikasi 16.04 LTS menjadi partisi untuk upgrade ke 18,04 LTS:

clone-ubuntu.png

Poin-poin penting untuk dipertimbangkan:

  • Anda harus membuat ext4partisi kosong yang cukup besar untuk menampung clone Ubuntu 16.04
  • Saat memanggil skrip clone-ubuntu.sh, partisi tidak dapat dipasang. Script secara otomatis me-mount dan melepas partisi.
  • Perintah rsyncini digunakan untuk menyalin file dari /ke partisi clone. Pertama kali Anda menjalankannya clone-ubuntu.shakan memakan waktu beberapa menit. Saat kedua kali Anda menjalankan skrip, hanya perubahan file yang diperbarui dan ini akan memakan waktu kurang dari satu menit.
  • Anda dapat menjalankan skrip ini dan reboot beberapa kali. Setiap data baru pada target klon akan dihapus untuk mencerminkan /file & direktori saat ini.
  • Semua pekerjaan Cron /etc/cron.d(reboot) dipindahkan ke sub-direktori baru yang disebut /etc/cron.d/hold. Setelah booting, klon ingatlah untuk menjalankan sudo crontab -eagar cron job yang dipilih tidak aktif.
  • File yang dikloning /etc/fstabdiubah dengan UUID yang sesuai untuk partisi yang dihidupkan.
  • File yang dikloning /boot/grub/grub.cfgdiubah dengan UUID yang sesuai untuk booting klon yang berhasil. File yang dikloning quiet splashdiubah nosplashsehingga Anda mendapatkan scrolling terminal messaging. Ini memberikan kesadaran visual untuk mem-boot versi klon daripada versi "Nyata".
  • update-grub dijalankan untuk memperbarui Grub dengan opsi menu baru yang menunjuk ke partisi yang dikloning.
  • File yang dikloning /etc/update-manager/release-upgradesdiubah untuk diubah Prompt=nevermenjadi Prompt=lts. Ketika Anda mem-boot clone dan melakukan do-release-upgrade -dini memungkinkan Ubuntu 16.04 ditingkatkan menjadi 18.04.
  • Sebelum mengkloning layar konfirmasi ditampilkan (diperlihatkan di bagian berikutnya) dan Anda harus mengetik y / Y untuk melanjutkan.

Layar Konfirmasi

Setelah memilih partisi klon target, pertama-tama diverifikasi ext4jenis partisi dan belum dipasang. Jika tes ini berlalu, pesan konfirmasi kemudian muncul:

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

Dalam contoh ini, klon sebelumnya telah dipilih untuk rekloning. Ruang yang tersedia pada klon adalah titik bisu karena kita sudah tahu ada cukup ruang.

Jika Anda memiliki beberapa instalasi Ubuntu, harap verifikasi Anda telah memilih partisi yang tepat untuk mengkloning Ubuntu yang saat ini di-boot, dipasang sebagai /(root), untuk.

Ini adalah kesempatan terakhir Anda untuk membatalkan dengan menekan sembarang tombol kecuali yatau Y.


Daftar keluaran

Ketika Anda menjalankan skrip Anda akan mendapatkan output ini (tidak termasuk output yang sudah terdaftar di atas):

=====================================================================
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 tampilan status untuk klon baru

Saat kloning untuk pertama kalinya, rsyncakan memberikan pembaruan dari 0 hingga 100% dari semua file yang dibuat. Tidak ada file yang akan dihapus atau diubah karena klon kosong:

clone-ubuntu.sh kosong clone.gif

rsync tampilan status saat rekloning

Ketika rsyncreclones tidak pernah hit 100%karena file yang tidak pernah berubah tidak disalin. Akan ada keterlambatan dalam kemajuan pembaruan sebagai rsyncpemindaian untuk file berikutnya yang akan disalin dan ketika itu menghapus file baru yang dibuat di klon yang tidak pernah ada dalam aslinya:

clone-ubuntu-rsync.gif


Skrip 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

Salin dan tempel kode bash di atas ke file baru yang disebut /usr/local/bin/clone-ubuntu.sh. Kemudian buat file baru dapat dieksekusi menggunakan:

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

Untuk memanggil skrip gunakan:

sudo clone-ubuntu.sh

Cara memutakhirkan klon 16,04 LTS ke Ubuntu 18,04 LTS

Ini adalah bagian "bonus" yang mungkin menarik minat banyak orang.

Nyalakan ulang mesin Anda. The grubmenu akan berisi pilihan menu menunjuk baru ke partisi kloning. Anda juga dapat memilih versi kernel tertentu dari menu Opsi Lanjutan klon .

Salah satu cara untuk mengubah klon 16.04 LTS menjadi 18.04 LTS adalah menjalankan:

sudo do-release-upgrade

Perhatikan bahwa -dbendera itu diperlukan sebelum 26 Juli 2018 tetapi tidak lagi diperlukan.

Baca konfirmasi peningkatan versi 18.04 dengan seksama .

Sebelum melanjutkan, pastikan penguncian layar tidak aktif dimatikan. Proses peningkatan dapat macet jika komputer Anda membuka layar kunci karena tidak adanya keyboard.

Ringkasan proses peningkatan 18,04

Bagian ini akan spesifik untuk mesin karena aplikasi yang berbeda dipasang oleh pengguna yang berbeda. Berikut ini ringkasan singkat yang saya buat berdasarkan catatan dan memori:

  1. konfirmasi untuk melanjutkan: ENTER
  2. paket akan dihapus: Y
  3. ganti longind.conf: Y
  4. File konfigurasi '/etc/sane.d/dll.conf', default N, ambil Y
  5. '/etc/NetworkManager/conf.d/default-wifi-powersave-on.conf' Ambil default N
  6. File konfigurasi '/etc/pulse/default.pa' default N, ambil Y
  7. File konfigurasi '/etc/grub.d/30_os-prober' 'default N, ambil N
  8. Konfigurasi menu grub layar penuh muncul. Ambil pilihan: pertahankan versi lokal saat ini diinstal
  9. File konfigurasi '/etc/cron.d/anacron', default N, ambil Y untuk melihat apa
  10. Pesan kesalahan beberapa kali: /sbin/ldconfig.real: Peringatan: mengabaikan file konfigurasi yang tidak dapat dibuka: /etc/ld.so.conf.d/x86_64-linux-gnu_EGL.conf: Tidak ada file atau direktori tersebut
  11. Non-standar: File konfigurasi '/etc/vnstat.conf' (perbedaan tampilan 1,13 vs 1,18) ambil Y
  12. 220 paket akan dihapus. (dapat memakan waktu berjam-jam) masukkan Y
  13. Untuk menyelesaikan upgrade, diperlukan restart. Ambil Y

Perhatikan langkah 10 kebanyakan orang tidak akan pernah melihat. Saya memiliki instalasi driver nVidia lama pada Ubuntu 16.04 saya, saya tidak pernah bisa menghapus sepenuhnya. Ini termasuk karena Anda mungkin memiliki paket lama yang serupa tidak pernah dihapus sepenuhnya.

Grub mengubah menu boot untuk dikloning di bawah UEFI

Tidak seperti upgrade 18.04 saya menemukan upgrade 18.04.1 mengubah konfigurasi Grub UEFI untuk menggunakan menu grub clone daripada menu grub asli sesuai jawaban ini: Dual boot dan file /boot/grub/grub.cfg - yang mana adalah bekas?

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

Berjalan sudo update-grubsetelah mem-boot partisi asli tidak cukup untuk mengubah yang grub.cfgdimuat oleh grub. Anda perlu menggunakan sudo grub-installuntuk memaksa grub untuk menggunakan konfigurasi partisi asli.

Baik partisi asli dan partisi klon dapat digunakan update-grub untuk memelihara /boot/grub/grub.cfgfile mereka sendiri tetapi hanya satu yang dapat digunakan selama boot.

Tentu saja jika Anda ingin grub menggunakan menu grone Clone jangan lakukan langkah-langkah di atas pada partisi asli.


Edit riwayat

Edit 6 Mei 2018 - Tampilan informasi untuk partisi klon kosong (target) diperbaiki.

Edit 26 Agustus 2018 - Gunakan --inplaceopsi dengan rsyncfile yang sangat besar seperti file sampah 2 GB tidak diduplikasi pada klon selama proses penyalinan. Ini dapat menyebabkan kesalahan "kehabisan ruang disk". Mengomentari /etc/cron.dpenimpaan karena pengguna mungkin ingin menyimpan atau menginginkan direktori yang berbeda sekaligus. Perbarui instruksi untuk digunakan do-release-upgradetanpa -dtanda karena Ubuntu 18.04.1 LTS sekarang telah dirilis.

WinEunuuchs2Unix
sumber
1
+1. Terima kasih atas alat yang berguna :-)
sudodus
1
@sudodus Saya harap orang-orang menggunakan alat ini sebelum melanjutkan dengan peningkatan 18,04. Paling tidak mereka dapat menggunakan ini sebagai tutorial dan ulangi langkah-langkah secara manual menggunakan boot USB Live. Sungguh tragis membaca begitu banyak kesalahan yang dialami orang pada 18,04 baru karena mereka telah meningkatkan versi tanpa pengujian terlebih dahulu dan berkomitmen dengan memusnahkan instalasi 16,04 , 17,04 atau 17,10 sebelumnya . Sayangnya saya telah melihat hal serupa berkali-kali selama beberapa dekade. Terima kasih atas suara Anda! Ini membantu memperkuat upaya yang dimasukkan ke dalam upaya seperti clone-ubuntu.shTapi saya sudah menggunakan ini 4 kali sendiri!
WinEunuuchs2Unix
1
Saya belum menggunakan skrip Anda, tetapi saya mengerti, bahwa itu sangat berguna, dan saya bermaksud menggunakannya. - Saya dapat memutakhirkan dari 8.04 ke 10.04 ke 12.04, yang saya gunakan untuk waktu yang lama. Tetapi ketika saya mulai melakukan upgrade melalui 14,04 hingga 16,04 saya gagal. Saya memiliki cadangan yang baik, jadi saya membuat instalasi baru 16,04 dan kemudian disalin, apa yang ingin saya simpan dan periksa apakah ada tweak, skrip, alias, dan program yang diinstal. - Ngomong-ngomong, saya mengerjakan skrip untuk membuat dan memutakhirkan live drive persisten 'home-rw' . Selamat mencoba :-)
sudodus
1
Kesalahan ketik kecil di tautan Anda: Saya menguji semuanya di 8.04 LTS pada akhirnya harus membaca 18,04 LTS . Alat Anda adalah nomor 1 bagi banyak orang yang tidak memiliki cukup ruang HDD untuk mengkloning Ubuntu 16.04 mereka. Ini juga lebih mudah (meskipun lebih lambat) daripada membuat partisi baru pada HDD mereka.
WinEunuuchs2Unix
Saya memperbaiki kesalahan ketik, terima kasih :-) Anda benar tentang kloning (atau menyalin konten) ke HDD. Tetapi bagi orang-orang yang ingin membawa sistem live persisten mereka di saku mereka, lebih mudah melakukannya dengan alat saya.
sudodus
3

Masalah dengan peningkatan dari rilis sebelumnya ke 18,04 LTS

Sama sekali tidak mudah untuk meningkatkan dari rilis sebelumnya ke 18,04 LTS. Saya tidak tahu apakah ada lebih banyak masalah daripada peningkatan seperti itu di masa lalu, tetapi orang-orang yang melakukan peningkatan versi sekarang mengambil risiko sendiri. Di sisi lain mereka menemukan bug dan jika bug dilaporkan , itu akan membantu mengembangkan alat peningkatan serta men-debug sistem Ubuntu 18.04 LTS itu sendiri.

Ini berarti bahwa orang yang cukup sabar untuk menunggu sampai peningkatan secara resmi dirilis dengan rilis poin pertama (18.04.1 LTS) akan mendapatkan perjalanan yang lebih mulus .

Menguji sebelum melakukan pemutakhiran penuh ...

Metode yang dijelaskan oleh @ WinEunuuchs2Unix di sini memungkinkan untuk menguji dengan salinan sistem nyata, jika memutakhirkan ke 18,04 LTS akan bekerja dengan sistem operasi [yang kurang lebih dimodifikasi] saat ini dengan perangkat keras komputer Anda.

Ini dapat mencegah beberapa bencana dengan sistem operasi yang rusak.

Saya belum menggunakan skrip @ WinEunuuchs2Unix, tapi saya mengerti, itu sangat berguna, dan saya bermaksud menggunakannya. Saya dapat memutakhirkan dari 8.04 ke 10.04 ke 12.04, yang saya gunakan untuk waktu yang lama. Tetapi ketika saya mulai melakukan upgrade melalui 14.04 hingga 16.04 saya gagal dan tidak dapat menemukan kesalahan.

... dan jika ada masalah, buat instalasi baru

Saya punya cadangan yang bagus , jadi saya membuat instalasi baru 16,04 dan kemudian disalin, apa yang ingin saya simpan dan periksa apakah ada tweak, skrip, alias, dan program yang diinstal. Jika saya menggunakan metode @ WinEunuuchs2Unix, saya telah melihat masalah lebih awal, saya akan langsung menginstal baru.

Meningkatkan sistem live yang persisten

Sistem live persisten digunakan untuk mendapatkan sistem Ubuntu yang sangat portabel, yang kadang-kadang digunakan untuk pengujian tetapi terkadang digunakan untuk waktu yang lama.

Ini adalah masalah yang diketahui, bahwa Anda tidak harus memperbarui & memutakhirkan sistem seperti yang Anda lakukan dengan sistem yang diinstal karena akan rusak cepat atau lambat. Selanjutnya, Anda terjebak dengan driver kernel dan kernel, yang datang dengan file iso, karena mereka dimulai sebelum sistem overlay dimulai.

Tetapi biasanya memungkinkan untuk menyimpan /homedirektori, seperti yang Anda bisa, ketika Anda membuat instalasi baru dengan partisi 'home' yang terpisah. Jika Anda membuathome-rw partisi, sistem live yang persisten akan menemukan dan menggunakannya secara otomatis saat boot.

Saya mengembangkan dan menguji shellscript, mk-persistent-live_with_home-rw , yang dapat membuat sistem live persisten dengan sebuah home-rwpartisi, dan yang nantinya dapat memutakhirkannya ,

  • ganti file iso dengan yang lebih baru. Paling tidak Anda harus memutakhirkan ketika file iso baru dirilis, tetapi Anda juga dapat memutakhirkan sistem LTS sebulan sekali dan menggunakan file iso harian saat ini dari pelacak pengujian ,

  • ubah grub untuk file iso baru.

  • menghapus (memformat ulang) casper-rwfile yang menyimpan modifikasi sistem operasi (jadi Anda harus menginstal ulang paket program yang Anda tambahkan ke sistem),

  • pertahankan home-rwpartisi dengan file pribadi Anda, pengaturan dan tweak.

  • Lihat tautan ini untuk lebih jelasnya.

Tautan ekstra

Kiat umum untuk orang yang ingin menguji versi terbaru dan terhebat Ubuntu dapat ditemukan di tautan berikut,

Bagaimana cara berpartisipasi dalam pengujian dan pengembangan Ubuntu

sudodus
sumber
1
Tautan ekstra adalah sentuhan yang bagus. Semakin banyak orang yang melaporkan masalah, semakin banyak masalah yang akan diselesaikan untuk orang lain.
WinEunuuchs2Unix
1
Poin yang sangat bagus untuk pengguna LTS (berhati-hati secara alami) untuk menunggu rilis poin pertama 18.04.1. Untuk organisasi yang lebih besar, mereka mungkin masih ingin mengkloning 16,04 ke partisi uji dan meningkatkannya menjadi 18,04 untuk keperluan pelatihan staf. Pengguna akan memiliki akses ke data yang biasa mereka gunakan. Tentu saja staf TI akan mendapat manfaat dari pengujian ekstensif pada data kloning bulan sebelum rilis poin pertama 26 Juli juga.
WinEunuuchs2Unix