|
|
  |
Отказоустойчивая запись на жёсткий диск, Какую файловую систему выбрать? |
|
|
|
Mar 10 2012, 04:29
|
Частый гость
 
Группа: Свой
Сообщений: 163
Регистрация: 25-09-09
Из: Nizhny Novgorod, Russia
Пользователь №: 52 588

|
Привет, уважаемые форумчане! Имеется одноплатный компьютер, с которого необходимо записывать данные на жёсткий диск, примерно 100 КБ каждые 10 мс. Получится ли использовать стандартную линуксовую файловую систему, каждые 10 мс открывая файл, дописывая новые данные в его конец и закрывая его? Какую файловую систему лучше выбрать? Или без низкоуровневой посекторной записи на жёсткий диск не обойтись? Кроме требования по скорости записи есть ещё требование по сохранности данных при аварийном отключении питания: желательно, чтобы данные не портились при этом и были доступны при восстановлении напряжения питания. Буду рад совету, пишите.
Сообщение отредактировал Enthusiast - Mar 10 2012, 04:31
|
|
|
|
|
Mar 10 2012, 07:09
|

Знающий
   
Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237

|
Цитата(Enthusiast @ Mar 10 2012, 07:29)  Привет, уважаемые форумчане! Имеется одноплатный компьютер, с которого необходимо записывать данные на жёсткий диск, примерно 100 КБ каждые 10 мс. Получится ли использовать стандартную линуксовую файловую систему, каждые 10 мс открывая файл, дописывая новые данные в его конец и закрывая его? Какую файловую систему лучше выбрать? Или без низкоуровневой посекторной записи на жёсткий диск не обойтись? Кроме требования по скорости записи есть ещё требование по сохранности данных при аварийном отключении питания: желательно, чтобы данные не портились при этом и были доступны при восстановлении напряжения питания. Буду рад совету, пишите. Открывать и закрывать при каждой записи файл совсем не нужно - это никак не влияет на механизмы общения ОС Linux с жёстким диском, при закрытии файла кэши не сбрасываются на диск в обязательном порядке. Открытие и закрытие файла - исключительно логические операции, манипулирующие с выдачей и освобождением файловых дескрипторов и статистической информацией о файле (время последнего доступа и т. п.). Для сброса кэша записи на диск нужно использовать sync(). В общем и целом, думаю, что станд. линуксовая ФС типа EXT непригодна для вашей задачи. Более того, низкоуровневая запись секторов на жёсткий диск тоже вас не спасёт, ибо так или иначе вам придётся как-то организовывать эти сектора, то есть по сути с нуля изобретать свою ФС. Для ваших целей придуманы так называемые "Power Safe Filesystem", правда, в мире QNX. Есть ли такие под Linux - мне неизвестно. Посмотрите здесь, раздел "Power-Safe Filesystem", там описаны принципы построения таких ФС, также изложено, почему системы EXT таковыми не являются.
--------------------
Сделано в Китае. Упаковано в России.
|
|
|
|
|
Mar 11 2012, 15:25
|
Частый гость
 
Группа: Свой
Сообщений: 163
Регистрация: 25-09-09
Из: Nizhny Novgorod, Russia
Пользователь №: 52 588

|
Цитата(Demeny @ Mar 10 2012, 11:09)  Открывать и закрывать при каждой записи файл совсем не нужно - это никак не влияет на механизмы общения ОС Linux с жёстким диском, при закрытии файла кэши не сбрасываются на диск в обязательном порядке. Открытие и закрытие файла - исключительно логические операции, манипулирующие с выдачей и освобождением файловых дескрипторов и статистической информацией о файле (время последнего доступа и т. п.). Для сброса кэша записи на диск нужно использовать sync(). В общем и целом, думаю, что станд. линуксовая ФС типа EXT непригодна для вашей задачи. Более того, низкоуровневая запись секторов на жёсткий диск тоже вас не спасёт, ибо так или иначе вам придётся как-то организовывать эти сектора, то есть по сути с нуля изобретать свою ФС. Для ваших целей придуманы так называемые "Power Safe Filesystem", правда, в мире QNX. Есть ли такие под Linux - мне неизвестно. Посмотрите здесь, раздел "Power-Safe Filesystem", там описаны принципы построения таких ФС, также изложено, почему системы EXT таковыми не являются. Чем плох fflush()? Последняя запись данных может быть потеряна, главное - чтобы сохранились все предыдущие данные и файл был доступен для чтения в последствии. Если записывать данные на жёсткий диск каждые 10 мс, то не откажет ли он от такой частой записи? Стоит ли кэшировать запись, к примеру, раз в 100 мс?
|
|
|
|
|
Mar 12 2012, 16:29
|
Местный
  
Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205

|
Вы еще учтите, что даже если вы с программной стороны все сделали верно, то не факт что данные с буферов накопителя успели попасть в сам накопитель. Сталкивался с проблемой, когда писал софт для обновления прошивки устройства, если сделать sync() и затем сразу выключить устройство, данные часто портились, а если добавить задержку в секунду (мне временные задержки были не критичны), то запись всегда проходила без ошибок. Правда это касалось MMC карточки, но для HDD думаю что-то такое тоже есть, нужно смотреть документацию. Писал через dd, без файловой системы.
|
|
|
|
|
May 4 2016, 07:44
|
Группа: Участник
Сообщений: 8
Регистрация: 4-05-16
Пользователь №: 91 582

|
нормальное решение зачем усложнять
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|