Bash脚本将backkup /克隆到另一个分区


12

Ubuntu 18.04于2018年4月26日发布,我想尝试使用它来升级程序和转换数据,但如果有bug则不想提交。

我已经将Windows从410 GB gparted压缩到385 GB,重新启动了Ubuntu 16.04,然后运行以创建一个新的25 GB分区,标记为“ Ubuntu18.04”。我运行rm-kernels并删除了约20个内核,以在Ubuntu 16.04上消除了约10 GB。

现在,我需要一个脚本,该脚本将使用16.04 LTS填充新分区并为其创建新的Grub菜单选项。仅复制相关目录。例如/sys/run/proc/dev在启动过程中创建的虚拟目录,不应该被复制。

我还希望/etc/fstab修补正确的UUID并cron禁用重新启动作业,以便在启动克隆后不对克隆数据进行每日备份。

我期望在接下来的几周/几个月内多次运行该脚本。因此,克隆过程应该毫不费力地重复。

相同的脚本可用于测试安全更新和新的Ubuntu Kernel Team更新,而不会影响生产系统。


20个内核需要10GB !!?您是否不小心安装了内核膨胀版?
Lie Ryan

@LieRyan每个内核实际上是400MB,而不是四舍五入时的500MB(大约20个内核)。要查看每个内核占用了多少内存(在我当前的安装中从394MB变为419MB,请参阅:。askubuntu.com
questions/

Answers:


19

Bash脚本将活动的Ubuntu分区克隆到克隆分区

clone-ubuntu.shbash脚本将无缝和安全地复制16.04 LTS成升级一个分区18.04 LTS:

clone-ubuntu.png

要考虑的重点:

  • 您必须创建一个ext4足够大的空分区来容纳Ubuntu 16.04克隆
  • 调用脚本时clone-ubuntu.sh无法挂载分区。该脚本会自动挂载和卸载分区。
  • 该命令rsync用于将文件从复制/到克隆分区。第一次运行clone-ubuntu.sh将需要几分钟。第二次运行脚本时,仅文件更改被更新,并且应该花费不到一分钟的时间。
  • 您可能会运行此脚本并多次重启。克隆目标上的所有新数据都将被删除以镜像当前/文件和目录。
  • 所有Cron /etc/cron.d(重新引导)作业均移至名为的新子目录/etc/cron.d/hold。引导克隆后,请记住运行sudo crontab -e以防止运行选定的cron作业。
  • 克隆的文件/etc/fstab将使用其所在分区的适当UUID进行修改。
  • /boot/grub/grub.cfg使用适当的UUID修改克隆的文件,以成功进行克隆引导。克隆文件的quiet splash更改为,nosplash因此您将获得滚动终端消息。这样可以引导克隆而不是“真实”版本。
  • update-grub 运行以使用指向克隆分区的新菜单选项更新Grub。
  • 克隆的文件/etc/update-manager/release-upgrades被修改Prompt=neverPrompt=lts。启动克隆并执行do-release-upgrade -d此操作后,Ubuntu 16.04即可升级到18.04。
  • 在克隆之前,将显示一个确认屏幕(显示在下一部分中),您必须键入y / Y才能继续。

确认画面

选择目标克隆分区后,首先将其验证为ext4分区类型,并且尚未安装。如果通过了此测试,则会显示一条确认消息:

=====================================================================
Mounting clone partition /dev/nvme0n1p8 as /mnt/clone16.04

=====================================================================
PLEASE: Carefully confirm Source (Live) and Target (Clone) partitions

SOURCE (BOOT /):  /dev/nvme0n1p5      TARGET (CLONE):  /dev/nvme0n1p8
ID:               Ubuntu              ID:              Ubuntu
RELEASE:          16.04               RELEASE:         16.04
CODENAME:         xenial              CODENAME:        xenial
DESCRIPTION:      Ubuntu 16.04.3 LTS  DESCRIPTION:     Ubuntu 16.04.3 LTS
 Size  Used Avail Use%                 Size  Used Avail Use%
  44G   17G   26G  40%                  24G   17G  5.8G  74%

NOTE: If you are recloning, new files in clone will be deleted,
      modified files are reset to current source content and,
      files deleted from clone are added back from source.

Type Y (or y) to proceed. Any other key to exit: 

在此示例中,已选择先前的克隆进行重新克隆。克隆上的可用空间是一个静默点,因为我们已经知道有足够的可用空间。

如果您安装了多个Ubuntu,请验证您是否选择了正确的分区,以将当前引导的Ubuntu /(克隆为(root))克隆到该分区。

这是您最后一次机会,可以通过按y或以外的任何键来中止操作Y


输出清单

运行脚本时,您将获得以下输出(不包括上面已经列出的输出):

=====================================================================
Using rsync to clone / to /dev/nvme0n1p8 mounted as /mnt/clone16.04
          6.11G  38%   86.46MB/s    0:01:07 (xfr#139123, to-chk=0/647700)   

Number of files: 647,700 (reg: 470,100, dir: 104,694, link: 72,903, special: 3)
Number of created files: 127,824 (reg: 72,472, dir: 15,825, link: 39,526, special: 1)
Number of deleted files: 73,318 (reg: 59,766, dir: 9,701, link: 3,847, special: 4)
Number of regular files transferred: 139,123
Total file size: 15.92G bytes
Total transferred file size: 6.11G bytes
Literal data: 6.11G bytes
Matched data: 0 bytes
File list size: 8.50M
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 6.14G
Total bytes received: 7.82M

sent 6.14G bytes  received 7.82M bytes  89.74M bytes/sec
total size is 15.92G  speedup is 2.59

Time to clone files: 68 Seconds

=====================================================================
Making changes in: /mnt/clone16.04/etc/update-manager/release-upgrades
     from Prompt=: never
       to Prompt=: lts
Allows running 'do-release-upgrade -d' when rebooting clone target
Consider 'do-release-upgrade -d -f DistUpgradeViewNonInteractive' This
allows you to go to bed or go to lunch whilst upgrade runs.

* * *  When you Upgrade, TURN OFF screen locking for inactivity. * * *

=====================================================================
Making changes in: /mnt/clone16.04/etc/fstab
        from UUID: f3f8e7bc-b337-4194-88b8-3a513f6be55b
          to UUID: 113f9955-a064-4ce2-9cae-74f2a9518550

=====================================================================
Making changes in: /mnt/clone16.04/boot/grub/grub.cfg
        from UUID: f3f8e7bc-b337-4194-88b8-3a513f6be55b
          to UUID: 113f9955-a064-4ce2-9cae-74f2a9518550
Also change 'quiet splash' to 'nosplash' for environmental awareness
Suggest first time booting clone you make wallpaper unique

=====================================================================
Calling 'update-grub' to create new boot menu
Generating grub configuration file ...
Found background: /home/rick/Pictures/1600x900/21.jpg
Found background image: /home/rick/Pictures/1600x900/21.jpg
Found linux image: /boot/vmlinuz-4.14.34-041434-generic
Found initrd image: /boot/initrd.img-4.14.34-041434-generic
Found linux image: /boot/vmlinuz-4.14.31-041431-generic
Found initrd image: /boot/initrd.img-4.14.31-041431-generic
Found linux image: /boot/vmlinuz-4.14.30-041430-generic
Found initrd image: /boot/initrd.img-4.14.30-041430-generic
Found linux image: /boot/vmlinuz-4.14.27-041427-generic
Found initrd image: /boot/initrd.img-4.14.27-041427-generic
Found linux image: /boot/vmlinuz-4.14.15-041415-generic
Found initrd image: /boot/initrd.img-4.14.15-041415-generic
Found linux image: /boot/vmlinuz-4.14.10-041410-generic
Found initrd image: /boot/initrd.img-4.14.10-041410-generic
Found linux image: /boot/vmlinuz-4.14.4-041404-generic
Found initrd image: /boot/initrd.img-4.14.4-041404-generic
Found linux image: /boot/vmlinuz-4.14.2-041402-generic
Found initrd image: /boot/initrd.img-4.14.2-041402-generic
Found linux image: /boot/vmlinuz-4.13.9-041309-generic
Found initrd image: /boot/initrd.img-4.13.9-041309-generic
Found linux image: /boot/vmlinuz-4.10.0-42-generic
Found initrd image: /boot/initrd.img-4.10.0-42-generic
Found linux image: /boot/vmlinuz-4.9.77-040977-generic
Found initrd image: /boot/initrd.img-4.9.77-040977-generic
Found linux image: /boot/vmlinuz-4.4.0-104-generic
Found initrd image: /boot/initrd.img-4.4.0-104-generic
Found linux image: /boot/vmlinuz-3.16.53-031653-generic
Found initrd image: /boot/initrd.img-3.16.53-031653-generic
Found Windows Boot Manager on /dev/nvme0n1p2@/EFI/Microsoft/Boot/bootmgfw.efi
Found Ubuntu 16.04.3 LTS (16.04) on /dev/nvme0n1p8
Found Windows Boot Manager on /dev/sda1@/efi/Microsoft/Boot/bootmgfw.efi
Adding boot menu entry for EFI firmware configuration
done

=====================================================================
Unmounting /dev/nvme0n1p8 as /mnt/clone16.04

rsync 新克隆的状态显示

首次克隆时,rsync会将创建的所有文件的更新范围从0更新到100%。由于克隆为空,因此不会删除或更改任何文件:

clone-ubuntu.sh空clone.gif

rsync 重新克隆时显示状态

rsyncreclones它从来没有碰到100%因为从来没有改变过的文件不会被复制。rsync扫描要复制的下一个文件以及删除克隆中创建的,原本不存在的新文件时,更新进度会有所延迟。

clone-ubuntu-rsync.gif


Bash脚本- clone-ubuntu.sh

#!/bin/bash

# NAME: clone-ubuntu.sh
# PATH: /usr/local/bin
# DESC: Written for AU Q&A: /ubuntu/1028604/bash-seemless-safe-script-to-upgrade-16-04-to-18-04/1028605#1028605
# DATE: Apr 27, 2018. Modified May 6, 2018.

# UPDT: May 02 2018 - Display selected parition and get confirmation.
#       May 06 2018 - Revise `do-release-upgrade -d` instructions.
#                     Correct listing of files in empty target partition.
#       Aug 09 2018 - Add --inplace parameter to `rsync`
#                     Comment out disabling `/etc/cron.d` on clone target.
#                     Users may uncomment and/or revise to their needs.

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    notify-send --urgency=critical \ 
                "$0 cannot be run from GUI without TERM environment variable."
    exit 1
fi

# Must run as root
if [[ $(id -u) -ne 0 ]] ; then echo "Usage: sudo $0" ; exit 1 ; fi

#
# Create unqique temporary file names
#

tmpPart=$(mktemp /tmp/clone-ubuntu.XXXXX)   # Partitions list
tmpMenu=$(mktemp /tmp/clone-ubuntu.XXXXX)   # Menu list
tmpInf1=$(mktemp /tmp/clone-ubuntu.XXXXX)   # Soucre (Booted) Ubuntu Info
tmpInf2=$(mktemp /tmp/clone-ubuntu.XXXXX)   # Target (Cloned) Ubuntu Info
tmpInf3=$(mktemp /tmp/clone-ubuntu.XXXXX)   # Work file used by DistInfo ()

#
# Function Cleanup () Removes temporary files
#

CleanUp () {
    [[ -f "$tmpPart" ]] && rm -f "$tmpPart" # If we created temp files
    [[ -f "$tmpMenu" ]] && rm -f "$tmpMenu" #  at various program stages
    [[ -f "$tmpInf1" ]] && rm -f "$tmpInf1" #  then remove them before
    [[ -f "$tmpInf2" ]] && rm -f "$tmpInf2" #  exiting.
    [[ -f "$tmpInf3" ]] && rm -f "$tmpInf3"

    if  [[  -d "$TargetMnt" ]]; then        # Did we create a clone mount?
        umount "$TargetMnt" -l              # Unmount the clone
        rm  -d "$TargetMnt"                 # Remove clone directory
    fi
}

#
# Function GetUUID () gets UUIDs of source and clone target partitions in menu.
#

GetUUID () {

    SrchLine="$1"                           # menu line passed to function
    UUID_col=0                              # start column of UUID in line
    lsblk -o NAME,UUID > "$tmpPart"         # Get list of UUID's

    while read -r UUID_Line; do             # Read through UUID list

        # Establish UUID position on line
        if [[ $UUID_col == 0 ]] ; then      # First time will be heading
            UUID_col="${UUID_Line%%UUID*}"  # Establish column number
            UUID_col="${#UUID_col}"         #  where UUID appears on line
            NameLen=$(( UUID_col - 1 ))     # Max length of partition name
            continue                        # Skip to read next line
        fi

        # Check if Passed line name (/dev/sda1, /nvme01np8, etc.) matches.
        if [[ "${UUID_Line:0:$NameLen}" == "${SrchLine:0:$NameLen}" ]] ; then
            FoundUUID="${UUID_Line:UUID_col:999}"
            break                           # exit function
        fi

    done < "$tmpPart"                       # Read next line & loop back
}


#
# Function DistInfo () builds information about source & target partitions
#

DistInfo () {

    Mount="$1"                              # Mount name is '/' or $TargetMnt
    FileName="$2"                           # "$tmpInf1" or "$tmpInf2" work file
    cat "$Mount"/etc/lsb-release >> "$FileName"
    sed -i 's/DISTRIB_//g' "$FileName"      # Remove DISTRIB_ prefix.
    sed -i 's/=/:=/g' "$FileName"           # Change "=" to ":="
    sed -i 's/"//g' "$FileName"             # Remove " around "Ubuntu 16.04...".

    # Align columns from "Xxxx:=Yyyy" to "Xxxx:      Yyyy"
    cat "$FileName" | column -t -s '=' > "$tmpInf3"
    cat "$tmpInf3" > "$FileName"
}


#
# Mainline
#

lsblk -o NAME,FSTYPE,LABEL,SIZE,MOUNTPOINT > "$tmpMenu"

i=0
SPACES='                                                                     '
DoHeading=true
AllPartsArr=()      # All partitions.

# Build whiptail menu tags ($i) and text ($Line) into array

while read -r Line; do
    if [[ $DoHeading == true ]] ; then
        DoHeading=false                     # First line is the heading.
        MenuText="$Line"                    # Heading for whiptail.
        FSTYPE_col="${Line%%FSTYPE*}"           
        FSTYPE_col="${#FSTYPE_col}"         # Required to ensure `ext4`.
        MOUNTPOINT_col="${Line%%MOUNTPOINT*}"
        MOUNTPOINT_col="${#MOUNTPOINT_col}" # Required to ensure not mounted.
        continue
    fi

    Line="$Line$SPACES"                     # Pad extra white space.
    Line=${Line:0:74}                       # Truncate to 74 chars for menu.

    if [[ "${Line:MOUNTPOINT_col:4}" == "/   " ]] ; then
        GetUUID "$Line"
        SourceUUID=$FoundUUID
        # Build "/dev/Xxxxx" FS name from "├─Xxxxx" lsblk line
        SourceDev="${Line%% *}"
        SourceDev=/dev/"${SourceDev:2:999}"
    fi

    AllPartsArr+=($i "$Line")               # Menu array entry = Tag# + Text.
    (( i++ ))

done < "$tmpMenu"                           # Read next "lsblk" line.

#
# Display whiptail menu in while loop until no errors, or escape,
# or valid partion selection .
#

DefaultItem=0

while true ; do

    # Call whiptail in loop to paint menu and get user selection
    Choice=$(whiptail \
        --title "Use arrow, page, home & end keys. Tab toggle option" \
        --backtitle "Clone 16.04 for upgrade.  ONLY CLONES / PARTITION" \
        --ok-button "Select unmounted partition" \
        --cancel-button "Exit" \
        --notags \
        --default-item "$DefaultItem" \
        --menu "$MenuText" 24 80 16 \
        "${AllPartsArr[@]}" \
        2>&1 >/dev/tty)

    clear                                   # Clear screen.
    if [[ $Choice == "" ]]; then            # Escape or dialog "Exit".
        CleanUp
        exit 0;
     fi

    DefaultItem=$Choice                     # whiptail start option.
    ArrNdx=$(( $Choice * 2 + 1))            # Calculate array offset.
    Line="${AllPartsArr[$ArrNdx]}"          # Array entry into $Line.

    # Validation - Don't wipe out Windows or Ubuntu 16.04:
    # - Partition must be ext4 and cannot be mounted.

    if [[ "${Line:FSTYPE_col:4}" != "ext4" ]] ; then
        echo "Only 'ext4' partitions can be clone targets."
        read -p "Press <Enter> to continue"
        continue
    fi

    if [[ "${Line:MOUNTPOINT_col:4}" != "    " ]] ; then
        echo "A Mounted partition cannot be a clone target."
        read -p "Press <Enter> to continue"
        continue
    fi

    GetUUID "$Line"                         # Get UUID of target partition.
    TargetUUID=$FoundUUID

    # Build "/dev/Xxxxx" FS name from "├─Xxxxx" menu line
    TargetDev="${Line%% *}"
    TargetDev=/dev/"${TargetDev:2:999}"

    break                                   # Validated: Break menu loop.

done                                        # Loop while errors.

#
# Mount Clone Target partition
#

Release=$(lsb_release -rs)                  # Source version ie: '16.04'
TargetMnt="/mnt/clone$Release"

echo ""
echo "====================================================================="
echo "Mounting clone partition $TargetDev as $TargetMnt"
mkdir -p "$TargetMnt"                       # '-p' directory may already exist
mount -t auto -v $TargetDev "$TargetMnt" > /dev/null

# Confirm partition is empty. If not empty confirm it's Ubuntu. If not exit.
# If Ubuntu display prompt with the version it contains and get confirmation.

echo ""
echo "====================================================================="
echo "PLEASE: Carefully confirm Source (Live) and Target (Clone) partitions"

# Build source information (our current boot partition)
echo "SOURCE (BOOT /)=$SourceDev"  > "$tmpInf1"
DistInfo "/" "$tmpInf1"                     # /etc/lsb_release information
df -h --output=size,used,avail,pcent "$SourceDev" >> "$tmpInf1"

# Build target information (the partition selected for cloning to)
LineCnt=$(ls "$TargetMnt" | wc -l)
if (( LineCnt > 1 )) ; then 
    # More than /Lost+Found exist so it's not an empty partition.
    if [[ -f "$TargetMnt"/etc/lsb-release ]] ; then
        echo "TARGET (CLONE)=$TargetDev" > "$tmpInf2"
        DistInfo "$TargetMnt" "$tmpInf2"    # /etc/lsb_release information
    else
        # TO-DO: might be cloning /boot or /home on separate partitions.
        #        the source partition is still `/` so can display message.
        echo "Selected partition has data which is not Ubuntu OS. Aborting."
        CleanUp                             # Remove temporary files
        exit 1
    fi
else
    echo "Target (Clone) partition appears empty" > "$tmpInf2"
    echo "/Lost+Found normal in empty partition" >> "$tmpInf2"
    echo "Head of '/Clone/' files & directories:" >> "$tmpInf2"
    ls "$TargetMnt" | head -n2 >> "$tmpInf2"
fi

# Target device free bytes
df -h --output=size,used,avail,pcent "$TargetDev" >> "$tmpInf2"

# Display source and target partitions side-by-side using bold text.
echo $(tput bold)       # Set to bold text
paste -d '|' "$tmpInf1" "$tmpInf2" | column -t -s '|'
echo $(tput sgr0)       # Reset to normal text

echo "NOTE: If you are recloning, new files in clone will be deleted,"
echo "      modified files are reset to current source content and,"
echo "      files deleted from clone are added back from source."
echo ""

read -p "Type Y (or y) to proceed. Any other key to exit: " -n 1 -r
echo    # (optional) move to a new line
if [[ ! $REPLY =~ ^[Yy]$ ]] ; then
    CleanUp             # Remove temporary files
    exit 0
fi

# Copy non-virtual directories to clone. Credit to TikTak's Ask Ubuntu answer:
# /ubuntu/319805/is-it-safe-to-clone-the-current-used-disk?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

SECONDS=0
echo ""
echo "====================================================================="
echo "Using rsync to clone / to $TargetDev mounted as $TargetMnt"
rsync -haxAX --stats --delete --info=progress2 --info=name0 --inplace  \
      /* "$TargetMnt"                                                   \
      --exclude={/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/media/*,/lost+found}
# For 16GB on Samsung Pro 960: First time 98 seconds, second time 27 seconds.
rsyncTime=$SECONDS  
echo ""
echo "Time to clone files: $rsyncTime Seconds"

# Change /etc/update-manager/release-upgrades prompt from never to LTS
echo ""
echo "====================================================================="
echo "Making changes in: $TargetMnt/etc/update-manager/release-upgrades"
echo "     from Prompt=: never"
echo "       to Prompt=: lts"
echo "Allows running 'do-release-upgrade -d' when rebooting clone target"
echo "Consider 'do-release-upgrade -d -f DistUpgradeViewNonInteractive' This"
echo "allows you to go to bed or go to lunch whilst upgrade runs."
echo ""
echo "* * *  When you Upgrade, TURN OFF screen locking for inactivity. * * *"
echo ""
sed -i 's/Prompt=never/Prompt=lts/' "$TargetMnt"/etc/update-manager/release-upgrades

## This section commented out to prevent surprises. You may uncomment.
## You may want to revise to include `cron.daily`, `cron.hourly`, etc.
# Move `/etc/cron.d` reboot jobs to `/etc/cron.d/hold` to prevent running
# scripts such as daily backup or Ubuntu 16.04 specific problem fixes.
#echo ""
#echo "====================================================================="
#echo "Moving '$TargetMnt/etc/cron.d' to '.../hold' to prevent running."
#echo "After booting clone, move back individual files you want to run"
#if [[ ! -d "$TargetMnt"/etc/cron.d/hold ]]; then
#    mkdir "$TargetMnt"/etc/cron.d/hold
#fi
#cp -p  "$TargetMnt"/etc/cron.d/* "$TargetMnt"/etc/cron.d/hold/
#rm -fv "$TargetMnt"/etc/cron.d/*

# Update /etc/fstab on clone partition with clone's UUID
echo ""
echo "====================================================================="
echo "Making changes in: $TargetMnt/etc/fstab"
echo "        from UUID: $SourceUUID"
echo "          to UUID: $TargetUUID"
sed -i "s/$SourceUUID/$TargetUUID/g" "$TargetMnt"/etc/fstab

# Update /boot/grub/grub.cfg on clone partition with clone's UUID
echo ""
echo "====================================================================="
echo "Making changes in: $TargetMnt/boot/grub/grub.cfg"
echo "        from UUID: $SourceUUID"
echo "          to UUID: $TargetUUID"
echo "Also change 'quiet splash' to 'nosplash' for environmental awareness"
echo "Suggest first time booting clone you make wallpaper unique"
sed -i "s/$SourceUUID/$TargetUUID/g" "$TargetMnt"/boot/grub/grub.cfg
sed -i "s/quiet splash/nosplash/g" "$TargetMnt"/boot/grub/grub.cfg

# Update grub boot menu
echo ""
echo "====================================================================="
echo "Calling 'update-grub' to create new boot menu"
update-grub

# Unmount and exit

echo ""
echo "====================================================================="
echo "Unmounting $TargetDev as $TargetMnt"

CleanUp             # Remove temporary files

exit 0

将上面的bash代码复制并粘贴到名为的新文件中/usr/local/bin/clone-ubuntu.sh。然后使用以下命令使新文件可执行:

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

要调用脚本,请使用:

sudo clone-ubuntu.sh

如何将16.04 LTS克隆升级到Ubuntu 18.04 LTS

这是一个“奖励”部分,可能会让很多人感兴趣。

重新启动计算机。该grub菜单将包含一个指向克隆分区的新菜单选项。您也可以从克隆的“ 高级选项”菜单中选择特定的内核版本。

将克隆的16.04 LTS转换为18.04 LTS的一种方法是运行:

sudo do-release-upgrade

请注意,该-d标志在2018年7月26日之前是必需的,但不再需要。

请仔细阅读18.04升级确认

在继续操作之前,请确保关闭非活动的屏幕锁定。如果您的计算机由于键盘不活动而进入锁定屏幕,则升级过程可能会崩溃。

18.04升级过程摘要

本节将针对计算机,因为不同的用户安装了不同的应用程序。这是我根据笔记和记忆做的简短总结:

  1. 确认进行:ENTER
  2. 软件包将被删除:Y
  3. 替换longind.conf:是
  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. 全屏grub菜单配置出现。选择:保留当前安装的本地版本
  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驱动程序,但从未完全删除。包含它是因为您可能有从未完全删除过的类似旧软件包。

Grub将启动菜单更改为在UEFI下克隆

与18.04升级不同,我发现18.04.1升级将Grub UEFI配置更改为使用克隆的grub菜单,而不是按照以下答案使用原始grub菜单:双重启动和文件/boot/grub/grub.cfg-哪个是用过的?

$ sudo cat /boot/efi/EFI/ubuntu/grub.cfg
search.fs_uuid b40b3925-70ef-447f-923e-1b05467c00e7 root 
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg

$ sudo grub-install
Installing for x86_64-efi platform.
Installation finished. No error reported.

sudo update-grub引导原始分区后运行还不足以更改grub.cfggrub加载的分区。您需要使用sudo grub-install强制grub使用原始分区的配置。

原始分区和克隆分区都可以update-grub用来维护自己的/boot/grub/grub.cfg文件,但是在引导过程中只能使用一个。

当然,如果您希望grub使用“克隆”的grub菜单,请不要在原始分区上执行上述步骤。


编辑历史

编辑20185月6日 -更正了针对空克隆(目标)分区的信息显示。

编辑20188月26日 - 如此大的文件(例如2 GB垃圾文件)的使用--inplace选项rsync在复制过程中不会在克隆上复制。这可能会导致“磁盘空间不足”错误。注释掉/etc/cron.d替代项是因为用户可能想要保留或完全希望使用其他目录。更新说明以do-release-upgrade不带-d标志使用,因为现已发布Ubuntu 18.04.1 LTS。


1
+1。感谢您提供有用的工具:-)
sudodus

1
@sudodus我希望人们在全面升级18.04之前使用此工具。他们至少可以将其用作教程,并使用Live USB启动手动重复这些步骤。这是悲剧阅读的人都在全新18.04有,因为他们已经升级,而不先进行测试,并通过消除他们以前犯下如此多的错误,16.0417.0417.10的安装。可悲的是,在过去的几十年中,我已经多次看到类似的事情。谢谢您的投票!它可以帮助您加倍努力,clone-ubuntu.sh但无论如何我还是自己使用过4次!
WinEunuuchs2Unix

1
我还没有使用过您的脚本,但是我知道它非常有用,并且我打算使用它。-我已经使用了很长时间,从8.04升级到10.04到12.04。但是,当我开始通过14.04升级到16.04时,我失败了。我的备份很好,所以我重新安装了16.04,然后将其复制并保留下来,并检查了调整,脚本,别名和已安装的程序。-顺便说一下,我使用脚本来创建和升级持久性活动驱动器“ home-rw”。欢迎尝试:-)
sudodus

1
您的链接中有小错字:我在8.04 LTS中测试了所有这些错误,最后应该读为18.04 LTS。对于没有足够硬盘空间克隆他们的Ubuntu 16.04的许多人来说,您的工具就是第一选择。比在其硬盘上创建新分区还容易(尽管速度较慢)。
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-rw分区,则持久性实时系统将在引导过程中自动找到并使用它。

我正在开发和测试shellscript mk-persistent-live_with_home-rw脚本可以创建具有home-rw分区的持久性实时系统,并且以后可以对其进行升级

  • 用较新的文件替换iso文件。至少您应该在发布新的iso文件时进行升级,但是您也可以每月一次升级LTS系统,并使用来自测试跟踪器的当前每日iso文件,

  • 为新的iso文件修改grub。

  • 擦除(重新格式化)casper-rw存储操作系统修改的文件(因此,您必须重新安装添加到系统中的程序包),

  • home-rw使用您的个人文件,设置和调整来保留分区。

  • 有关更多详细信息,请参见此链接

额外连结

以下链接为想要测试最新和最佳版本的Ubuntu的人提供了一般性提示,

如何参与Ubuntu的测试和开发


1
额外的链接很不错。报告问题的人越多,将为其他人解决的问题就越多。
WinEunuuchs2Unix

1
对于LTS用户(本质上是谨慎的)来说,非常值得等待第一点发行18.04.1。对于大型组织,他们可能仍希望将16.04克隆到测试分区,并将其升级到18.04,以进行员工培训。用户将有权访问他们习惯的数据。当然,IT人员也将从7月26日第一点发布之前几个月对克隆数据进行的广泛测试中受益。
WinEunuuchs2Unix
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.