Я работаю со встроенными устройствами и хотел бы, чтобы они могли изменять размер своих разделов MTD через Linux без перезагрузки.
Проблема в том, что размер моего образа 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. Однако этот код не удаляет разделы должным образом. Даже после размонтирования JFFS2 из mtd1 и вызова 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? Есть ли более правильный способ сделать это?
mtdchar.c
mtd_open()
вызываетget_mtd_device()
, что, вероятно, объясняет дополнительное приращениеusecount
. Но моему пользовательскому приложению необходимо вызватьopen()
для раздела, чтобы отправить емуioctl()
для удаления раздела :/ catch 22? Есть ли более правильный способ сделать это? - person mikhail   schedule 05.06.2012