PC側でlittlefsファイルシステムのデバッグを使用littlefsヒューズ

背景

組み込みデバイスのためlittlefsアームは、抗パワーダウン、動的ウェアレベリング、少ないRAM / ROM需要特性、可視特定の記述を有するセキュリティシステムダウン小さなファイルの打ち上げ、あるhttps://github.com/ARMmbed/littlefs

物事がうまくいかないとき、組み込み機器で使用するためのファイルシステムとしては、一般的に、分析のためのデータをダンプする必要があります。その後、PC側のデバッグ・ツールを必要としています。

littlefsヒューズ紹介

このプロジェクトは、あなたのPC上にマウントミラーlittlefs直接このプロジェクトを使用し、通常のファイルシステムの一部を動作させることができlittlefs FUSEパッケージを提供しています。

ソースは次の場所にあります。https://github.com/ARMmbed/littlefs-fuse

構造

私たちは直接ダウンロード

 $ git clone https://github.com/ARMmbed/littlefs-fuse.git
 $ cd littlefs-fuse

建設中のルック

$ tree -L 2

.
├── lfs_fuse_bd.c
├── lfs_fuse_bd.h
├── lfs_fuse.c
├── LICENSE.md
├── littlefs
│   ├── DESIGN.md
│   ├── emubd
│   ├── lfs.c
│   ├── lfs.h
│   ├── lfs_util.c
│   ├── lfs_util.h
│   ├── LICENSE.md
│   ├── Makefile
│   ├── README.md
│   ├── scripts
│   ├── SPEC.md
│   └── tests
├── Makefile
└── README.md

これは、直接littlefsフォルダが含まれている外箱、です。我々はlittlefsの特定のバージョンが必要な場合littlefsとデバイスの同じバージョンを使用する場合、例えば、非常に便利な内側の層にlittlefsを交換する必要があります。

コンパイル

READMEよると、プロジェクトはFUSEバージョン2.6以上のバージョンの依存関係、あなたはバージョンを表示するには、次のコマンドを使用することができます

fusermount -V

またlibfuse-devをインストールする必要があります。

sudo apt-get install libfuse-dev

依存関係が満たされた後、LFSを生成するために直接アプリケーションを作ります

make

発生装置と使用してマウント

機器の一部を構築するための最初の必要性

sudo chmod a+rw /dev/loop0                  # make loop device user accessible
dd if=/dev/zero of=image bs=512 count=2048  # create a 1MB image
losetup /dev/loop0 image                    # attach the loop device

前のDDあなたがフォーマットする必要があるので、私たちは、空の画像を生成しています、

./lfs --format /dev/loop0

そして、マウント

mkdir -p mount
./lfs /dev/loop0 mount

成功マウント、マウントを実行した後マウントケースを見ることができます

$ mount | grep lfs
/home/zhuangqiubin/debug_littlefs/littlefs-fuse/lfs on /home/zhuangqiubin/debug_littlefs/littlefs-fuse/mount type fuse.lfs (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)

今、あなたが動作するように自由に、下のディレクトリをマウントすることができ、および削除操作は、読み取り、書き込みを作成するには、それが最終的に画像に適用littlefsに変換されます

プロセスは、あなたは、あなたがあなたの操作を見ることができ、いつでもデータをダンプし、最終的にどのような例えば、フォーマットlittlefsに保存されたデータのことができます

$ echo "www.cnblogs.com/zqb-all/" >> mount/test_littlefs.txt

$ hexdump -C image
00000000  03 00 00 00 f0 0f ff f7  6c 69 74 74 6c 65 66 73  |........littlefs|
00000010  2f e0 00 10 00 00 02 00  00 02 00 00 00 08 00 00  |/...............|
00000020  ff 00 00 00 ff ff ff 7f  fe 03 00 00 20 00 04 09  |............ ...|
00000030  74 65 73 74 5f 6c 69 74  74 6c 65 66 73 2e 74 78  |test_littlefs.tx|
00000040  74 20 00 00 11 70 0f f9  b7 ee c0 48 bb ff ff ff  |t ...p.....H....|
00000050  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00000200  04 00 00 00 f0 0f ff f7  6c 69 74 74 6c 65 66 73  |........littlefs|
00000210  2f e0 00 10 00 00 02 00  00 02 00 00 00 08 00 00  |/...............|
00000220  ff 00 00 00 ff ff ff 7f  fe 03 00 00 20 00 04 09  |............ ...|
00000230  74 65 73 74 5f 6c 69 74  74 6c 65 66 73 2e 74 78  |test_littlefs.tx|
00000240  74 20 00 00 08 77 77 77  2e 63 6e 62 6c 6f 67 73  |t ...www.cnblogs|
00000250  2e 63 6f 6d 2f 7a 71 62  2d 61 6c 6c 2f 0a 70 0f  |.com/zqb-all/.p.|
00000260  f9 87 46 fe c1 ad ff ff  ff ff ff ff ff ff ff ff  |..F.............|
00000270  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00000400  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00100000

使用後、アンインストールするには、次のコマンドを使用します

umount mount
sudo losetup -d /dev/loop0

指定されたミラーマウント

これらは、空の画像は、生成されたフォーマットされ、マウントされています。あなたは既製のイメージをマウントしたい場合は、手順も似ていますが、変更を反映しました。、その既存のミラーリングと呼ばれるlittlefs.imgを想定すると、

sudo chmod a+rw /dev/loop0                  # make loop device user accessible
losetup /dev/loop0 littlefs.img                    # attach the loop device
mkdir -p mount
./lfs /dev/loop0 mount

何の違いを指揮しないアンインストール

umount mount
sudo losetup -d /dev/loop0

しかし、デバイスlittlefsミラーの上にダンプ、その構成は必ずしもlittlefsヒューズのデフォルトの設定と一致しません。

このとき、正常にデバイス上で実行されているシミュレートlittlefsをマウントし、正確にするために、我々は同じの構成を変更する必要があります。

溶液は、直接、例えば、ソースコードを変更します

diff --git a/lfs_fuse.c b/lfs_fuse.c
index 3c87dad..d1a99a2 100644
--- a/lfs_fuse.c
+++ b/lfs_fuse.c
@@ -26,7 +26,16 @@
 
 
 // config and other state
-static struct lfs_config config = {0};
+/* static struct lfs_config config = {0}; */
+static struct lfs_config config = {
+    .read_size = 256,
+    .prog_size = 256,
+    .block_size = 4096,
+    .block_count = 1224,
+    .block_cycles = 512,
+    .cache_size = 256,
+    .lookahead_size = 32
+};

世代を作るために再変更された後、

ソリューション第二に、例えば、指定するには、コマンドラインパラメータから呼び出されたときに、

./lfs --block_size=512 --format /dev/loop0
./lfs --block_size=512 /dev/loop0 mount

サポートされているオプションは、ヘルプに記載されています

$lfs -h
usage: ./lfs [options] device mountpoint

general options:
    -o opt,[opt...]        FUSE options
    -h   --help            print help
    -V   --version         print version

littlefs options:
    --format               format instead of mounting
    --migrate              migrate previous version  instead of mounting
    -b   --block_size      logical block size, overrides the block device
    --block_count          block count, overrides the block device
    --block_cycles         number of erase cycles before eviction (512)
    --read_size            readable unit (block_size)
    --prog_size            programmable unit (block_size)
    --cache_size           size of caches (block_size)
    --lookahead_size       size of lookahead buffer (8192)
    --name_max             max size of file names (255)
    --file_max             max size of file contents (2147483647)
    --attr_max             max size of custom attributes (1022)

FUSE options:
    -d   -o debug          enable debug output (implies -f)
    -f                     foreground operation
    -s                     disable multi-threaded operation

    -o allow_other         allow access to other users
    -o allow_root          allow access to root
    -o auto_unmount        auto unmount on process termination
    -o nonempty            allow mounts over non-empty file/dir
    -o default_permissions enable permission checking by kernel
    -o fsname=NAME         set filesystem name
    -o subtype=NAME        set filesystem type
    -o large_read          issue large read requests (2.4 only)
    -o max_read=N          set maximum size of read requests

    -o hard_remove         immediate removal (don't hide files)
    -o use_ino             let filesystem set inode numbers
    -o readdir_ino         try to fill in d_ino in readdir
    -o direct_io           use direct I/O
    -o kernel_cache        cache files in kernel
    -o [no]auto_cache      enable caching based on modification times (off)
    -o umask=M             set file permissions (octal)
    -o uid=N               set file owner
    -o gid=N               set file group
    -o entry_timeout=T     cache timeout for names (1.0s)
    -o negative_timeout=T  cache timeout for deleted names (0.0s)
    -o attr_timeout=T      cache timeout for attributes (1.0s)
    -o ac_attr_timeout=T   auto cache timeout for attributes (attr_timeout)
    -o noforget            never forget cached inodes
    -o remember=T          remember cached inodes for T seconds (0s)
    -o nopath              don't supply path if not necessary
    -o intr                allow requests to be interrupted
    -o intr_signal=NUM     signal to send on interrupt (10)
    -o modules=M1[:M2...]  names of modules to push onto filesystem stack

    -o max_write=N         set maximum size of write requests
    -o max_readahead=N     set maximum readahead
    -o max_background=N    set number of maximum background requests
    -o congestion_threshold=N  set kernel's congestion threshold
    -o async_read          perform reads asynchronously (default)
    -o sync_read           perform reads synchronously
    -o atomic_o_trunc      enable atomic open+truncate support
    -o big_writes          enable larger than 4kB writes
    -o no_remote_lock      disable remote file locking
    -o no_remote_flock     disable remote file locking (BSD)
    -o no_remote_posix_lock disable remove file locking (POSIX)
    -o [no_]splice_write   use splice to write to the fuse device
    -o [no_]splice_move    move data while splicing to the fuse device
    -o [no_]splice_read    use splice to read from the fuse device

Module options:

[iconv]
    -o from_code=CHARSET   original encoding of file names (default: UTF-8)
    -o to_code=CHARSET      new encoding of the file names (default: UTF-8)

[subdir]
    -o subdir=DIR       prepend this directory to all paths (mandatory)
    -o [no]rellinks     transform absolute symlinks to relative

デバッギング

それはマウントシミュレートし、PC上で読んで、すべての最も直感的なの最初のことができますので、あなたがデマンドソースlittlefsデバッグコードを追加し、印刷して、問題を分析するために、ミラーのうち、ダンプを再マウントできることです。

第二に、必要なときに、我々はより多くのGDB超えることができます

make DEBUG=1 clean all                # build with debug info
gdb --args ./lfs -d /dev/loop0 mount  # run with gdb

この記事のアドレスします。https://www.cnblogs.com/zqb-all/p/12078659.html

おすすめ

転載: www.cnblogs.com/zqb-all/p/12078659.html