суббота, 19 января 2019 г.

Горячее отключение SATA-устройств в Linux.



Заметка, чтобы не забыть.
В Windows есть значок безопасного извлечения устройств, в графических окружениях для Linux тоже обычно что-то подобное есть изначально или легко устанавливается из репозиториев дистрибутива. Без графики сложнее, но тоже можно сделать безопасное отключение SATA-устройства.

В интернете я находил много разных инструкций. В итоги выработал для себя примерно такой сценарий.


Перед всеми действиями надо отмонтировать все файловые системы на извлекаемом диске, закрыть все криптоконтейнеры, остановить все массивы на нём и т.д. и т.п. Ещё желательно запустить программу "sync" после всего этого.

Основная идея всех последующих действий - отключение диска так, чтобы в SMART не увеличился параметр "Power-Off_Retract_Count", т.е. счётчик аварийных отключений питания.

Все команды выполняются с правами root.

Допустим, что надо отключить диск, который в системе виден как "/dev/sdd".

# Перевод диска в состояние offline
echo offline > /sys/class/block/sdd/device/state
# Удаление устройства из системы
echo 1 > /sys/class/block/sdd/device/delete

В логе ядра при этом должны появиться примерно такие сообщения:

kernel: sd 3:0:0:0: [sdd] Synchronizing SCSI cache
kernel: sd 3:0:0:0: [sdd] Stopping disk
kernel: ata4.00: disabled

После этих команд диск будет готов к отключению питания. Шпиндель будет остановлен, магнитные головки будут запаркованы, при отключении никаких странных звуков аварийной парковки не будет. Для SSD это тоже актуально, потому контроллеры могут странно реагировать на резкое пропадание питания.

После отключения питания диска в логах ядра появятся сообщения об изменении состояния порта:

kernel: ata4: exception Emask 0x10 SAct 0x0 SErr 0x90002 action 0xe frozen
kernel: ata4: irq_stat 0x00400000, PHY RDY changed
kernel: ata4: SError: { RecovComm PHYRdyChg 10B8B }
kernel: ata4: hard resetting link
kernel: ata4: SATA link down (SStatus 0 SControl 300)
kernel: ata4: EH complete