开发机迁移踩坑全录(2026-09,Ubuntu 22.04 → 24.04)
场景:老开发机(22.04)全量迁移到新台式机(ThinkCentre M760t, 24.04.4),含系统安装、1.1T 数据、AI 环境、自动化服务、外设。 双 AI 协作完成,本文沉淀所有踩过的坑与解药,换机/装机时按速查表直接拿。
⭐ 症状 → 解药 速查表
| 症状 | 解药 | 章节 |
|---|---|---|
| 两台电脑互 ping 不通(都在公司网) | 公司网终端隔离是设计如此;走小米路由器同段 or 网线直连 | §3 |
| 机器对机器要不要交叉网线? | 不要。千兆网卡 Auto-MDIX 强制标配,直通线随便插 | §3 |
| USB A-to-C 线连两台电脑传数据? | 物理上不可能(主从架构);除非雷电3/4/USB4 | §3 |
| 新机器没网,怎么传文件给它 | 旧机 dnsmasq 发 IP + python3 -m http.server 开下载 | §3 |
| apt 报”无法获得 dpkg 前端锁” | apt-get -o DPkg::Lock::Timeout=600 ...;元凶多为 unattended-upgrades | §4 |
| apt 安装卡死不动 | 看 /var/cache/apt/archives/partial 增长=0 + CLOSE-WAIT 连接 → kill + dpkg --configure -a | §4 |
| rsync 同步 .ssh 后 SSH 公钥失效 | 源机 authorized_keys 必须先含源机自己的公钥(否则被旧内容覆盖) | §4 |
| 迁完 Python 环境,venv/pip 包全废 | 大版本跳变(3.10→3.12)必须重装 pip 包 + 重建 venv,不能拷 | §5 |
| 双机服务/定时任务会双写飞书 | systemd ConditionPathExists=/etc/newcar-cutover-approved 切换协议 | §6 |
| 用户服务重启机器不自启 | sudo loginctl enable-linger <user> | §6 |
| 搜狗输入法装新版后 Chrome 异常 | 锁定 4.2.1.145 存档版,别追新 | §8 |
| 搜狗 service 反复重启/起不来 | apt install libqt5quickwidgets5 libgsettings-qt1;qt5 目录已改 qt5.bak 属正常勿还原 | §8 |
| 输入法图标闪、所有应用打不出中文 | Wayland 会话全灭 → /etc/gdm3/custom.conf 设 WaylandEnable=false 重启切 X11 | §8 |
| 唯独文件管理器(Nautilus)不能输中文 | GTK4 只有 ibus 模块 → apt install ibus-libpinyin + GNOME input-sources 登记 | §8 |
| 蓝牙耳机/键鼠要重新配对吗 | 同一块 USB 蓝牙适配器=同 MAC,/var/lib/bluetooth 整树 tar 搬走即无缝 | §7 |
| netadmin 搬到新机不工作 | 前提=目标机 sudo NOPASSWD;删掉旧 data/state.json 让它按新硬件重建 | §7 |
| Chrome 打开的标签页怎么搬 | 关 Chrome 后拷 ~/.config/google-chrome/Default/Sessions/ + 设 restore_on_startup=1 | §9 |
| pkill 杀 Chrome 把自己终端杀了 | pkill -f 会匹配自己命令行 → 用 pkill -f "chrom[e]" 括号法 | §4 |
| 自定义快捷键怎么按都没反应 | ①字母必须小写(大写=含Shift)②确认没锁屏 ③X11 下截图类工具别走 portal 走 grabWindow | §9 |
| 截图工具报 Only the focused app is allowed to show a system access dialog | portal 授权窗对快捷键拉起的进程永远拒绝 → X11 直接 QScreen.grabWindow 绕过 | §9 |
| herdr 复制到剪贴板粘贴为空 | 装机必装 xclip(X11 下唯一路径) | §9 |
1. 背景
- 老机:自组台式,Ubuntu 22.04,1.8T NVMe 用 85%,工作数据 ~1.1T(源码树/Android SDK/AI 环境/看板服务)
- 新机:联想 ThinkCentre M760t,Ubuntu 24.04.4,1.9T NVMe + 1.8T HDD
- 全程 3 天(09-18 装机 → 09-19 数据 → 09-20 切换+外设),双 AI 通过共享 MIGRATION-STATUS.md 分工
2. 装机阶段
- Ventoy 非交互刷盘:
Ventoy2Disk.sh -i要两次 y 确认;无人值守用printf 'y\ny\n' | sudo bash Ventoy2Disk.sh -I /dev/sdX - ISO 必须官方 SHA256 校验(清华镜像站有 SHA256SUMS);Ventoy 盘的数据区是普通 exFAT,ISO 和装机软件包可同盘携带
- 先问 IT 再装系统:公司机可能要求统一镜像+合规软件(eDLP/ESET/Corplink),否则入不了网
3. 网络互联(双机互传)
- 公司网终端隔离:两台机器不同网段,互 ping 不通(NAC/隔离 VLAN 设计),不要浪费时间排查本机防火墙;解法是两台挂同一个小米路由器(192.168.31.x)或网线直连
- 直连不需要交叉线:1000BASE-T 起 Auto-MDIX 是强制标准,普通直通线即可;配静态 IP(192.168.99.1/24 ↔ .2)或等链路本地 169.254
- USB 线不能连两台电脑:A 口永远主机口,台式机 C 口也只做主机;唯一例外是 Thunderbolt/USB4 直连组网(双机都要有)
- 无网新机喂文件:旧机
dnsmasq --dhcp-range=...发 IP +python3 -m http.server --bind <ip>开 HTTP,新机浏览器直接下载;还可ip_forward+MASQUERADE 把旧机网络 NAT 给新机 - ⚠️ 拓扑变化后立刻杀掉临时 dnsmasq——不然它会在公司网上当流氓 DHCP 干扰同事
- 排查顺序:链路灯/ip link → tcpdump 静默度(零包=直连但对面没协议栈;有公司 ARP=接到交换机了)→ DHCP → 静态 IP
4. 数据传输
- rsync 幂等可断点续传,中断重跑同参数即可;exFAT 盘不保留权限/软链接,git 仓库上盘前必须 tar
- pkill -f 自杀陷阱:
pkill -f "google-chrome"会匹配到执行该命令的 shell 自己(命令行里含同样字符串)→ 用括号法pkill -f "chrom[e]" - dpkg 锁:
DPkg::Lock::Timeout=600等待而非硬抢;双 AI/多会话环境必备 - apt 假死:CLOSE-WAIT + partial 目录 0 增长 = 下载连接挂死,kill 后
dpkg --configure -a修复重跑 - authorized_keys 覆盖坑:rsync 全量同步 ~/.ssh 会把目标机的 authorized_keys 覆盖回源机版本;源机 authorized_keys 先补上源机自己的公钥,同步后双向互认不断
- 大版本迁移 pip 包要记录清单:
pip3 list --user --format=freeze > 备份
5. Python 大版本跳变(3.10 → 3.12)
~/.local/lib/python3.10在 3.12 下全部失效:按清单pip3 install --user --break-system-packages重装(24.04 PEP668)- 项目 venv 内嵌解释器路径,必重建:老机
.venv/bin/pip freeze > req.txt→ 新机python3 -m venv .venv && pip install -r req.txt(清华源) - 24.04 建 venv 先
apt install python3.12-venv - venv 的 python 是指向系统解释器的软链(如
bin/python -> /usr/bin/python3.10):系统大版本换代后链接全断=“环境消失”假象。要保 frida 这类版本敏感依赖,用uv python install 3.10装独立旧解释器原样重建(uv venv .venv --python 3.10+ dist-info 目录名反推name==version清单安装),比重装系统/装 deadsnakes 都快;__editable__包(.pth 指向源码目录)在源码树已迁移的前提下uv pip install -e <源码路径>重挂即可 - 注意 dist-info 反推清单时是下划线名(oss_sdk),grep 排除要用
oss[-_]sdk两种写法都盖
6. 自动化服务/定时任务迁移
- 防双写切换协议(systemd guard):
- 新机 unit 文件注入
ConditionPathExists=/etc/newcar-cutover-approved(drop-in conf) - 新机
enable但不 start(systemctl 显示 condition failed 属预期) - 切换日:老机 stop+disable 服务、清空 crontab(先
crontab -l > 备份)→ 新机sudo touch /etc/newcar-cutover-approved→ 逐个 start → 注册 crontab
- 新机 unit 文件注入
- 会写外部系统(飞书/JIRA)的服务和 cron 都必须进此协议,包括周报 cron、分数机器人
- lingering:用户服务要无登录自启必须
sudo loginctl enable-linger zbc(老机默认 yes,新机默认 no) - 迁移前盘点:
crontab -l、systemctl --user list-unit-files --state=enabled、unit 的 ExecStart/WorkingDirectory 依赖路径、pip 包依赖(如 streamlit)
7. 外设迁移
- 蓝牙:USB 蓝牙适配器拔到新机=适配器 MAC 不变 →
sudo tar czf - -C /var/lib bluetooth | ssh 新机 'sudo tar xzf - -C /var/lib'→systemctl restart bluetooth,全部配对(耳机/键鼠)免重连 - USB 手机热点(netadmin):
- 前提:目标机 sudo NOPASSWD(netadmin 所有网络操作走
sudo -n) - 接口名(enxXXX)会变,但检测逻辑按 sysfs
/sys/class/net/*/usb自适应,无需改代码 - 删掉老机带过来的
netadmin/data/state.json(内含旧接口名)让它按新硬件重建 - 迁移后确认 8502
/api/overview里手机被识别为「USB 热点」角色、模式在安全默认(all_company)
- 前提:目标机 sudo NOPASSWD(netadmin 所有网络操作走
8. 搜狗输入法坑全集(本次最痛,按序执行)
- 版本锁定:只用存档
sogoupinyin_4.2.1.145_amd64.deb,新版与 Chrome 冲突(老坑) - qt5.bak 勿还原:
/opt/sogoupinyin/files/lib/qt5改名 qt5.bak 强制用系统 Qt5,是解决 Chrome 冲突的关键;dpkg -V sogoupinyin报 44 个 missing 是正常假象,重装 deb 恢复 qt5 会把冲突带回来 - service 起不来(图标闪/journal 刷
can't open sendmq ... SOGOUPINYIN-SOGOU-IME-IPC-MQ):ldd /opt/sogoupinyin/files/bin/sogoupinyin-service | grep "not found"→ 补apt install libqt5quickwidgets5 libgsettings-qt1 - 全应用打不出中文(24.04 新机最常见):GDM 默认 Wayland 会话,fcitx4/搜狗在 Wayland 原生应用全灭 →
sudo sed -i 's/^#*WaylandEnable=.*/WaylandEnable=false/' /etc/gdm3/custom.conf→ 重启/注销,会话变 x11 全恢复。首选根治 - Nautilus(新建文件夹对话框等)仍打不出中文:GTK4 应用只带
libim-ibus.so,没有 fcitx 模块、没有 xim——只能走 ibus 通道: 效果:GTK4 应用(Nautilus/gnome-text-editor/GNOME 搜索)由 ibus/libpinyin 供中文,其余应用照常走 fcitx/搜狗;Super+Space 切 ibus 引擎,Ctrl+Space 切 fcitx,互不冲突sudo apt install ibus-libpinyin # 给 ibus 一个中文引擎 gsettings set org.gnome.desktop.input-sources sources "[('xkb','us'),('ibus','libpinyin')]" ibus engine libpinyin # 立即激活 - 只留 Wayland 的单点补救(不推荐):给 Chrome 加
--ozone-platform=x11用户级 desktop 覆盖
9. 应用与杂项
- Avidemux 在 24.04:apt 已无候选(Debian/Ubuntu 仓库移除了),官方渠道=flatpak
org.avidemux.Avidemux(flathub 官方源https://dl.flathub.org/repo/flathub.flatpakrepo直连可用;tuna/sjtu 镜像路径已失效 404)。flatpak 应用关联默认打开方式可能一直不生效:desktop 文件在/var/lib/flatpak/exports/share/applications,该路径理论上登录时由/etc/profile.d/flatpak.sh注入 XDG_DATA_DIRS,但 systemd 用户会话起的 gnome-shell 不吃 profile.d(24.04 实测重启也不带)→ xdg-mime 找不到 desktop id 静默回退旧关联。根治=把 desktop 文件软链到永远生效的用户目录:ln -sf /var/lib/flatpak/exports/share/applications/<app>.desktop ~/.local/share/applications/+update-desktop-database,xdg-mime query立即解析成功,重登都不需要 - 桌面图标全不展示(DING 扩展静默失败):报错藏在 journalctl(
Gio.IOErrorEnum: 无法找到默认的本地文件监视器类型)。真凶=inotify 实例限额 128 被 IDE 全家桶吃光(strace 见inotify_init1 = EMFILE)→ DING 监视不了桌面目录就不画图标。修法:/etc/sysctl.d/99-inotify-dev.conf写fs.inotify.max_user_instances=1024+fs.inotify.max_user_watches=524288,sysctl -p后重启扩展即恢复。连带收益:IDE 的文件监听劣化也一并治好。排查口诀:GUI 静默失败 → journalctl —user -b grep 扩展名 → 报”监视器”就 strace 查 inotify - 桌面(DING)重命名/新建文件夹不能输中文:与 Nautilus 同根——DING 对话框是 GTK4,走 ibus 通道;§8 第 5 条的 ibus-libpinyin 装好后桌面自动好,不用单独修
- 视频播放器默认关联:
xdg-mime default <desktop> video/mp4 ...写入~/.config/mimeapps.list[Default Applications];排查顺序=用户 config → gnome-mimeapps.list → local/share → 系统 - MCP(npx 型)迁移后集体 CONNECTION_CLOSED:
.npm缓存属”有意不迁”项,但首次重下被打断会留残缺包(报Cannot find module ... ajv-provider.js)→rm -rf ~/.npm/_npx全部重下。大依赖包(如 gitnexus 的 @ladybugdb/core)首次下载要数分钟,别用短超时试跑(25 秒超时每次杀在半路,日志只有 exit 1 无报错,误判成坏包);HTTP 型 MCP 不受影响;飞书官方 HTTP MCP 的个人 URL 会过期(404),需去配置平台重新生成 - GNOME 自定义快捷键字母必须小写:
<Ctrl><Alt>A大写 = 实际要求按 Ctrl+Alt+Shift+A,永远等不到用户按下 - 锁屏状态快捷键不触发/界面不可见:GNOME 自动息屏锁屏后自定义 binding 无效——排障前先确认机器没锁屏(
grabWindow抓回一张看看最直观) - xdg-desktop-portal 截图在 X11+快捷键场景的死亡组合:portal 授权窗要求调用方是”焦点应用”,而快捷键(gsd-media-keys)拉起的进程永非焦点 →
AccessDenied: Only the focused app is allowed to show a system access dialog→ 超时静默死。X11 下截图根本不该走 portal——直接QScreen.grabWindow(0)(X11 无访问控制概念),免授权零延迟;portal 路径只在 Wayland 需要。排障技巧:portal_shot 直跑成功但 App 内失败时,注意 QProcess SeparateChannels 会吞掉子进程 stderr,调试日志要写文件 - GNOME 快捷键模拟调试:xdotool
key ctrl+alt+a的 XTEST 合成事件 gsd-media-keys 不响应,必须物理按键验证 - Chrome 标签页迁移:两边都关 Chrome → 拷
~/.config/google-chrome/Default/Sessions/→ 新机 Preferences 设session.restore_on_startup=1;密码/Cookie 不在此列(那是全量 profile 或 Chrome 同步的事) - xclip 必装:X11 下 herdr/脚本写系统剪贴板的唯一路径,漏装表现为”提示已复制但粘贴为空”
- 小米人/小米办公 Pro:本地无包,用 nac 门户
wget -q -O- https://nac.mioffice.cn/download/install_u.sh | sudo bash;包名直链模式https://nac.mioffice.cn/download/linux/<包名>.deb - local deb 包批量装:
sudo apt install ./*.deb,注意已装更新版会报”降级需 —allow-downgrades”——跳过旧包即可 - pip 179 包/IDE/SDK 这类大目录:直接 rsync 整树,注意 .cache/.npm 这类纯缓存可排除
10. 双 AI 协作经验(可选参考)
- 共享一份 MIGRATION-STATUS.md(两机同步):分工领地、进度、坑、切换协议全在里面
- 规则:apt 加锁等待;rsync 幂等可接手;不覆盖对方已同步目录(尤其 authorized_keys);进度写回文件
- 效果:1089G 数据多流并行通宵跑完零失败,中途互相救援一次(卡死的 apt)、互相去重一次(重复 rsync)