大文字の8.3ファイル名でFAT12ファイルシステムをシミュレートするにはどうすればよいですか?


7

私は組み込みコントローラ上でホストされるWebアプリケーションを持っています。

このコントローラ(私のものではありません)はFAT12風の8.3大文字ファイル名ファイルシステムを持っています。

私のビルドシステムはLinux上で動作し、ext4(UTF-8)で許可されている任意のファイル名を使用できます。

問題は、ファームウェアアーカイブを自分で作成して署名することはできないため、圧縮されたアーカイブをキー所有者に配布する必要があることです。

アーカイブに何かこっそり侵入しても、署名済みのファームウェアアーカイブを作成した後でテストコントローラにアップロードするとプロセスが中断されるため、多くの問題が発生します。

この煩わしさのために、私は自分のビルドシステムでできるだけ早くこれらのエラーを見つけたいと思います。

mode = strictを使用してbuild /ディレクトリにFAT12モードでループデバイス経由でマウントされたファイルに含まれるVFATファイルシステムをマウントしようとしましたが、ループバックファイルのスペース制限以外の制限は機能しません。

限られたファイルシステムをシミュレートするためにファイルシステムに制約を追加する別の方法はありますか?

編集19 2012年12月: おそらく、私は以前に試したことを示す必要があります。(-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のパーティションサイズ。そのサイズのループバックイメージですか? mkfs.vfatを-F12スイッチと共に使用してフォーマットします。マウント中に、-o fat = 12スイッチを試すこともできます。

@スタッフ:このスレッドを移行していただきありがとうございます。ビルドシステム関連の問題がここにあるのかどうか私にはわかりませんでした。しかし、もっとよく知っているでしょう:)
Peter

@itisravi:サイズはわずか1 MBです。テストケースのスクリプトを元の質問に追加しました。
Peter

回答:


2

あなたは純粋なMSDOSの慣習によって制限すると思われるFS上の長い名前の存在に苦労しているようです。それから " -t msdos " のではなく " -t vfat そうでなければ、VFATは "不可能な"ファイルのための長い名前をそれらに代わる短い代替物を構築することと共に格納するだけです。 "

あなたは削除しなければならないでしょう」 ショートネーム 「オプション」 msdos 「FSは、「短縮名」の意味を認識していません。

ところで、あなたの意図した通りにそれを実行不可能にしているあなたのスクリプトに別のエラーがあります:あなたは逃しました」 ループ msgstr "" "mountコマンドのオプション、したがってエラーで報告され、それ以降のすべての操作は $ {MOUNTPOINT} テストファイル内のテストされたFSではなく、基礎となるFSのディレクトリ。あなたの投稿の前にあなたのスクリプト/出力を編集するようでした。 スードマウント msgstr "したがって、正しいmountコマンドは以下のようになります:

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

もう1つの注意:MSDOSモードでは、ディスク上の名前は大文字だけで保存されます。そう、 " msdos 「FS Linuxの開発者は、大文字で保存しながら、すべての名前を小文字に変換して表示することにしました。つまり、大文字と小文字の区別はなく、大文字のみを拒否するということです。テストに不都合が生じると、ファイル内の名前は常に正しく作成され、すべての混合複製が拒否されます(8.3以外の異常も同様)ので、この特定のマウントの特殊性に状況を適応させることができるでしょう。 LinuxでのMSDOS FS


どうもありがとうございました! -oループはmountによって自動的に行われます: "ファイルシステムタイプが指定されていないか、ファイルシステムがlibblkidで認識されている場合、mountコマンドは通常のファイルからループデバイスを自動的に作成します"(man mount 2.22.2、sce)ループデバイス ")
Peter

バックスラッシュは無害です。それは "sudo"という名前のエイリアスの評価を抑制します - 私の古い習慣です。
Peter

@Peter:ええと、これらの両方の機能に出会ったことは一度もありませんでした。説明してくれてありがとう。
Van Jone
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.