ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

wx855双系统启动:GRUB2接管UEFI引导让Windows与Linux共存

wx855双系统启动:GRUB2接管UEFI引导让Windows与Linux共存 简介这套资源面向需要在Windows和Linux双平台启动wx855/微信849协议服务的开发者定位为微信协议接口联调与部署异常排查工具包。压缩包共40个文件整体约21.96MB核心包含main.exe可执行程序、Swagger接口文档页面html/js/json/map、Apipost测试集合、PDF使用测试手册、MySQL报错与登出错误等运行截图以及yml/yaml配置与README说明文件类型覆盖从启动到排错的完整链路。资源已有162人学习下载。通过其中的部署配置与截图指引使用者可以快速弄清wx855在Windows/Linux系统上的启动步骤借助Swagger与Apipost对接口发起调试遇到MySQL连接异常或登录失效时也能对照截图定位问题README和各类配置文件则进一步降低了协议服务落地时对环境差异的排错成本适合负责微信协议对接的后端或测试工程师。1. wx855 双系统启动先看清引导链再谈装系统接手一台 wx855 盒子原厂装好了 Windows系统里还有一套现场调试软件不能动但新项目要在这台设备上跑 docker、elasticsearch 这一套 Linux 生态的服务。于是“Windows 留着Linux 也要能启动”就成了一道绕不开的题。很多人把 Linux 拼成 liunx 也照样能找到教程说明这个需求确实普遍。装上双系统不难难的是让它在每次开机、每次系统更新之后都稳定地引导到你想去的系统——这背后其实是 UEFI 固件、ESP 分区、引导加载器三者之间的一连串约定。这篇就按我处理这类 x86 工控盒的流程来讲适合手头有类似设备、需要 Windows 和 Linux 共存的人。2. 选型与分区为什么双系统启动要让 grub2 做总入口2.1 从开机到内核x86 设备的三段启动链先把黑匣子打开。任何一台较新的 x86 设备wx855 如果出厂带 Windows基本可以确认是 UEFI 模式开机后是这样工作的主板固件读取 NVRAM 中保存的 BootOrder 列表按顺序去预定义的路径找可用的引导文件找到后把它加载进内存并执行。这个被执行的 .efi 文件就是“引导加载器”。Windows 的引导加载器是 \EFI\Microsoft\Boot\bootmgfw.efi它只做一件事去 Windows 系统分区里找 winload.efi然后把控制权交给内核。grub2 的引导文件是 \EFI\grub\grubx64.efi它比 Windows 的启动加载器多了一套完整的菜单逻辑既能直接引导 Linux 内核也能用 chainloader 方式把控制权转交给 bootmgfw.efi从而实现跨系统引导。理解了这条链双系统的问题就变成一个很具体的问题NVRAM 里第一个启动项是谁答案是 grubx64.efi 时开机先出 grub 菜单从菜单进 Windows 或 Linux答案是 bootmgfw.efi 时开机直接进 Windows想进 Linux 得手动按 F12 之类的快捷键去挑启动项。所以方案选型其实是在选“谁排在 NVRAM 的第一位”。这件事也和 Secure Boot 有关系如果固件开着 Secure Boot引导文件必须有合法签名才能被执行。Ubuntu 和 Debian 的 grubx64.efi 是带微软签名的能过但你自己手写的 EFI 程序过不了这点在配置时要注意别一上来就把 Secure Boot 关掉先试试默认状态能不能跑通。2.2 为什么不用 Windows Boot Manager 当总引导有一个看起来更省事的思路既然 wx855 原厂是 Windows开机先进 Windows Boot Manager然后从它的菜单里加一个 Linux 项行不行技术上能行但我一般不建议。原因是 Windows Boot Manager 是一个闭源且被系统更新绑定的组件。每当你给 Windows 打一个大版本更新它都可能重写自己的引导配置顺手把额外加的 Linux 项清掉。你花半小时配好的菜单一次更新就没了这种翻车我见过不止一次。另外它对待 Linux 的方式非常“黑匣子化”——看不到日志、没有交互式命令行做紧急修复出了问题只能进恢复环境。而 grub2 是开源的有 shell 模式、有 grub-mkconfig 和 grub-editenv 这一套维护工具坏了还能用 Live USB 进系统重装。rEFInd 也是不错的选择界面漂亮、自动扫描能力强但它的依赖链多一层而且对引导的“控制力”没有 grub2 直接。我的判断是对 wx855 这种长期在线、需要运维可介入的设备grub2 是默认选择。如果你只是临时玩一下双系统那用 Windows Boot Manager 也不是不行但别指望它在一次 Windows 大更新后还能好好活着。2.3 单盘还是双盘先想清楚再分区wx855 这类工控盒内部一般只有一块硬盘很多还带一个 mSATA 或 M.2 插槽。如果条件允许最省心的方案是两块物理磁盘分开一块装 Windows一块装 Linux各自独立引导互不干扰。比如你在 mSATA 上放 Windows在 SATA 或 M.2 上放 Linux平时用主板启动菜单选择从哪块盘引导就行完全不需要动引导加载器。但现实往往是只有一块盘这时候就要做单盘双分区而且必须用 GPT 分区表不能再用老掉牙的 MBR——MBR 最多只能建 4 个主分区还无法原生支持 UEFI 引导。单盘方案的要点是ESPEFI System Partition分区必须存在且共享给两个系统。Windows 会把 bootmgfw.efi 放进这个分区Linux 的 grubx64.efi 也会放进来大家共用一个小 FAT32 分区互不冲突。分区顺序上我习惯把 ESP 放在磁盘最前面Windows 系统分区次之Linux 的根分区再往后这样 Windows 安装器在检测磁盘布局时最不容易发疯。分区大小一般这样规划ESP 给 500MB 而不是默认的 100MB因为 Windows 更新有时会往 ESP 里塞恢复文件太小容易满Windows 分区按你现场软件的实际占用给 80GB 左右Linux 根分区给剩余空间的大头swap 我建议单独分 8GB虽然交换文件也能用但双系统场景下独立 swap 在休眠和内存溢出排查时都更好定位。3. 装出可引导的双系统分区规划与安装顺序3.1 分区方案给 wx855 的磁盘布局建议以下是我给 wx855 这类设备在单块 256GB512GB 硬盘上做的布局实际大小按你的硬盘和用途调整。先把分区表摆出来后面每一步都对照着来分区大小文件系统挂载点/用途/dev/sda1 ESP500MBFAT32共享 EFI 引导分区两个系统共用/dev/sda2 MSR16MB无Windows 保留分区安装器自动用/dev/sda380GBNTFSWindows 系统盘 C:/dev/sda4剩余-8GBext4Linux 根分区 //dev/sda58GBswapLinux 交换分区为什么 ESP 要单独强调很多 Windows-only 机器上 ESP 只有 100MBWindows 够用了但再塞一个 grubx64.efi 虽然也只占几 MB可后续系统更新时 Windows 会往 ESP 写恢复文件Linux 更新内核也会往里写空间一旦吃紧两边都可能引导失败。我一般直接给 500MB省得以后来收拾残局。Linux 根分区用 ext4 而不是 xfs 或 btrfs是因为 ext4 最中庸出问题时用 Live USB 挂载修复的工具链最成熟不会在应急时刻卡在文件系统特性上。3.2 先装 Windows用 diskpart 手动建分区顺序上永远是先 Windows 后 Linux这是 Windows 安装器的傲慢决定的——它不乐意检测已经存在的其他系统但 Linux 安装器会主动去找现成的 Windows 并把它加进引导菜单。反过来装十有八九要手动修 Windows 的引导项不值当。用 U 盘启动 Windows 安装器走到“选择安装位置”这一步先别急着新建分区。按 ShiftF10 调出命令提示符用 diskpart 手动清盘建分区diskpart select disk 0 clean convert gpt create partition efi size500 format quick fsfat32 labelESP create partition msr size16 create partition primary size81920 format quick fsntfs labelWindows create partition primary exit这段命令做的事情是把整盘转成 GPT建 ESP 并格式化成 FAT32建 16MB MSR 保留分区给 Windows 自己用再建一个 80GB 的主分区格式化成 NTFS 当 C 盘最后再留一段未格式化的主分区空间给 Linux。注意最后一条 create partition primary 后面我故意不写 format——diskpart 根本不认识 ext4你想在这里格式化 Linux 分区会直接报错。Linux 的文件系统留给 Linux 安装器去做别越俎代庖。分区建好后关掉命令提示符回到安装界面选择那个 80GB 的 NTFS 分区继续安装。此时磁盘上还有一段未分配空间Windows 安装器会无视它这是正常的别手贱去格式化。装完 Windows 后先正常进一次系统确认驱动和现场软件都正常再进入下一步。如果你打算让 Linux 访问 NTFS 分区里的数据我建议现在就把 Windows 的快速启动关掉命令行执行 powercfg /h off否则后面 Linux 侧挂载 NTFS 容易碰到脏数据问题第五章会展开讲。3.3 装 Linux引导加载器位置是决定性选项Windows 装好并验证后插入 Linux 安装 U 盘。这里有个关键前提U 盘必须以 UEFI 模式启动而不是传统的 BIOS 兼容模式。判断方法很简单看安装界面是否显示 UEFI 字样或者直接进主板启动菜单选带 UEFI 前缀的那个 U 盘选项。用 BIOS 模式装出来的 Linux 会写 MBR 引导和 GPT 上的 Windows 引导互相看不见开机只能二选一等于双系统白装。进入安装器后选择“手动分区”会看到之前留给 Linux 的未分配空间。在这里创建两个分区一个挂载到 /文件系统选 ext4一个作为 swap。如果你的磁盘空间足够大也可以把 /home 单独分出来这样以后 Linux 系统崩了重装用户数据还能留在原地。我一般建议给 /home 独立分区但 wx855 这类设备通常存储有限所以按需取舍。分区完成后安装器会问“引导加载器装到哪里”。这一步是双系统成败的核心必须选整块磁盘一般是 /dev/sda而不是某个分区比如 /dev/sda4。选分区以为能更精准实际会在这一步埋雷——grub 写进分区而不是 ESP固件根本不会去读它开机照样直接进 Windows。选整盘后 grub 会把 grubx64.efi 写进 ESP 并注册进 NVRAM同时自动检测到现有的 Windows Boot Manager在菜单里生成对应条目。如果你装的是 Ubuntu 23.04 以上版本可能会发现装完菜单里没有 Windows 项这是新版默认禁用 os-prober 导致的第四章讲怎么补。4. 让 grub 接管启动配置生成与手写菜单项4.1 开启 os-prober 并重新生成 grub.cfgLinux 装好后第一次重启理论上应该看到 grub 菜单。如果没有菜单而是直接进了 Windows先别急着重装多半是 NVRAM 里的启动顺序还排着 Windows 第一。进 BIOS 把 grub 启动项调到第一位即可。如果菜单出现了但只有 Linux 没有 Windows这是 Ubuntu 22.04 之后最常遇到的坑新版本出于安全考虑默认把 GRUB_DISABLE_OS_PROBER 设成了 true导致 update-grub 时不扫描其他磁盘上的系统。修起来不复杂编辑 /etc/default/grubsudo nano /etc/default/grub把这几行改成这样GRUB_DEFAULTsaved GRUB_TIMEOUT5 GRUB_SAVEDEFAULTtrue GRUB_DISABLE_OS_PROBERfalse解释一下参数含义。GRUB_DEFAULTsaved 表示记住你上次选择的启动项配合 GRUB_SAVEDEFAULTtrue 用这样你这次选 Windows 进了一次下次重启菜单还是默认 Windows如果你更希望永远默认进 Linux把 GRUB_DEFAULT 改成 0 就行。GRUB_TIMEOUT5 是菜单停留秒数默认 10 秒太长现场设备没人盯着屏幕我一般压到 35 秒。最后一行 GRUB_DISABLE_OS_PROBERfalse 是解决 Windows 项消失的关键把它从默认的 true 改过来然后执行sudo update-grub看到输出里出现 “Found Windows Boot Manager on /dev/sda1/EFI/Microsoft/Boot/bootmgfw.efi” 这样的行说明检测成功Windows 项已经被加进菜单。跑完 update-grub 后建议再执行一遍 grub-install把改动同步到 ESP 里sudo grub-install /dev/sda4.2 手写 Windows 菜单项os-prober 失灵时的后备方案os-prober 有时候会失灵特别是 Windows 的 EFI 引导文件不在默认路径或者盘上有多个 ESP 分区时。这时不用跟它死磕grub 允许你在 /etc/grub.d/40_custom 里手写菜单项。这是最原始也最可靠的方案基本不受系统更新影响。打开 40_customsudo nano /etc/grub.d/40_custom在末尾追加menuentry Windows Boot Manager (via chainloader) { search --fs-uuid --no-floppy --setroot 你的ESP分区UUID chainloader /EFI/Microsoft/Boot/bootmgfw.efi }这里面的 search 命令作用是根据文件系统 UUID 找到 ESP 分区并把它的设备设为 root。相比直接写 set root(hd0,gpt1)用 UUID 的好处是不会因为盘序变化而失效——wx855 这类设备经常插拔 U 盘和移动硬盘盘序一变hd0 就未必是系统盘了。替换“你的ESP分区UUID”时先查一下实际值sudo blkid /dev/sda1输出里 UUID 后面那一串就是。把 40_custom 里的占位换成真实 UUID再跑 sudo update-grub 即可。chainloader 的作用是把控制权整体转交给 bootmgfw.efi也就是说 Windows 会认为自己是被 UEFI 直接启动的不会启动到一半报错退出。4.3 设置默认启动项开机不用每次都守在菜单前设备上电后没人操作grub 菜单停在那里直到超时然后默认进上次选的系统。对于 wx855 这种往往放在机柜里的设备你不可能每次开机都去手动选。所以把默认项固定下来是有必要的。grub 提供一个专门工具管理默认项sudo grub-editenv list这个命令会打印当前 grub 环境变量其中 saved_entry 就是开机默认进的项目。查看当前菜单项编号可以用sudo grep menuentry /boot/grub/grub.cfg第一行 menuentry 是 0第二行是 1以此类推。想把默认项固定成 Windows执行sudo grub-set-default Windows Boot Manager (via chainloader)或者直接用菜单项编号sudo grub-set-default 1注意 grub-set-default 的字符串参数必须和 grub.cfg 里的 menuentry 引号内文字完全一致少个空格都会匹配失败。设置完再用 grub-editenv list 确认 saved_entry 已变化即可。4.4 更新 NVRAM 启动顺序让主板真正从 grub 启动配置文件都改好了但主板固件根本没把 grub 列为启动项或者排在 Windows 后面那一切都白搭。Linux 下用 efibootmgr 直接管理 NVRAM 里的 UEFI 引导条目比进 BIOS 手工点快得多也适合远程维护。先看当前状态efibootmgr -v输出里 BootCurrent 是本次启动实际用的条目BootOrder 是完整的启动顺序下面列出的 Boot0001、Boot0002 等就是各个引导项每个条目末尾会显示对应的 EFI 文件路径。找到形如 “grub” 或 “ubuntu” 的条目记下它的编号。如果根本找不到 grub 条目先执行 grub-install 把它注册进去sudo grub-install /dev/sda sudo efibootmgr -v确认 grub 条目存在后调整 BootOrder 让它排第一。假设 grub 是 Boot0001Windows Boot Manager 是 Boot0002执行sudo efibootmgr -o 0001,0002-o 参数后面的编号顺序就是新的 BootOrder一次写入立即生效不需要重启验证。如果以后你想临时从 Windows 引导一次还可以用 -B 参数创建一次性启动项避免改来改去把顺序弄乱。这里提醒一句efibootmgr 写的是 NVRAM不是文件改坏不会损坏系统数据但会造成暂时开不了机所以操作前先用 -v 看清楚当前顺序改完确认无误再重启。5. 双启动避坑指南wx855 上容易踩的五个坎5.1 插着 U 盘装系统grub 写进了 U 盘现象Linux 装完重启拔掉安装 U 盘开机直接进 grub rescue 或显示 no such partition插上 U 盘又能正常进 Linux。原因安装时 U 盘还插着安装器探测磁盘设备时把 /dev/sdbU 盘当成了引导设备grub 被装进 U 盘而不是硬盘。拔了 U 盘ESP 分区里根本没有 grubx64.efi。解决重新插上 U 盘进入 Live 环境chroot 进已装的 Linux 系统后执行 grub-install 指定硬盘。如果嫌 chroot 麻烦最直接的办法是重装但这次安装前拔掉 U 盘或者看清楚引导设备选择。血的教训我每次装这类设备都会在安装器分区界面打开终端执行 lsblk 确认哪块是硬盘哪块是 U 盘确认清楚再动手。5.2 Windows 快速启动导致 NTFS 挂载只读现象Linux 里挂载 Windows 的 C 盘mount 报错或提示磁盘有未完成的休眠操作强行挂载后只能读不能写。原因Windows 默认开启快速启动这个功能本质是深度休眠关机时内存数据写入休眠文件NTFS 分区处于“被占用”状态。Linux 的 ntfs3 驱动检测到异常标志位后拒绝挂载或降级为只读。解决进 Windows在管理员命令行执行powercfg /h off然后完全关机重启再进 LinuxNTFS 分区就能正常读写。这个操作同时还能省一块休眠文件占用的硬盘空间对 wx855 这类存储有限的设备是双赢。5.3 双系统时间相差 8 小时现象Windows 里看时间是晚上 8 点切到 Linux 变成中午 12 点两个系统交叉使用时间总不对。原因Windows 默认把主板 RTC 时钟当作本地时间Linux 默认当作 UTC 时间。两个系统用同一个硬件时钟各按各的解释去换算自然差了时区偏移。解决让 Linux 把 RTC 当本地时间解释sudo timedatectl set-local-rtc 1 --adjust-system-clock执行完两个系统的时间就一致了。这里注意不要为了省事去改 Windows 注册表Windows 更新有时会重置那个设置改 Linux 侧反而更稳定。5.4 Windows 大版本更新后 grub 菜单消失现象Windows 做了一次大版本功能更新重启后开机直接进 Windowsgrub 菜单消失Linux 也进不去了。原因Windows 更新会重建自己的引导配置并重写 NVRAM 的 BootOrder把 bootmgfw.efi 排到第一位。grub 文件本身没有被删只是启动顺序变了。解决用 Linux 安装 U 盘进 Live 环境chroot 进系统后重装 grub 并重设启动顺序。更省事的做法是先不进 Live直接在 grub 还活着的时候用 efibootmgr 把顺序调回来但 Windows 更新往往不给你这个机会。所以我一般会在双系统配好之后专门留一份安装 U 盘在旁边不费事但真需要时能救命。5.5 EFI 分区空间不足导致两边引导都失败现象某次 Linux 内核更新后 update-grub 报错说 EFI 分区无可用空间接着 Windows 也开不了机。原因ESP 分区只有 100MBWindows 更新往里面塞了恢复文件grub 再写新内核空间爆了。两个系统的引导文件都在这个小分区里一损俱损。解决压缩 Windows 分区腾出空间给 ESP 是不可行的GPT 分区调整很麻烦。最实际的补救是清理 ESP 里 Windows 残留的旧恢复文件或者用 gdisk 把 ESP 扩大。但最根本的预防是在装系统时就给 ESP 留 500MB一步到位后面根本没有这个烦恼。6. 让双启动更好用grub-reboot 一键切换与引导健康验证6.1 grub-reboot重启一次进 Windows下次自动回 Linux现场设备有时候需要在 Windows 里做调试但平时希望它跑 Linux。手动在 grub 菜单切换也行但人不在设备跟前时就没辙。grub 提供一个叫 grub-reboot 的命令可以只修改“下一次启动”的默认项重启进入指定系统后自动恢复原默认非常适合远程切换。sudo grub-reboot Windows Boot Manager (via chainloader) sudo systemctl reboot第一行的字符串要和在 grub.cfg 里的 menuentry 名称完全一致也可以用菜单项编号。执行后 grub 菜单里 Windows 项被临时标为默认重启直接进 Windows等下次再重启默认项自动回到之前的 Linux。我在现场维护 wx855 时经常用这个手法先在 Linux 侧跑一次 grub-reboot 切到 Windows重启后远程桌面处理问题处理完再通过 Windows 的远程重启指令回到 Linux全程不用人站在设备前面按键盘。6.2 双启动链路的三个健康检查双系统用久了尤其是经过几次系统更新引导链可能会悄悄发生变化。我每次做巡检或远程排障时都会先跑三个命令确认链路健康efibootmgr -v sudo grub-editenv list ls /boot/grub/grub.cfg /boot/efi/EFI/grub/grubx64.efiefibootmgr -v 看 NVRAM 里的 BootOrder 排序确认 grub 仍排第一Windows Boot Manager 仍在列表里grub-editenv list 看 saved_entry 指向的菜单项是否还存在最后一条命令检查核心文件是否都还挂在正确位置——grub.cfg 是 Linux 侧的配置文件grubx64.efi 是 ESP 里实际被固件加载的引导程序。三个都正常基本可以放心。如果哪一天发现开机直接进了 Windows不要慌按前三章的方法重新跑一遍 grub-install 和 efibootmgr -o 即可。这套双系统的配置方案前前后后在好几台 wx855 同类设备和普通 PC 上验证过核心逻辑始终是那句让 grub2 做总入口ESP 分区留够空间os-prober 保持开启NVRAM 顺序随时可控。早期我也偷懒用过 Windows Boot Manager 直接引导 Linux一次 Windows 功能更新就把配置清了那会儿蹲在机柜边折腾了一下午才恢复。后来老老实实换成 grub2 这一套就再也没因为切换系统翻过车。希望帮到你。本文还有配套的精品资源点击获取
返回列表