前几天买了一个固态硬盘,Ubuntu重装倒是可以,但是环境的搭建太麻烦了,因此还是采用系统迁移的办法,免去环境搭建的痛苦。迁移过程中需要以下工具或材料:
(1)一个安装好UBuntu的硬盘,这个自然不必多说;
(2)一个空白硬盘,一个空白U盘。
(3)GParted工具(https://gparted.org/),boot-repair工具(https://sourceforge.net/p/boot-repair/home/Home/)。其实boot-repair就够了,并且boot-repair制作的U盘映像支持UEFI启动。GParted不太清楚,因为原来做好了Gparted的U盘映像,发现没有UEFI启动。另外,使用boot-repair的U盘映像启动,会将硬盘中的SWAP分区自动挂载。
(4)grub-efi-amd64 (2.02-2ubuntu8)软件包(https://packages.ubuntu.com/zh-cn/bionic/grub-efi-amd64)。
一. 制作boot-repair的U盘映像
使用映像制作工具,如UltraISO制作boot-repair的U盘映像,空白U盘用到了,U盘1GB足够。
二. 硬盘分区
做好boot-repair的U盘映像后,启动时选择UEFI启动(注:我的机器是B75主板,没有挂载安装Windows的硬盘),进入桌面,自动启动boot-repair应用,关闭它,毕竟不是修复grub。
硬盘分区使用GParted工具,boot-repair中自带了这个工具,这一点很方便,如果没有也可以安装一下。
(1)先创建硬盘分区表,建议使用GPT格式,毕竟GPT格式既支持BIOS启动也支持UEFI启动。
(2)分区根据个人喜好进行,更详细的分区策略,可以参考CntChen的博文: Ubuntu16.10 迁移到 SSD。
我分了4个区,一个是1MB的GRUB分区,格式为unformated;一个是30GB的SWAP分区,格式选择linux swap;一个是2GB的EFI分区,分区格式为FAT32,其实这个分区没必要这么大,我当时分了这么大,所以懒得改了;另一个就是系统分区,我没有单独创建mnt分区和home分区。
分区完成后,单击"Apply"就可以完成并且格式化。既创建GRUB分区,又创建EFI分区的目的是,同时支持BIOS和UEFI启动,如果仅是BIOS启动,只创建GRUB分区即可。
(3)创建分区Flag,“manage flags”。1MB字节的GRUB分区,创建bios_grub标记;2GB的EFI分区,创建boot+esp标记。
(4)使用GParted的Partition-->information查看系统分区、SWAP分区以及EFI分区的UUID,并记录。也可以使用sudo blkid查看。
三. 复制
关于硬盘间数据的复制,有多种方法。使用GParted自带的分区复制--粘贴工具(这个最简单,图形界面,甚至连分区UUID都会复制,虽然简单,但前提是目标分区的容量要大于或者等于源分区的容量),或者使用UBuntu的dd工具(这个应该属于备份恢复类型)。也可以使用下面的方法。
(1)使用sudo fdisk -l命令查看源硬盘和目标硬盘的信息,主要是硬盘的设备名以及分区的设备名,比如源盘是/dev/sdb,目的盘是/dev/sda,分区的设备名后面就有数字编号。
(2)在home/lubuntu目录下创建sdb2目录,将源盘的系统分区sdb2挂载到此:sudo mount /dev/sdb2 /home/lubuntu/sdb2;创建sda2目录,将目的盘的系统分区sda2挂载到此:sudo mount /dev/sda2 /home/lubuntu/sda2。创建的目录名与硬盘分区设备名相同,仅是为了在操作时避免误操作。
(3)使用cp命令,将源盘系统分区的内容复制到目的盘的系统分区:sudo cp -rf -a source destination。这个过程需要的时间由硬盘类型和源盘系统分区中数据的大小决定。
(4)数据复制完成后,将挂载的源盘设备卸载:sudo umount /dev/sdb2。
(5)安装BIOS启动方式需要的GRUB:sudo grub-install --target=i386-pc --root-directory=/home/lbuntu/sda2 --recheck --debug /dev/sda。
执行完后,如果没有错误提示即表示成功。
(6)修改grub。修改sda2/etc/fstab文件,修改/boot/default/grub.cfg,可以使用vi编辑器,也可以使用boot-repair映像自带的文本编辑器。
主要是修改开机启动自动挂载分区的UUID,将原来的UUID改为新分区的UUID。
注:如果只是想使用BIOS启动,那么卸载掉挂载的sda2就可以了。如果还想使用UEFI启动,还要继续。
(7)使用dpkg -x命令解包grub-efi-amd64的deb包到一个目录下,根据目录结构,将包中的文件和目录复制到sda2的相应目录下,这个包中包含了UBuntu采用UEFI方式启动所需要的文件。
注:我原来安装UBuntu时采用的BIOS启动方式,因此原来的系统中没有关于UEFI启动所需要的文件,如果原来就是按照UEFI启动方式安装的UBuntu,那么这一步骤可以省略。
(8)安装EFI。新建sda2/boot/efi目录,将sda4分区(目的盘的EFI分区)挂载到此:sudo mount /dev/sda4 sda2/boot/efi。然后执行命令安装:sudo grub-install --target=x86_64-efi --efi-directory=/home/lubuntu/sda2/boot/efi --directory=/home/lubuntu/sda2/usr/lib/grub/x86_64-efi --root-directory=/home/lubuntu/sda2/ --recheck --debug /dev/sda
命令执行完毕,如果没有错误提示,则表示安装成功。
(9)修改grub。修改sda2/etc/fstab文件,开机挂载efi分区,EFI分区是FAT32格式,增加一行(注:uid,gid,fmask,dmask也许不是必须的):
UUID=2AF2-0D74 /boot/efi vfat defaults,utf8,uid=1000,gid=1000,dmask=111,fmask=000 0 0
最好为(最后的1表示自检, 与/boot分区相同):
UUID=2AF2-0D74 /boot/efi vfat 0 1
四. 挂盘开机启动
grub修复。使用2个命令行完成:sudo update-grub; sudo grub-install /dev/sda
完成以上步骤,基本大功告成。BIOS启动方式应该是没问题的。至于UEFI启动,在开机时通过BIOS的启动菜单即可选择。但是,启动时会提示错误,不同的主板可能提示的信息不同:对系统进行了非认证的修改,或者,违背了安全策略。
遇到上面的错误信息,进入BIOS设置,都是安全启动相关的。第一种提示,修改安全启动中的操作系统类型。第二种提示,修改CSM(兼容性支持模块)为Enabled,其他选择UEFI,不用选Auto。
五. 结语
一个晚上没有睡觉,将原来安装的UBuntu16 64位迁移到了2块硬盘,一块是纯BIOS启动,一块是BIOS+UEFI启动。上面的步骤,完全凭记忆写的,可能有些地方有些小问题,如遇到问题,网络搜索一下相应的问题即可。
另外,迁移64位的系统,迁移32位的系统,相应的工具软件应该匹配。Ubuntu能够自适应显示器分辨率,这一点真是不错。
上几张图,第1张是GParted分区以后的截图,第2张是boot-repair映像中的disks工具显示硬盘信息的截图,第3张是fdisk -l命令显示的结果(EFI分区应该显示EFI System类型),第4张是安装EFI执行命令后的截图。
五. 后记:设置独立home分区
独立home分区的好处搜索一下就可以看到。
(1)在全新硬盘中创建一个home分区,可以使用fdisk命令,参考博文:https://blog.csdn.net/williananjhon/article/details/81201510。如果在现有硬盘的分区中划分出一块空闲空间作为新分区,建议还是用GParted工具,无损的,ext4格式。
(2)备份现有home文件夹内容,有2种方法:
可以使用rsync命令,备份:rsync -aqxuP /home/* /backup/home;恢复:rsync -aqxuP /backup/home/* /home。
也可以使用tar命令,备份:tar czvf /backup/home.bak.tar.gzip /home/*;恢复:tar xzvf /backup/home.bak.tar.gzip /home/。
(3)将home文件夹重新命名:mv /home /home.old
(4)新建home文件夹:mkdir /home
(5)挂载home分区
修改配置文件/etc/fstab,增加一行
UUID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx /home ext4 defaults 0 2
使用命令挂载:mount /home
(6)将备份的home文件夹的内容恢复,参见步骤(2)。