当前位置: 首页 > 科技观察

Ubuntu桌面生存指南4:Ubuntu系统备份还原升级攻略

时间:2023-03-13 22:48:26 科技观察

本文作者张家伟(@ghosert)延续上一篇文章内容。刚开始使用开发者系统时,无论是搭建Ubuntu系统基础设施,还是安装配置各种软件,都是一个劳动密集型的过程:由于开发者系统是一个需要付出脑力换取高效率的系统,所以设计成为一个高度可定制和极其自由的系统,更不用说您可以从编译源代码的方式自由配置和安装整个操作系统。即使是最常用的软件如:vi、emacs等,通过更改配置文件,也能玩出无数种运行方式。用户需要花时间去改变和尝试这些配置,这样操作这些软件的方式就是破解自己的习惯,达到高效的目的。因此,经过一段时间的部署,每个Linux用户都会拥有自己的专属高效系统,1000个用户就有1000个专属高效系统。每个系统安装的软件和配置方式都不一样,每个用户在搭建这个专属系统的过程中都会花费大量的精力和时间。失去自己专属的系统就意味着失去时间和精力,尤其是对于一个长期使用Linux的用户:用户在这个系统上积累了太多的软件和操作习惯,如果系统崩溃需要从头配置一个新的系统而不用任何提前的备份措施,剩下的简直就是一场灾难。这就是有经验的Linux用户非常注意备份的原因。正因如此,笔者在本章中结合自己的一些经验,介绍了Ubuntu系统的备份恢复和升级策略。这些备份和恢复策略不仅适用于Ubuntu。使用其他发行版的Linux用户,也可以参考以下内容修改步骤。脚本恢复攻略——完全格式化更新我们引入了Ubuntu系统的一个特性,可以通过apt-get命令从自己的源下载需要的软件,这样用户就可以创建一个脚本文件,编写常用的apt-getinstall命令用于备份需要的软件(见上篇文章在云端保存一个软件安装脚本),同时在这个脚本文件中加入一些需要人工干预的个性化配置的具体步骤,用于示例:更改激活拼音输入法快捷键的具体步骤(大部分拼音输入法抢占ctrl+space,如果不更改,开发者和用户将无法使用此快捷键激活智能代码提示功能在Eclipse等IDE中),例如:您可能对Firefox的默认字体不满意,需要更换它。这些详细步骤应该以注释的形式记录在这个脚本中。如果这些步骤太繁琐,也可以在配置后找到对应的字体。配置文件直接保存在Dropbox中,方便以后直接从云端将这些配置恢复到本地机器。例如,如果你定制了Vim的行为并安装了Vim插件,那么你只需要在云端备份~/.vimrc~/.vim。所以一旦创建了这样的脚本文件,即使需要重装系统或者面对全新的电脑,只需要执行脚本文件,查看脚本中的注释记录,就可以保证软件不丢失,配置软件的步骤可以还原,重要数据保存在云端:Dropbox(二进制文件),GitHub(文本文件,后面详述)。自然,这个策略的前提是你在使用系统的时候一定要保持勤于更新脚本的习惯,为以后的系统恢复做准备。优点这种方式更适用于希望将现有系统迁移到更高版本的情况。例如:将Ubuntu10.04迁移到12.04时,格式化系统并重新安装12.04后,用户可以通过该脚本恢复原来电脑的面貌。并且由于Ubuntu源码中的软件版本与Ubuntu发行版之间存在对应关系(例如:10.04源码中的firefox版本在某个版本之后可能不再提供更新),如果12.04还是比较新的LTSversion,那么可以保证12.04上使用apt-getinstall安装的软件版本比较新。同时,如果你的大部分配置恢复是通过恢复特定步骤来完成的,那么就有机会检查这些步骤是否仍然适用于新版本的软件。也不会出现从云端将旧版本软件的配置恢复到新版本软件不适用的情况。当然,这在理论上不是什么大问题。Linux下的很多知名软件都尊重用户的旧习惯。读取配置文件的方式不会改变。在大多数情况下,将旧软件的配置恢复到新版本不会造成太多问题。缺点由于没有全盘备份方式,这种备份恢复策略的缺点也很明显。虽然可以保证升级后电脑的原貌不会丢失,但是相对来说,很多软件配置的手动恢复还是需要投入的。相当大的时间和精力,即使在完美备份策略的前提下,当笔者用这种方式将Ubuntu10.04升级到12.04时,还是用了整整5天的国庆长假。所以我个人建议只有在每两年发布的LTS版本出现时才进行这样的升级,以保证电脑处于全新的状态。#p#脚本恢复攻略——继续使用/home分区数据我们前面提到了独立/home分区的原因是用户最重要的个性化配置和数据都存放在这个目录下,所以Ubuntu官方的云备份软件Ubuntu一默认是协助用户将/home分区所在的数据备份到云端。所以,如果我们在重装系统的时候能够继续使用这个分区的数据,无疑会为我们节省大量的数据恢复和配置恢复的时间,更何况一些电影、照片等数据可能会占用上百个G./home分区,当用户重装系统并格式化分区时,没有第二个介质可以容纳如此大量的数据进行临时备份,除非你有第二块硬盘。另一方面,在恢复系统时,由于配置和数据还在/home目录下,只需要执行上面提到的脚本重新安装软件即可,不需要手动恢复配置软件。为了使用这个恢复策略,可以参考之前博客中的分区推荐方案,在安装Ubuntu时将/home分区分开。在使用系统的过程中,始终确保您只在该目录下存放您的重要数据和文件。配置,如果一定要有一些特殊情况,一定要记录在recovery脚本中,云端还有其他的备份措施。只要你的/home分区没有损坏,再次恢复它的成本是比较小的。重装系统时,可以格式化/目录挂载的分区,但切记不要在下面的安装类型界面选择格式化/home所在的分区,否则该分区的数据无法使用。优势显而易见。这个策略很经济,也省了很多麻烦。这是一种非常常见的系统恢复策略。也适用于从10.04LTS升级到12.04LTS等重新安装更高版本的Ubuntu后恢复电脑原貌。缺点是要用到之前/home分区的数据。毕竟,保留了旧的配置和目录结构以及数据。如上所述,虽然这在匹配新版本软件时不会有太大问题,但是一旦出现一种情况,比如两个软件版本差异过大,导致新版本无法在旧版本上正常运行配置或目录结构,用户必须有一定的解决能力,仍然需要通过查看脚本注释手动还原配置步骤。#p#tar包全盘备份恢复策略以上两种恢复策略不可避免的还是需要在分区后插入启动U盘或光盘,从头开始安装操作系统本身,安装完操作系统后继续安装软件,还原配置,熟悉Windows大名鼎鼎的Ghost同学一定很疑惑Ubuntu下有没有这种一站式的全盘备份方案:不管电脑系统当前状态如何,我都可以备份每一个字节整个系统,以及什么时候需要恢复系统有时候你甚至不需要重新安装Ubuntu本身,你可以将备份的状态恢复到新机器或者格式化后的当前机器,甚至是一个虚拟机。这也是一般公司IT部门帮助员工重装机器时最常用的策略。没有别的原因,就是因为这个方法最快。从备份中恢复系统所需的时间不超过一个小时。优点最快最快捷的备份恢复方式,刻录母盘即可随处恢复自己的备份。您可以将一台物理机上的备份恢复到另一台物理机或虚拟机中,甚至可以将虚拟机中的备份恢复到物理机或另一台虚拟机中,非常灵活方便。使用这种方法的缺点之一是,如果要恢复的目标机器的硬件配置与备份的源机器相差太大,恢复后某些驱动程序可能无法正常工作,例如电脑没有声音或图形极分辨率低,无法联网等,此时需要用户自己尝试解决。第二个问题,因为是全盘备份,也就是说你备份了10.04系统,只能恢复到10.04系统。此恢复方法无法将您的Ubuntu升级到更高版本。第三个问题:一定的学习和实践成本。下面以我个人的实践经验提供tar包全盘备份的基本步骤和原理。也许你可以在网上找到更方便的脚本或备份软件来代替这些任务,但是如果你遇到了,回到这些具体的步骤和原则可以帮助你理解哪里出了问题以及如何解决这些问题。1、全盘备份得益于Linux系统强大的命令行和系统设计,Ubuntu系统全盘备份的基本原理非常简单:使用tar命令打包必要的文件目录,也就是说备份系统和备份数据基本上没有区别。新建脚本文件BACKUP_SYSTEM.sh,在里面添加如下内容:mkdir~/BACKUP_SYSTEMsudotar--exclude/proc--exclude/mnt--exclude/tmp--exclude/media--exclude/home/jiawzhang/Downloads--exclude/home/jiawzhang/Templates--exclude'/home/jiawzhang/VirtualBoxVMs'--exclude/home/jiawzhang/BACKUP_SYSTEM-jpcvf~/BACKUP_SYSTEM/Ubuntu-12.04-20121114-home-pc.tar.bz2/these2命令首先在主目录下新建一个BACKUP_SYSTEM目录,用于存放备份的tar包。然后tar命令的--exclude参数排除了某些你认为不需要备份的目录,比如Download、Templates目录,我这里也排除了VirtualBoxVMs目录,因为安装好虚拟机后,目录Virtualbox所在的地方会极速扩容,我们不需要把几十G的虚拟机镜像备份成tar包。-jpcvf该命令中:j表示使用bzip2格式打包,是一种比较耗时的压缩格式,压缩率高,常用于压缩大数据。p表示在制作tar包时保留目录结构的用户权限信息,最大限度的保护现场的文件系统。cvf表示创建一个压缩包,列出详细的压缩过程。~/BACKUP_SYSTEM/Ubuntu-12.04-20121114-home-pc.tar.bz2指定压缩包的文件名。我个人比较喜欢把这个文件名里的版本信息写清楚,打包的时间,在哪台机器上做备份,有利于以后的恢复操作。该命令末尾有一个“/”字符,意思是从机器的根目录开始全盘备份,你机器上除了被--exclude排除的目录外的所有内容都会进入最后压缩包。即使是全盘备份,也必须提前确定哪些目录是不需要备份的,否则压缩解压的过程会变得冗长。打开终端并运行shBACKUP_SYSTEM.sh开始备份。根据用户备份的数据量和硬件配置的质量,备份时间会有所不同。在笔者的机器上,用了1小时左右的时间备份了全盘,去掉了不必要的目录,将40G的数据压缩成9G的压缩包。如果你想跟踪压缩进度,你可以打开另一个终端并运行以下命令:watch-d-n5ls-alh~/BACKUP_SYSTEM/这个watch命令用于执行后续的'ls-alh~/BASHUP_SYSTEMevery5seconds/'并突出显示两次执行之间的差异,这样您就可以看到tarball大小的变化。2.全盘恢复恢复系统的步骤会比备份繁琐得多。以下是主要步骤,我会尽量解释每一步的含义。●确保预先备份的压缩包在某个分区可以访问。这里假设你的备份压缩包在/home/jiawzhang/BACKUP_SYSTEM/UBUNTU-2012-02-05.tar.bz2●使用Ubuntu启动U盘或光盘重启电脑,进入尝试模式Ubuntu。●在Ubuntu中以试用模式打开终端,运行命令sudosu-切换到root权限,获得root权限后,fdisk-l、df-h等命令可以返回准确的结果。●运行命令sudogparted,打开Linux下的分区软件gparted。如果提示安装,运行sudoapt-getinstallgparted,然后按照之前博客的分区建议进行分区。如果对自己的分区满意,也可以跳过分区,只需要格式化/所在的分区即可。因为/home所在分区是用来存放备份压缩包的,所以可以选择暂时不格式化。●解压备份压缩包mkdir/tmp/rootmkdir/tmp/root2mount/dev/sda1/tmp/rootmount/dev/sda2/tmp/root2cd/tmp/root2/jiawzhang/BACKUP_SYSTEM/sudotar-jpxvfUBUNTU-2012-02-05.tar.bz2-C/tmp/root使用U盘启动到liveUbuntu模式并不会真正挂载你的物理分区,所以你需要使用mount命令手动挂载你刚刚格式化的/分区并解压压缩包并导入。新建两个目录/tmp/root/tmp/root2,将分区/dev/sda1/dev/sda2分别挂载到这两个目录下。确保sda1是系统恢复后挂载/目录的分区,sda2是原来挂载/home目录的分区,并且存在我们需要的备份压缩包。挂载后/tmp/root对应sda1分区,/tmp/root2对应sda2分区,进入/tmp/root2/jiawzhang/BACKUP_SYSTEM就是我们原来备份存储的位置。运行sudotar-jpxvfxxx.tar.bz2-C/tmp/root解压,jpxvf中的x表示解压,-C/tmp/root指定解压的目标目录,其实就是sda1分区所在的目录位于根目录。完成此操作后,所有数据已恢复到sda1分区。应该可以查看/tmp/root/etc、/tmp/root/home/等目录,它们对应的目录是原来的/etc、/home。我们下面的步骤会指定在系统启动时将sda1分区挂载回/目录,将sda2分区挂载回/home目录,这样系统中的目录结构就完全恢复了。另外,由于之前没有格式化过/home目录对应的sda2分区,所以可以选择删除/tmp/root2/jiawzhang/中除BACKUP_SYSTEM之外的所有数据,然后运行:cp/tmp/root/home/./tmp/root2/-rrm/tmp/root/home-rf将刚刚从备份存档中解压出来的/tmp/root/home部分的数据复制到/tmp/root2,然后删除/tmp/root/home,即至此,将恢复的home数据从sda1分区转移到sda2分区的工作就完成了:sda2分区是后面用来挂载/home目录的分区,home下的数据应该恢复到这个分区。●恢复分区的GRUB/MBR信息经过格式化、分区等操作后,即使在现有硬盘上恢复系统,分区的uuid也有可能被改变,所以压缩备份中的启动备份packageBoot信息如:GRUB/MBR不再匹配当前实际信息,所以我们必须修复它。仍然在liveubuntu模式下运行:$sudoadd-apt-repositoryppa:yannubuntu/boot-repair$sudoapt-getupdate$sudoapt-getinstall-yboot-repair$sudoboot-repair下载并运行引导修复软件boot-repair,点击默认推荐后启动方式。如果你想知道这个软件具体是干什么的,可以参考这里的手动修复步骤。但是,由于作者未验证其正确性,因此不能保证可用。1$ls-al/dev/disk/by-uuid再次查看各分区的uuid信息,确保这些uuid与/tmp/root/etc/fstab中使用的uuid一致,/、/home、和需要挂载的swap在/tmp/root/etc/fstab中也匹配对应的uuid。因为我们恢复的备份使用的是旧的uuid信息,如果不一致:手动打开/tmp/root/etc/fstab文件进行修正,主要工作是将里面的uuid字符串替换成上面命令中的字符串.启动系统时,/etc/fstab文件指定将sda1sda2sda3分区分别挂载到/、/home、swap。如果没有正确的uuid和分区目录mount匹配,系统就不能正常启动。可以大致参考/etc/fstab文件的内容片段:#/wason/dev/sda1duringinstallationUUID=f381f8cd-ca11-4227-b9ce-8de330bf0e9f/ext4errors=remount-ro01#/homewason/dev/sda2duringinstallationUUID=b4b376c7-9ef0-48dc-9f50-28decd899190/homeext4defaults02#swapwason/dev/sda3duringinstallationUUID=d770aa08-a3f3-4469-a682-f161cff16135noneswapsw00另外如果安装第二块硬盘也可以通过'ls-al/dev/disk/by-uuid'查看新硬盘的uuid,并新建一个对应这个硬盘分区的挂载目录,并将这些信息写入/etc/fstab,这样系统会自动加载你的新硬盘分区后启动。●重建系统目录这些目录是我们备份时在–exclude参数后添加的目录。mkdir/tmp/root/proc/tmp/root/mnt/tmp/root/tmp/tmp/root/mediachmod777/tmp/root/tmp记得给/tmp/root/tmp777权限,这是系统级别的临时目录需要完全的读写权限,否则你的系统将无法启动成功。刚开始练习全盘备份恢复时,忽略了这个小细节,导致系统恢复屡屡失败,差点放弃。●重新启动计算机关闭计算机,然后从硬盘重新启动计算机。如果一切顺利,则全盘恢复成功。至此,你就可以无差别的使用当时备份的专属高效系统了。全盘备份恢复操作对新手来说有一定的风险。如果担心操作不当丢失数据,可以先在虚拟机环境下练习。笔者实践过此方法,在虚拟机中同样适用。#p#将五笔系统迁移到物理分区另外,一些用户最初通过五笔在Windows上试用Ubuntu,最后决定彻底放弃Windows,才发现五笔中已经积累了太多的软件和配置,重新安装了安装系统的成本非常高。笔者本人先是在五笔系统中练习Ubuntu,一年半后正式迁移到独立分区,彻底告别Windows。那么这里就简单介绍一下如何将五笔系统移植到物理分区上。●新建分区在Windows下用分区工具从已有分区中划分出两个分区,假设安装系统名为/dev/sda5,swap分区名为/dev/sda6。(如果需要单独的/home分区,可以再分一个)进入五笔系统下载运行迁移脚本点击下载五笔迁移脚本,解压运行sudozxvfwubi-move.tar.gzsudobashwubi-move。sh/dev/sda5/dev/如果sda6有独立的/home分区,读者可以参考上一节解压备份压缩包中恢复/home分区数据的部分。●重新启动计算机,如果一切顺利,系统会显示Grub引导菜单,您可以通过选择菜单选择进入物理分区的Windows或Ubuntu系统。这个Ubuntu系统的内容和你的五笔系统是一样的。这个脚本的使用和更新也在进行中,目前支持从Ubuntu8.04到12.04的所有版本。这里只是一个总结,读者可以访问Ubuntu论坛以查看此脚本的更多用法和其他详细信息。#p#Ubuntu系统升级策略频率Ubuntu一直都是每六个月发布一次自己的新版本,这对用户来说其实是一个很大的负担,经常不适应当前的版本,新版本就推过去了,所以我个人的看法是即无需追新,每两年升级一次LTS版本即可。时机我们之前也说过,Ubuntu某个版本源中的软件版本会和Ubuntu自身的版本有对应关系。例如:Ubuntu10.04上的输入法软件iBus只会更新到1.2版本。如果要使用最新的1.4版本,就得自己编译安装,或者劝说软件作者或者其他爱好者在Ubuntu10.04源中打包更新iBus版本或者找第三方源,这很不方便。对于过早发布的版本,很多软件作者没有动力和热情为其做兼容性开发、测试和更新源。所以当你发现你的分发源中的软件太旧,相互之间的兼容性问题越来越多时,这也是一个提醒你升级现有系统的信号。举个我自己的例子,两个月前我决定从10.04升级到12.04,因为10.04下的拼音输入法fcitx和较新版本的firefox有冲突,总是导致页面卡顿。问fcitx的源码打包者无果:不愿意更新10.04以下的fcitx版本来解决这个问题,所以做了这次升级。虽然Ubuntu本身提供了'sudoapt-getdist-upgrade'之类的命令来进行版本间的大升级,但是从一些用户反馈来看效果并不理想,这样升级的系统总会出现各种问题。因此,建议读者可以参考本文前面的备份恢复策略进行跨大版本升级。一般这样的升级不会造成太大的问题,除非是某些软件差异太大,用户可以适应一段时间。另一方面,在UbuntuServer上进行大版本升级时,我建议使用“sudoapt-getdist-upgrade”方法。首先,没有GUI软件的升级会更顺畅。第二,根据我自己的实践:这种服务器端的升级会比较顺利。运行apt命令后,只用了半个小时就完成了Ubuntu版本的升级和所有软件的更新。待续...