The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Раздел полезных советов: Cкрипт ddrescue-loop с функцией автоматической остановки/перезапуска диска на SATA порту, auto_tips, 29-Ноя-23, 20:01  [смотреть все]
Cкрипт [[https://vk.com/doc14960727_670930009 ddrescue-loop v0.1]] с функцией автоматической остановки/перезапуска диска на SATA порту.

Предназначен для упрощения процесса восстановления данных с неисправных SATA SSD. В случаях когда после ошибок чтения - SSD перестает возвращать данные и требует остановки/перезапуска.

Для работы не требуется реле для отключения питания.
Использует интерфейсы ядра udev /dev и sysfs /sys.

Рекомендуется материнская плата с поддержкой AHCI.
На платформах Intel начиная с Soc-1156 и на AMD AM4/AM5 нужно включать Hot Plug в UEFI BIOS Setup для каждого порта отдельно.
На более старых AMD, но у которых в чипсете есть поддержка AHCI - сразу должно работать ничего специально включать не нужно.

   ddrescue-loop -ata N [-loop N] [-wait N] [-act N] outfile mapfile   [ddrescue options]

   ddrescue-loop -ata N -stop Остановить диск на SATA порту N
   ddrescue-loop -ata N -scan Cканировать SATA порт N

Номер соответствует порту на мат.плате, но нумерация всегда начинается с 1, а не с 0 как на платах Gigabyte например. См. вывод dmesg

Функция циклической остановки/перезапуска диска на SATA порту:

   -loop N Предельное число попыток N целое число. Указывать обязательно.

Таймер ожидания остановки/перезапуска диска:
   -wait N Время в секундах. 10 по умолчанию.

В конце после mapfile можно указать опции запуска ddrescue

Код ddrescue-loop:

#!/bin/sh
#ddrescue-loop script writen by gumanzoy <gumanzoy@gmail.com>

# Compatible only with Linux, not with other *nix!
# Depends on udev /dev and sysfs /sys kernel interfaces
# Requires SATA AHCI compatible motherboard
# For all Intel and modern AMD platforms (AM4 and newer), check the UEFI Setup
# SATA settings to ensure Port Hot Plug is enabled

# [RU] forum thread. Обсуждение
# https://forum.ixbt.com/topic.cgi?id=11:47589-31

# /* This program is free software. It comes without any warranty, to
# * the extent permitted by applicable law. You can redistribute it
# * and/or modify it under the terms of the Do What The Fuck You Want
# * To Public License, Version 2, as published by Sam Hocevar. See
# * http://www.wtfpl.net/ for more details. */

VERSION=0.1

showhelp () {
echo "ddrescue-loop v""$VERSION"" перезапускает процесс ddrescue в случае его завершения"
echo "Внимание следует соблюдать очередность аргументов"
echo "Указывать ключи в произвольном порядке нельзя!"
echo "Числовые значения аргументов обязательно через пробел"
echo -n "\n"
echo "# Остановить/запустить диск на SATA порту:"
echo "-ata <n> -stop""        ""остановить диск на SATA порту <n>"
echo "-ata <n> -scan""        ""сканировать SATA порт <n>"
echo -n "\n"
echo "# Запустить восстановление:"
echo "ddrescue-loop -ata <n> [-loop <n>] [-wait <n>] [-act <n>] outfile mapfile [ddrescue options]"
echo -n "\n"
echo "# Укажите номер SATA порта к которому подключен диск источник:"
echo -n "-ata <n>""        ""Номер SATA порта <n> цифра (смотрите вывод dmesg)"
echo -n "\n""            ""#: "; ls /sys/class/ata_port
echo -n "\n"
echo "# Функция циклической остановки/перезапуска диска на SATA порту:"
echo "-loop <n>""        ""<n> предельное число попыток"
echo -n "\n"
echo "# Таймер ожидания остановки/перезапуска диска:"
echo "-wait <n>""        ""Время в секундах <n> [10]"
echo -n "\n"
echo "# Переопределить таймаут ожидания исполнения ATA команд:"
echo "-act <n>""        ""Время в секундах <n> [1..30]"
echo -n "\n"
echo "# Основные:"
echo "outfile""            ""Устройство приемник данных / файл образа"
echo "mapfile""            ""ddrescue map/log файл (обязательно)"
echo -n "\n"
echo "# В конце после mapfile можно указать опции запуска ddrescue через пробел"
echo "# Поддержка зависит от версии. Полный список опций в мануале. Важные:"
echo "-P [<lines>]""        ""Предпросмотр данных [число строк] по умолчанию 3"
echo "-b 4096""            ""Размер сектора (физического блока) [default 512]"
echo "-O"" #Рекомендую!        ""После каждой ошибки заново открывать файл устройства"
echo "-J"" #Опционален        ""При ошибке перечитать последний не сбойный сектор"
echo "-r <n> #ИЛИ -r -1""    ""<n> число повторных проходов до перехода к trim"
echo "-m <domain.mapfile>""    ""Ограничить область чтения доменом <file> ddru_ntfsbitmap"
}

get_ata_host () {
until SCSIHOST=`readlink -f /sys/class/ata_port/ata"$1"/device/host?/scsi_host/host?/` \
&& test -d "$SCSIHOST"; do sleep 1; done
}

get_ata_target () {
until SYSFSTGT=`readlink -f /sys/class/ata_port/ata"$1"/device/host?/target?:?:?/?:?:?:?/` \
&& test -d "$SYSFSTGT"; do sleep 1; done
}

get_ata_dev () {
until INDEV=`readlink -f /dev/disk/by-path/pci-*-ata-"$1"` \
&& test -b "$INDEV"; do sleep 1; done
}

if [ "$1" = "-h" -o "$1" = "--help" ]; then showhelp
exit; fi

if [ "`whoami`" != "root" ]; then
echo Exit. This script should be run as root !
exit 1; fi

if [ -n "$1" ] && [ "$1" = "-ata" ]; then
if [ -n "$2" ] && test -d /sys/class/ata_port/ata"$2"; then
SATAP="$2"; get_ata_host "$SATAP"; shift; shift
else echo -n "Please enter correct port number: "; ls /sys/class/ata_port; exit 1; fi
fi

if [ -n "$1" ] && [ "$1" = "-loop" ]; then
if [ -n "$2" ] && [ "$2" -gt 0 ]; then
DDLOOP="$2"; shift; shift; fi
else DDLOOP=0
fi

if [ -n "$1" ] && [ "$1" = "-wait" ]; then
if [ -n "$2" ] && [ "$2" -gt 0 ]; then
LOOPWAIT="$2"; shift; shift; fi
else LOOPWAIT=10
fi

if [ -n "$1" ] && [ "$1" = "-act" ]; then
if [ -n "$2" ] && [ "$2" -gt 0 -a "$2" -lt 30 ]; then
ATACMDT="$2"; shift; shift; fi
fi

if [ -n "$1" ] && [ "$1" = "-stop" ] && [ -n "$SATAP" ]; then
get_ata_target "$SATAP"
while test -f "$SYSFSTGT"/delete; do echo 1 > "$SYSFSTGT"/delete; sleep 1; done
exit; fi

if [ -n "$1" ] && [ "$1" = "-scan" ] && [ -n "$SATAP" ]; then
echo '0 0 0' > "$SCSIHOST"/scan; exit; fi

if [ -z "$SATAP" ]; then showhelp
exit; fi

OUTFILE="$1"; shift
MAPFILE="$1"; shift
DDOPTS="$@"

DONE=X
LOOPCOUNT=0

until [ "$DONE" = 0 ]; do
get_ata_target "$SATAP"; get_ata_dev "$SATAP"
if [ -n "$ATACMDT" ]; then echo "$ATACMDT" > "$SYSFSTGT"/timeout
fi
echo ddrescue "-fd" "$INDEV" "$OUTFILE" "$MAPFILE" "$DDOPTS"
ddrescue "-fd" "$INDEV" "$OUTFILE" "$MAPFILE" $DDOPTS
DONE="$?"
if [ "$DONE" != 0 ] && [ "$DDLOOP" -gt 0 ]; then
sleep "$LOOPWAIT"
while test -d "$SYSFSTGT"; do echo 1 > "$SYSFSTGT"/delete
sleep "$LOOPWAIT"; done
sleep "$LOOPWAIT" && echo '0 0 0' > "$SCSIHOST"/scan
DDLOOP=$(($DDLOOP-1))
LOOPCOUNT=$(($LOOPCOUNT+1))
echo "\n\033[1mDDLOOP" "#""$LOOPCOUNT"
tput sgr0
date
echo -n "\n"
else DONE=0
fi
done


URL: https://vk.com/doc14960727_670930009
Обсуждается: https://www.opennet.ru/tips/info/3236.shtml




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру