我们正在开发一个小型嵌入式 Linux 系统(2.6.35-ish),带有一个用于操作系统和应用程序的小型内部 NAND 设备(250-500Meg)和一个带有 8Gb SDHC SD 卡的 SD 卡用于数据。
可以随时切断设备的电源。
系统必须将数据存储到 SD 卡。这些数据非常重要……这是系统的全部目的。这些系统通常与远程位置的任何网络完全断开,每 4-8 周通过运动鞋网检索数据。
目前,我们只是在 SD 卡上安装了 VFAT。这主要是为了让第一批测试客户可以轻松地将数据手动复制到他们的 Win7 笔记本电脑上。
但是,我现在担心在错误的时间断电导致数据丢失只是时间问题。
配置此类系统以防止数据丢失的最佳方法是什么?JFFS2 在写入数据的方式方面听起来像是我想要的(并且性能需求根本不高),但是使用 block2mtd 等听起来相当笨拙。我也不确定卡的磨损均衡将如何交互用它。
做到这一点的最佳方法是什么?
编辑
我现在正在考虑离开文件系统 VFAT 并一次分配一天大小的文件,填充 0xFF,这应该会极大地限制电源循环故障的风险。然后我只能在这些预先创建的块中附加记录,希望 SD 卡不会太愚蠢以至于它们会擦除/磨损级别写入 0xFF 区域。
我可以使用 noatime,但是是否有等效的 VFAT nomtime 来防止写入修改后的时间字段?在创建新的一天的文件之前,我需要某种方法来阻止任何元数据更新。
编辑 2
电子堆栈交换中的某个人提醒我,NAND 上也有 ECC 数据,因此无法防止需要擦除。
那么,在这种情况下,通过 block2mtd 的 JFFS2 是否合适?
编辑 3
这比我想象的还要糟糕。即使您将完全相同的内容写入磁盘,我拥有的 SD 卡也会擦除数据块。擦除块是 64KB,这太大了,无法完全延迟写入。我将在 NAND 闪存中存储多达 128KB 的数据(我可以控制其写入行为),在一种日志中,然后将 128KB 块写入 SD 卡上 VFAT 分区中的 128KB 对齐文件(在如果其他 SD 卡有 128KB 擦除块)。
这个问题相当长,所以我会在顶部提出问题,然后通过我的方法来回答问题:
在我们的测试系统在过去几天相当密集地运行之后 - 我 telnet 进入系统并检查了测试结果。当我来删除一些数据时,系统返回了命令行(好像命令执行正确一样)。当我来检查目录以获取另一组结果时,我看到该文件仍然存在(使用 ls)。
在此之后,我注意到越来越多的 shell 命令没有按预期执行。
在 rm 无法正确执行后,我将从dmesg的输出开始:
从进程 6821 (rm) 分配长度 61440 失败
每个 CPU 的 DMA:
CPU 0: hi: 0, btch: 1 usd: 0
Active_anon:0 active_file:1 inactive_anon:0 inactive_file:0 unevictable:6 脏:0 回写:0 不稳定:0 空闲:821 平板:353 映射:0 页表:0 弹跳:0
DMA free:3284kB min:360kB low:448kB high:540kB active_anon:0kB inactive_anon:0kB active_file:4kB inactive_file:0kB unvictable:24kB present:8128kB pages_scanned:0 all_unreclaimable?不
lowmem_reserve[]: 0 0 0
DMA:31*4kB 47*8kB 42*16kB 64*32kB 1*64kB …
我需要一个可扩展的 Linux 发行版,我可以轻松地将其缩小到适合 64 mb CF 卡的大小。
在这个精简版中,它将在 Via C7 上运行,并且需要内核、网络、shell、基本的 perl 和一个 ftp 服务器。有一些嵌入式系统的发行版可以做到这一点,但是我要求将来应该可以扩展这个集合,例如扩展到基本的 X 设置或 python 而不是 perl 等。
你知道哪个发行版可以做到这一点?像 Fedora、Debian、Ubuntu 这样的主要发行版中的任何一种都可以精简这么多吗?
编辑:我查看了嵌入式 Debian,它似乎与我需要的非常接近。可悲的是,由于主要维护者的健康问题,开发似乎已经停滞。
目前,我尝试使用Cross Linux from Scratch 中的说明从头开始构建嵌入式 Linux 。
一切正常,直到我尝试编译 GCC 交叉编译器。我想为 Beagleboard-xM 构建 Linux...所以我选择了以下设置:
export CLFS_ABI="aapcs-linux"
export CLFS_HOST="x86_64-cross-linux-gnu"
export CLFS_TARGET="armv7a-unknown-linux-uclibceabi"
export CLFS_ARCH="arm"
export CLFS_ENDIAN="little"
export CLFS_ARM_ARCH="armv7"
export CLFS_ARM_MODE="arm"
export CLFS_FLOAT="hard"
export CLFS_FPU="neon"
Run Code Online (Sandbox Code Playgroud)
不,只要我尝试运行此页面上的说明,命令就会make all-gcc all-target-libgcc出错。
checking for armv7a-unknown-linux-uclibceabi-gcc... /mnt/clfs/sources/gcc-build/./gcc/xgcc -B/mnt/clfs/sources/gcc-build/./gcc/ -B/mnt/clfs/cross-tools/armv7a-unknown-linux-uclibceabi/bin/ -B/mnt/clfs/cross-tools/armv7a-unknown-linux-uclibceabi/lib/ -isystem /mnt/clfs/cross-tools/armv7a-unknown-linux-uclibceabi/include -isystem /mnt/clfs/cross-tools/armv7a-unknown-linux-uclibceabi/sys-include
checking for suffix of object files... configure: error: in `/mnt/clfs/sources/gcc-build/armv7a-unknown-linux-uclibceabi/libgcc':
configure: error: cannot compute suffix of object files: cannot compile
See `config.log' for more details.
make: *** [configure-target-libgcc] Error …Run Code Online (Sandbox Code Playgroud) 给定一个二进制文件,如何在安装了的最小系统上仅使用sed和cut等标准工具将其转换为十六进制字符串并返回busybox?
这些工具不可用:
perlpythonxxd (带有vim)gcchexdump命令随附busybox,但与随附的命令不同util-linux。
我正在寻找将文件转换为十六进制字符串的脚本或命令,以及将其转换回二进制的相应脚本或命令。中间格式不必是十六进制,它可以是 base64 或其他格式。
这适用于磁盘空间有限的嵌入式设备。
我运行一个小的uClibc和busybox一个x86设备上基于嵌入式系统。我正在使用 initramfs,但我还在ext3IDE 模式下的紧凑型闪存设备上安装了一个自定义目录,我用它来存储由自定义编写的 C++ 应用程序创建的持久测量日志记录数据。我选择了ext3文件系统,因为在我读过的几本书(Karim Yaghmour 的《构建嵌入式 Linux 系统》和Christopher Hallinan 的《嵌入式 Linux 入门》)中,在 IDE 模式下使用 CF 驱动器时,建议使用它来防止断电。这一点尤为重要,数据至关重要。
但是,由于我之前的问题混淆了如果在文件写入过程中发生断电,如何恢复损坏的 ext3 文件中的一些评论,看来实际上该文件系统并没有提供针对因电源造成的数据损坏的安全保证损失。所以我想知道是否
ext3实际上是这个设置的最佳选择?initramfs.cpio文件是否也有损坏的风险?我已经看到并阅读了这个相关问题的答案:日志文件系统是否保证在断电后不会损坏?,但它并没有完全涵盖一些让我感到困惑的事情。
我意识到我问了很多问题,但似乎尽管阅读了很多材料,但我从根本上无法理解断电时我的数据所面临的风险。
我最近买了一台三星智能电视。设置wifi连接后,我浏览了http://ip.comlex.de,它为我提供了有关浏览器的以下信息:
REMOTE_ADDR: ###.###.###.###REMOTE_HOST: XXXXXXXXXXXXXXXXXXX.netREQUEST_TIME: 1381093040QUERY_STRING: HTTP_ACCEPT: text/html,application/xhtml+xml,application/xml,application/vnd.hbbtv.xhtml+xml,application/ce-html+xml,application/vnd.oipf.xhtml+xml;q=0.9, / ;q =0.8HTTP_ACCEPT_CHARSET: HTTP_ACCEPT_ENCODING: gzip, deflateHTTP_ACCEPT_LANGUAGE:HTTP_REFERER:http ://pagerank.comlex.de/ HTTP_USER_AGENT: Mozilla/5.0 (SMART-TV; X11; Linux i686) AppleWebKit/535.20+ (KHTML, like Gecko) Version/5.0 Safari/535.20+那么,是否有像 HTTP_USER_AGENT 建议的那样在我的 SmartTV 上运行的 Linux?如何找到有关所用 Linux 的更多信息?我可以以某种方式从台式电脑登录电视吗?
可能的解决方案:http : //www.samsungdforum.com/Guide/d21/index.html#how-to-get-firmware-version-and-model-code
围绕这个问题有几个现有的主题,但我所寻求的略有不同。我在嵌入式 Linux 上有一张 SD 卡,但它断电了。我也许可以在某个时候修改硬件,正确关闭等等。但现在,我只想找到一个文件系统,它可以在断电后毫不费力地幸存下来。数据丢失是可以接受的。我不想丢失比我当前正在编写的文件更多的文件,但我仍然宁愿丢失所有文件,也不愿面对“无法挂载”、“等待 10 分钟 fsck”或“无法创建新文件”文件由于此 inode 出现某些错误'。节目必须继续!
我正在努力确保这一点。我正在使用工业级组件,我有硬件看门狗,软件看门狗,内部,外部,init 重新启动程序,守护进程不断检查内存、文件描述符等等,我让看门狗看着我的看门狗,而其他看门狗又在看...但我似乎不能保证SD卡能够挂载和运行?
我现在最好的选择是在 SD 卡上使用 JFS,在我的安装中包含 fsck 和 fsck.jfs。(增加 600kb+ 占用我的内存和闪存。这很糟糕。)并在每次启动时运行 fsck(可能会增加很多启动时间。这有点糟糕。)。不过好像有点难过。
有谁知道更好的方法或更好的文件系统?
更新:在我的发行版中编译 e2fsprogs-libs(对 jfsutils 的依赖)似乎非常困难。我会研究 ZFS(虽然它不是我的发行版的原生。它似乎做了很多我不需要的事情。)
UPDATE2:有关我的系统和我的测试的更多信息:SD 卡存储是辅助的可选存储。SD 卡是 2Gb-8Gb 工业级 microSD。SD 卡是通过我的 rc 使用 mount -t 命令挂载的。选项“noatime”而不是“sync”。我的发行版是一个定制的模拟设备风格的 uClinux,有一个 3.10 内核和一个 1.21 busybox。我的主要存储是带有 jffs2 的 spi 闪存。我从来没有遇到过任何问题。我什至不知道是否有可用的 fsck.jffs2。另一方面,Nand flash ...但那是另一回事了。SD 卡的用途是存储测量数据。“监控”程序会将结果附加到文件中,并具有战略性的同步位置。当文件超过给定大小时,将创建一个新文件。当达到给定数量的文件时,最旧的文件将被删除。如果当前测量文件因断电而丢失,也不是灾难。文件通常为 50-100kb,1 个结果通常为 1kb。这只是最初的开发阶段。没有什么是固定的。这是我第一次在嵌入式系统中处理非闪存文件系统。(我的 x86 服务器上有 ext4。)
我从 vfat 开始。默认文件系统。(我认为工厂可能有选择它的理由。如果一切正常,我真的不太在意。)我从未在嵌入式 vfat 设备中看到任何功率损耗问题。不过,我在 WinCE 中遇到过 FAT 问题。但是,当我的“监视器”程序达到 100-200 个文件时,它拒绝创建更多文件。似乎 FAT 在根目录中有一个特殊的文件限制问题,在子目录中有一个稍大的问题。我需要能够在 1 个目录中创建 500-1000 个文件。所以 vfat 不行。
然后我切换到ext2。不过,我没有在启动时插入 fsck。(不知道我必须这样做。)一天之内,由于“inode …
有哪些专为路由器设计的发行版?请包括以下内容
我正在研究在 Linux 上运行的嵌入式设备。该设备与服务器通信并使用证书和私钥向其发送数据。
当我们分发设备时,我担心某些邪恶的人可能会通过入侵嵌入式设备的文件系统来窃取该私钥,并试图篡改我们服务器上的数据。
即使我对该私钥进行加密,由于正在运行的程序需要解密该密钥,他们仍然可以在文件系统的某处找到解密密钥。
更改文件的权限不是解决方案,因为我们必须固有地分发设备,因此,任何人都可以物理访问它。
我很高兴听到任何保护私钥而不阻止正在运行的程序使用它的建议。谢谢你。
编辑:我们使用在英特尔 Edison 上运行的 Yocto。