SSD производства Kimtigo на контроллере Maxio MAP1202
Подключаю через док станцию AgeStar 31CBNV1C на контроллере JMicron JMS583 USB-NVMe
Помогает только отключение-включение переключателем на док станции.
Реле пришло. Все работает как и задумано.
Вот доработанный вариант скрипта ddrescue-loop-v0.2.1.gz
Подключаю через док станцию AgeStar 31CBNV1C на контроллере JMicron JMS583 USB-NVMe
Помогает только отключение-включение переключателем на док станции.
Реле пришло. Все работает как и задумано.
Вот доработанный вариант скрипта ddrescue-loop-v0.2.1.gz
ddrescue-loop-v0.2.1
001 | #!/bin/sh |
002 | #ddrescue-loop script writen by gumanzoy <gumanzoy@gmail.com> |
003 | |
004 | # Compatible only with Linux, not with other *nix! |
005 | # Depends on udev /dev and sysfs /sys kernel interfaces |
006 | |
007 | # For SATA requires AHCI compatible motherboard |
008 | # For all Intel and modern AMD platforms (AM4 and newer), check the UEFI Setup |
009 | # SATA settings to ensure Port Hot Plug is enabled |
010 | |
011 | # For USB requires lsusb from usbutils package |
012 | # And optional uhubctl for power off/on cycle |
013 | # Or hardware USB Relay Module LCUS-1 CH340 |
014 | |
015 | # [RU] forum thread. Обсуждение |
016 | # https: //forum.ixbt.com/topic.cgi?id=11:47589-31 |
017 | |
018 | # /* This program is free software. It comes without any warranty, to |
019 | # * the extent permitted by applicable law. You can redistribute it |
020 | # * and/or modify it under the terms of the Do What The F... You Want |
021 | # * To Public License, Version 2, as published by Sam Hocevar. See |
022 | # * http://www.wtfpl.net/ for more details. */ |
023 | |
024 | VERSION=0.2.1 |
025 | |
026 | showhelp () { |
027 | echo "ddrescue-loop v" "$VERSION" " перезапускает процесс ddrescue в случае его завершения" |
028 | echo "Внимание следует соблюдать очередность аргументов" |
029 | echo "Указывать ключи в произвольном порядке нельзя!" |
030 | echo "Числовые значения аргументов обязательно через пробел" |
031 | echo -n "\n" |
032 | echo "# ----- SATA ----- SATA ----- SATA ----- SATA ----- SATA -----" |
033 | echo "# Остановить/запустить диск на SATA порту:" |
034 | echo "-ata <n> -stop" " " "остановить диск на SATA порту <n>" |
035 | echo "-ata <n> -scan" " " "сканировать SATA порт <n>" |
036 | echo -n "\n" |
037 | echo "# Запустить восстановление c SATA:" |
038 | echo "ddrescue-loop -ata <n> [-loop <n>] [-pwc] [-wait <n>] [-act <n>] outfile mapfile [ddrescue options]" |
039 | echo -n "\n" |
040 | echo "# Укажите номер SATA порта к которому подключен диск источник:" |
041 | echo -n "-ata <n>" " " "Номер SATA порта <n> цифра (смотрите вывод dmesg)" |
042 | echo -n "\n" " " "#: " ; ls /sys/ class /ata_port |
043 | echo -n "\n" |
044 | echo "# Функция циклической остановки/перезапуска диска на SATA порту:" |
045 | echo "-loop <n>" " " "<n> предельное число попыток" |
046 | echo -n "\n" |
047 | echo "# Таймер ожидания остановки/перезапуска диска:" |
048 | echo "-wait <n>" " " "Время в секундах <n> [10]" |
049 | echo -n "\n" |
050 | echo "# Переопределить таймаут ожидания исполнения ATA команд:" |
051 | echo "-act <n>" " " "Время в секундах <n> [30]" |
052 | echo -n "\n" |
053 | echo "# ------ USB ------ USB ------ USB ------ USB ------ USB -----" |
054 | echo "# Отключить/включить питание USB устройства <ID>, методом <hub/rle>:" |
055 | echo "-usb <ID> -pwc hub" " " "Использовать uhubctl --search <ID>" |
056 | echo "-usb <ID> -pwc rle" " " "Использовать USB реле LCUS-1 CH340 RLETTY=" "$RLETTY" |
057 | echo -n "\n" |
058 | echo "# Запустить восстановление c USB:" |
059 | echo "ddrescue-loop -usb <ID> [-loop <n>] [-pwc <hub/rle>] [-wait <n>] outfile mapfile [ddrescue options]" |
060 | echo -n "\n" |
061 | echo "# Укажите Hex идентификаторы VID:PID USB устройства источника:" |
062 | echo "-usb <ID>" " " "<VID:PID> через двоеточие (смотрите вывод lsusb)" |
063 | echo -n "\n" |
064 | echo "# Функция циклического перезапуска ddrescue:" |
065 | echo "-loop <n>" " " "<n> предельное число попыток" |
066 | echo -n "\n" |
067 | echo "# Основные:" |
068 | echo "outfile" " " "Устройство приемник данных / файл образа" |
069 | echo "mapfile" " " "ddrescue map/log файл (обязательно)" |
070 | echo -n "\n" |
071 | echo "# В конце после mapfile можно указать опции запуска ddrescue через пробел" |
072 | echo "# Поддержка зависит от версии. Полный список опций в мануале. Важные:" |
073 | echo "-P [<n>]" " " "Предпросмотр данных [число строк] по умолчанию 3" |
074 | echo "-b 4096" " " "<bytes> размер сектора (физического блока) [default 512]" |
075 | echo "-c <n>" " " "Размер кластера <n> секторов за раз [default 128]" |
076 | echo "-O" " #Рекомендую! " "После каждой ошибки заново открывать файл устройства" |
077 | echo "-J" " #Опционален " "При ошибке перечитать последний не сбойный сектор" |
078 | echo "-r <n> #ИЛИ -r -1" " " "<n> число повторных проходов до перехода к trim" |
079 | echo "-m <domain.mapfile>" " " "Ограничить область чтения доменом <file> ddru_ntfsbitmap" |
080 | } |
081 | |
082 | get_ata_host () { |
083 | until SCSIHOST=` readlink -f /sys/ class /ata_port/ata "$1" /device/host?/scsi_host/host?/` \ |
084 | && test -d "$SCSIHOST" ; do sleep 1; done |
085 | } |
086 | |
087 | get_ata_target () { |
088 | until SYSFSTGT=` readlink -f /sys/ class /ata_port/ata "$1" /device/host?/target?:?:?/?:?:?:?/` \ |
089 | && test -d "$SYSFSTGT" ; do sleep 1; done |
090 | } |
091 | |
092 | get_ata_dev () { |
093 | until INDEV=` readlink -f /dev/disk/by-path/pci-*-ata- "$1" ` \ |
094 | && test -b "$INDEV" ; do sleep 1; done |
095 | } |
096 | |
097 | device_delete () { |
098 | while test -f "$SYSFSTGT" / delete ; do echo 1 > "$SYSFSTGT" / delete ; sleep 1; done |
099 | } |
100 | |
101 | get_usb_dev_by_path () { |
102 | INDEV= "/dev/" ` basename "$1" ` |
103 | SYSFSTGT= "$1" "/device/" |
104 | } |
105 | |
106 | get_usb_dev_by_id () { |
107 | IDVID=` echo -n "$1" | cut -d ":" -f1` |
108 | IDPID=` echo -n "$1" | cut -d ":" -f2` |
109 | |
110 | until get_usb_dev_by_path `udevadm trigger -v -n -s block \ |
111 | -p ID_VENDOR_ID= "$IDVID" -p ID_MODEL_ID= "$IDPID" ` \ |
112 | && test -b "$INDEV" ; do sleep 1; done |
113 | } |
114 | |
115 | power_cycle () { |
116 | if [ -n "$USBID" ] && [ "$PWRCTL" = hub ]; then |
117 | uhubctl --search "$USBID" --action cycle --delay "$LOOPWAIT" |
118 | elif [ "$PWRCTL" = rle ]; then /bin/ echo -en "\xA0\x01\x01\xA2" > "$RLETTY" && \ |
119 | sleep "$LOOPWAIT" && /bin/ echo -en "\xA0\x01\x00\xA1" > "$RLETTY" |
120 | fi |
121 | } |
122 | |
123 | if [ "$1" = "-h" -o "$1" = "--help" ]; then showhelp |
124 | exit ; fi |
125 | |
126 | if [ "`whoami`" != "root" ]; then |
127 | echo Exit . This script should be run as root ! |
128 | exit 1; fi |
129 | |
130 | if [ -z "$RLETTY" ] && test -c /dev/ttyUSB0; then RLETTY= "/dev/ttyUSB0" |
131 | elif [ -n "$RLETTY" ] && ! test -c "$RLETTY" ; then |
132 | echo "RLETTY=" "$RLETTY" " control device not found" ; exit 1; fi |
133 | |
134 | if [ -n "$1" ] && [ "$1" = "-ata" ]; then |
135 | if [ -n "$2" ] && test -d /sys/ class /ata_port/ata "$2" ; then |
136 | SATAP= "$2" ; get_ata_host "$SATAP" ; shift; shift |
137 | else echo -n "Please enter correct port number: " ; ls /sys/ class /ata_port; exit 1; fi |
138 | fi |
139 | |
140 | if [ -n "$1" ] && [ "$1" = "-stop" ] && [ -n "$SATAP" ]; then |
141 | get_ata_target "$SATAP" ; device_delete; exit ; fi |
142 | |
143 | if [ -n "$1" ] && [ "$1" = "-scan" ] && [ -n "$SATAP" ]; then |
144 | echo '0 0 0' > "$SCSIHOST" /scan; exit ; fi |
145 | |
146 | if [ -n "$1" ] && [ "$1" = "-usb" ] && [ -z "$SATAP" ]; then |
147 | if [ -n "$2" ] && lsusb -d "$2" ; then |
148 | USBID= "$2" ; get_usb_dev_by_id "$USBID" ; shift; shift |
149 | else echo "Please enter correct USB Device ID:" |
150 | lsusb | cut -d ":" -f2,3 | grep -vi hub |
151 | exit 1; fi |
152 | fi |
153 | |
154 | if [ -n "$1" ] && [ "$1" = "-loop" ]; then |
155 | if [ -n "$2" ] && [ "$2" -gt 0 ]; then |
156 | DDLOOP= "$2" ; shift; shift; fi |
157 | else DDLOOP=0 |
158 | fi |
159 | |
160 | if [ -n "$1" ] && [ "$1" = "-pwc" ]; then |
161 | if [ -n "$USBID" ] && [ -n "$2" ] && [ "$2" = "hub" -o "$2" = "rle" ]; then |
162 | PWRCTL= "$2" ; echo "PWRCTL=" "$2" ; shift; shift |
163 | elif [ -n "$RLETTY" ]; then |
164 | PWRCTL= "rle" ; echo "PWRCTL=rle" ; shift; fi |
165 | fi |
166 | |
167 | if [ -n "$1" ] && [ "$1" = "-wait" ]; then |
168 | if [ -n "$2" ] && [ "$2" -gt 0 ]; then |
169 | LOOPWAIT= "$2" ; shift; shift; fi |
170 | else LOOPWAIT=10 |
171 | fi |
172 | |
173 | if [ -n "$1" ] && [ "$1" = "-act" ]; then |
174 | if [ -n "$2" ] && [ "$2" -gt 0 ]; then |
175 | ATACMDT= "$2" ; shift; shift; fi |
176 | fi |
177 | |
178 | if [ -n "$RLETTY" ] && [ "$PWRCTL" = rle ]; then |
179 | stty -F "$RLETTY" 9600 - echo && echo "RLETTY=" "$RLETTY" ; fi |
180 | |
181 | if [ "$DDLOOP" = 0 ]; then |
182 | if [ -n "$USBID" ] && [ "$PWRCTL" = hub ]; then power_cycle; exit |
183 | elif [ -n "$RLETTY" ] && [ "$PWRCTL" = rle ]; then power_cycle; exit ; fi |
184 | fi |
185 | |
186 | if [ -z "$SATAP" ] && [ -z "$USBID" ]; then showhelp |
187 | exit ; fi |
188 | |
189 | OUTFILE= "$1" ; shift |
190 | MAPFILE= "$1" ; shift |
191 | DDOPTS= "$@" |
192 | |
193 | DONE=X |
194 | LOOPCOUNT=0 |
195 | |
196 | until [ "$DONE" = 0 ]; do |
197 | |
198 | if [ -n "$SATAP" ]; then get_ata_target "$SATAP" ; get_ata_dev "$SATAP" |
199 | elif [ "$LOOPCOUNT" -gt 0 ] && [ -n "$USBID" ]; then get_usb_dev_by_id "$USBID" |
200 | fi |
201 | |
202 | if [ -n "$ATACMDT" ]; then echo "$ATACMDT" > "$SYSFSTGT" /timeout |
203 | fi |
204 | |
205 | echo ddrescue "-fd" "$INDEV" "$OUTFILE" "$MAPFILE" "$DDOPTS" |
206 | ddrescue "-fd" "$INDEV" "$OUTFILE" "$MAPFILE" $DDOPTS |
207 | DONE= "$?" |
208 | |
209 | if [ "$DONE" != 0 ] && [ "$DDLOOP" -gt 0 ]; then |
210 | |
211 | device_delete & |
212 | sleep "$LOOPWAIT" |
213 | |
214 | if [ -n "$PWRCTL" ]; then power_cycle |
215 | elif [ -n "$SATAP" ]; then while test -d "$SYSFSTGT" ; do |
216 | sleep "$LOOPWAIT" ; done; fi |
217 | |
218 | if [ -n "$SATAP" ]; then sleep "$LOOPWAIT" |
219 | echo '0 0 0' > "$SCSIHOST" /scan; fi |
220 | |
221 | DDLOOP=$(( $DDLOOP -1)) |
222 | LOOPCOUNT=$(( $LOOPCOUNT +1)) |
223 | |
224 | echo "\n\033[1mDDLOOP #" "$LOOPCOUNT" ; tput sgr0 |
225 | date ; echo -n "\n" |
226 | |
227 | sleep "$LOOPWAIT" |
228 | |
229 | else DONE=0 |
230 | fi |
231 | done |
1 | ddrescue-loop -usb 152d:0583 -loop 9999 -pwc -wait 4 /dev/loop1 homenet512-0324.log -b 4096 -c 32 -O -J |
Исправлено: gumanzoy, 25.12.2023 20:20
К сообщению приложены файлы: