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

Linux kernel 在运行时调整MTD分区的大小,linux-kernel,embedded-linux,partitioning,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 +

我正在使用嵌入式设备,希望它们能够通过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 UTIL”的建议补丁:

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\u mtd\u device
,当调用
del\u mtd\u 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
我试着联系补丁的作者,但他们的电子邮件不再有效,所以我将感谢任何建议


更新:


似乎
mtdchar.c
中的
mtd\u open()
触发了一个
get\u mtd\u设备()
,这可能是额外的
usecount
增量的原因。但是我的用户空间应用程序需要调用分区上的
open()
,向它发送一个
ioctl()
来删除分区:/catch 22?有更正确的方法吗?

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

为了减少复杂性,我也做到了,所以我不能运行这个应用程序多次。它最终是一个“运行一次,完成你的事情,重新启动”类型的过程


更新:

这是我的代码,我想它可以让一些人受益:


也许您可以插入代码以指示引用计数的递增和递减,并找出它的起点(我假设它不是您的根文件系统…),作为替代方案,也许您可以通过删除不需要的功能或将一些功能移动到模块来缩小映像大小。或者使用精简映像进行中间升级,该映像将配置信息备份到其他位置,允许您在启动新的完整映像后重新创建文件系统。谢谢Chris,我喜欢尝试跟踪引用计数的想法,我将在下一步尝试。缩小图像不是一个选项,我已经做了大量的工作来缩小它,现在我正在做一个大项目,这个项目可能会将图像的大小增加50%(现在说还为时过早)。我真的需要一种扩展分区的方法来在将来处理这个问题。我也考虑过使用中间位置,但升级需要在各种网络配置中远程完成,因此我担心这太复杂/不可靠。似乎在
mtdchar.c
mtd_open()
触发
get_mtd_设备()
,这可能是额外的
usecount
增量的原因。但是我的用户空间应用程序需要调用分区上的
open()
,向它发送一个
ioctl()
来删除分区:/catch 22?有没有更正确的方法?