修复Ubuntu中的启动项

问题描述

之前是Ubuntu和Windows双系统,Ubuntu系统装在硬盘A,Windows系统装在硬盘B,由Ubuntu的grub进行启动引导.
后来硬盘A出了问题,送去维修.在此期间想要使用Windows系统,于是通过lilo修改了引导记录,成功启动了Windows.麻烦的是后来Ubuntu系统所在的硬盘A回来了,硬盘A可以正常进行读写,但是读写的时候会发出非常大的噪音,于是买了一块全新的硬盘C,希望将硬盘A上的内容全部迁移到硬盘C上,因为Ubuntu上重装系统重新配置环境实在是太麻烦了,最终我找到一个解决方案,能够直接不用重新安装系统,就可以使用迁移过后的Ubuntu系统.
值得注意的是,此时由于使用lilo修改过引导记录的缘故,硬盘A再次安装到主机,也无法直接从硬盘A启动.

准备工作

  • Ubuntu的U盘启动盘
  • 确保已经插好网线,网络环境正常
  • 硬盘A和硬盘C被连接到主板

使用Gparted进行分区

  1. 进入U盘启动中的live CD
  2. 使用sudo fdisk -l可以查看各个磁盘中的分区情况.记住磁盘A中的每个分区的名称以及在原Ubuntu系统中对应的目录,以及分区类型,例如我的根目录是在/dev/sda9,boot是在/dev/sda8.如果不能确认,可以使用sudo mount /dev/sda9 /mnt这样的命令挂载对应分区,然后查看其中内容来确认.
    之后在Gparted中对硬盘C进行分区,要确保分区与硬盘A中Ubuntu系统的分区数量一致,并且每个分区的大小都不小于原来分区的大小.

拷贝分区

  1. 使用dd命令从硬盘A将对应的分区拷贝到硬盘C,例如sudo dd if=/dev/sda1 of=/dev/sdb1. 这个过程不会有输出,为了查看复制的进程,可以在另外的terminal中执行watch -n 5 killall -USR1 dd,这样在dd的窗口中可以看到输出. 重复这一指令直到所有的分区都拷贝完成.
  • 注意:使用dd命令拷贝之后所有的新分区与原来分区具有相同的uuid.如果不希望uuid相同,可以在gparted中修改uuid,并且在文件系统对应分区的/etc/fstab中完成对应修改
  1. 使用gparted在硬盘C中boot对应分区添加boot标记
  2. 使用gparted新建分区,大小大于1M, file system选择unformatted.标记为boot_grub.
  3. 解除挂载硬盘A

修复grub

  1. 挂载系统.

    1
    2
    3
    4
    5
    sudo mount /dev/sdX /mnt
    sudo mount /dev/sdY /mnt/boot
    sudo mount /dev /mnt/dev
    sudo mount /sys /mnt/sys
    sudo mount /proc /mnt/proc
  2. 使用chroot进入虚拟系统
    sudo chroot /mnt

  3. 修复grub
    sudo grub-install --force

使用boot-repair

  1. 安装boot-repair
    1
    2
    3
    sudo add-apt-repository ppa:yannubuntu/boot-repair
    sudo apt-get update
    sudo apt-get install -y boot-repair && boot-repair

进行正确的设置之后,等待完成,重启即可.