我的电脑经过长期使用,硬盘分区杂乱,安装了windows和两个ubuntu。我的常用ubuntu崩溃了,多次尝试也没有修复,乘着这次重装系统,打算直接全部推到,从格式化SSD开始。
数据备份
我之前是将系统和用户数据全部安装在一个分区的,就好像比windows下只有一个C盘,系统和用户数据都在一个盘,一旦崩溃就非常棘手。
重装之前,我必须把用户数据备份。我另一个ubuntu系统还可以进入,如果没有可以用U盘启动盘进入另一个系统,访问数据所在的分区,将数据复制到移动硬盘。
其他两个系统没有重要数据,就不备份,后面直接全部清除。
删除分区
首先我使用winPE系统进入PE系统,使用DiskGenius分区软件,发现我的SSD盘存在大量的分区,全部删除并使用数据清除,最后点击左上角的应用,才算是开始执行。最后整个SSD都变成了一整块未分配的区域。
制作硬盘镜像
制作硬盘镜像可以参考:2、制作硬盘镜像
Ubuntu安装
Ubuntu的安装参考:安装Ubuntu系统
但是区别在于分区步骤。在上面的教程中,只分了一个区挂在/目录,因为它没有删除EFI分区,并且将/系统和/home用户区都安装在了一个分区。
但是上面将整个SSD都清理了,加上我们分离系统和用户的需求,所以需要创建三个区:
首先创建EFI分区。因为上面清理了1T的SSD,所以可以看到有一个约1T的free space,点击加号创建分区,大小选择512MB(很大了,绰绰有余),用途选择EFI System Partition,点击OK。

同样的创建一个大约200GB的分区,挂载点选择/,用于装系统。这个200GB是根据经验来的,我统计了我之前的系统,发现系统占用91GB,用户数据占用400GB。所以这次我给系统分区设置200GB也绰绰有余了。

最后就是用户分区了,我不打算安装其他系统了或者有其他用途,所以将剩余的磁盘空间全部分成用户区。挂载点选择/home

最终可以看到,1T的SSD分成了三个区nvme0n1p1、nvme0n1p2、nvme0n1p3。分别用作EFI区、系统区、用户区。

接下来,我们选中nvme0n1p2也就是/挂载区,执行下一步安装。后续和上面教程一样了。
安装成功后:
bash
df |grep nvme # 查询占用情况
/dev/nvme0n1p2 196G 24G 163G 13% /
/dev/nvme0n1p1 516M 6.1M 510M 2% /boot/efi
/dev/nvme0n1p3 719G 122G 560G 18% /home
可以看到分区情况、挂载点和使用情况。
备份
现在我们安装好系统并且配置好环境后,需要进行系统备份。备份主要分成两部分:
/分区备份,这是系统分区,当系统无法启动或者其他故障,可以直接将备份覆盖该分区,快速恢复到之前的系统状态/home这是用户数据分区,这一块就是自己弄个移动硬盘经常拷贝数据即可。可以写一个脚本定时备份,参考:Ubuntu增量备份和定时执行
现在已知系统分区在nvme0n1p2:
可以使用dd制作镜像,其中if输入文件,of是输出文件:
bash
sudo dd if=/dev/nvme0n1p2 of=/media/backup/root_backup.img bs=4M status=progress
备份是最好退出所有程序,保证备份期间数据的一致性。
恢复时,或者重装SSD时:
bash
sudo dd if=/media/backup/root_backup.img of=/dev/nvme0n1p2 bs=4M status=progress
然后更新GRUB,然后重启系统:
bash
sudo mount /dev/nvme0n1p1 /boot/efi
sudo grub-install /dev/nvme0n1
sudo update-grub
dd实际上是复制整个分区,但是比如200GB分区,实际文件只占用90GB。所以可以使用partclone拷贝已用空间:
bash
# 备份
sudo apt install partclone
sudo partclone.ext4 -c -s /dev/nvme0n1p2 -o /media/backup/root_backup.pcl
# 恢复
sudo partclone.ext4 -r -s root_backup.pcl -o /dev/nvme0n1p2
还有可以使用fsarchiver压缩备份,支持恢复到不同大小分区:
bash
# 备份
sudo apt install fsarchiver
sudo fsarchiver savefs /media/backup/root_backup.fsa /dev/nvme0n1p2
# 恢复
sudo fsarchiver restfs /media/backup/root_backup.fsa id=0,dest=/dev/nvme0n1p2
引导问题
上面装系统时可以看到,分了三个分区,其中有一个EFI分区负责引导。如果我们格式化或者恢复或新SSD上恢复镜像,在EFI中的引导是没有一起的,因为我们没有对EFI分区数据做任何备份。单独的在新SSD中写入系统分区和数据分区数据,是无法启动的。
现在已知我的分区情况如下:
bash
user@user-System-Product-Name:/$ df -h|grep nvme
/dev/nvme0n1p2 196G 24G 163G 13% /
/dev/nvme0n1p1 516M 6.1M 510M 2% /boot/efi
/dev/nvme0n1p3 719G 132G 551G 20% /home
系统崩溃,只恢复/系统分区
bash
# 写入系统数据到分区
sudo dd if=/media/backup/root_backup.img of=/dev/nvme0n1p2 bs=4M status=progress
# 挂载EFI分区
sudo mount /dev/nvme0n1p1 /boot/efi
# 安装grub并更新
sudo grub-install /dev/nvme0n1 # 注意是整个磁盘,不是某个分区
sudo update-grub
# 重启
sudo reboot
格式化SSD,恢复/系统分区和/home用户分区数据
bash
lsblk
# 确保:
# /dev/nvme0n1p1 → EFI 512MB
# /dev/nvme0n1p2 → / 分区
# /dev/nvme0n1p3 → /home 分区
# 如果没有 EFI 分区,需要新建(FAT32,512MB,标记 EFI),按照Ubuntu安装章节创建分区
# 恢复系统数据
sudo dd if=/media/backup/root_backup.img of=/dev/nvme0n1p2 bs=4M status=progress
# 恢复用户数据
sudo dd if=/media/backup/home_backup.img of=/dev/nvme0n1p3 bs=4M status=progress
# 挂载EFI并安装GRUB
sudo mount /dev/nvme0n1p1 /boot/efi
sudo grub-install /dev/nvme0n1
sudo update-grub
# 重启
未分区的全新SSD
首先进行分区规划,按照安装系统时的参数:
| 分区 | 大小 | 挂载点 | 文件系统 |
|---|---|---|---|
| p1 | 512MB | /boot/efi | FAT32 (EFI) |
| p2 | 120GB | / | ext4 |
| p3 | 剩余 | /home | ext4 |
bash
# 恢复系统数据
sudo dd if=/media/backup/root_backup.img of=/dev/nvme0n1p2 bs=4M status=progress
# 恢复用户数据
sudo dd if=/media/backup/home_backup.img of=/dev/nvme0n1p3 bs=4M status=progress
# 挂载EFI并安装GRUB
sudo mount /dev/nvme0n1p1 /boot/efi
sudo grub-install /dev/nvme0n1
sudo update-grub
# 重启
sudo reboot
关于生成引导的理解
首先启动系统是UEFI固件会到EFI分区去寻找启动文件。
EFI分区在一个SSD中只存在一个,如果是一个未分区的全新SSD,在分区时就创建一个FAT32,大约几百MB的分区,类型选择EFI。如果已经存在EFI(一般装过系统的都会有EFI分区),则安装多个系统都会将自己的引导分拣写入到EFI分区中。那么启动后UEFI在EFI找到多少个启动程序,就会显示多少个,用户自己选择即可。
ubuntu中的流程是:根据/boot/grub数据生成启动文件,写入到/boot/efi,而/boot/efi像指针,指向了实际的EFI分区。所以/boot/efi就像是一个桥梁,给grub向EFI分区写入数据创建一个桥梁。
从上面的指令也可以看到,首先是进行了挂载,将/boot/efi这个空指针指向一个实际分区EFI。
然后使用grub-install生成启动程序,写入到EFI分区。可以看到生产grub时给的地址是/dev/nvme0n1整个磁盘,声明在这个磁盘上注册启动项。
所以可以看到,如果换了SSD,/boot/grub数据是随着系统数据一起的,只需要设置新SSD的EFI分区指向(挂载)/boot/efi,然后使用grub-install向EFI写入引导既可。
至此我们理解了这一块的知识,在实践中会遇到一些问题,比如安装了多个系统,删除某些系统且删除其分区后,再启动时仍然存在他们启动项,但是选择后进入只有黑色终端框(比如ubuntu的grub对话框)。我们就可以根据上面的原理进入EFI分区找到他们的引导文件删除。因为他们只是删除了系统分区,而EFI分区是独立的,没有同步删除他们的引导向。
如何访问EFI分区文件?方法很多,我是通过Ubuntu安装盘进入Try模式,进入将EFI分区挂载到一个临时目录,通过这个目录进入后删除了引导项。
常见问题
U盘启动后选择Try or Install Ubuntu后黑屏,按e编辑启动参数,将quiet splash ---修改为quiet splash nomodeset,按ctrl+x启动。这主要是NVIDIA显卡造成的,安装好系统后安装NVIDIA驱动一般都可以解决。