ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Ubuntu 20.04系统备份与还原实操:tar、dd、Clonezilla三方案全解析

Ubuntu 20.04系统备份与还原实操:tar、dd、Clonezilla三方案全解析 Ubuntu 20.04 系统备份和还原从新手翻车到恢复如初的完整实操记录一个搞运维和开发的朋友最怕听到的一句话是什么不是“服务器又挂了”而是“系统起不来了你之前装的环境还在吗”。我自己的Ubuntu 20.04主力机也曾因为一次内核升级失败开机直接卡在initramfs折腾了一下午才把数据救回来。整个过程让我深刻体会到在Linux上备份和还原不是可选项而是每个靠这台机器吃饭的人的必修课。这篇博文我会把Ubuntu 20.04的备份和还原讲透覆盖从最简单但最耗时的tar打包到整盘级别的dd克隆再到适合批量部署的Clonezilla再生龙方案。每个方案不仅讲怎么做还会解释为什么这么做以及还原过程中那些让你抓狂的引导修复问题。不管你是刚装好Ubuntu想做个安全快照还是已经遇到系统崩溃急着救数据这篇文章都能给你一套可以直接照抄的作业。1. 为什么Ubuntu备份比Windows更需要技术含量1.2 先搞懂备份的本质系统状态的可复现性很多从Windows转过来的朋友第一反应是用ghost那套思路来处理Linux拿个PE盘就想进去把整个C盘打包。但诚实地讲这条路在Ubuntu上行不通。原因很简单Windows的启动依赖C盘里那一坨引导文件和注册表ghost备份的是“能把Windows硬件层一起带走的镜像”而Ubuntu的系统逻辑是“内核initramfs根文件系统Grub引导”它跟特定硬件绑得不那么死但跟分区结构、UUID、引导方式UEFI还是Legacy BIOS绑定得非常深。所以备份Ubuntu前首先得想清楚你要备份的到底是什么状态。按我的实践经验可以分成三类一是“系统配置状态”比如/etc下的网络配置、用户账号、SSH密钥、APT软件源二是“应用数据状态”比如Docker容器和镜像、数据库文件、NVIDIA驱动的安装结果三是“整个磁盘的物理状态”包括分区表、引导区、EFI分区里的所有字节。很多教程一上来就让你拿dd整盘克隆说“什么都能备份”。这话没毛病但代价是时间、空间和风险。dd是把每一个扇区都原样复制哪怕那个扇区是空的对着1TB的硬盘跑一次dd可能要三四个小时生成一个同样1TB的镜像文件。而如果你只是想“防止系统配置崩了能快速回滚”那tar打包就够用十几分钟搞定一个几GB的压缩包还原起来也快。先把需求想清楚再选工具这是我在Ubuntu上折腾几年后最深的体会。1.2 主流备份方案的一次深度对比先放一张我从实际使用角度做的对比表看完基本就能自己选型了方案原理备份速度还原场景优点痛点tar文件级打包遍历文件系统只打包指定文件快取决于文件数量和大小系统文件损坏、要迁移到新机器灵活、体积小、可增量不包括未挂载分区、不保留空目录权限时容易出错dd整盘/分区克隆逐扇区复制慢跟磁盘容量成正比整盘迁移、磁盘一模一样的新盘无脑、完整包括了引导区和分区表镜像体积巨大、目标盘不能小于源盘Clonezilla再生龙文件系统感知的镜像备份中等批量装机、全盘恢复压缩率高、支持UEFI、有交互界面新手对参数不熟容易选错还原后常遇到引导问题Timeshiftrsync或btrfs快照快系统更新/配置变更回滚界面友好、保留多时间点不是完整备份/home数据之外的备份能力有限我个人的选择习惯是主力开发机上用tar做每周级全备配合Timeshift做系统更新前的回滚点遇到要换硬盘或者做虚拟机模板才上dd或者Clonezilla。这个组合在实际使用中兼顾了速度和可靠性下面我会把每个方案的实操细节都拆开讲。2. 动手前的环境检查和备份策略规划2.1 摸清磁盘布局你的系统到底是怎么启动的备份之前第一件事不是急着敲命令而是搞清楚这台Ubuntu 20.04的底细。我习惯用一根Ubuntu Live U盘启动到体验环境然后执行以下三组命令来摸清磁盘布局。首先是查看全盘分区表sudo fdisk -l这个命令会列出你机器上所有磁盘及其分区。重点看两点磁盘的扇区大小、分区表类型gpt还是dos。如果显示的是Disklabel type: gpt那说明你的系统是UEFIGPT模式如果显示dos或者Disklabel type: dos说明是传统的Legacy BIOSMBR。这两种模式的引导修复方式完全不同UEFI需要EFI分区里有.efi引导文件Legacy需要MBR里写引导代码。很多还原后“开机黑屏”或“找不到引导设备”的案例根源就是没区分这一点。第二步是查看文件系统挂载情况lsblk -flsblk -f会列出所有块设备的文件系统类型和UUID。注意看有没有一个FAT32格式、通常几百MB的分区挂载在/boot/efi下这就是UEFI引导的关键。如果这台机器是双系统WindowsUbuntuEFI分区里还会同时存在微软和Ubuntu的引导文件备份还原时不要把整个EFI分区无脑格式化。第三步是查看当前的引导模式efibootmgr -v如果输出里能看到BootCurrent之类的信息说明当前是UEFI模式。如果提示EFI variables are not supported说明你是Legacy BIOS模式。这个区别直接决定了后面还原引导时的命令和步骤。2.2 理清“必须备份”和“可以丢弃”的内容Ubuntu的文件系统是树状的但并非所有目录都值得备份。我总结了一套“精简原则”在打包系统时能省下不少时间和空间。必须备份的内容包括/etc整个系统配置的核心网络配置Netplan文件、用户组信息、APT源列表、系统环境变量全在这里。备份了这个目录重装后基本能恢复八九成的系统配置。/home用户目录里面有你所有的文档、下载、项目代码、隐藏配置文件.bashrc、.config等。很多人的劳动成果全在这里丢了这个等于白备份。/rootroot用户的目录虽然平时用得少但有人的脚本和SSH密钥放在这里。/var/lib/docker如果你用Docker这里存着所有镜像、容器和卷。Ubuntu上装Docker容易但重新拉镜像和重建容器的成本很高。/usr/local很多手动编译安装的软件默认装在这里比如NVIDIA驱动、自行编译的OpenCV等重装起来特别麻烦。明确不用备份的内容/proc、/sys、/dev、/run这些都是虚拟文件系统或内存文件系统每次开机动态生成备份它们除了浪费空间没有任何意义。/tmp、/var/tmp临时文件没备份价值。/var/cache/apt/archivesAPT下载的deb安装包缓存删了顶多以后下载慢一点不值得占用备份空间。/swapfile或交换分区交换文件就像虚拟内存的存放地里面全是不重要的临时数据备份它纯粹徒增体积。把这些目录记下来后面的tar打包命令里会用--exclude参数把它们排除掉。每次备份前我也会顺手用du -sh估算一下所有要备份目录加起来有多大好预估需要准备多大容量的备份介质。我一般是备份到外接移动硬盘或者另一块独立的数据盘不建议备份到本机同一块物理磁盘的另一个分区——一旦整块盘挂了备份也跟着没了。3. Ubuntu 20.04的备份实操三种方案手把手演示3.1 方案一tar文件级备份日常恢复效率最高的选择tar是Linux里最经典的归档工具它本身不做压缩但可以通过参数调用gzip或其他压缩算法。Ubuntu 20.04系统备份最主流的做法就是用tar带-cvpzf参数打包整个根文件系统同时排除不需要的目录。我的备份命令通常长这样sudo tar -cvpzf /mnt/backup/ubuntu_20.04_system_$(date %Y%m%d).tar.gz \ --exclude/proc \ --exclude/sys \ --exclude/dev \ --exclude/run \ --exclude/tmp \ --exclude/mnt \ --exclude/media \ --exclude/lostfound \ --exclude/var/cache/apt/archives \ --exclude/swapfile \ --one-file-system \ /解释一下几个关键参数如果你用过tar做简单打包可能对-cvpzf比较眼熟但其中每个字母都值得细说-c表示创建归档-v是显示详情第一次备份时开着可以看到过程以后嫌吵可以去掉-p表示保留权限属性这非常关键。很多新手还原后出现文件无法访问、服务起不来的问题就是因为打包时丢了权限位。-z表示用gzip压缩如果你不怕体积大想追求速度可以改成-Jxz压缩或者干脆不加压缩参数。但xz压缩在小内存机器上很吃CPU我一般还是用gzip。-f后面紧跟归档文件路径注意-f后面的路径要在所有参数的最后因为tar会把-f后面的第一个字符串当作文件名。--one-file-system这个参数容易被忽略但非常有用。它会告诉tar不要跨越文件系统边界避免把挂载在当前目录下的其他磁盘分区也备份进去。比如你把数据盘挂载到了/data如果不加这个参数tar会把/data里的内容也打包进去导致备份体积爆炸。备份目标路径/mnt/backup是我手动挂载的外部存储设备。这里强调一点备份文件不要放在要备份的那个磁盘上否则就跟“给房子刷漆时人站在房子里”一样永远有丢的风险。这个注意事项几乎是所有备份事故的共因。等备份跑完我会顺手做两个验证动作。第一看压缩包大小是否在合理范围内第二用tar -tzf 备份文件 | head -20随机列出压缩包内容确认根目录、/etc、/home这些关键路径确实打进去了。如果哪天系统出了问题这个包就是你重建家园的种子。3.2 方案二dd整盘克隆适合换硬盘和虚拟机快照场景对于“要求完整还原、一个字节都不能差”的场景tar就力不从心了因为tar只能备份已挂载的、文件系统可见的内容。而dd是把整个块设备从第一个扇区到最后一个扇区逐个复制它能帮你保留MBR/GPT分区表、EFI系统分区、隐藏的保留分区甚至连文件系统里的“空洞”都原样搬走。dd的基本用法是sudo dd if/dev/sda of/mnt/backup/disk_sda.img bs64M statusprogress convsync,noerror参数含义if是输入文件在这个场景下就是你要备份的整个磁盘比如/dev/sda。of是输出文件可以是另一个磁盘上的镜像文件也可以是另一块裸盘比如/dev/sdb这就是俗称的“硬盘对拷”。bs是一次读写的块大小。设成64M甚至128M能显著提高吞吐量因为每次读写的数据块越大系统调用的开销占比就越低。但别贪大实测下来64M是性能和内存占用比较平衡的取值。statusprogress会显示实时的拷贝进度不然dd默认是“闷声干活”跑几个小时你都不知道它动没动。convsync,noerror的作用是遇到读取错误时填充零而不是直接中断。对整盘备份来说宁可是一个“不完美但完整”的镜像也不要在中途直接停下来。用dd克隆单个分区也类似sudo dd if/dev/sda1 of/mnt/backup/efi_partition.img bs64M statusprogress在VMware虚拟机里装好Ubuntu后很多人习惯直接给虚拟机做快照其实dd在这种场景下也很香——你把整个虚拟磁盘dd成一个镜像文件将来就算虚拟机的快照崩了也能用一个慢速但绝对可靠的原始镜像把人捞回来。热词里搜“vmware虚拟机安装ubuntu”的人特别多我的建议是虚拟机里做系统测试时先用dd把系统盘克隆到本地再随便折腾反正有后悔药。3.3 方案三Clonezilla再生龙物理机和批量部署的救星tar和dd都是命令行工具对不熟悉终端的用户不够友好。如果你更习惯“选择菜单、下一步”的操作方式那Clonezilla国内常叫“再生龙”会更适合你。它是一个基于Parted Magic和DRBL的轻量级Linux发行版做成启动U盘后开机从U盘启动就能进入图形化菜单操作。Clonezilla的核心优势有两点一是文件系统感知它认出ext4、xfs、NTFS后会只备份实际使用的数据块配合压缩算法生成的镜像体积可能只有dd的十分之一二是对UEFIGPT的支持非常完善能自动处理EFI分区和Grub引导的恢复。用Clonezilla备份系统的基本流程先从官网下载Clonezilla的ISO镜像用启动盘制作工具比如balenaEtcher写入U盘。目标机器从U盘启动选择Clonezilla live (Default settings)。依次选择语言、键盘布局进入模式选择菜单。日常备份通常选device-image设备到镜像也就是把磁盘或分区备份成一个镜像文件。选择镜像文件保存位置这一步很关键——不要选“本机硬盘”里那个正在被备份的系统盘而是选外接存储设备或网络共享。选择备份模式。新手我一般推荐beginner初学者模式选项少、安全。想精细控制的高级用户选expert模式可以自定义压缩率、扇区对齐策略等。选择要备份的来源整盘备份选sda分区备份选sda1这样的分区名。最后确认操作Clonezilla会列出即将执行的命令比如ocs-sr -q2 -c -j2 -z1p -i 2000 -p true savedisk 20250322_backup sda这类命令其实本质就是调用Partclone去复制分区确认无误后回车开始。克隆结束后把U盘拔掉再开机系统应该还是原来的样子。Clonezilla是我给实体服务器做全备的首选镜像文件可管理性好还原速度也快。但很多网友反馈“再生龙还原后启动不了”这通常不是Clonezilla的锅而是还原后Ubuntu的Grub引导没有正确重置到EFI分区。这个问题的解决办法我放在第4章专门讲。4. 还原全流程从镜像到你能正常开机4.1 tar备份还原重装系统后把配置和数据接回来tar备份的还原场景跟dd不太一样它更适合这样的情形系统彻底崩了但你有Live U盘能启动到一个临时的Ubuntu环境你的备份包放在外接硬盘里然后你的计划是先装一个最小化Ubuntu 20.04到目标磁盘再把备份包解压覆盖回去。具体步骤第一步用Live U盘启动打开终端确认目标磁盘的设备名sudo lsblk -f假设目标磁盘是/dev/sda系统分区是/dev/sda2EFI分区是/dev/sda1。没有分区的话可以用gparted或者fdisk手动创建这里假设你已经用安装器把基础系统装好了此时目标盘上应该是空系统。第二步把系统根分区挂载到一个临时目录sudo mkdir -p /mnt/ubuntu sudo mount /dev/sda2 /mnt/ubuntu第三步解压备份包到根分区。这一步是整个还原过程的核心也是最容易出问题的地方。务必注意解压时需要保留权限和所有属性并且把备份包里的内容解压到/mnt/ubuntu这个挂载点下而不是解压到Live环境本身的根目录sudo tar -xvzpf /media/ubuntu/backup/ubuntu_20.04_system_20250322.tar.gz -C /mnt/ubuntu关键参数是-x解压、-v显示详情、-zgzip解压、-p保留权限、-f指定文件最后用-C指定解压目标目录。这里缺少-p的话所有系统文件的权限都会乱掉还原后连sudo都用不了。第四步挂载虚拟文件系统并chroot进入目标系统重新生成引导。这一步对UEFI模式尤其重要命令序列如下sudo mount --bind /dev /mnt/ubuntu/dev sudo mount --bind /proc /mnt/ubuntu/proc sudo mount --bind /sys /mnt/ubuntu/sys sudo mount --bind /run /mnt/ubuntu/run sudo mount /dev/sda1 /mnt/ubuntu/boot/efi sudo chroot /mnt/ubuntu进入chroot环境后先确认当前系统识别到的设备lsblk -f df -h然后查看Grub的配置文件是否存在最后重新生成引导update-grub grub-install /dev/sdagrub-install这个命令会把Grub引导程序写入磁盘的MBR或EFI引导条目取决于你是Legacy还是UEFI模式。如果你是UEFI模式grub-install还会自动在/boot/efi里写入或更新EFI引导文件。这就是为什么第四步必须先挂载EFI分区到/mnt/ubuntu/boot/efi再chroot——不然grub-install不知道UEFI固件该去哪找引导文件。退出chroot、重启之前别急着拔U盘。用fdisk -l再看一眼分区结构是否正常确认备份包解压后/etc/fstab里记录的UUID跟当前磁盘分区的UUID对得上。因为备份里的fstab记录的是备份时系统的UUID如果你换了新硬盘或者分区有调整UUID就会对不上系统启动时找不到根分区直接掉进initramfs。遇到这种情况可以在chroot里执行blkid查到实际UUID再用nano /mnt/ubuntu/etc/fstab改回来。4.2 dd镜像还原和Clonezilla还原后的引导修复dd镜像的还原则简单粗暴得多。你之前用dd备份了整盘镜像disk_sda.img现在要把一块新硬盘还原成一样的状态直接执行sudo dd if/mnt/backup/disk_sda.img of/dev/sda bs64M statusprogressdd的还原不需要先分区因为它连分区表一起写进去了。整个流程没有技术难度难度在风险评估of写错盘符的后果是毁灭性的会直接抹掉目标盘里的所有数据。所以我每次执行这种命令前都会执行三遍lsblk和fdisk -l反复确认目标盘是空盘或确认可以覆盖。Clonezilla的还原也类似启动到Clonezilla后选择device-image-restoredisk选源镜像再选目标磁盘一路确认就完事。Clonezilla还原后启动不了的经典场景我处理过好几次现象是开机后直接卡在品牌Logo或者直接进入BIOS设置界面根本看不到Grub菜单。原因是还原时没有把UEFI的启动条目写进NVRAM或者写进去的条目路径不对。这种情况下最快的修复办法是用Ubuntu Live U盘重新启动按第4.1节的步骤挂载根分区和EFI分区然后执行sudo mount --bind /dev /mnt/ubuntu/dev sudo mount --bind /proc /mnt/ubuntu/proc sudo mount --bind /sys /mnt/ubuntu/sys sudo mount --bind /run /mnt/ubuntu/run sudo mount /dev/sda1 /mnt/ubuntu/boot/efi sudo chroot /mnt/ubuntu apt install --reinstall grub-efi-amd64 grub-install --targetx86_64-efi --efi-directory/boot/efi --bootloader-idubuntu update-grub这里的核心是把grub-efi-amd64包重新装一遍然后用grub-install显式指定EFI目录和启动项ID最后执行update-grub重新扫描内核和系统条目。做完之后再重启基本就能从UEFI固件里看到Ubuntu的启动项了。4.3 还原后不能忽略的检查清单还原只是“能开机”的前置条件不代表系统已经完全恢复如初。我有几次还原后看似成功一进系统才发现网络没配置、Docker起不来、NVIDIA驱动没装上折腾半天比重装还累。所以还原完成后不要着急庆祝按这个顺序检查一遍先看系统关键服务状态systemctl --failed这条命令会列出当前所有启动失败的服务。如果出现failed状态的服务针对性地查看日志比如journalctl -u docker.service -n 50排查Docker没起来的原因。然后检查网络配置ip a ip route showUbuntu 20.04用Netplan管理网络还原后如果发现没有IP检查/etc/netplan/*.yaml是否存在且内容正确。Netplan里记录的网卡名称可能跟新环境下不一致比如之前是ens33现在是enp0s3这种时候要么修改yaml里的网卡名要么用netplan generate重新生成应用。最后检查数据完整性这部分靠个人需求定制了。我至少会验证/home下的关键项目代码能否正常编译、数据库服务能否正常启动、Docker容器列表是否恢复docker ps -a如果之前有NVIDIA显卡驱动还可以跑一下nvidia-smi确认驱动和CUDA版本能正常输出。5. 常见故障排查实录和避坑经验5.1 一份拿来即用的Ubuntu备份还原问题定位表这些年我处理过不少备份还原故障也参考过大量社区里的求助帖把最常见的问题汇总成了一张表。你遇到问题时可以先对号入座省得从零开始排查。症状可能原因快速定位命令解决思路还原后开机直接进BIOS没有Grub菜单EFI分区没有引导文件或UEFI NVRAM启动条目丢失efibootmgr -v看看有无ubuntu条目挂载EFI分区后重装grub-efi-amd64并grub-install开机卡在Initramfs unpacking failed或busybox提示根分区UUID对不上fstab记录blkid看实际UUID再对比fstab在initramfs的busybox环境或chroot环境里修正fstab还原后网络不通ip a里没有IP地址Netplan配置的网卡名与当前网卡名不一致ip a对比网卡名ls /etc/netplan/查看配置文件修改netplan yaml里的网卡名后netplan apply还原后Docker容器全部丢失/var/lib/docker目录没备份或者备份不完整docker ps -a看列表du -sh /var/lib/docker看体积重新从tar备份包恢复/var/lib/docker后重启docker还原后系统能启动但图形界面黑屏显卡驱动没有正确恢复特别是NVIDIAnvidia-smilsmodgrep nvidiadd备份的镜像文件比源盘还大目标备份文件系统不支持稀疏文件或者镜像写入时格式问题ls -lh查看实际大小用du -h确认实际占用或改用ClonezillaClonezilla还原到一块更大的新硬盘但分区没变大还原时选择了“整盘还原”而非自定义分区还原后用fdisk -l看分区大小用gparted手动扩展分区或重新用Clonezilla的高级选项调整分区5.2 我踩过的坑三个真实的备份事故复盘第一个坑是tar备份时没有加--one-file-system。那时候我把一块数据盘挂载到了/data结果数据盘里正好有个几TB的大目录tar打包时完全不设防把挂载点下的整个数据盘全卷进去了备份跑了几个小时还没结束最后把我移动硬盘的空间彻底塞爆。这个体验让我给所有朋友讲备份时都会强调做系统备份之前先看看你系统里挂载了哪些额外的文件系统该排除的目录一个都不能漏。第二个坑是dd的时候把of写反了。那段时间我在实验室帮同事迁移磁盘原本是想把旧盘克隆到新盘结果脑子一热if和of写反了直接把旧盘当成了目标盘。幸亏当时那块旧盘上已经没有重要数据不过那一瞬间的冷汗够我记一辈子。后来我给自己立了一个规矩执行dd这种破坏性命令之前先echo把命令打印到屏幕上盯一眼确认无误再回车绝不凭肌肉记忆复制粘贴。第三个坑是UEFI模式下tar还原后忘了挂载EFI分区直接chroot进去执行update-grub。结果grub-install报了一堆错系统重启后直接进BIOS。我开始以为是备份包的问题后来才发现是EFI分区没挂载导致grub-install把引导写到了根分区而不是EFI分区UEFI固件根本找不到启动文件。从那以后我的还原流程里把“挂载EFI分区”写在了chroot之前并且会检查ls /mnt/ubuntu/boot/efi/EFI/ubuntu/里是否生成了grubx64.efi文件。6. 最后分享一点关于备份习惯的个人体会做了这么多年Linux系统的备份还原我的总结是工具本身并不复杂难的是坚持和预案。tar、dd、Clonezilla这三种工具我都推荐你提前在虚拟机里练一遍哪怕只是备份一个几百兆的测试系统也要从头到尾把“备份-还原-修复引导-验证”这个流程跑通。真到了系统崩的那天你才能心不慌手不抖地操作。我个人的经验是备份这件事要跟“写代码”一样形成肌肉记忆系统装好后做一次全盘克隆之后每周做一次tar增量备份每次升级内核、装驱动、改大版本配置之前都先花五分钟做个Timeshift快照。这个习惯帮我无数次从“手贱把系统玩坏”的边缘救回来。备份文件也别忘了定期做校验我一般会在备份完顺手生成一个SHA256校验文件存到备份目录里还原之后用它来验证备份包的完整性。希望这篇Ubuntu 20.04备份和还原的实操分享能让你少走一些弯路。如果你在备份还原中还有别的坑欢迎交流毕竟这些经验都是拿时间换来的。
返回列表