5

組み込みデバイスを使用していますが、再起動せずにLinux経由でMTDパーティションのサイズを変更できるようにしたいと考えています。

問題は、Linuxイメージのサイズが大きくなり、それが存在する現在のMTDパーティション(mtd0)が小さすぎることです。ただし、その直後のパーティション(mtd1)は構成情報を格納するために使用されるJFFS2セクションであるため、構成が失われる可能性があるため、再起動によるサイズ変更はオプションではありません。

私の目標はこれです:

1. Copy contents of JFFS2 into /tmp/
2. Unmount JFFS2 from mtd1
3. Increase the starting offset + reduce size of mtd1 by X bytes (or delete mtd1 and create new mtd of proper size and offset)
4. Mount JFFS2 on new mtd1 and restore contents from /tmp/
5. Increase the size of mtd0 by X bytes
6. Burn new (larger) Linux image into mtd0 (the new image will contain a device tree with an updated partition structure)
7. Reboot

数年前から「mtd-utils」に提案されたパッチを見つけました。

http://article.gmane.org/gmane.linux.drivers.mtd/30949
http://article.gmane.org/gmane.linux.drivers.mtd/30950
http://article.gmane.org/gmane.linux.drivers.mtd/30951

これをガイドとして使用して、カーネルとユーザースペースのコードを記述し、JFFS2をマウントできる新しいMTDパーティションを作成することができました。ただし、このコードはパーティションを適切に削除しません。mtd1からJFFS2をアンマウントして呼び出した後でもput_mtd_devicedel_mtd_deviceが呼び出されると、カーネルは次のように文句を言います。

user.notice kernel: Removing MTD device #1 (jffs2) with use count 1 

私が知りたいのは:

1. How to fix the patch to allow deleting my old mtd1
2. How to change the starting offset of mtd1 instead of creating/deleting partitions

パッチの作者に連絡してみましたが、メールが無効になっているので、何か提案をいただければ幸いです。


アップデート:

トリガーで、おそらく余分な増分を説明mtd_open()しているようです。しかし、私のユーザースペースアプリは、パーティションを削除するためにパーティションを送信するためにパーティションを呼び出す必要があります:/ catch 22?これを行うためのより正しい方法はありますか?mtdchar.cget_mtd_device()usecountopen()ioctl()

4

1 に答える 1

3

パッチを適用したmtdユーティリティのサイズを「mtd0」に増やしてから、JFFSをマウントするための正しい縮小サイズの新しいパーティションを作成することでこの問題を解決しました。これにより、構成情報を新しいフラッシュの場所にコピーする機会が得られました。

複雑さを軽減するために、このアプリを2回以上実行できないようにしました。それは「一度実行して、あなたのことをして、再起動する」タイプの手順になってしまいました。


アップデート:

これが私のコードです、それが何人かの人々に利益をもたらすかもしれないと考えました:

https://github.com/mikzat/mtd_runtime_partition

于 2013-03-15T20:19:50.630 に答える