Bash脚本将Ubuntu克隆到新分区以测试18.04 LTS升级

Ubuntu 18.04于2018年4月26日发布,我想尝试升级我的程序并转换我的数据,但如果有错误则不想提交。

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

现在我想要一个脚本,它将使用16.04 LTS填充新分区并为其创建一个新的Grub菜单选项。 只应复制相关目录。 例如/sys/run/proc/dev是在引导期间创建的虚拟目录,不应复制。

我还希望/etc/fstab使用正确的UUID和cron reboot作业进行修补,以便在启动克隆后不会运行克隆数据的每日备份。

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

可以使用相同的脚本来测试安全更新和新的Ubuntu内核团队更新,而不会影响生产系统。

Bash脚本克隆活动Ubuntu分区以克隆分区

clone-ubuntu.sh bash脚本将无缝安全地将16.04 LTS复制到一个分区,以升级到18.04 LTS:

克隆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进行修改。
  • 使用适当的UUID修改克隆文件/boot/grub/grub.cfg ,以便成功克隆引导。 克隆文件的quiet splash更改为nosplash因此您可以滚动终端消息。 这使得视觉感知启动克隆而不是“真实”版本。
  • 运行update-grub以使用指向克隆分区的新菜单选项更新Grub。
  • 克隆的文件/etc/update-manager/release-upgrades被修改为更改Prompt=never to Prompt=lts 。 当您启动克隆并执行do-release-upgrade -d这允许Ubuntu 16.04升级到18.04。
  • 在克隆之前会显示一个确认屏幕(如下一节所示),您必须输入y / Y才能继续。

确认屏幕

选择目标克隆分区后,首先validation它是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安装,请validation您是否选择了正确的分区来克隆当前启动的Ubuntu(挂载为/ (root))。

这是你按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 empty clone.gif

重新克隆时显示rsync状态

rsync重新连接时,它永远不会达到100%因为不会复制从未更改过的文件。 当rsync扫描要复制的下一个文件以及删除在原始中从未存在的克隆中创建的新文件时,更新进度将会延迟:

克隆Ubuntu的rsync.gif


Bash脚本 – clone-ubuntu.sh

 #!/bin/bash # NAME: clone-ubuntu.sh # PATH: /usr/local/bin # DESC: Written for AU Q&A: https://askubuntu.com/questions/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  to continue" continue fi if [[ "${Line:MOUNTPOINT_col:4}" != " " ]] ; then echo "A Mounted partition cannot be a clone target." read -p "Press  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: # https://askubuntu.com/questions/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 

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

仔细阅读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. 出现全屏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加载的grub.cfg 。 您需要使用sudo grub-install强制grub使用原始分区的配置。

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

当然,如果你想让grub使用Clone的grub菜单,请不要在原始分区上执行上述步骤。


编辑历史记录

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

编辑20188月26日 – 对rsync使用--inplace选项,因此在复制过程中克隆时不会复制诸如2 GB垃圾文件之类的大文件。 这可能导致“磁盘空间不足”错误。 注释掉/etc/cron.d覆盖,因为用户可能想要保留或想要一个完全不同的目录。 更新使用do-release-upgrade而不使用-d标志的说明,因为Ubuntu 18.04.1 LTS现已发布。

从早期版本升级到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分区,则持久性实时系统将在引导期间自动查找并使用它。

我正在开发和测试一个shellcript, mk-persistent-live_with_home-rw它可以home-rw分区创建一个持久的实时系统, 以后可以升级它,

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

  • 修改新iso文件的grub。

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

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

  • 有关详细信息,请参阅此链接 。

额外的链接

有关想要测试最新和最好版本的Ubuntu的人的一般提示可以在以下链接中找到,

如何参与Ubuntu的测试和开发