Програмный ремонт жёстких дисков HDD (Програмный (и не только) ремонт классических жёстких дисков HDD /Seagate /Samsung /IBM /Hitachi /HGST /Western Digital)

FAQ, мануалы, полезные ссылки
i8088
Advanced Member
Сообщения: 2480
Зарегистрирован: 30.01.2015,17:06
Откуда: г. Баку, Азербайджан

Конкурсы

Вклад в сообщество

Сообщение i8088 » 18.05.2018,10:07

Относительно редактирования SMART, идея такая. По команде 1>N05 получаем дамп SMART атрибутов, скорее всего он будет соответствовать
одному из секторов vnd track (проверить). Если это то же, что отдается по команде READ SMART DATA, то нужно правильно отредактировать
этот сектор и записать его (у него простая КС). В ATA стандарте поля этого сектора, касающиеся атрибутов, отмечены как vendor specific, но
может помочь документация на конкретные диски и исходный код smartmon.

Кроме того, считаю правильным сперва сбросить SMART, а потом занести старые значения часов работы и вкл/выкл, тк при сбросе чистятся и
логи SMART (там можно посмотреть, на каких LBA были ошибки, после скана это нам конечно не нужно). Да и reallocated event count и UDMA
SRC error count тоже ни к чему старые оставлять.

Такие мысли, осталось поработать над этим.

i8088
Advanced Member
Сообщения: 2480
Зарегистрирован: 30.01.2015,17:06
Откуда: г. Баку, Азербайджан

Конкурсы

Вклад в сообщество

Сообщение i8088 » 19.05.2018,08:43

SMART сектор хранится по смещению 0x400 (сектор 0x02) в vnd треке, написал разборщик его,
похоже на правду.

Не смог найти документацию на интерпритацию raw значений конкретно для Seagate, так
атрибут 1 и 195 видимо нужно умножать на коэффициент (или какое другое преобразование).
КС тоже непохоже что есть. Остальные значения предположительно хранятся как uint32_t.
Буду признателен, если кто подскажет по SMART документации конкретно на Seagate Barracuda

Пока разборщик вот так отработал со SMART сектором на недавней ALPINE FW 3.06

Код: Выделить всё

SMART structure version 0x000a
ID 001, flags 0x000f, val 061, worst 051 raw   56409381
ID 003, flags 0x0003, val 098, worst 098 raw          0
ID 004, flags 0x0032, val 100, worst 100 raw         99
ID 005, flags 0x0033, val 100, worst 100 raw          0
ID 007, flags 0x000f, val 082, worst 060 raw  187249042
ID 009, flags 0x0032, val 097, worst 097 raw       3190
ID 010, flags 0x0013, val 100, worst 100 raw          0
ID 012, flags 0x0032, val 097, worst 097 raw       3500
ID 194, flags 0x0022, val 035, worst 053 raw         35
ID 195, flags 0x001a, val 061, worst 051 raw   56409381
ID 197, flags 0x0012, val 100, worst 100 raw          0
ID 198, flags 0x0010, val 100, worst 100 raw          0
ID 199, flags 0x003e, val 200, worst 200 raw          0
ID 200, flags 0x0000, val 100, worst 253 raw          0
ID 202, flags 0x0032, val 100, worst 253 raw          0

strelec
Junior Member
Сообщения: 135
Зарегистрирован: 03.04.2018,17:33
Откуда: Кемерово

Сообщение strelec » 19.05.2018,10:57

i8088,
Все верно, смарт хранится во 2-ом сект. vendor трека(по смещению 0x400).
Для обнуления например, атрибутов 5, 187 делал так.
смещения атрибутов:
атрибут 5 -смещение 0x29;
атрибут 187- смещение 0x65.
Правим первые два байта, ставим значения 0x64, следующие
два -0x00.
Заливаем любым удобным способом.
Проверяем-все работает.
Экспериментировал с TLITE1HD.

i8088
Advanced Member
Сообщения: 2480
Зарегистрирован: 30.01.2015,17:06
Откуда: г. Баку, Азербайджан

Конкурсы

Вклад в сообщество

Сообщение i8088 » 19.05.2018,12:18

strelec писал(а):атрибут 5 -смещение 0x29;
0x29 это val, 0x30 worst, далее 4 байта - raw (порядок Intel, младший первый).

Интересно, если поменять только raw, FW пересчитает val и worst автоматически?

Я добавляю в разборщик функцию редактирования желаемого атрибута, чтобы делать эти
манипуляции с удобством.

Попробую на дисках, где был сброшен SMART, записать значения start/stop и hours
как сумму текущего и старого.

strelec
Junior Member
Сообщения: 135
Зарегистрирован: 03.04.2018,17:33
Откуда: Кемерово

Сообщение strelec » 19.05.2018,12:27

i8088 писал(а):Попробую на дисках, где был сброшен SMART, записать значения start/stop и hours
как сумму текущего и старого.
С "часами" такой фокус не прокатил ))(смещение 0x41).

strelec
Junior Member
Сообщения: 135
Зарегистрирован: 03.04.2018,17:33
Откуда: Кемерово

Сообщение strelec » 19.05.2018,12:36

i8088 писал(а):Интересно, если поменять только raw, FW пересчитает val и worst автоматически?
Val пересчитывает, wrst нет.

i8088
Advanced Member
Сообщения: 2480
Зарегистрирован: 30.01.2015,17:06
Откуда: г. Баку, Азербайджан

Конкурсы

Вклад в сообщество

Сообщение i8088 » 19.05.2018,12:39

OK, спасибо, поковыряюсь!

i8088
Advanced Member
Сообщения: 2480
Зарегистрирован: 30.01.2015,17:06
Откуда: г. Баку, Азербайджан

Конкурсы

Вклад в сообщество

Сообщение i8088 » 19.05.2018,21:53

Причина "нередактируемости" некоторых атрибутов видимо в том, что начиная со смещения
SMART sector 386 (0x182) идут еще vendor-specific поля, в которых некоторые атрибуты по
непонятной системе дублируются (надо искать документацию для Seagate's HDD). Я нашел
поле, где дублировались часы работы, но установка их одинаковым с основным полем часов
не решила проблему, часы работы сбрасываются при первом же чтении SMART, или
инкременте счетчика часов, или команде 1>N02 в терминале.

При редактировании же исходного SMART (диск TONKA2 80GB, SATA), у меня возвращались к
исходным сбойные атрибуты 197 и 198 (они установились в 0xFFFFFFFF,те (2^32-1) видимо
из-за сбоя SMART). Я нашел последовательность FFFFFFFF по адресу 0x5AA vnd_track, и изменил на
00000000. После этого возврат к 0xFFFFFFFF происходить перестал.

Я писал только один отредактированный SMART сектор, а SMART логи я сбросил ранее. Такие же
атрибуты как start/stop, UDMA CRC error, reallocated sectors, reported uncorrect,
power cycle count - редактировались без проблем. Val, да ставится сам по raw, но на всякий
случай в программе он тоже задается.

Вот такой программой я пользовался

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>
#include <sys/types.h>

#define	SMART_OFFSET	0x400L
#define	ENTRY_SIZE	12
#define	RADIX		0	//auto detection base

int main(int argc, char *argv[]) {
/* Variables declarations*/
unsigned short int i;
uint8_t att_entry[ENTRY_SIZE];
uint16_t struct_ver;
uint8_t cmd_id, cmd_val, cmd_worst;
uint32_t cmd_raw;
uint32_t* raw_val;
FILE* vnd_trk;

    if(argc < 2) {
	printf("SMART sector editor\n");
	printf("Usage: smartatt <input_file> [id val worst raw]\n");
	exit(EXIT_SUCCESS);
    }

    vnd_trk = fopen(argv[1],"rb+");
	if (vnd_trk == NULL) {
	perror(argv[1]);
	exit(EXIT_FAILURE);
	}

    fseek(vnd_trk, SMART_OFFSET, SEEK_SET);
    fread(&struct_ver, 2, 1, vnd_trk);
    printf("SMART structure version 0x%04x\n", struct_ver);

    for (i=1; i <= 42 ; i++) {  //42
	if (feof(vnd_trk)) {
	    printf (" Input file too short, stop\n");
	    break;
	}

	fread(att_entry, ENTRY_SIZE, 1, vnd_trk);
	if (!att_entry[0])
	    break;

	if (argc == 6) {
	    cmd_id = (uint8_t)strtol(argv[2], NULL, RADIX);
	    if (cmd_id == att_entry[0]) {	//if id equal to cmd line arg
		cmd_val = (uint8_t)strtol(argv[3], NULL, RADIX);
		cmd_worst = (uint8_t)strtol(argv[4], NULL, RADIX);
		cmd_raw = (uint32_t)strtol(argv[5], NULL, RADIX);
		raw_val = (uint32_t*)&att_entry[5];
		
		//write val
		fseek(vnd_trk, -9, SEEK_CUR);
		fwrite(&cmd_val, sizeof(uint8_t), 1, vnd_trk);
		
		//write worst
		fwrite(&cmd_worst, sizeof(uint8_t), 1, vnd_trk);
		
		//write raw value
		fwrite(&cmd_raw, sizeof(uint32_t), 1, vnd_trk);
		fseek(vnd_trk, +3, SEEK_CUR);
		
		//update att entries
		att_entry[3] = cmd_val;
		att_entry[4] = cmd_worst;
		*((uint32_t*)&att_entry[5]) = cmd_raw;
	    }
	}
	printf("ID %03d, flags 0x%02x%02x, val %03d, worst %03d, %10u\n",
	    att_entry[0], att_entry[2], att_entry[1], att_entry[3],
	    att_entry[4], *((uint32_t*)&att_entry[5]));
    }
fclose(vnd_trk);
return 0;
}
Все числа вводятся по правилам Си, те например 077 - восьмеричное, 77 - десятичное,
0x77 шестнадцатеричное (тк RADIX 0)

./smartatt file просмотр атрибутов, file - файл vnd track, с редактируемым SMART сектором по смещению 0x400
./smartatt file id val worst raw - редактирование атрибута id, выставляем параметры val worst raw

strelec
Junior Member
Сообщения: 135
Зарегистрирован: 03.04.2018,17:33
Откуда: Кемерово

Сообщение strelec » 20.05.2018,11:00

Нашел я, как установить нужный "пробег" после сброса
смарта. С остальными атрибутами уже все понятно.
Отвечают за это байты [0x5A2-0x5A7].
Например ,нам нужна наработка 9000ч. :
2328h*20h=046500h. Соответственно строку правим :[00 00 00 00 65 04].
Заливаем, проверяем.
Я думаю,что для всех барракуд должно работать.Надо проверять.

i8088
Advanced Member
Сообщения: 2480
Зарегистрирован: 30.01.2015,17:06
Откуда: г. Баку, Азербайджан

Конкурсы

Вклад в сообщество

Сообщение i8088 » 20.05.2018,11:26

strelec, те там счетчик с большим разрешением?

У GALAXY и TONKA2 очень похоже, а у вот ALPINE возможно по другому, и там нет дублирующего
счетчика по адресу 0x5DA. Надо проверить.

Я предлагаю еще один вариант. Сохраняем текущий VND track, далее сброс SMART, для очистки
старых логов, а потом редактируем старый SMART, часы останутся, остальное редактируется легко,
хотя могут быть трудности с атрибутами 197 и 198 (как я писал).

strelec
Junior Member
Сообщения: 135
Зарегистрирован: 03.04.2018,17:33
Откуда: Кемерово

Сообщение strelec » 20.05.2018,11:31

i8088 писал(а):Я предлагаю еще один вариант. Сохраняем текущий VND track, далее сброс SMART, для очистки
старых логов, а потом редактируем старый SMART, часы останутся, остальное редактируется легко,
хотя могут быть трудности с атрибутами 197 и 198 (как я писал).
Я так и делал))
Но мне было интересно разобраться с часами...
В старом компе вроде стоит альпина. Надо откопать и проверить)
С атрибутами 197,198 я решал также, как и вы.

Ответить