linuxLinuxLinux

Ubuntu16.10 迁移到 SSD

2017-02-11  本文已影响2405人  CntChen

tags: Linux OS GRUB 硬盘分区

背景

2016年双十一入手了一块500G的 SSD(Solid State Drive,固态硬盘),打算安装到自己的笔记本上。笔记本的 HDD(Hard Disk Drive,机械硬盘)已经跑了 Ubuntu16.10 + Win10 双系统。光驱位的硬盘支架也装好了,一直虚位以待。工作忙一直拖到了2017年。

公司的 PC 机器也是 Ubuntu16.10,并且安装的软件比较齐全,所以计划将 PC 的 Ubuntu16.10 迁移到 SSD 上,然后在笔记本上运行。

开工准备

基础知识

该章节是计算机启动和系统加载的一些概念,有助于加深对迁移原理的理解,注重实践的话可以直接跳过。

总结不一定准确,仅作为个人理解。干货可以看这篇文章:uefi-boot-how-does-that-actually-work-then

BIOS vs UEFI

BIOS(Basic Input/Output System)和 UEFI(Unified Extensible Firmware Interface )是不同的计算机启动固件(Fireware),需要硬件(通常为主板)支持,相互代替的,其中 UEFI 是比较新的方式。

MBR vs GPT

MBR 与 GPT 用于存储硬盘的分区信息,是不同的硬盘分区表类型

File System

File System(文件系统)是存储媒介中文件存储的组织方式。
不同的文件系统类型有不同的速度,灵活性,安全性和占用空间。不同操作系统只支持特定的文件系统类型。
常见的文件系统类型有 FAT16,FAT32,NTFS,EXT3,EXT4,HFS 等。

磁盘发展史

Wikipedia 上有许多关于磁盘的资料,在磁盘分区上,我猜测的发展脉络是这样的:

  1. 磁盘跟内存一样直接物理寻址去访问数据;
  2. 为了方便,建立数据 Index,有了 File System;
  3. 需要多个分区,搞出了 Partition Tabel。

小结

If you want to do a ‘BIOS compatibility’ type installation, you probably want to install to an MBR formatted disk.
If you want to do a UEFI native installation, you probably want to install to a GPT formatted disk.

Of course, to make life complicated, many firmwares can boot BIOS-style from a GPT formatted disk.
UEFI firmwares are in fact technically required to be able to boot UEFI-style from an MBR formatted disk.

SSD 分区

硬盘状态

使用外接硬盘盒,将 SSD 连接到 PC 机上,先查看硬盘状态:

$ sudo fdisk -l
Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0xb2708ce0

Device     Boot     Start       End   Sectors   Size Id Type
/dev/sda1  *         2048    411647    409600   200M  7 HPFS/NTFS/exFAT
/dev/sda2          411648 210126847 209715200   100G  7 HPFS/NTFS/exFAT
/dev/sda3       210128894 913704959 703576066 335.5G  f W95 Ext'd (LBA)
/dev/sda5       210128896 703989759 493860864 235.5G 83 Linux
/dev/sda6       703991808 704966655    974848   476M 83 Linux
/dev/sda7       704968704 764067839  59099136  28.2G 83 Linux
/dev/sda8       764069888 771973119   7903232   3.8G 82 Linux swap / Solaris

Partition 3 does not start on physical sector boundary.

Disk /dev/sdb: 489.1 GiB, 525112713216 bytes, 1025610768 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 33553920 bytes

其中/dev/sda为 PC 上的硬盘,装有 Ubuntu16.10 + Win7;/dev/sdb为 SSD,当前 SSD 为空盘。

分区策略

(注:前文出现的/dev/sdb1/dev/sdf1和后面可能出现的/dev/sd#1都为同一个分区,因为多次插拔了 SSD ,所以标识一直按字母序递增)

分区操作

分区操作在 Gparted 软件中完成,命令行fdiskparted也可以操作,但是我不熟悉。

  1. 打开 Gparted,点击 Device --> Created Partition Table
  2. 选择partition tabel typegpt,然后点击Apply
    create-gpt.png
  1. 分区大小为1M,分区类型为unformatted

    bios-grub-partition.png
  2. 在新建的分区上点击右键,选择managerFlags,然后选中bios_grub选项。

    set-bios-grub-flag.png
$ sudo fdisk -l /dev/sdh
Device         Start       End   Sectors  Size Type
/dev/sdh1       2048      4095      2048    1M BIOS boot
/dev/sdh2       4096   2101247   2097152    1G Linux filesystem
/dev/sdh3    2101248 106958847 104857600   50G Linux filesystem
/dev/sdh4  106958848 736104447 629145600  300G Linux filesystem

GRUB 引导

GRUB 是什么

GRUB(Grand Unified Boot loader)是硬盘中的软件,引导器(loader)的一种。目前主流版本是 GRUB2,可以看 [GRUB2 中文介绍][GRUB2 中文介绍]。

GRUB 用于从多操作系统的计算机中选择一个系统来启动,或从系统分区中选择特殊的内核配置。

provides a user the choice to boot one of multiple operating systems installed on a computer or select a specific kernel configuration available on a particular operating system's partitions. -- GRUB

示例:


grub-loader.jpg

如图:第一个选项和最后一个选项是选择不同的操作系统;第一个选项和第二个选项是选择不同的内核配置。

GRUB 位置

其启动代码(boot.img)直接安装在 MBR 中,然后执行 GRUB 内核镜像(core.img),最后从/boot/grub中读取配置和其他功能代码。
BIOS 引导方式中,MBR 分区表和 GPT 分区表的 GRUB 引导文件所放分区不同

GNU_GRUB_components.png

如图,GRUB 的执行顺序为 boot.img --> core.img --> /boot/grub/

Some MBR code loads additional code for a boot manager from the first track of the disk, which it assumes to be "free" space that is not allocated to any disk partition, and executes it. -- MBR

建立 GRUB 引导

使用 grup-install 的教程来安装 GRUB 到 SSD 盘。

$ sudo mount /dev/sdb2 /mnt
$ sudo grub-install --target=i386-pc --root-directory=/mnt --recheck --debug /dev/sdb

如果看到以下输出,应该就是成功了:

...
Installation finished. No error reported.

此时/mnt目录下,应该有一个./boot/grub的文件夹:

/mnt/boot/grub ⌚ 20:54:33
$ ls
fonts  grubenv  i386-pc  locale
/boot/grub ⌚ 13:30:33
$ ls
fonts  gfxblacklist.txt  grub.cfg  grubenv  i386-pc  locale  unicode.pf2

grub-install /dev/sdb安装的 GRUB 是/mnt/boot/grub,其中/mnt是 SSD /dev/sdb2分区,从 SSD 启动 Ubuntu 的话,/dev/sdb2会挂载为/boot,此时 GRUB 的位置是/boot/boot/grub。而当grub-install /dev/dsa安装 GRUB 到 PC Ubuntu 启动磁盘时,生成的/grub是在/boot/grubgrub-install的处理逻辑应该是先判断/boot路径是否存在,没有就新建。
所以,要将/mnt/boot/grub移动到/mnt/grub

$ sudo mv /mnt/boot/grub /mnt/grub

GRUB 引导修复类型

启动电脑后,当 GRUB 无法按照boot.img --> core.img --> /boot/grub/顺序执行时,会看到命令行界面,等待用户输入命令。此时可以通过输入 GRUB 内置的命令来修复 GRUB 引导。

boot.img是写在 MBR 中的,如果不能执行,直接跟 GRUB 引导方式说再见了,所以执行boot.img一般没问题。boot.img不能识别任何文件系统,core.img的位置是硬编码进boot.img的,所以执行boot.img一般没问题。因此,常见的引导问题集中在/boot/grub/,主要有两种,对应有两种引导修复模式:

数据复制

该步骤是把 PC 硬盘中几个 Linux 分区的数据拷贝到 SSD 上对应的分区。
注意:PC Ubuntu 和 SSD Ubuntu 都有//boot/home分区,阅读下文时注意辨别,我有时并没有写得很清晰。

操作方式

操作的套路是先将 SSD 的分区使用mount命令挂载为 PC 的/mnt,使用cp命令复制数据,再用umount命令移出这个分区;对下一个分区做同样操作。

// 挂载
$ sudo mount /dev/sdb2 /mnt
// 移出
$ sudo umount /mnt
$ sudo cp -rf -a source destination

复制/boot分区

SSD Ubuntu 的/boot从 PC Ubuntu 上看为/dev/sdb2,将/dev/sdb2挂载为 PC Ubuntu 的/mnt。安装 GRUB 之后,/mnt已经有/grub这个文件夹和默认的lost+found文件夹。
使用cp将 PC 的/boot中其他文件复制到/mnt。结果类似:

/mnt/ ⌚ 13:56:06
$ ls | sort
abi-4.8.0-36-generic
config-4.8.0-36-generic
grub
initrd.img-4.8.0-36-generic
lost+found
memtest86+.bin
memtest86+.elf
memtest86+_multiboot.bin
System.map-4.8.0-36-generic
vmlinuz-4.8.0-36-generic

复制/分区

SSD Ubuntu 的/分区(根目录)比较特殊:一些子目录挂载了其他分区,并存在“伪目录”,不同子目录有特定的用途

所以复制/分区是有选择性的,不区分子目录进行复制,可能会提示“权限问题”、“无法访问”等错误。

这几个目录是 Linux 内核启动后由内核来挂载并存放信息的,不能从运行中的 PC Ubuntu 复制过去,但是需要建立空目录,不然内核启动后会报类似错误:

mount: mount point /dev does not exist

创建命令:

$ sudo mkdir dev proc sys

复制/home分区

挂载 SSD Ubuntu/home到 PC Ubuntu /mnt,然后全盘复制

$ sudo mount /dev/sdb4 /mnt
$ sudo cp -rf -a /home/* /mnt

挂载/home/boot分区

SSD Ubuntu 的/home/boot需要挂载到/,挂载方法为:修改/ect/fstab

$ sudo blkid
...
/dev/sdb3 UUID="a5eb2b0c-2104-4afe-aa78-93396d3e0986" TYPE="ext4" PARTUUID="b2708ce0-07"
...
$ sudo vim /mnt/etc/fatab

fstab文件大概是这样子的:

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda3 during installation
UUID=a5eb2b0c-2104-4afe-aa78-93396d3e0986 /               ext4    errors=remount-ro 0       1
#
# /boot was on /dev/sda2 during installation
UUID=8cba10c6-dff2-4300-a630-ab0e7a4782af /boot           ext4    defaults        0       2
#
# /home was on /dev/sda4 during installation
UUID=298ba5ad-d306-4b4a-aaa8-54312590dec6 /home           ext4    defaults        0       2

GRUB 引导修复

将 SSD 通过 USB 插入到笔记本,开机,选择从 USB 启动。此时应该会是看到类似下图的画面。


GRUB-Prompt-crop.png

说明已经进入到 GRUB 引导程序中,但是没有 GRUB 启动选项,无法继续引导了。距离成功仅剩一步:修复 GRUB 引导。

指定内核启动

// grub> root=hd0,gpt2
// grub> prefix=(hd0,gpt2)/grub
grub> set root=hd0,gpt2
grub> set prefix=(hd0,gpt2)/grub
grub> linux /vmlinuz-4.8.0-36-generic ro root=/dev/sda2
grub> initrd /initrd.img-4.8.0-36-generic
grub> boot

到这一步应该可以启动 SSD 的 Ubuntu,但是下次重新开机,又需要手动指定内核才能启动,通过在 SSD Ubuntu 中重建 GRUB 引导可以解决该问题。

重建 GRUB 引导

从 SSD 开启 Ubuntu 成功后,执行以下命令:

$ sudo update-grub
$ sudo grub-install /dev/dsa

以上命令更新了 GRUB 可引导的系统/内核列表:/boot/grub/grub.cf,并重新安装了 GRUB。可以参考:Grub2/Installing

笔记本下次开机,就能看到类似画面:


grub-loader.jpg

完成

将 SSD 放入笔记本内置硬盘位,将旧的 HDD 放到光驱位置,开机,完成!(撒花)!

结语

总共花了三天时间搞定这个事情,整理出文章花了N天,查看了很多资料,对计算机开机引导,硬盘分区和 GRUB 算是比较了解了。
现在笔记本有了 SSD + HDD,下一步可能会实践双硬盘的数据备份。
最后放上 HDD 凌乱的分区图,纪念这几年装机折腾的日子。折腾中总有收获。

old-disk-partition.png

Refenrences

http://www.ihacksoft.com/uefi.html
[UEFI是什么?与BIOS的区别在哪里]:http://www.ihacksoft.com/uefi.html

http://zhaodedong.leanote.com/post/Linux%EF%BC%9A%E7%B3%BB%E7%BB%9F%E5%90%AF%E5%8A%A8%E5%BC%95%E5%AF%BC%E8%BF%87%E7%A8%8B

http://www.howtogeek.com/193669/whats-the-difference-between-gpt-and-mbr-when-partitioning-a-drive/
[What’s the Difference Between GPT and MBR When Partitioning a Drive]:http://www.howtogeek.com/193669/whats-the-difference-between-gpt-and-mbr-when-partitioning-a-drive/

http://www.thegeekstuff.com/2011/02/Linux-boot-process/

https://my.oschina.net/guol/blog/37373
[GRUB2 中文介绍]:https://my.oschina.net/guol/blog/37373

END

上一篇 下一篇

猜你喜欢

热点阅读