十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

x86工控板卡Windows与Linux双系统启动配置实战指南

x86工控板卡Windows与Linux双系统启动配置实战指南 简介这是一份面向服务端开发与接口调试人员的 wx855微信 iPad 协议部署资源包支持 Windows 与 Linux 双平台启动主要解决协议服务在本地环境搭建与运行问题。包内共 40 个文件约 21.96MB涵盖 windows 可执行程序 main.exe、Swagger 接口文档相关 js/html/css/json 文件、Apipost 接口测试集合v7/v8、使用手册 PDF 以及部署配置 yml/yaml 与说明 md便于用户直接启动服务并按需查看接口定义与调用示例。目前已有 161 人学习下载。资源特别包含 login/logout、错误码等场景截图并配有模板文件与静态资源整体目录结构清晰可帮助开发者快速完成环境准备、接口联调与异常排查适合有一定后端基础、需要接入微信 iPad 协议能力的研发人员。 最近在调一块WX855的板卡要求在上面同时跑Windows和Linux。本来以为这就是装两个系统然后搞个引导菜单的事结果真正开始动手才发现从分区规划到UEFI引导再到两边系统互相不认对方的启动项坑比想象中多得多。这块板子采用的是x86架构SoC方案本身支持标准UEFI启动所以Windows和Linux理论上可以共存。这篇文章就拿WX855当样板把双系统启动从分区方案到GRUB引导配置再到排查思路完整理一遍给后面要在嵌入式/工控平台上做WindowsLinux双系统的朋友做个参考。1. 项目整体思路与启动方案选型1.1 WX855平台的双系统需求WX855这类x86 SoC板卡在工控、边缘计算、医疗设备里很常见。它一般配好了串口、网口、USB、显示接口性能也足够跑完整的桌面系统。之所以要Windows和Linux双系统最典型的场景是Windows负责跑厂商提供的上位机软件、PLC编程工具或者某些只有Windows版驱动的工业相机SDK而Linux则用来跑ROS、Python算法、Docker容器或者实时控制程序。两块系统各有不可替代的软件生态一块板卡上要兼顾那就只能两个都装。这种情况下最忌讳的就是拍脑袋把Windows和Linux各装一个分区就完事。启动引导谁说了算、分区怎么划、两个系统的时钟会不会互相干扰、UEFI安全启动要不要关这些问题如果没提前想清楚后面大概率要花成倍的时间返工。我这次在WX855上做双系统的过程中最重要的一个体会就是启动方案必须先定系统安装顺序也必须先定分区更不能乱来。1.2 为什么选择GRUB作为主引导程序Windows有自己的Windows Boot ManagerLinux这边常见的是GRUB2。双系统下到底让谁来当主引导我的结论是让GRUB来管Windows Boot Manager作为二级引导。原因有几个GRUB2原生支持多系统菜单能识别并链式加载Windows的bootmgfw.efi但Windows Boot Manager引导Linux要麻烦得多要么手动加条目要么借助工具对普通用户不友好。GRUB2的菜单可定制性强可以设置默认启动项、超时时间、内核参数甚至做启动画面的定制在工控设备上还能隐藏菜单或做一键恢复。WX855这类板卡用的是UEFI固件GRUB2对UEFI的支持已经很成熟完全可以通过UEFI引导流程加载不需要依赖传统的MBR方式。也就是说最终的启动链路是UEFI固件 - GRUB2 - Linux内核 或 GRUB2 - Windows Boot Manager - Windows。这个方案最稳定也最方便后期维护。2. 双系统启动的准备工作2.1 UEFI固件设置与安全启动拿到WX855之后第一步不是装系统而是进BIOS/UEFI设置界面确认几个关键项。首先是启动模式WX855这类新平台默认就是UEFI模式如果遇到老设备有Legacy/CSM模式建议务必选UEFI。因为Windows 10/11和主流Linux发行版对UEFI的原生支持都更好GPT分区表配合UEFI也远比MBRLegacy可靠。其次是Secure Boot。如果Linux发行版用的是Ubuntu、Debian这类主流发行版官方内核是带微软签名的理论上Secure Boot也能过。但是WX855这种嵌入式板卡上我们经常要自己编译驱动、加载第三方内核模块Secure Boot很容易变成拦路虎一旦内核签名不对就直接启动不了。我的Windows和Linux双系统都关闭了Secure Boot。工控设备如果对安全等级要求高可以后续用MOKMachine Owner Key的方式给自定义内核做签名但前期的双系统规划阶段先关掉能少很多麻烦。还有一个容易忽略的点是启动顺序。如果目标是让GRUB作为主引导那安装完所有系统后要把GRUB所在的EFI分区对应的启动项调整到第一位。不过很多板卡的UEFI固件支持在开机时按F11或F12弹出启动设备菜单即使启动顺序乱乱了也能临时切这个后面排障时特别好用。2.2 GPT分区方案设计WX855通常配备一块SSD或eMMC存储容量从64GB到512GB不等。在UEFI模式下分区表必须用GPT别用MBR。我采用的典型分区布局如下分区文件系统大小建议用途/dev/sda1FAT32ESP512MBEFI System Partition存放GRUB和Windows Boot Manager/dev/sda2NTFS视需求比如80GBWindows系统盘C盘/dev/sda3ext4剩余空间Linux根分区//dev/sda4swap8GB~16GBLinux交换分区可选这里特别提醒EFI分区一定不要只给Windows默认的100MB。GRUB2和Windows Boot Manager都要往里面写文件再加上将来可能要放一些UEFI启动工具空间很容易紧张。512MB是一个比较宽裕的选择完全不影响启动速度。2.3 系统安装顺序的讲究双系统的安装顺序几乎可以说是一条铁律先装Windows再装Linux。原因是Windows的安装程序在检测到硬盘上已有其他系统时会直接覆盖UEFI的启动项把Windows Boot Manager设成第一优先级而且不会去添加Linux的引导入口。反过来绝大多数Linux发行版在安装到“安装引导程序”这一步时GRUB2会通过os-prober自动检测到已经存在的Windows并主动添加Windows的启动菜单项。所以先Win后Lin就能省去很多手工配置环节。反过来装的话Windows安装完成之后Linux的引导项就被顶掉了还得手动修GRUB平白给自己增加工作量。我当时就是先给WX855装Windows 10 LTSC注意工控设备尽量选LTSC版本稳定且没有乱七八糟的商店应用。Windows装好并更新驱动、确认板卡的串口、网口、显示都正常后再拿Ubuntu的U盘启动选择“与Windows共存”的方式安装程序会自动检测到Windows并处理好GRUB菜单。后面我只需要再手动微调菜单把Windows的显示名和默认启动项改得更顺手就行。3. 核心实现GRUB2引导双系统详细步骤3.1 安装Linux并让GRUB接管引导Linux发行版我在这块WX855上选的是Ubuntu 22.04 LTS原因无他工控场景下的第三方驱动、ROS版本、内核工具链在Ubuntu上的支持最全遇到问题查资料也最方便。安装到“安装引导程序”步骤时安装器会询问把GRUB写到哪块磁盘这里需要注意要选到整个硬盘/dev/sda而不是某个分区因为UEFI模式下GRUB的grubx64.efi文件会写入EFI分区而不是写到某个分区的引导扇区。安装完成后重启应该能看到GRUB菜单里面有Ubuntu的启动项和自动探测到的Windows Boot Manager选项。如果看不到Windows大概率是安装时系统里没有装os-prober或者因为Windows是后来才装的不按正常顺序就会出现这种情况。解决办法是在Ubuntu里执行sudo apt update sudo apt install os-prober sudo os-prober sudo update-grub执行os-prober时会扫描其他磁盘上的操作系统如果识别到Windows会在/boot/grub/grub.cfg中生成对应的菜单项。这一步很关键很多朋友双系统装完Linux后发现GRUB菜单里没有Windows原因就是没装os-prober或者没执行update-grub。3.2 手动定制GRUB菜单和默认启动项update-grub自动生成的菜单基本能用但默认启动项往往是第一个Linux内核启动超时常为10秒。做嵌入式和工控设备的人都知道设备放在现场如果断电重启后需要人工守在屏幕前去选Windows还是Linux体验是很糟的。所以我一般会手动改一下/etc/default/grub把默认启动项、超时时间、甚至是否显示菜单都控制好。先查看当前GRUB菜单项的顺序grep menuentry /boot/grub/grub.cfg假设输出中Windows的菜单项标题是类似Windows Boot Manager (on /dev/sda1)我可以通过GRUB_DEFAULT直接指定要启动的菜单项名称或者用菜单项序号从0开始数。比如想让Windows作为默认启动项可以这么写sudo vim /etc/default/grub把GRUB_DEFAULT0改成GRUB_DEFAULTWindows Boot Manager (on /dev/sda1)注意必须加引号。然后执行sudo update-grub如果想在设备上电后快速进入默认系统不等待手动选择可以把GRUB_TIMEOUT从10改小比如2秒甚至改成0。但改成0之前一定要确认默认启动项是可靠的不然设备进入错误系统后没有补救机会。我实际生产上的做法是把默认启动项设为最常用的系统GRUB_TIMEOUT3给现场维护人员一点选择的空间。另外还有个实用技巧GRUB菜单项在/etc/grub.d/目录下有很多脚本控制但日常使用不建议去改这些脚本容易在升级内核时出问题。常规操作就是改/etc/default/grub然后update-grub别硬碰脚本。3.3 解决Windows和Linux时间相差8小时的问题双系统启动还有一个几乎必踩的坑在Linux下重启进入Windows后系统时间总是快8小时或者慢8小时。这个问题的根源在于两个系统对硬件时钟RTC的解读方式不一样。Linux默认把硬件时间当成UTC时间然后根据时区设置换算显示本地时间Windows则默认把硬件时间直接当成本地时间。中国处于UTC8时区所以两个系统切换后Windows显示的时间就会差8小时。解决方式二选一。我推荐改Linux让Linux也把硬件时间当作本地时间处理这样Windows不用动。在Ubuntu里执行sudo timedatectl set-local-rtc 1执行完用timedatectl查看应该能看到RTC in local TZ: yes。这个方法比改Windows注册表安全因为Windows的时区和时间服务有时候会被同步工具改回去。如果你更想改Windows也可以新建注册表项HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation添加一个DWORD值RealTimeIsUniversal设为1让Windows也把硬件时间当UTC。但我实测下来Windows在更新或休眠唤醒后偶尔会把这项重置不如改Linux来得稳。WX855这类设备大多数时候是Linux为主、Windows为辅把Linux的时间模型设置成与Windows一致整体切换更省心。3.4 UEFI启动项的管理与优先级调整GRUB接手引导后UEFI固件里的启动项通常有两个一个指向ubuntuGRUB一个指向Windows Boot Manager。为了让GRUB在开机时直接出现需要保证GRUB启动项排在第一位。可以在BIOS启动菜单里调整也可以在Linux下用efibootmgr工具操作。查看当前UEFI启动项sudo efibootmgr输出里会有一行显示BootOrder比如BootOrder: 0000, 0001然后下面列出各个启动项对应的名称和所在设备。把GRUB对应的BootXXXX放到第一位的命令是sudo efibootmgr -o 0000,0001要特别注意这里的编号要和efibootmgr输出里的实际编号一致直接复制内容来改最稳妥。如果操作后把启动顺序改乱了一般也可以用BIOS的“Boot Override”功能临时选择指定启动项不至于完全开不了机。4. 启动过程中的常见问题和排查技巧4.1 双系统启动问题速查表我在WX855上折腾启动的这几天遇到的最常见的故障大概有下面这几种整理成表方便后续对照。故障现象可能原因处理方式开机直接进Windows不出现GRUB菜单UEFI启动项中Windows Boot Manager优先级高于GRUB进BIOS或用efibootmgr将GRUB启动项设为第一优先级GRUB菜单里没有Windows选项缺少os-prober或Windows引导文件损坏安装os-prober并执行update-grub若无效检查EFI分区内是否存在/EFI/Microsoft/Boot/bootmgfw.efi进入GRUB后选择Windows屏幕闪一下又跳回GRUBWindows Boot Manager文件损坏或EFI启动项指向错误用Windows安装U盘进入修复模式运行bootrec /fixmbr、bootrec /rebuildbcd或用bcdboot重建EFI引导文件Linux启动后卡在logo界面或黑屏显卡驱动、ACPI问题或内核参数冲突在GRUB菜单按e编辑启动项去掉quiet splash加上nomodeset或acpioff逐项排查Secure Boot开启后GRUB无法加载内核或GRUB未签名进入BIOS关闭Secure Boot或使用MOK给自定义内核签名4.2 Windows开机修复维护启动项双系统中最容易“忽然坏掉”的其实是Windows的引导。GRUB菜单还在但选择Windows后提示\Windows\system32\winload.efi找不到或状态错误这种问题一般出现在Windows更新、磁盘分区被调整之后。修复方法不复杂关键是修复用的Windows安装U盘或者恢复环境版本要和系统大版本匹配Windows 10的设备就用Windows 10的安装U盘进修复模式。在WX855上如果遇到Windows启动失败我的操作路径是用Windows安装U盘启动选择“修复计算机”进入命令行执行以下命令bootrec /scanos bootrec /fixmbr bootrec /fixboot bootrec /rebuildbcd注意/fixmbr和/fixboot在UEFIGPT磁盘上往往没有效果最重要的其实是/rebuildbcd它会扫描磁盘上的Windows系统并把启动记录重新写入BCD存储。如果还是不行可以使用bcdboot命令bcdboot C:\Windows /s S: /f UEFI这里C:\Windows是Windows系统分区所在盘符S:是EFI分区盘符。这个命令会直接把Windows的UEFI启动文件复制到指定EFI分区并重建启动配置我在UEFI双系统环境下用它比bootrec更有效。4.3 手动在GRUB中添加Windows启动项有些特殊场景下os-prober扫描不出Windows比如Windows装在NVMe硬盘上、Linux装在SATA盘上或者两块磁盘的UUID识别有问题。这时候可以直接手动在/etc/grub.d/40_custom里追加菜单项稳定且不容易受升级影响。编辑文件sudo vim /etc/grub.d/40_custom追加以下内容menuentry Windows 10 (Manual) { search --fs-uuid --no-floppy --setroot EFI分区的UUID chainloader /EFI/Microsoft/Boot/bootmgfw.efi }其中EFI分区的UUID需要先查看sudo blkid /dev/sda1把输出里的UUID填进去然后sudo update-grub这里核心原理是search命令让GRUB找到存放Windows启动文件的EFI分区chainloader直接加载Windows的UEFI引导文件。这种方式不依赖os-prober去识别系统类型只要EFI分区里有bootmgfw.efi它就能引导。手动添加的菜单项在GRUB配置更新后还会保留因为40_custom这个文件本身就会被update-grub读取。4.4 内核更新后GRUB菜单乱了怎么办Linux内核经常升级旧的update-grub会自动把新内核加进菜单并保留旧内核正常情况下不会乱。如果某天执行系统更新后发现GRUB菜单缺失、默认启动项变了甚至进不去系统多数原因是/boot分区空间不足。内核更新时会清理旧内核但如果/boot分得特别小有些工具默认只分500MB新内核写入失败GRUB配置就会生成失败。排查方式很简单在Linux里执行df -h /boot如果空间使用率达到90%以上就手动清理旧内核。Ubuntu下可以用apt autoremove --purge或者直接用dpkg --list | grep linux-image查看已安装的内核列表删掉不用的旧内核。清理后重新sudo update-grub菜单就能恢复正常。WX855这种嵌入式板卡如果磁盘空间宽裕我建议把/boot独立分区直接给到1GB以上省得后面频繁清理。5. 双系统启动的维护经验在这块WX855上把Windows和Linux双系统跑通之后我最大的感受是启动问题本质上不是操作系统的问题而是固件、分区、引导程序三者之间的配合问题。UEFI是Windows和Linux都能识别的一套标准只要遵循GPT分区、EFI分区共享、先Windows后Linux这几条原则GRUB做主引导的方案完全可以做到长期稳定。我现在日常维护只用两个命令Linux下执行sudo update-grubWindows出问题时用安装U盘进修复模式跑一次bcdboot。来回切换系统不需要再碰BIOS开机3秒内就能进到想要的系统。最后再分享一个小技巧WX855这类板卡的BIOS一般有“Boot Override”功能不需要进BIOS设置界面就能临时指定启动设备。双系统即使把默认启动顺序折腾乱了也能靠这个功能临时救急再回系统里把配置改回来就行。现场维护的时候我一般把GRUB默认启动项设为现场最常用的系统超时3秒其他系统手动从菜单里选既保证重启后系统能正常起来也保留了一个随时切换的入口。这个方案我在多个工控项目里用过稳定性和操作体验都还过得去。本文还有配套的精品资源点击获取
返回列表