如何给装有 Linux 的笔记本更换 ssd,不重装系统的情况下? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
phpfpm
V2EX    问与答

如何给装有 Linux 的笔记本更换 ssd,不重装系统的情况下?

  phpfpm 2020-08-03 16:41:38 +08:00 4041 次点击
这是一个创建于 1920 天前的主题,其中的信息可能已经有所发展或是发生改变。

目前一块 500G 的 hdd

fdisk -l: Disk /dev/sda: 465.78 GiB, 500107862016 bytes, 976773168 sectors Disk model: ST500LM021-1KJ15 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: gpt Disk identifier: F4E44CEB-7501-40CD-949A-EF8BA7BFC1AF Device Start End Sectors Size Type /dev/sda1 2048 4095 2048 1M BIOS boot /dev/sda2 4096 976771071 976766976 465.8G Linux filesystem df -h: /dev/sda2 458G 24G 411G 6% / 

手头有一块 ssd,240G 的,想直接替换一下

其他的工具有:

其他的 linux 的电脑

支持双硬盘的 sata-usb dock

其他的 windows 的电脑

想问下怎么搞最简单的 best practice ?

Thanks(ω)

35 条回复    2020-08-04 09:17:05 +08:00
Tink
    1
Tink  
PRO
   2020-08-03 16:44:34 +08:00 via Android
直接 rsync 拷贝,考完了编辑 fstab,修改引导就行了
phpfpm
    2
phpfpm  
OP
   2020-08-03 16:49:38 +08:00
@Tink 这块硬盘还有一个 bios boot 分区,这个 rsync 能搞定吗。。

可以接受离线一小段时间

编辑 fstab 是指编辑新硬盘的 fstab ?
a719114136
    3
a719114136  
   2020-08-03 16:57:54 +08:00   1
树莓派用 dd 可以整个系统以及引导,不知道对于完整的 linux 行不行

```
sudo dd bs=4M if=/dev/mmcblk0 of=/dev/sda
```
zhve2x4
    4
zhve2x4  
   2020-08-03 17:07:04 +08:00
我以前的做法是直接对分区打 tar 包。然后通过 u 盘引导进入 liveCD 的系统:解压 tar 到新硬盘的新分区,grep -rn '原分区 uuid' / 找到后修改, 命令修复 efi 分区,命令修复 grub2 等。
phpfpm
    5
phpfpm  
OP
   2020-08-03 17:12:49 +08:00
@a719114136 我没试过,磁盘不一样大小也可以吗
plko345
    6
plko345  
   2020-08-03 17:13:11 +08:00 via Android
dd 吧,有 boot bios,其它方案就不太清楚了
raaaaaar
    7
raaaaaar  
   2020-08-03 17:14:14 +08:00 via Android
注意分区和引导程序就行
uncat
    8
uncat  
   2020-08-03 17:18:28 +08:00
之前在 archlinux 的论坛潜水的时候. 大家的说法是用 `dd` #3 说的那个.

我用的是 `rsync` #1 说的这个. 要更新 `/boot` 和 `/etc/fstab` 和重建 `initramfs` (这条命令相关的: `mkinitcpio`)

不过. 如果你要用 `rsync`. 建议先看看 arch 的 wiki: https://wiki.archlinux.org/index.php/migrate_installation_to_new_hardware

会更好一点
phpfpm
    9
phpfpm  
OP
   2020-08-03 17:21:27 +08:00
@zhve2x4 我搜了一下 uuid 只有 fstab 里面有

```
foo@db:~$ cat /etc/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/sda2 during curtin installation
/dev/disk/by-uuid/74e0ce4b-9915-4c5b-9a2a-76ceb67f64fc / ext4 defaults 0 0
/swap.img none swap sw 0 0
foo@db:~$ ls /dev/disk/by-uuid/
74e0ce4b-9915-4c5b-9a2a-xxx
```

是不是我 dd 全盘之后直接改一下这个 fstab 就可以了?
phpfpm
    10
phpfpm  
OP
   2020-08-03 17:24:18 +08:00
@plko345 其实看了这么多我觉得我还不如重装吧。。

这台机器上只有 mysql,再配置一遍也没那么麻烦。。。
a719114136
    11
a719114136  
   2020-08-03 17:33:06 +08:00 via Android
@phpfpm 新盘必须要>=旧盘
phpfpm
    12
phpfpm  
OP
   2020-08-03 17:35:30 +08:00
@a719114136 如果小呢,只能 rsync 了?
phpfpm
    13
phpfpm  
OP
   2020-08-03 18:09:11 +08:00
@zhve2x4 仔细 grep 了一下 /boot/grub/grub.cfg 里面还真多。。

感觉有点坑啊
Shing
    14
Shing  
   2020-08-03 18:17:25 +08:00   1
前段时间刚给 manjaro 电脑升级 nvme sn750

方法很简单,其实也是直接 dd 复制对烤
首先准备一个 usb 下载个 ubuntu live 制作启动盘,后续大部分操作都在这个启动盘,然后把老盘整个磁盘用 dd 命令烤到新盘
对烤后的 uuid 都是对得上的,但是由于新盘比老盘大,而且 swap 分区位于老盘的最后,所以扩容新盘的时候,就得把新盘的 swap 删了重建,于是就造成 swap 在 grub.cfg 里面的 uuid 值变了,于是,你要做的就是把老盘的 uuid 全部改成新盘的 uuid 就好了。
Shing
    15
Shing  
   2020-08-03 18:18:42 +08:00
@phpfpm 如果小了,就先需要在新盘建立与老盘相对应的分区表,再把数据从老盘 rsync 到新盘,修改 grub 和 fstab 里的 uuid
phpfpm
    16
phpfpm  
OP
   2020-08-03 18:18:47 +08:00
@Shing 但是如果新的比老的小是不是连 dd 的资格都没有了
phpfpm
    17
phpfpm  
OP
   2020-08-03 18:21:01 +08:00
@Shing 感觉这样我还不如重装了。。。。。
┓(;_`)┏
autoxbc
    18
autoxbc  
   2020-08-03 18:35:12 +08:00   1
对于两个硬盘的复制:
1. dd 会原样复制分区表,导致大转小会失败,小转大剩余容量无法利用
2. rsync 看起来是基于目录的操作逻辑,大部分教程都有一串很长的参数,不容易理解
3. 专门做这个工作的工具首推 Clonezilla,其后端核心是 Partimage 和 Partclone
4. 我常用的是 Partimage,是个控制台下的图形界面的向导式工具,简单易懂
phpfpm
    19
phpfpm  
OP
   2020-08-03 18:43:18 +08:00
@autoxbc cooool !!!

所以我是不是把俩硬盘插到 usb dock 上,找一台能用的 ubuntu 的本子,对拷一下就可以了?
Osk
    20
Osk  
   2020-08-03 18:54:14 +08:00 via Android
我个人是用 rsync 或 cp 复制系统。
需要注意:
boot 分区,如果有。
initramfs 可能需要 update
grub2 需要安装到新磁盘和更新配置。
fstab 需要作一点点修改。


现在我在安装前就会考虑 lvm 或 btrfs,两者都很方便,除了 boot 分区需要迁移外,其它一律不用管。
autoxbc
    21
autoxbc  
   2020-08-03 18:54:20 +08:00
@phpfpm #19 Partimage 仍然是基于分区来复制,复制之前的手动分区,复制之后的修改 fstab 和 grub.cfg 还是需要的

手动分区我更喜欢用 WinPE 来操作,Linux 读 Windows 生成的分区表很少出错,反过来则不一定

USB Dock 注意供电问题,不要预设板载 USB 3.0 有足够的输出功率
phpfpm
    22
phpfpm  
OP
   2020-08-03 19:07:47 +08:00
@Osk ubuntu 20.04 的 boot 貌似不是分区,是 /boot 目录,所以估计还是得改。

lvm,brtfs,ext4 这些分区格式跟迁移有啥本质区别呢?
phpfpm
    23
phpfpm  
OP
   2020-08-03 19:12:22 +08:00
@autoxbc dock 有外置供电,这点还好。

还以为有那种点击能用的迁移工具 ToT
Osk
    24
Osk  
   2020-08-03 19:29:30 +08:00 via Android
@phpfpm 不管它是 /boot 抑或是 /boot/efi 还是咋的,反正有 bootloader 的分区要动。

lvm 可以把底层的磁盘布局抽象了,/ 等在 lv 中,新加入的硬盘加入 vg 内,然后移除旧硬盘的 pv,只需要重新安装 bootloader 就好,理论上系统运行中也可以实现迁移,这就是用 lvm 的优势之一。

而 btrfs 也有类似的功能,甚至比 lvm 更好,因为 btrfs 知道哪些 block 是需要迁移到新磁盘的,会更快,也可以在线迁移而不需要启动到 LiveCD 中,现在的 linux,这里挂个 tmpfs,那里放个 lock 文件,用 cp 或 rsync 在线复制系统会很痛苦,exclude 一长串,btrfs 和 lvm 就不一样。

另外,还有一点,不过我未验证过:xp 或 rsync 等遇到小文件会让人崩溃,而 btrfs 或 lvm 估计会大部分操作都是连续读写 io,速度有时会更快。仅仅是我的猜测,我没观察过 btrfs 和 lvm 迁移的 io 类型,lvm 有时无法与上层的 fs 配合好可能相当于 dd,对硬件的影响比较大吧。
gansteed
    25
gansteed  
   2020-08-03 19:42:24 +08:00
你可以看看这个: https://jiajunhuang.com/articles/2020_05_22-linux_clone_sys.md.html 我前不久才迁移过一次
Osk
    26
Osk  
   2020-08-03 19:42:39 +08:00 via Android
另外楼主的电脑有 bios boot 分区却无 esp 分区,说明是 bios/legacy 模式启动的,新硬盘上要记住用 gdisk 分一个 bios boot 分区哦,grub2 推荐在 1M 以上,建议 2M.
然后分一个 / 分区,在其它 linux 上 cp /或 rsync /,然后 chroot,grub-install /dev/sdx,update-grub2,编辑 fstab 就完事
phpfpm
    27
phpfpm  
OP
   2020-08-03 20:03:38 +08:00
@Osk 但是很奇怪诶 是 legacy 但是分区却是 gpt 的,这个矛盾吗
Osk
    28
Osk  
   2020-08-03 20:11:31 +08:00 via Android
@phpfpm 不矛盾,mbr 磁盘中,grub 会将自己的一部分代码(stage1 吧,忘了)放在 mbr 到第一个磁盘分区之间的区域,该区域大约有 2M 左右空间,之前 grub2 出现过 bug,未能正确处理好这部分写入操作,把第一个分区写炸了,印象中是如此。

gpt 分区中没了这部分空间,微软就搞出了 msr (但不是用于放 bootmgr 代码 ),grub2 也提出了 bios boot 分区,用来放 mbr 中嵌入区的引导代码。
Osk
    29
Osk  
   2020-08-03 20:14:50 +08:00 via Android
@phpfpm 回答偏了,mbr+legacy/bios boot 和 gpt+uefi 这两个组合方式的限制是微软 client OS 的限制,据说 Windows Server 都没这限制,Linux 更不管了
alexkkaa
    30
alexkkaa  
   2020-08-03 20:26:40 +08:00 via Android
clonezilla 复制过去就行 不用改
xing2387
    31
xing2387  
   2020-08-03 23:37:15 +08:00   1
emmmmm 。。 我觉得这是很简单的事情。。。不会就干脆劝退 ubuntu 算了。。。(狗头保命
1. 要能卸载这个系统分区 -> 需要个 Live cd 之类的,用安装镜像写进 U 盘启动选“try ubuntu”就行。
2. 新硬盘可能比原有分区小 -> 调整分区大小,用自带的 gparted 就可以啦(有 GUI 的)。
3. 需要将分区数据拷到新硬盘 -> dd 就完事了,dd 完数据之后应该是能 mount 挂载的,挂载一下验证一下。
=========== 保险方法: ============
4. 启动到新硬盘上 -> 重启进入原硬盘上的 ubuntu,执行 update-grub 命令,会将新硬盘的系统识别到并更新到 grub 的配置里。再重启,grub 选项应该会多一个新硬盘上的 ubuntu,选他,就妥妥的进了新硬盘的 ubuntu 。
5. 安装引导 -> 在进了新硬盘的 ubuntu 后,grub-install 安装 grub 再 update-grub 更新配置。
6. 其他工作 -> 注释掉 fstab 中多余的分区挂载配置,只保留 /写入新硬盘的,uuid 可以在 gparted 上查到。
7. 完事了。
=========== 不保险但是很快的方法: ==============
4. 对新硬盘使用 grub-install,拔掉旧硬盘。或直接用 live cd 的 grub 。
5. 重启手动 grub:a. set root=xxx; b. linux xxx; c. initrd xxx; d. boot 。
6. 进去新硬盘的系统后就懂得都懂.jpg 了
xing2387
    32
xing2387  
   2020-08-03 23:42:35 +08:00
补充一下没看清楚题目。。。1. 原来不是专门指的 ubuntu 而是 linux 。。。大同小异没差。。
2. 原来是 gpt,不算 legacy bios 。。。这个就当我前面那堆 12345 是说废话。。嫌麻烦没用过 gpt 。。。
fkmc
    33
fkmc  
   2020-08-04 00:04:42 +08:00 via iPhone
timeshift 这个软件备份到一个硬盘然后再恢复到新的硬盘
phpfpm
    34
phpfpm  
OP
   2020-08-04 07:28:02 +08:00
@xing2387 我决定我抽空数据 dump 一份之后直接重装吧

23333
zhve2x4
    35
zhve2x4  
   2020-08-04 09:17:05 +08:00
@phpfpm 没必要 dd 呀,直接在新硬盘上用 liveCD 分好区,然后用 tar 的方式备份恢复。把 os 恢复到新硬盘后,执行" grep -rn '原分区 uuid' 新硬盘分区所挂的路径" 改好 uuid 。然后 chroot 到新硬盘,修复引导就搞定了。你可以选择性参考 https://www.cnblogs.com/mind-water/p/11807150.htmlhttps://www.cnblogs.com/mind-water/p/11870604.html
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2953 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 28ms UTC 13:08 PVG 21:08 LAX 05:08 JFK 08:08
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86