Передовица » Агат ↔ PC » Линк N 1 » программа для сведЕния образов дисков

программа для сведЕния образов дисков

Эта программа позволяет сводить несколько образов одного и того же диска, сделанных многократно (на разных дисководах или просто несколько раз). Она ищет среди имеющихся образов сбойные сектора (заполненые константой 0xBD) и пытается объединить образы так, чтобы исключить как можно больше сбойных секторов. При этом также анализируется корректные сектора на предмет совпадения данных в них. Если обнаруживается расхождение, программа старается "лечить" все возможные версии диска.

Скачать (~220 Кб). В этом архиве представлен исходный текст (FreePascal, турбой он не соберётся, так как использованы довольно крупные структуры данных), а также скомпилированные версии для FreeBSD 6.1 и MS-DOS (go32v2, идет также под любой Windows). Для каждого формата образов (140к и 840к) - свой исполняемый код.

Подробности

Она пытается из набора образов, снятых с одного диска, собрать один или более живой образ путем взаимной замены сбойных блоков живыми между имеющимися в наличии образами. Одновременно пытается понять, не случилось ли какого либо случайного сбоя при снятии образов путем сравнения живых секторов между собой. Если находятся образы, у которых одни и те же живые сектора различны, такие образы лечатся поотдельности - для последующего ручного анализа.

Вводится понятие дистанции - числа различающихся блоков между образами. Чем короче дистанция, тем больше вероятность, что реставрация сбойных блоков будет правильной.

По шагам действует она так:

  • Читает все образы в массив (определяет образ по размеру + возможный эпилог);
  • Заполняет внутри описателя образа таблицу bad block;
  • Ищет в массиве совпадающие образы и удаляет их;
  • Находит наиболее близкие по количеству совпадающих правильных секторов:
    • находит расстояния между образами и выводит таблицу;
    • сортирует образы в порядке возрастания дистанций;
  • Лечит сбойные сектора живыми из наиболее близких образов;
  • Ищет совпадающие образы и удаляем их;
  • Оставшиеся в памяти записывает под новыми именами (name + '.rep');

Во время работы на stdout выводится довольно подробный отчет о проделанных действиях. Вывод удобно перенаправлять в файл и потом смотреть его:

blend800 > log.txt

!!! Образы ищутся в пределах текущего каталога, поэтому в нем должны присутствовать только образы одного и того же диска !!!

Например (это вариант сравнения ранее присланного btk1 и ikpsrc7 - я так понял, это один и тот же диск) [мои комментарии начинаются с '-----']:

-----   Читает изображения, составляет карту сбойных блоков
>>> Find and loading images...
Add BTK1.DSK image, 1362 bad block(s)
Add SRCIKP7.DSK image, 14 bad block(s)
-----   Такая фраза относится к найденным файлам, но они не были опознаны как образы
l [0020] is not image


----- Здесь она просто сравнивает образы и удаляет из своего списка те, которые полностью совпадают
----- Если образ удаляется из списка, после его номера ставится буква 'd'
>>> Compare and delete images...
 0: BTK1.DSK -  1
 1: SRCIKP7.DSK -


----- Расчет дистанций между образами
>>> Calc and sort distance...
 0: BTK1.DSK -  1:1350
----- Сортировка образов в порядке увеличения дистанции
  [0.1:1350 ]
 1: SRCIKP7.DSK -  0:1350
  [0.0:1350 ]

----- Поиск сбойных блоков в каждом образе и попытка найти для них замену
----- Сектора внутри blender'а нумеруются подряд, начиная с 0,
----- но для удобства он в [] дает соответствие в формате tr/sc.
>>> Cure images...
=====  0: BTK1.DSK =====
Sector 67 [3/4] cured from SRCIKP7.DSK, distance = 1350
Donor for sector 77 [3/14] not found :(
Donor for sector 154 [7/7] not found :(
Donor for sector 156 [7/9] not found :(
Sector 163 [7/16] cured from SRCIKP7.DSK, distance = 1350
Sector 186 [8/18] cured from SRCIKP7.DSK, distance = 1350

----- [skip]

=====  1: SRCIKP7.DSK =====
Donor for sector 77 [3/14] not found :(
Donor for sector 154 [7/7] not found :(
Donor for sector 156 [7/9] not found :(
Donor for sector 275 [13/2] not found :(
Donor for sector 292 [13/19] not found :(
Donor for sector 949 [45/4] not found :(
Donor for sector 1042 [49/13] not found :(
Donor for sector 1464 [69/15] not found :(
Donor for sector 1670 [79/11] not found :(
Donor for sector 1671 [79/12] not found :(
Donor for sector 2014 [95/19] not found :(
Donor for sector 2299 [109/10] not found :(
Donor for sector 2678 [127/11] not found :(

----- Процесс поиска повторяется до тех пор, пока хотя бы в одном образе удается
----- успешно заменить хотя бы один сбойный сектор.

----- Снова ищем и удаляем полностью совпадающие имейджы.
>>> Compare and delete images...
 0: BTK1.DSK -  1d

----- Сохраняем уникальные
>>> Writing images...
BTK1.DSK.rep saved

В результате, после лечения двух образов, один из них был удален из результатов, т.к. не было найдено ни одного живого сектора, который бы в них различался. Причем, несмотря на то, что srcikp7 был гораздо живее, чем btk1, один сектор все же был выужен именно из btk1 (21/17) - в srcikp7 он не прочитался.

--

В общем, это сейчас уже мелочь, наверное: поскольку образы обрабатываются в ОЗУ, причем статически распределяемом, blender может для своей работы зараз захавать до 50 МБт и более оперативки.

--

Я использую blender как собранный для msdos так и для FreeBSD, но, вероятно, он легко соберется и для Windows и для Linux - в его коде нет никаких вывертов - чистые move и cmp + файловые операции.

--

!! Сбойные сектора опознаются по признаку наличия во всех байтах сектора значения ¤BD. Эта концепция используется в dos33.exe и моих линках, но, например, у Игоря линк помечает сбои по другому: dos33.exe знает этот вариант пометки, но blener - нет, поэтому не стоит подсовывать blendеру диски с других линков - есть риск залечить насмерть !!

Использование материалов проекта agatcomp без получения предварительного письменного разрешения agatcomp запрещено.


Почта для обратной связи: mail@agatcomp.ru


Живое общение по теме Агата: Telegram группа Agatcomp.


Накопленные знания и проекты: тематический ФОРУМ.


© 2004-2024 agatcomp.su / agatcomp.ru

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *