如何使用大写的8.3文件名模拟FAT12文件系统?


7

我有一个Web应用程序,它将托管在嵌入式控制器上。

这个控制器(不是我的)有一个类似FAT12的8.3 UPPERCASE文件名文件系统。

我的构建系统在Linux上运行,可以使用ext4中允许的任何文件名(UTF-8)。

问题是:我不能自己构建和签署固件存档,我必须将压缩存档分发给密钥所有者。

如果有什么东西偷偷进入存档,那就很麻烦并且争论是因为该过程只有在创建签名固件存档后才会中断,当它被上传到测试控制器时。

由于这个麻烦,我想在我的构建系统中尽早捕获这些错误。

我尝试在我的build /目录下使用mode = strict在FAT12模式下通过循环设备挂载的文件中安装一个VFAT文件系统,但除了对回送文件的空间限制外,似乎没有任何限制。

是否有另一种方法可以向文件系统添加约束以模拟有限的文件系统?

编辑19.Dec.2012: 也许我应该展示我以前尝试过的东西:(我的测试shell脚本在-vx调试模式下)

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

如果有人能发现错误:TIA,因为我找不到它。


1
FAT12支持最大值分区大小为8MB。这是你那个大小的环回映像吗?使用带有-F12开关的mkfs.vfat对其进行格式化。另外,在安装它时,可以尝试使用-o fat = 12开关

@staff:谢谢你迁移这个帖子。我不确定构建系统相关的问题是否属于此处。但你肯定会知道更好:)
Peter

@itisravi:它的大小只有1 MB。我刚刚将测试用例脚本添加到原始问题中。
Peter

Answers:


2

您似乎很难在FS上存在长名称,您希望通过纯MSDOS约定来限制它。然后使用“ -t msdos “ 而不是 ” -t vfat “。否则,VFAT只会为”不可能“的文件存储长名称,并为它们构建简短的替代品。

你必须删除“ 简称 “选项为” MSDOS “FS不知道”短名“是什么意思。

顺便说一下,你的脚本中还有另一个错误,因为你打算不行,你错过了“ “mount命令中的选项,因此它将报告错误,并且所有进一步的操作都将在 $ {} MOUNTPOINT 底层FS的目录,而不是测试文件中测试的FS。您似乎在发布之前编辑了脚本/输出,因为在您的“之前”有一个明显错误的反斜杠“\” sudo mount “命令。所以,正确的mount命令将是这样的:

sudo mount ${IMAGE} ${MOUNTPOINT} -t msdos -o loop,fat=12,check=strict,uid=1000,gid=1000,debug

还有一点需要注意:在MSDOS模式下,磁盘上的名称仅以大写形式存储。所以,“ MSDOS “FS Linux开发人员决定转换并仅将所有名称显示为/小写,同时将它们保存为大写。这意味着您对案例的测试将采用相反的方式:只允许全部小写但拒绝任何大写字符。为您的测试带来不便,您的文件中的名称将始终正确创建并且所有混合副本都被拒绝(以及其他非8.3异常),因此我相信您将能够根据这种特殊的安装特性调整您的情况Linux中的MSDOS FS。


非常感谢你! -o循环是通过自动挂载完成的:“如果没有指定文件系统类型或者文件系统已知为libblkid,则mount命令会自动从常规文件创建循环设备”(man mount 2.22.2,sce。“循环装置“)
Peter

反斜杠是无害的:它抑制了一个名为“sudo”的别名的评估 - 这是我的一个老习惯。
Peter

@Peter:嘿,以前从来没有遇到过这两个功能,谢谢你解释一下。
Van Jone
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.