2012-05-31 6 views
3

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

Используя это в качестве руководства, я был в состоянии написать kernel и user-space, чтобы создать новый раздел 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 

Я попытался связаться с автором патча, но их электронная почта больше не действительна, поэтому я буду благодарен за любые предложения!


UPDATE:

Кажется, что mtd_open() в mtdchar.c вызывает get_mtd_device(), что, вероятно, объясняется дополнительным usecount прироста. Но мое приложение для пользователя необходимо вызвать open() в разделе, чтобы отправить его ioctl() для удаления раздела:/catch 22? Есть ли более правильный способ сделать это?

+1

Может быть, вы могли бы инструмент код для обозначения увеличения и уменьшения счётчика ссылок и выяснить, куда он выходит (я полагаю, это не ваша корневая файловая система ...). В качестве альтернативной идеи, возможно, вы можете уменьшить размер изображения, удалив ненужные функции или переместив некоторые из них в модуль. Или имеете промежуточное обновление с использованием урезанного изображения, которое резервирует конфигурационную информацию в другом месте, позволяя вам затем воссоздать файловую систему при загрузке нового полного изображения. –

+0

Спасибо Крису, мне нравится идея отследить подсчет ссылок, я попробую это дальше.Сокращение изображения не является вариантом, я уже проделал большую работу, чтобы сделать его таким маленьким, как сейчас, и я работаю над большим проектом, который может увеличить размер на целых 50% (пока рано говорить об этом). Мне действительно нужен способ расширить раздел, чтобы справиться с этим в будущем. Я также думал об использовании промежуточного местоположения, но обновление нужно будет удаленно выполнять в различных конфигурациях сети, поэтому я боюсь, что это будет слишком сложно/ненадежно. – mikhail

+0

Похоже, что в 'mtdchar.c'' mtd_open() 'запускается' get_mtd_device() ', что, вероятно, объясняет дополнительный приращение' usecount'. Но для моего приложения userpace нужно вызвать 'open()' в разделе, чтобы отправить ему 'ioctl()' для удаления раздела:/catch 22? Есть ли более правильный способ сделать это? – mikhail

ответ

2

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

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


UPDATE:

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

https://github.com/mikzat/mtd_runtime_partition

Смежные вопросы