Изменение размера разделов MTD во время выполнения

Я работаю со встроенными устройствами и хотел бы, чтобы они могли изменять размер своих разделов 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? Есть ли более правильный способ сделать это?


person mikhail    schedule 31.05.2012    source источник
comment
Возможно, вы могли бы настроить код для указания увеличения и уменьшения счетчика ссылок и выяснить, где он выходит (я предполагаю, что это не ваша корневая файловая система...) В качестве альтернативы, возможно, вы могли бы уменьшить размер изображения, удалив ненужные функции или перемещение некоторых в модуль. Или сделайте промежуточное обновление с использованием урезанного образа, который создает резервную копию информации о конфигурации в другом месте, позволяя затем воссоздать файловую систему при загрузке нового полного образа.   -  person Chris Stratton    schedule 04.06.2012
comment
Спасибо, Крис, мне нравится идея попытаться отследить количество ссылок, я попробую это в следующий раз. Уменьшение изображения не вариант, я уже проделал большую работу, чтобы сделать его таким маленьким, как сейчас, и я работаю над большим проектом, который может увеличить размер на целых 50% ( пока рано говорить об этом). Мне действительно нужен способ расширить раздел, чтобы справиться с этим в будущем. Я также думал об использовании промежуточного местоположения, но обновление необходимо будет выполнять удаленно в различных сетевых конфигурациях, поэтому я боюсь, что это будет слишком сложно/ненадежно.   -  person mikhail    schedule 04.06.2012
comment
Кажется, что в mtdchar.c mtd_open() вызывает get_mtd_device(), что, вероятно, объясняет дополнительное приращение usecount. Но моему пользовательскому приложению необходимо вызвать open() для раздела, чтобы отправить ему ioctl() для удаления раздела :/ catch 22? Есть ли более правильный способ сделать это?   -  person mikhail    schedule 05.06.2012


Ответы (1)


В итоге я решил эту проблему, заставив мою пропатченную утилиту mtd увеличить размер «mtd0», а затем создать новый раздел правильного уменьшенного размера для монтирования JFFS, что дало мне возможность скопировать информацию о конфигурации в новое местоположение флэш-памяти.

Чтобы уменьшить сложность, я также сделал так, чтобы я не мог запускать это приложение более одного раза. Это закончилось процедурой типа «запусти один раз, делай свое дело, перезагрузись».


ОБНОВЛЕНИЕ:

Вот мой код, подумал, что это может принести пользу некоторым людям:

https://github.com/mikzat/mtd_runtime_partition

person mikhail    schedule 15.03.2013