SSD 迁移记

由于某些需求,决定上SSD,提高一下硬盘读写速度。上二手东买了三星(SAMSUNG) 860 EVO
最初的想法是作为数据盘使用,即操作系统还是跑在机械硬盘上,仔细一思考,还是折腾
一下,要不实在是有些浪费,事实证明,折腾是值得的,感觉就想飞一样。

首先查看一下原始的情况:

1
2
3
4
$ mount
/dev/sda1 on /boot type ext4 (rw,relatime,seclabel,stripe=4)
/dev/mapper/fedora-root on / type ext4 (rw,relatime,seclabel)

当然首先要把SSD处理一下,安装一下 gparted 图形化界面很好用。建个分区表,选择
gpt,分个区,/dev/mapper/fedora-root 大小为50G,先分个50G的分区,剩下的全部给
另外一个分区,格式化为 ext4。操作完成后,用fdisk 查看一下:

1
2
3
4
5
6
7
8
9
10
11
12
$ fdisk -l
Disk /dev/sdb:232.9 GiB,250059350016 字节,488397168 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:gpt
磁盘标识符:
设备 起点 末尾 扇区 大小 类型
/dev/sdb1 2048 104859647 104857600 50G Linux 文件系统
/dev/sdb2 104859648 488396799 383537152 182.9G Linux 文件系统

将原来系统的 / dd 到新的SSD,

1
dd if=/dev/mapper/fedora-root of=/dev/sdb1 bs=1M

用新的root 把系统启动起来,reboot 后进入引导界面,按e 编译,找到
root=/dev/fedora/root 改为 root=/dev/sdb1 按 ctrl+x 启动,一会儿就进系统了,速度
提升很大。现在需要把 grub.cfg 更新一下,因为我们是手动修改进入了新的根,如果重启
的话,还是会使用老的根,因为grub.cfg 里就是这么写的。

要生成新的grub.cfg 需要使用grub2-mkconfig, 命令很简单

$ grub2-mkconfig -o /boot/grub2/grub.cfg

执行后重启,md 怎么又进到老根去了。这里折腾了好久,第一个问题fedora 的内核出bug
了,每次重启都要等待非常久的时间,所以需要升级,所以正确的顺序应该是先升级系统再
dd,没办法升级系统重新 dd

解决了fedora 内核的问题后,发现还是进不到新根。只要认真地看 grub.cfg, grub2 改动
挺大,不太熟悉了。

1
2
3
4
#
# DO NOT EDIT THIS FILE #
# It is automatically generated by grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub

启动有两个信息,确实是使用 grub2-mkconfig 生成,/etc/default/grub 里有配置

1
2
3
4
5
6
7
8
9
10
$ cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.driver.blacklist=nouveau modprobe.blacklist=nouveau nvidia-drm.modeset=1 rd.lvm.lv=fedora/root rd.lvm.lv=fedora/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

grub2-mkconfig 里用这句

1
GRUB_DEVICE="`${grub_probe} --target=device /`"

执行查看结果, 发现正确

1
2
3
$ grub2-probe --target=device /
/dev/sdb1

可是为什么不能正确启动呢,看看生成的 grub.cfg 文件

linux16 /vmlinuz-4.17.2-200.fc28.x86_64 root=UUID=290a98e3-7937-49db-a971-4d0e49567cf0

使用的是 UUID,并不是 /dev, 查看一下各分区的 uuid

1
2
3
4
# blkid
/dev/sdb1: UUID="290a98e3-7937-49db-a971-4d0e49567cf0" TYPE="ext4" PARTUUID="fe64f395-7520-42c3-939b-b17eb7064cec"
/dev/mapper/fedora-root: UUID="290a98e3-7937-49db-a971-4d0e49567cf0" TYPE="ext4"

由于dd 的原因,/dev/sdb1 和 /dev/mapper/fedora-root 的 UUID 居然是相同的。第一个
想法是把/dev/sdb1 的 UUID 给改了。放狗搜发现有下面的方法

1
2
3
4
$ uuidgen
8e4c27b2-c63e-4d1d-8ac4-5ddd90669eb0
tune2fs /dev/{device} -U {uuid}

可是tune2fs 时报错,死活改不过来。lzx 提示可以看看如何是grub.cfg 不使用uuid,
发现有个参数 GRUB_DISABLE_UUID=true, 在 /etc/default/grub 加上这行,重新生成
grub.cfg 重启,一切 OK 进入到SSD 的新root

有的系统上的参数可能不太一样,ubuntu 系统里这个参数好像的是 GRUB_DISABLE_LINUX_UUID=true
可能需要确认一下。

  • EOF