我有一个要托管在嵌入式控制器上的 Web 应用程序。
这个控制器(不是我的)有一个类似 FAT12 的 8.3 大写文件名文件系统。
我的构建系统在 Linux 上运行,并且可以使用 ext4 (UTF-8) 中允许的任何文件名。
问题是:我无法自己构建和签署固件档案,我必须将压缩档案分发给密钥所有者。
如果有任何东西潜入档案,就会带来很多麻烦和争论,因为只有在创建签名固件档案后,当它上传到测试控制器时,过程才会中断。
由于这个麻烦,我想在我的构建系统中尽早捕获这些错误。
我尝试使用 mode=strict 在我的 build/ 目录上以 FAT12 模式通过循环设备挂载的文件中包含 VFAT 文件系统,但除了对回送文件的空间限制外,似乎没有任何限制。
是否有另一种方法可以向文件系统添加约束以模拟有限的文件系统?
2012 年 12 月 19 日编辑:也许我应该展示我之前尝试过的内容:(我在 -vx 调试模式下的测试 shell 脚本)
export LANG=C
+ export LANG=C
+ LANG=C
export LC_ALL=C
+ export LC_ALL=C
+ LC_ALL=C
IMAGE=$(mktemp --quiet --suffix=fat12.img 8dot3XXXXXXXX)
mktemp --quiet --suffix=fat12.img 8dot3XXXXXXXX)
mktemp --quiet --suffix=fat12.img 8dot3XXXXXXXX
++ mktemp --quiet --suffix=fat12.img 8dot3XXXXXXXX
+ IMAGE=8dot3C2CGojhZfat12.img
MOUNTPOINT=${HOME}/fat-test
+ MOUNTPOINT=/home/human/fat-test
dd if=/dev/zero of=${IMAGE} bs=1M count=1
+ dd if=/dev/zero of=8dot3C2CGojhZfat12.img bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.00500883 s, 209 MB/s
mkfs.vfat -F 12 -n flashfs ${IMAGE}
+ mkfs.vfat -F 12 -n flashfs 8dot3C2CGojhZfat12.img
mkfs.vfat 3.0.12 (29 Oct 2011)
file ${IMAGE}
+ file 8dot3C2CGojhZfat12.img
8dot3C2CGojhZfat12.img: x86 boot sector, mkdosfs boot message display, code offset 0x3c, OEM-ID " mkdosfs", sectors/cluster 4, root entries 512, sectors 2048 (volumes <=32 MB) , Media descriptor 0xf8, sectors/FAT 2, heads 64, serial number 0xc02d5e98, label: "flashfs ", FAT (12 bit)
mkdir -p ${MOUNTPOINT}
+ mkdir -p /home/human/fat-test
\sudo mount ${IMAGE} ${MOUNTPOINT} -t vfat -o fat=12,check=strict,shortname=win95,uid=1000,gid=1000,debug
+ sudo mount 8dot3C2CGojhZfat12.img /home/human/fat-test -t vfat -o fat=12,check=strict,shortname=win95,uid=1000,gid=1000,debug
cd ${MOUNTPOINT}
+ cd /home/human/fat-test
df -h ${MOUNTPOINT}
+ df -h /home/human/fat-test
Filesystem Size Used Avail Use% Mounted on
/dev/loop1 1004K 0 1004K 0% /home/human/fat-test
## test suite
# is 8.3 and uppercase, should work
mkdir TEST
+ mkdir TEST
touch TEST/TEST.TXT
+ touch TEST/TEST.TXT
# is 8.3, but wrong case, should fail
mkdir trial
+ mkdir trial
mkdir trial/trial.txt
+ mkdir trial/trial.txt
# should fail
mkdir muchtoolong
+ mkdir muchtoolong
touch muchtoolong/muchtoolong.with.triple.extension
+ touch muchtoolong/muchtoolong.with.triple.extension
find ${MOUNTPOINT} -ls
+ find /home/human/fat-test -ls
1 16 drwxr-xr-x 5 human human 16384 Dec 19 18:40 /home/human/fat-test
21 2 drwxr-xr-x 2 human human 2048 Dec 19 18:40 /home/human/fat-test/TEST
22 0 -rwxr-xr-x 1 human human 0 Dec 19 18:40 /home/human/fat-test/TEST/TEST.TXT
23 2 drwxr-xr-x 3 human human 2048 Dec 19 18:40 /home/human/fat-test/trial
24 2 drwxr-xr-x 2 human human 2048 Dec 19 18:40 /home/human/fat-test/trial/trial.txt
25 2 drwxr-xr-x 2 human human 2048 Dec 19 18:40 /home/human/fat-test/muchtoolong
26 0 -rwxr-xr-x 1 human human 0 Dec 19 18:40 /home/human/fat-test/muchtoolong/muchtoolong.with.triple.extension
cd
+ cd
\sudo umount ${MOUNTPOINT}
+ sudo umount /home/human/fat-test
rm ${IMAGE}
+ rm 8dot3C2CGojhZfat12.img
Run Code Online (Sandbox Code Playgroud)
如果有人能发现错误:TIA,因为我找不到它。
您似乎对 FS 上存在的长名称感到困扰,您希望通过纯 MSDOS 约定对其进行限制。然后使用“ -t msdos ”而不是“ -t vfat ”。否则,VFAT 只会存储“不可能”文件的长名称,并为其构建简短的替代文件。
您必须删除“ shortname ”选项,因为“ msdos ”FS 不知道“shortname”的含义。
顺便说一句,您的脚本中还有另一个错误,使其无法按您的预期工作:您错过了 mount 命令中的“ loop ”选项,因此它将报告错误,并且所有进一步的操作将发生在底层 FS 的${MOUNTPOINT}目录中,而不是在您的测试文件中测试了 FS。您似乎在发布之前编辑了脚本/输出,因为在“ sudo mount ”命令之前有一个明显错误的反斜杠“\” 。所以,正确的挂载命令应该是这样的:
sudo mount ${IMAGE} ${MOUNTPOINT} -t msdos -o loop,fat=12,check=strict,uid=1000,gid=1000,debug
Run Code Online (Sandbox Code Playgroud)
另请注意:在 MSDOS 模式下,磁盘上的名称仅以大写形式存储。因此,“ msdos ”FS Linux 开发人员决定将所有名称仅转换为小写或从小写转换显示,同时仍以大写形式存储它们。这意味着您对案例的测试将起到相反的作用:仅允许名称全部为小写,但拒绝任何大写字符。虽然这可能会给您的测试带来不便,但您文件中的名称将始终正确创建,并且所有混合重复项都会被拒绝(以及其他非 8.3 异常),因此我相信您将能够根据此特定情况调整您的情况在 Linux 中挂载 MSDOS FS 的特殊性。
| 归档时间: |
|
| 查看次数: |
4540 次 |
| 最近记录: |