Я думаю, что возможно при присоединении процесса связанного интерпретатора к gdb. Я попробовал его этой остротой жемчуга
perl -e 'do { print "x\n"; sleep(1) } while(1)'
и это работает, но к сожалению не с подобным сценарием удара.
В первую очередь, необходимо выяснить PID того процесса, чей производит Вас, хотят получить. Затем запустите gdb
в другом терминале и выполняют следующие gdb-команды
attach PID
call close(2)
call open("/abs/olu/te/path/filename", 65, 384)
detach PID
после этого целые данные, которые записаны в stderr
перенаправляется к /abs/olu/te/path/filename
, с тех пор
attach PID
присоединяет процесс к gdb и останавливает егоcall close(2)
завершения stderr
filedescriptor процесса (для stdout
filedescriptor 1)call open(...)
открывает новый файл и берет самое низкое неиспользованное целое число для недавно созданного filedescriptor иdetach PID
продолжает процессПо крайней мере, на моей машине. Первыми двумя строками является совместимый POSIX, но не третий.
Второе и третий аргумент open
в третьей строке документируются в man 2 open
. В моем случае 65 средств это open
должен создать файл и открыть файл, только для записи т.е. O_WRONLY | O_CREAT
(определенный в fcntl.h
). Третий аргумент говорит открытый создавать файл с чтением и разрешением записи для пользователя т.е. S_IWUSR | S_IRUSR
(определенный в sys/stat.h
). Таким образом, возможно, необходимо узнать соответствующие значения на машине собой.
Поврежденные секторы всегда являются признаком провального жесткого диска, на самом деле момент, Вы видите ошибку ввода-вывода, такую как это, Вы, вероятно, уже теряли/повреждали некоторые данные. Сделайте резервное копирование, если Вы уже не имеете того, работаете сам тест smartctl -t long /dev/disk
и проверьте УМНЫЕ данные smartctl -a /dev/disk
. Получите замену, если Вы можете.
Поврежденные секторы не могут быть восстановлены, только заменены резервными секторами, который вредит производительности жесткого диска, поскольку они требуют дополнительный, ищет на резервные секторы каждый раз, когда к ним получают доступ. Отмечание таких секторов настолько плохо на слое файловой системы помогает, как к ним никогда не будут получать доступ затем; однако трудно определить, какие секторы были уже перераспределены диском, таким образом, возможности являются файловой системой, не будет знать для обхода затронутого региона.
Нет, поврежденные секторы являются не всегда признаком сбойного диска. Иногда, если запись будет происходить во время сбоя питания, то данные в секторе будут повреждены, приводя к ошибке, когда Вы попытаетесь считать его. Попытка записать новые данные в сектор может работать просто великолепно, так как нет ничего физически неправильно с ним.
Можно работать badblocks -n
на диске читать и переписать каждый сектор, или в Вашем случае, так как Вы уже знаете количество рассматриваемого сектора, можно использовать dd
записать нули в него. Можно проверить УМНУЮ статистику с smartctl -a
. Необходимо видеть, что ожидание перераспределило количество, указывают, сколько секторов не удалось читать, и после попытки записать сектору, это количество понизится. Перераспределенное количество сектора может повыситься, в этом случае это было физически плохо и было повторно отображено на запасном пуле, и это может быть знаком, что диск продвигается. В противном случае затем затем это было просто скремблировано и должно быть прекрасным теперь.
Попытайтесь читать сектор сначала:
dd count=1 if=/dev/sda of=/dev/null skip=nnnn
Если это перестало работать, то Вы имеете право числа, то можно обнулить его с:
dd count=1 if=/dev/zero of=/dev/sda seek=nnnn
Двойная проверка, чтобы Вы ввели команду точно перед ударом, входит.
Чтобы заставить диск перераспределить секторы, обычно в них нужно что-то записать. Однако, dd
(Disk Destroyer) не всегда работает и очень небезопасен: Если перепутать опции skip
и seek
, можно легко выстрелить в ногу, пропустив skip
ping первые блоки N
из /dev/zero
и записав блок с этого "смещения" над сектором 0 вашего жесткого диска.
Если вы действительно знаете, что хотите, чтобы сектор был перезаписан нулями, вам следует использовать hdparm
:
% sudo hdparm --read-sector 833192656 /dev/sda
/dev/sda:
reading sector 833192656: FAILED: Input/output error
Да, сектор 833192656 также не прошел smart-тестов. Чтобы записать в него нули, используйте --write-сектор
:
% sudo hdparm --write-sector 833192656 /dev/sda
/dev/sda:
Use of --write-sector is VERY DANGEROUS.
You are trying to deliberately overwrite a low-level sector on the media.
This is a BAD idea, and can easily result in total data loss.
Please supply the --yes-i-know-what-i-am-doing flag if you really want this.
Program aborted.
В качестве защиты, hdparm
на самом деле ничего не записывает, если только вы не передадите переключатель --yes-know-what-i-am-doing
в hdparm
:
% sudo hdparm --yes-i-know-what-i-am-doing --write-sector 833192656 /dev/sda
/dev/sda:
re-writing sector 833192656: succeeded
% sudo hdparm --read-sector 833192656 /dev/sda
/dev/sda:
reading sector 833192656: succeeded
0000 0000 0000 0000 0000 0000 0000 0000
[ ... more zeroes here... ]
0000 0000 0000 0000 0000 0000 0000 0000
%
Get a replacement if you can.
? Вы имеете в виду, заменяют Диск? – aircraft 20.11.2017, 10:28