V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
phpfpm
V2EX  ›  问与答

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

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

    目前一块 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  
       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 。。。
    wccc
        33
    wccc  
       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   ·   实用小工具   ·   2698 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 81ms · UTC 03:55 · PVG 11:55 · LAX 19:55 · JFK 22:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.