我正在开发一款嵌入式产品,该产品将在类似于 raspberry pi 的硬件上运行 Linux,但具有内部存储。我希望它能够切断机器的电源,并且损坏风险非常低。我当时认为 Linux 的实时版本不会执行 HDD 写入,因此它永远不会处于写入中期。
在我见过的所有用例中,这通常是在 USB 驱动器上完成的。我想将其安装到内部存储中,以便可以从中启动。
同样在完美的世界中,直接更新图像很容易,例如,创建一个文件,然后“更新”磁盘上的图像以包含该文件。
Linux 版本是否支持类似的东西?另外,如何安装才能将非持久性安装安装在内部驱动器上而不是闪存驱动器上?
答案1
我正在开发嵌入式产品...
运行嵌入式 Linux 的设备通常具有自定义内核和自定义根文件系统。通常,尝试将现有 Linux 发行版定制为自定义硬件并使用通用桌面文件系统来开发专用嵌入式应用程序是不值得的。
用于构建自定义 Linux 内核和根文件系统的工具是 Buildroot 和 Yocto。
某个 Linux 版本是否支持类似这样的功能?
A“Linux 实时版本”只是一个使用 ramdisk 或更可能是 ramfs 作为根文件系统启动的 Linux 内核。我见过(也构建过)许多使用 ramfs 或 ramdisk 作为根文件系统的嵌入式 Linux 系统。换句话说,
你提出的方案既不独特也不新颖;它是一个常用的概念,有许多实现变体。
启动介质取决于您和硬件支持的内容。
换句话说,如果您想使用硬盘驱动器上的 initramfs 启动 Linux,那么唯一的问题可能是您要学习如何构建它。
根据您使用的硬件,可能没有新代码需要开发(除了您的应用程序),而构建这样的内核和 rootfs 只需要下载、配置和构建现有源代码。
在现场更新系统是一个复杂的话题,并且有很多解决方案。发行版使用的各种软件包系统通常对于嵌入式系统来说太重/太复杂,尤其是那些基于 NAND 闪存的系统。
答案2
首先,您实际上可以非常轻松地从硬盘或其他持久性存储启动这样的“实时”系统。只需将您要放在 USB 闪存驱动器上的映像写入任何存储,然后从那里启动即可。许多自助服务终端类型的系统都这样做,许多瘦客户端也是如此。
现在,话虽如此,这可能不是您的用例的最佳选择。我强烈建议您看看 Android 和 ChromeOS 如何处理它们的根文件系统。两者都设计得非常灵活,可以抵御意外断电造成的损坏,并且默认情况下都提供篡改保护(换句话说,如果有人在设备关闭时修改了数据,您会知道)。使用由构建根。
作为替代方案,您可以考虑查看Alpine Linux。它被设计为从只读媒体运行,但我不确定它对 64 位 x86 系统以外的系统的支持程度如何。