克隆硬盘换电脑后修复 Linux 引导与驱动 — 完整笔记
适用场景:把原电脑的 Linux 系统盘整盘克隆(dd / Clonezilla / rsync)到新电脑后,新机器无法启动或启动后没网络/没驱动。 本文基于联网检索的社区与官方修复路径整理,覆盖 Debian/Ubuntu 系与 RHEL/CentOS/Fedora 系。
0. 先懂原理:为什么换电脑会“开不了机”
Linux 启动是分层的,任何一层和硬件对不上都会断:
BIOS/UEFI 固件层 └─ 引导加载器层 (GRUB / systemd-boot) └─ initramfs 临时根文件系统层 (加载硬件驱动) └─ 根文件系统挂载层 (/etc/fstab 按 UUID 找根分区) └─ 用户空间初始化层 (udev、网卡命名、显示驱动)
换电脑后最常见的四类断层:
| | |
|---|
| No Bootable Device | 新旧机器 UEFI/Legacy 模式不一致;启动项没注册 |
| grub rescue> | GRUB 没装到新盘;grub.cfg 里设备名/UUID 旧了 |
| dracut-initqueue timeout | |
| Failed to mount root | /etc/fstab |
| | udev 固化了旧 MAC;DKMS 模块没随新内核重建 |
铁律:自底向上验证,先确认固件层再动引导层,不要没查清前一层就乱改后一层。
1. 克隆方式怎么选(决定后续工作量)
| | | |
|---|
dd | | 新盘容量不同/分区表格式不同(MBR→GPT)会破坏引导;UUID 完全一样导致冲突 | |
| Clonezilla | | | |
| rsync 文件级 | 不复制 /dev /proc /sys,UUID 可自定义,跨硬件兼容性最好 | | |
rsync 克隆骨架(在 Live 环境下):
# 新盘已分好区并挂载到 /mnt/new,且有独立 ESP(/mnt/new/boot/efi)sudo rsync -aAXv --exclude=/dev/* --exclude=/proc/* --exclude=/sys/* \ --exclude=/tmp/* --exclude=/run/* / /mnt/new/
2. 进救援环境(所有修复的前提)
准备一个 Ubuntu Live USB(或对应发行版安装盘),从它启动,选 “Try Ubuntu” / “Troubleshooting → Rescue”。
开终端,先认盘:
lsblk -f # 看所有盘、分区、文件系统类型、UUIDsudo fdisk -l # 看分区表是 GPT 还是 MBR、起始扇区sudo blkid # 看每个分区的真实 UUID(后面要和 fstab 比对)
确认新机器的启动模式,进 BIOS 看:
- 原机是 Legacy/MBR → 新机 BIOS 里 关闭 UEFI、开 CSM;
- 原机是 UEFI/GPT → 新机开 UEFI,且确认有 ESP(EFI System Partition,通常 fat32,几百 MB) 并被克隆过来。
⚠️ 模式不匹配(源 Legacy 目标 UEFI,或反之)是导致“黑屏直接跳过”的头号原因。
3. 通用修复:chroot 进原系统一次性修好
这是最稳的一条路,能同时修 GRUB、initramfs、fstab。
# 假设根分区是 /dev/nvme0n1p2(或 /dev/sda2),ESP 是 p1sudo mount /dev/nvme0n1p2 /mntsudo mount /dev/nvme0n1p1 /mnt/boot/efi # UEFI 必做;Legacy 可省# 绑定内核启动必需的运行环境for i in /dev /dev/pts /proc /sys /run; do sudo mount -B
idonesudo chroot /mnt
进入 chroot 后,按下面顺序执行:
3.1 修正 /etc/fstab 的 UUID(最常被忽略)
blkid # 在 chroot 里再确认一次真实 UUIDnano /etc/fstab # 把根分区、/boot、swap 的 UUID 改成 blkid 显示的真实值# 非必需的数据盘挂载行,加 nofail,x-systemd.device-timeout=10s,避免一次挂不上就卡 emergencyfindmnt --verify --verbose # 安全校验 fstab,不报错再继续
3.2 重建 initramfs(把新硬件驱动打进去)
# Debian / Ubuntu:update-initramfs -u -k all# 若换的是 NVMe/RAID 等剧烈硬件,可显式加模块:# echo -e "nvme\nnvme_core\next4" >> /etc/initramfs-tools/modules# update-initramfs -u -k all# RHEL / CentOS / Fedora:dracut --regenerate-all --force# 或只针对当前内核:dracut -f /boot/initramfs-$(uname -r).img $(uname -r)# 需要手动塞驱动:dracut --add-drivers "nvme xhci_pci mpt3sas" -f
💡 initramfs 是内核启动初期用的临时根文件系统,包含存储控制器/网卡等驱动。硬件变了必须重建,否则卡在 dracut-initqueue timeout。
3.3 重装 GRUB 并更新配置
# Debian / Ubuntu:update-grub # 重新生成 /boot/grub/grub.cfggrub-install /dev/nvme0n1 # 注意是"整块盘"不是分区!# RHEL / CentOS:grub2-mkconfig -o /boot/grub2/grub.cfggrub2-install /dev/nvme0n1# 注册 UEFI 启动项(UEFI 机器):efibootmgr -c -d /dev/nvme0n1 -p 1 -L "Linux" -l '\EFI\ubuntu\grubx64.efi'
3.4 清掉固化旧硬件的 udev 规则(修网卡名异常)
rm -f /etc/udev/rules.d/70-persistent-net.rules # 旧网卡 MAC 绑定,删了让新网卡重新命名
退出并重启:
exitsudo umount -R /mntsudo reboot
4. 引导层专项:进不了 GRUB 时的手动救法
4.1 GRUB Rescue 提示符下先临时启动
set root=(hd0,gpt2) # gpt 盘用 gptX;msdos 盘用 (hd0,2)linux /boot/vmlinuz-$(版本) root=/dev/nvme0n1p2initrd /boot/initrd.img-$(版本)boot
进去系统后再 update-grub && grub-install /dev/nvme0n1 固化。
4.2 实在搞不定用 Boot-Repair(Ubuntu 图形化)
sudo add-apt-repository ppa:yannubuntu/boot-repairsudo apt update && sudo apt install -y boot-repairboot-repair # 点 "Recommended repair"
适合 GPT + UEFI 双引导场景,一键重建。
5. 联网与网卡驱动修复(启动后没网络)
启动进系统后发现 ip addr 只有 lo,或网卡名怪异(还是旧机的 eth0):
lspci -k | grep -iA3 ethernet # 看网卡型号和"Kernel driver in use"ip link # 看当前网卡名
通用修法(驱动已在内核里,只是没加载):
sudo modprobe <驱动模块名> # 如 igb / e1000e / r8169 / iwlwifi# 写入开机自动加载echo "<驱动模块名>" | sudo tee -a /etc/modules-load.d/network.conf
initramfs 没带网卡驱动导致启动阶段就连不上(少见但存在):
# Debian/Ubuntu:把模块写进 initramfs 配置后重建echo "<模块名>" | sudo tee -a /etc/initramfs-tools/modulessudo update-initramfs -u# RHEL/CentOS:sudo dracut --add-drivers "<模块名>" -f
网卡命名恢复成可预测名称(enpXsY):
- 删
/etc/udev/rules.d/70-persistent-net.rules(见 3.4); - Netplan(Ubuntu 18.04+)配置用
match + set-name,或干脆用 networkd 默认策略。
闭源/厂商驱动(如 NVIDIA、特定无线网卡):
- NVIDIA 驱动在内核升级后常
NVIDIA-SMI has failed:用 DKMS 重建模块 sudo dkms autoinstall # 或 sudo apt install --reinstall nvidia-dkms-<版本>
- 实在不行进旧内核(GRUB → Advanced → 选旧内核)先能开机再修。
6. 一步到位的标准操作流程(建议照此执行)
- 克隆前(原机): 清理持久化硬件标识(
rm /etc/udev/rules.d/70-persistent-net.rules);记录原 blkid 和启动模式。 - 克隆: 优先 rsync 文件级,或 Clonezilla(勾
-j1 单独处理 boot 分区)。 - 新机进 Live USB:
lsblk -f / blkid 确认分区与 UUID;确认 BIOS 启动模式与源机一致。 - chroot 修复三部曲: 改 fstab UUID →
update-initramfs -u -k all 或 dracut --regenerate-all --force → update-grub + grub-install。 - 清 udev 旧网卡规则,UEFI 用
efibootmgr - 重启验证: 能进系统后
ip addr 看网络、lsmod 看驱动、journalctl -xb 看有无报错。 - Secure Boot 注意: 若开了 Secure Boot,新 initramfs/驱动需经 shim 签名,否则被拒。临时关 Secure Boot,或用
mokutil --import 注册密钥。
7. 排障速查表
| | |
|---|
No Bootable Device | | 进 BIOS 看 UEFI/Legacy;efibootmgr -v |
grub rescue> | | |
error: no such device | | |
Failed to mount root | | blkid |
dracut-initqueue timeout | | dracut -f |
| | lspci -k |
| | dkms autoinstall |
| | fsck -y /dev/... |
8. 预防 SOP(下次换机少踩坑)
- 每次动分区后立刻:
sudo blkid && sudo nano /etc/fstab && sudo update-initramfs -u。 - NVMe/RAID/LUKS 系统,在
/etc/initramfs-tools/modules(Debian)或 dracut 配置里显式列驱动。 - 非必需数据盘挂载一律加
nofail,x-systemd.device-timeout=10s。 - fstab 一律用
UUID= 而非 /dev/sdX(设备名会因盘序变化而变)。 - 换机前清
/etc/udev/rules.d/70-persistent-net.rules,避免网卡名绑定旧 MAC。 - 保留一个 Live USB + 串口/键盘控制台访问,无头服务器尤为重要。
9. 命令速查(Debian/Ubuntu vs RHEL/CentOS)
| | |
|---|
| update-initramfs -u -k all | dracut --regenerate-all --force |
| update-grub | grub2-mkconfig -o /boot/grub2/grub.cfg |
| grub-install /dev/sdX | grub2-install /dev/sdX |
| lsmod | lsmod |
| modprobe <mod> | modprobe <mod> |
| efibootmgr -c ... | efibootmgr -c ... |
| findmnt --verify | findmnt --verify |
10. Secure Boot 签名问题与解决(详细)
换机后重建 initramfs、重装 GRUB、重编译 NVIDIA 等第三方模块,这些新产物通常没有经过签名。若新机开着 Secure Boot,固件会直接拒绝加载,表现成“能进 GRUB 但起不来”或“系统能进但驱动失效”。本节展开讲清成因和三种解法。
10.1 为什么会卡在签名
Secure Boot 要求引导链上每个组件都被受信任密钥签名:
固件(DB 密钥) → shim(微软/MOK 密钥) → GRUB → 内核 → initramfs → 第三方内核模块(.ko)
换机修复时我们生成的 initramfs、重装的 GRUB、重编的 NVIDIA 模块,默认没有签名,于是被固件拦截。
10.2 典型症状
- 重启后黑屏/卡住,提示
error: bad shim signature 或 Verification failed: (0x1A) Security Violation - 能进 GRUB 但选内核后报
Signed kernel image not found 或直接跳回 - 系统能启动,但
NVIDIA-SMI has failed,dmesg 里出现 module verification failed: signature and/or required key missing - mokutil --sb-state 显示
SecureBoot enabled
10.3 解决方法(从易到难)
方案 A:临时关闭 Secure Boot(最快,适合测试/内网机器) 进 BIOS → Security/Boot → 把 Secure Boot 设成 Disabled,重启即可加载未签名组件。 缺点:失去 Secure Boot 保护,公网暴露机器不推荐。
方案 B:用发行版自带签名组件(推荐正规做法) Debian/Ubuntu 装好签名包,让 GRUB/内核走发行商签名版(固件默认信任 Canonical/Microsoft 密钥):
sudo apt install -y grub-efi-amd64-signed linux-signed-generic shim-signedsudo update-grubsudo grub-install --uefi-secure-boot /dev/nvme0n1
方案 C:给自编译 / 第三方模块签名(MOK 机制) 适用于 NVIDIA DKMS、VirtualBox、自编译驱动。
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der \ -nodes -days 36500 -subj "/CN=MySecureBootKey/"
- 把公钥注册进 MOK(会要求设一个临时密码,重启要用):
sudo mokutil --import MOK.der
- 重启,shim 弹出蓝色 MOK 管理界面 → 选
Enroll MOK → 输入刚设的密码 → 确认 enrolled。 - 给模块签名(内核自带
sign-file 工具):
KVER=$(uname -r)sudo /usr/src/linux-headers-$KVER/scripts/sign-file sha256 \ MOK.priv MOK.der /lib/modules/$KVER/updates/dkms/nvidia.ko
- 让 DKMS 自动签名(避免每次内核升级重签):编辑
/etc/dkms/framework.conf,设置:
sign_file="/usr/src/linux-headers-$(uname -r)/scripts/sign-file"sign_cert="MOK.der"sign_key="MOK.priv"
或在 /etc/kernel/postinst.d/ 放签名钩子脚本。
10.4 验证
mokutil --sb-state # 确认 Secure Boot 开/关状态mokutil --test-key MOK.der # 确认公钥已 enrolledmodinfo nvidia | grep -i sig # 看模块是否带签名段sudo dmesg | grep -iE "secure|signature|verif" # 排查签名相关报错
11. 参考链接(本文整理依据)
- Clonezilla 克隆 Linux 后无法启动的常见原因(CSDN)— https://ask.csdn.net/questions/9340664
- Clonezilla clone won’t boot without reinstalling grub2(Unix & Linux StackExchange)— https://unix.stackexchange.com/a/373403
- 硬件迁移后的系统引导与内核恢复:从 Bootloader 到 Rootfs 的底层逻辑分析(tsight.io)— https://tsight.io/articles/15443981?lang=zh
- Ubuntu 系统折腾记录:克隆系统 UUID 与 fstab/GRUB 修复(CSDN)— https://blog.csdn.net/hxsln11/article/details/148668972
- Linux 系统备份迁移到新硬盘后无法启动的原因(kd.cloud)— https://cloud.kd.cn/ask/22400.html
- Linux 驱动加载失败?dracut 重建 initramfs 全攻略(codechina)— https://codechina.net/article/weixin_31766003/84980
- CentOS 虚拟机迁移或更换硬件后无法启动重载驱动(clouditidc)— https://www.clouditidc.com?p=1795/
- 如何利用 Dracut 重建 initramfs 解决驱动加载故障(php.cn)— https://www.php.cn/faq/2305043.html
- 如何轻松克隆 Linux 系统到新主机(CSDN)— https://ask.csdn.net/questions/9130727
- CentOS 驱动程序如何恢复(yisu.com)— https://www.yisu.com/ask/89133352.html
- /etc/fstab 配置错误导致系统无法启动如何排查(CSDN)— https://ask.csdn.net/questions/8911777
- 克隆机出现 give root password for maintenance 的处理(CSDN 文库)— https://wenku.csdn.net/answer/2rkiwvpc32
- Linux Error Guide: ‘You are in emergency mode’ — Repair a bad fstab(devopsaitoolkit)— https://devopsaitoolkit.com/blog/linux-error-boot-emergency-mode-fstab
- Ubuntu 开机卡在 initramfs 提示如何修复根文件系统(CSDN)— https://ask.csdn.net/questions/9303957
- Dracut emergency shell from wrong fstab UUID(progressiverobot)— https://www.progressiverobot.com/2026/05/21/dracut-emergency-shell-from-wrong-fstab-uuid
整理日期:2026-08-03 · 基于 Clonezilla/GRUB/dracut/initramfs 社区与官方排障文档归纳。
📌 > 如果觉得有用,欢迎点赞、在看、转发三连!