Я работаю со встроенными устройствами и хочу, чтобы они могли изменять размеры своих разделов 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? Есть ли более правильный способ сделать это?
Может быть, вы могли бы инструмент код для обозначения увеличения и уменьшения счётчика ссылок и выяснить, куда он выходит (я полагаю, это не ваша корневая файловая система ...). В качестве альтернативной идеи, возможно, вы можете уменьшить размер изображения, удалив ненужные функции или переместив некоторые из них в модуль. Или имеете промежуточное обновление с использованием урезанного изображения, которое резервирует конфигурационную информацию в другом месте, позволяя вам затем воссоздать файловую систему при загрузке нового полного изображения. –
Спасибо Крису, мне нравится идея отследить подсчет ссылок, я попробую это дальше.Сокращение изображения не является вариантом, я уже проделал большую работу, чтобы сделать его таким маленьким, как сейчас, и я работаю над большим проектом, который может увеличить размер на целых 50% (пока рано говорить об этом). Мне действительно нужен способ расширить раздел, чтобы справиться с этим в будущем. Я также думал об использовании промежуточного местоположения, но обновление нужно будет удаленно выполнять в различных конфигурациях сети, поэтому я боюсь, что это будет слишком сложно/ненадежно. – mikhail
Похоже, что в 'mtdchar.c'' mtd_open() 'запускается' get_mtd_device() ', что, вероятно, объясняет дополнительный приращение' usecount'. Но для моего приложения userpace нужно вызвать 'open()' в разделе, чтобы отправить ему 'ioctl()' для удаления раздела:/catch 22? Есть ли более правильный способ сделать это? – mikhail