在运行时调整MTD分区的大小

时间:2012-05-31 15:34:27

标签: linux-kernel embedded-linux partitioning

我正在使用嵌入式设备,并希望能够通过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

以此为指导,我能够编写内核和用户空间代码来创建一个新的MTD分区,我可以在其上安装JFFS2。但是,此代码无法正确删除分区。即使在从mtd1卸载JFFS2并调用put_mtd_device之后,当调用del_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()中的mtdchar.c会触发get_mtd_device(),这可能会导致额外usecount增量。但是我的用户空间应用需要在分区上调用open()来发送ioctl()来删除分区:/ catch 22?有没有更正确的方法呢?

1 个答案:

答案 0 :(得分:2)

我最终通过修补mtd实用程序增加“mtd0”大小来解决这个问题,然后创建一个正确缩小大小的全新分区来安装JFFS,这让我有机会将配置信息复制到新的闪光位置。

为了降低复杂性,我也做到了这一点,所以我不能多次运行这个应用程序。它最终成为了“一次运行,做你的事,重新启动”的程序。


<强>更新

这是我的代码,认为它可能会让一些人受益:

https://github.com/mikzat/mtd_runtime_partition