开发机迁移踩坑全录(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 dialogportal 授权窗对快捷键拉起的进程永远拒绝 → 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):
    1. 新机 unit 文件注入 ConditionPathExists=/etc/newcar-cutover-approved(drop-in conf)
    2. 新机 enable 但不 start(systemctl 显示 condition failed 属预期)
    3. 切换日:老机 stop+disable 服务、清空 crontab(先 crontab -l > 备份)→ 新机 sudo touch /etc/newcar-cutover-approved → 逐个 start → 注册 crontab
  • 会写外部系统(飞书/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)

8. 搜狗输入法坑全集(本次最痛,按序执行)

  1. 版本锁定:只用存档 sogoupinyin_4.2.1.145_amd64.deb,新版与 Chrome 冲突(老坑)
  2. qt5.bak 勿还原:/opt/sogoupinyin/files/lib/qt5 改名 qt5.bak 强制用系统 Qt5,是解决 Chrome 冲突的关键;dpkg -V sogoupinyin 报 44 个 missing 是正常假象,重装 deb 恢复 qt5 会把冲突带回来
  3. 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
  4. 全应用打不出中文(24.04 新机最常见):GDM 默认 Wayland 会话,fcitx4/搜狗在 Wayland 原生应用全灭 → sudo sed -i 's/^#*WaylandEnable=.*/WaylandEnable=false/' /etc/gdm3/custom.conf → 重启/注销,会话变 x11 全恢复。首选根治
  5. Nautilus(新建文件夹对话框等)仍打不出中文:GTK4 应用只带 libim-ibus.so,没有 fcitx 模块、没有 xim——只能走 ibus 通道:
    sudo apt install ibus-libpinyin          # 给 ibus 一个中文引擎
    gsettings set org.gnome.desktop.input-sources sources "[('xkb','us'),('ibus','libpinyin')]"
    ibus engine libpinyin                     # 立即激活
    效果:GTK4 应用(Nautilus/gnome-text-editor/GNOME 搜索)由 ibus/libpinyin 供中文,其余应用照常走 fcitx/搜狗;Super+Space 切 ibus 引擎,Ctrl+Space 切 fcitx,互不冲突
  6. 只留 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)