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

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

  •  1
     
  •   phpfpm · 86 天前 · 1480 次点击
    这是一个创建于 86 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前一块 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   86 天前 via Android
    直接 rsync 拷贝,考完了编辑 fstab,修改引导就行了
    phpfpm
        2
    phpfpm   86 天前
    @Tink 这块硬盘还有一个 bios boot 分区,这个 rsync 能搞定吗。。

    可以接受离线一小段时间

    编辑 fstab 是指编辑新硬盘的 fstab ?
    a719114136
        3
    a719114136   86 天前   ❤️ 1
    树莓派用 dd 可以整个系统以及引导,不知道对于完整的 linux 行不行

    ```
    sudo dd bs=4M if=/dev/mmcblk0 of=/dev/sda
    ```
    zhve2x4
        4
    zhve2x4   86 天前
    我以前的做法是直接对分区打 tar 包。然后通过 u 盘引导进入 liveCD 的系统:解压 tar 到新硬盘的新分区,grep -rn '原分区 uuid' / 找到后修改, 命令修复 efi 分区,命令修复 grub2 等。
    phpfpm
        5
    phpfpm   86 天前
    @a719114136 我没试过,磁盘不一样大小也可以吗
    plko345
        6
    plko345   86 天前 via Android
    dd 吧,有 boot bios,其它方案就不太清楚了
    raaaaaar
        7
    raaaaaar   86 天前 via Android
    注意分区和引导程序就行
    uncat
        8
    uncat   86 天前
    之前在 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   86 天前
    @zhve2x4 我搜了一下 uuid 只有 fstab 里面有

    ```
    [email protected]:~$ 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
    [email protected]:~$ ls /dev/disk/by-uuid/
    74e0ce4b-9915-4c5b-9a2a-xxx
    ```

    是不是我 dd 全盘之后直接改一下这个 fstab 就可以了?
    phpfpm
        10
    phpfpm   86 天前
    @plko345 其实看了这么多我觉得我还不如重装吧。。

    这台机器上只有 mysql,再配置一遍也没那么麻烦。。。
    a719114136
        11
    a719114136   86 天前 via Android
    @phpfpm 新盘必须要>=旧盘
    phpfpm
        12
    phpfpm   86 天前
    @a719114136 如果小呢,只能 rsync 了?
    phpfpm
        13
    phpfpm   86 天前
    @zhve2x4 仔细 grep 了一下 /boot/grub/grub.cfg 里面还真多。。

    感觉有点坑啊
    Shing
        14
    Shing   86 天前   ❤️ 1
    前段时间刚给 manjaro 电脑升级 nvme sn750

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

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


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

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

    USB Dock 注意供电问题,不要预设板载 USB 3.0 有足够的输出功率
    phpfpm
        22
    phpfpm   86 天前
    @Osk ubuntu 20.04 的 boot 貌似不是分区,是 /boot 目录,所以估计还是得改。

    lvm,brtfs,ext4 这些分区格式跟迁移有啥本质区别呢?
    phpfpm
        23
    phpfpm   86 天前
    @autoxbc dock 有外置供电,这点还好。

    还以为有那种点击能用的迁移工具 ToT
    Osk
        24
    Osk   86 天前 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   86 天前
    你可以看看这个: https://jiajunhuang.com/articles/2020_05_22-linux_clone_sys.md.html 我前不久才迁移过一次
    Osk
        26
    Osk   86 天前 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   86 天前
    @Osk 但是很奇怪诶 是 legacy 但是分区却是 gpt 的,这个矛盾吗
    Osk
        28
    Osk   86 天前 via Android
    @phpfpm 不矛盾,mbr 磁盘中,grub 会将自己的一部分代码(stage1 吧,忘了)放在 mbr 到第一个磁盘分区之间的区域,该区域大约有 2M 左右空间,之前 grub2 出现过 bug,未能正确处理好这部分写入操作,把第一个分区写炸了,印象中是如此。

    gpt 分区中没了这部分空间,微软就搞出了 msr (但不是用于放 bootmgr 代码 ),grub2 也提出了 bios boot 分区,用来放 mbr 中嵌入区的引导代码。
    Osk
        29
    Osk   86 天前 via Android
    @phpfpm 回答偏了,mbr+legacy/bios boot 和 gpt+uefi 这两个组合方式的限制是微软 client OS 的限制,据说 Windows Server 都没这限制,Linux 更不管了
    alexkkaa
        30
    alexkkaa   86 天前 via Android
    clonezilla 复制过去就行 不用改
    xing2387
        31
    xing2387   86 天前   ❤️ 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   86 天前
    补充一下没看清楚题目。。。1. 原来不是专门指的 ubuntu 而是 linux 。。。大同小异没差。。
    2. 原来是 gpt,不算 legacy bios 。。。这个就当我前面那堆 12345 是说废话。。嫌麻烦没用过 gpt 。。。
    wccc
        33
    wccc   86 天前 via iPhone
    timeshift 这个软件备份到一个硬盘然后再恢复到新的硬盘
    phpfpm
        34
    phpfpm   86 天前
    @xing2387 我决定我抽空数据 dump 一份之后直接重装吧

    23333
    zhve2x4
        35
    zhve2x4   86 天前
    @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
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4445 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 08:27 · PVG 16:27 · LAX 01:27 · JFK 04:27
    ♥ Do have faith in what you're doing.