우분투를 다른 파티션으로 백업 / 복제하는 배쉬 스크립트


12

Ubuntu 18.04 는 2018 년 4 월 26 일에 나 왔으며 프로그램을 업그레이드하고 데이터를 변환하려고하지만 버그가 있으면 커밋하고 싶지 않습니다.

Windows를 gparted410GB에서 385GB로 축소하고 Ubuntu 16.04를 재부팅 한 후 "Ubuntu18.04"라는 새 25GB 파티션을 만들었습니다. rm-kernels우분투 16.04에서 약 10GB를 제거하기 위해 약 20 개의 커널을 실행 하고 제거했습니다.

이제 새 파티션을 16.04 LTS로 채우고 새 Grub 메뉴 옵션을 생성하는 스크립트가 필요합니다. 관련 디렉토리 만 복사해야합니다. 예를 들어 /sys, /run, /proc/dev부팅 중에 만들어진 가상 디렉터리하고 복사 할 수 없습니다.

또한 /etc/fstab올바른 UUID로 패치하고 cron재부팅 작업을 비활성화하여 클론을 부팅 한 후 복제 된 데이터의 일일 백업이 실행되지 않도록합니다.

앞으로 몇 주 / 달 동안 스크립트를 여러 번 실행할 것으로 예상됩니다. 따라서 클로닝 프로세스는 쉽게 반복 가능해야합니다.

프로덕션 시스템에 영향을 미치지 않으면 서 동일한 스크립트를 사용하여 보안 업데이트 및 새로운 Ubuntu Kernel Team 업데이트를 테스트 할 수 있습니다.


20 개의 커널에는 10GB가 필요합니다 !!!? 실수로 커널 부풀린 판을 설치 했습니까?
Lie Ryan

@LieRyan 실제로 커널 당 400MB이고 숫자를 반올림하면 500MB가 아닙니다 (약 20 개의 커널). 각각의 커널이 설치 참조 :. 내 현재에 419메가바이트에 3백94메가바이트에서 (변동하기를 차지하는 보려면 askubuntu.com/questions/949411/...
WinEunuuchs2Unix

답변:


19

활성 Ubuntu 파티션을 복제하여 파티션을 복제하는 Bash 스크립트

clone-ubuntu.shbash는 스크립트가 원활하고 안전하게 18.04 LTS로 업그레이드를위한 파티션으로 16.04 LTS를 복제합니다 :

clone-ubuntu.png

고려해야 할 중요한 사항 :

  • Ubuntu 16.04 복제본ext4 을 보유 할 수있을만큼 큰 빈 파티션을 만들어야합니다
  • 스크립트를 호출 할 때 clone-ubuntu.sh파티션 마운트 할 수 없습니다 . 스크립트는 파티션을 자동으로 마운트 및 마운트 해제합니다.
  • 이 명령 rsync은 파일을 /복제 파티션 으로 복사하는 데 사용됩니다 . 처음 실행 clone-ubuntu.sh하면 몇 분이 걸립니다. 두 번째로 스크립트를 실행하면 파일 변경 사항 만 업데이트되며 1 분 미만이 소요됩니다.
  • 이 스크립트를 실행하고 여러 번 재부팅 할 수 있습니다. 복제 대상의 모든 새 데이터 는 현재 파일 및 디렉토리 를 미러링하기 위해 삭제됩니다/ .
  • 모든 Cron /etc/cron.d(재부팅) 작업은이라는 새 하위 디렉토리로 이동됩니다 /etc/cron.d/hold. 클론을 부팅 한 후 sudo crontab -e선택한 크론 작업이 실행되지 않도록 실행 해야합니다.
  • 복제 된 파일 /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 설치가있는 경우 /(root) 로 마운트 된 현재 부팅 된 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 리 클로닝시 상태 표시

rsync그것은 결코 명중하지 reclones 100%변경하지 파일이 복사되지 않기 때문에. rsync복사 할 다음 파일을 스캔하고 원본에 존재하지 않았던 복제본에서 생성 된 새 파일을 삭제할 때 업데이트 진행이 지연 됩니다.

clone-ubuntu-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

위의 bash 코드를 복사하여이라는 새 파일에 붙여 넣습니다 /usr/local/bin/clone-ubuntu.sh. 그런 다음 다음을 사용하여 새 파일을 실행 가능하게 만드십시오.

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

스크립트를 호출하려면 다음을 사용하십시오.

sudo clone-ubuntu.sh

16.04 LTS 클론을 Ubuntu 18.04 LTS로 업그레이드하는 방법

이것은 많은 사람들이 관심을 가질 수있는 "보너스"섹션입니다.

컴퓨터를 재부팅하십시오. grub메뉴는 복제 된 파티션에 새로운 메뉴 옵션을 가리키는 포함됩니다. 복제본의 Advanced Options (고급 옵션) 메뉴 에서 특정 커널 버전을 선택할 수도 있습니다.

복제 된 16.04 LTS를 18.04 LTS로 변환하는 한 가지 방법은 다음을 실행하는 것입니다.

sudo do-release-upgrade

-d플래그는 2018 년 7 월 26 일 이전에 필요했지만 더 이상 필요하지 않습니다.

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 단계 대부분의 사람들은 보지 못할 것입니다. Ubuntu 16.04에 이전 nVidia 드라이버가 설치되어 있습니다. 완전히 제거하지 못했습니다. 유사한 이전 패키지가 완전히 제거되지 않았기 때문에 포함되어 있습니다.

UEFI에서 Grub 변경 부팅 메뉴 복제

18.04 업그레이드와는 달리 18.04.1 업그레이드에서이 답변에 따라 원래 grub 메뉴 대신 클론의 grub 메뉴를 사용하도록 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.cfggrub 이로 드 한 파티션을 변경하기에 충분하지 않습니다 . 당신은 사용할 필요가 sudo grub-install원래 파티션의 구성을 사용하도록 강제 GRUB에.

원래 파티션과 복제 파티션 모두 update-grub자체 /boot/grub/grub.cfg파일 을 유지 관리하는 데 사용할 수 있지만 부팅 중에는 하나만 사용할 수 있습니다.

물론 grub에서 복제 grub 메뉴를 사용하려면 원본 파티션에서 위 단계를 수행하지 마십시오.


기록 편집

2018 년 5 월 6 일 편집 -빈 클론 (대상) 파티션의 정보 표시가 수정되었습니다.

2018 년 8 월 26 일 편집 - 복사 프로세스 중에 2GB 휴지통 파일과 같은 큰 파일은 복제시 복제되지 않는 --inplace옵션을 사용하십시오 rsync. "디스크 공간 부족"오류가 발생할 수 있습니다. /etc/cron.d사용자가 다른 디렉토리를 유지하거나 원할 수 있으므로 무시를 주석 처리하십시오 . Ubuntu 18.04.1 LTS가 출시되었으므로 플래그 do-release-upgrade없이 사용할 수 있도록 지침을 업데이트하십시오 -d.


1
+1. 유용한 도구에 감사드립니다 :-)
sudodus

1
@sudodus 나는 사람들이 18.04 업그레이드를 시작하기 전에이 도구를 사용하기를 바랍니다. 최소한 그들은 이것을 튜토리얼로 사용할 수 있으며 Live USB 부팅을 사용하여 수동으로 단계를 반복 할 수 있습니다. 처음 18.04 , 17.04 또는 17.10 설치를 지우고 테스트하지 않고 업그레이드했기 때문에 사람들이 새로운 18.04에서 발생하는 많은 오류를 읽는 것은 비극적 입니다. 슬프게도 수십 년 동안 비슷한 것들을 여러 번 보았습니다. 투표 해 주셔서 감사합니다! 그것은 노력과 같은 노력을 강화하는 데 도움 이되지만 어쨌든 나는이 4 번 나 자신을 사용했습니다! clone-ubuntu.sh
WinEunuuchs2Unix

1
귀하의 스크립트를 아직 사용하지 않았지만 매우 유용하며 사용하고자합니다. -오랫동안 사용해온 8.04에서 10.04로 12.04로 업그레이드 할 수있었습니다. 그러나 14.04를 통해 16.04로 업그레이드하기로 결정했을 때 실패했습니다. 백업이 잘되었으므로 16.04 이상을 새로 설치 한 후 복사, 수정, 스크립트, 별명 및 설치된 프로그램을 확인하고 유지하고 싶었습니다. -그건 그렇고, 영구 라이브 드라이브 'home-rw'를 만들고 업그레이드하기 위해 스크립트 작업을합니다 . 그것을 시도해 주셔서
감사

1
귀하의 링크에있는 작은 오타 : 8.04 LTS에서 모두 테스트 했습니다. 끝에 18.04 LTS 를 읽어야 합니다. 귀하의 도구는 Ubuntu 16.04를 복제하기에 충분한 HDD 공간이없는 많은 사람들에게 가장 중요한 도구입니다. HDD에 새 파티션을 만드는 것보다 쉽습니다.
WinEunuuchs2Unix

나는 오타를 고쳤다. 고마워. 그러나 지속적인 라이브 시스템을 주머니에 넣고 싶어하는 사람들에게는 내 도구를 사용하여 편리하게 사용할 수 있습니다.
sudodus

3

이전 릴리스에서 18.04 LTS로 업그레이드 할 때 발생하는 문제

이전 릴리스에서 18.04 LTS로 업그레이드하는 것은 전혀 간단하지 않습니다. 과거에 그러한 업그레이드보다 더 많은 문제가 있는지 모르겠지만 업그레이드를 릴리스하는 사람들은 이제 위험 하게됩니다. 반면에 버그를 발견 하고 버그가보고 되면 업그레이드 도구를 개발하고 Ubuntu 18.04 LTS 시스템 자체를 디버깅하는 데 도움이됩니다.

즉 , 업그레이드가 공식적으로 첫 번째 포인트 릴리스 (18.04.1 LTS)로 릴리스 될 때까지 기다릴 만큼 환자 는 더 부드럽게 승차 할 수 있습니다.

전체 업그레이드를 수행하기 전에 테스트 ...

@ WinEunuuchs2Unix가 여기에 설명하는 방법을 사용하면 18.04 LTS로 업그레이드 할 때 컴퓨터 하드웨어를 사용하여 현재 [더 많거나 덜 수정 된] 운영 체제에서 작동하는 경우 실제 시스템의 사본으로 테스트 할 수 있습니다.

운영 체제가 손상된 여러 재난을 방지 할 수 있습니다.

@ WinEunuuchs2Unix의 스크립트를 아직 사용하지 않았지만 매우 유용하다는 것을 이해하고 사용하려고합니다. 8.04에서 10.04로 12.04로 업그레이드하여 오랫동안 사용했습니다. 그러나 14.04를 통해 16.04로 업그레이드하기로 설정했을 때 실패하고 오류를 찾을 수 없었습니다.

... 문제가 발생하면 새로 설치하십시오.

백업좋았 으므로 16.04 이상을 새로 설치하여 복사, 수정, 스크립트, 별명 및 설치된 프로그램을 확인하고 확인했습니다. @ WinEunuuchs2Unix의 방법을 사용했다면 문제를 일찍 보았을 때 직접 새로 설치했을 것입니다.

영구 라이브 시스템 업그레이드

영구 라이브 시스템은 휴대용 Ubuntu 시스템을 얻는 데 사용되며 때로는 테스트에 사용되지만 때로는 오랫동안 사용됩니다.

설치된 시스템에서와 같이 이러한 시스템이 조만간 손상 될 수 있으므로 이러한 시스템을 업데이트 및 업그레이드해서는 안된다는 것은 알려진 문제입니다. 또한 오버레이 시스템이 시작되기 전에 시작되기 때문에 iso 파일과 함께 제공되는 커널 및 커널 드라이버가 붙어 있습니다.

그러나 /home별도의 '홈'파티션으로 새로 설치하는 경우 일반적으로 디렉토리 를 유지하는 것이 가능 합니다. home-rw파티션 을 생성하면 영구 라이브 시스템이 부팅 중에 자동으로이를 찾아 사용합니다.

내가 개발하고 쉘 스크립트, 테스트입니다 MK-지속적-live_with_home-RW , 만들 수 있습니다 와 지속적인 라이브 시스템을 home-rw파티션을하고, 그 나중에 업그레이드 할 수 있습니다 , 그것을

  • iso 파일을 최신 파일로 교체하십시오. 새로운 ISO 파일이 해제 될 때 적어도 업그레이드해야하지만, 당신은 또한 한 달에 한 번 LTS 시스템을 업그레이드하고부터 현재 일일 ISO 파일을 사용할 수 있습니다 테스트 추적기 ,

  • 새 iso 파일의 grub을 수정하십시오.

  • casper-rw운영 체제의 수정 사항을 저장 하는 파일을 정리 (재 포맷)하십시오. 따라서 시스템에 추가 한 프로그램 패키지를 다시 설치해야합니다.

  • home-rw개인 파일, 설정 및 조정으로 파티션을 보존하십시오 .

  • 자세한 내용은 이 링크 를 참조하십시오.

추가 링크

최신 버전의 Ubuntu를 테스트하려는 사람들을위한 일반적인 팁은 다음 링크에서 찾을 수 있습니다.

우분투 테스트 및 개발에 참여하는 방법


1
추가 링크는 멋진 터치입니다. 더 많은 사람들이 문제를보고하면 더 많은 사람들이 다른 문제를 해결할 것입니다.
WinEunuuchs2Unix

1
LTS 사용자 (본질 상 신중한 사용자)가 첫 번째 포인트 릴리스 18.04.1을 기다리는 것이 좋습니다. 대규모 조직의 경우 16.04를 테스트 파티션으로 복제하고 직원 교육 목적으로 18.04로 업그레이드하려고 할 수 있습니다. 사용자는 익숙한 데이터에 액세스 할 수 있습니다. 물론 IT 직원은 7 월 26 일 첫 번째 포인트 릴리스 이전에 복제 된 데이터에 대한 광범위한 테스트의 이점을 누릴 수 있습니다.
WinEunuuchs2Unix
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.