eSATA hot swap einer externen HDD

Ich habs geschafft. Für zukünftige Leute die keine Lust haben den Weg zur Lösung in diesem Thread zu lesen, hier die komplette Lösung.

tl;dr

SATA Hot Plug / Hot Swap muss im BIOS des Mainboards aktiviert sein und der SATA Controller muss im AHCI Modus laufen.

Damit SATA Hot Plug in Linux funktioniert, muss das Power Managment des SATA Ports mindestens auf “max_performance” stehen. Quelle: 3.6. Aggressive Link Power Management Red Hat Enterprise Linux 6 | Red Hat Customer Portal

Die aktuellen Werte vom SATA (AHCI) Power Managment aka Aggressive Link Power Management (ALPM) kann man wie folgt anzeigen lassen:

user@pc ~> cat /sys/class/scsi_host/host*/link_power_management_policy
med_power_with_dipm
med_power_with_dipm
med_power_with_dipm
med_power_with_dipm
med_power_with_dipm
med_power_with_dipm

PC ausschalten und SATA Festplatte an den gewünschten SATA Hot Plug Port anschließen, PC einschalten. Block devices (Festplatten) auflisten:

user@pc ~> lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    0   7,3T  0 disk 
└─sda1        8:1    0   7,3T  0 part /media/DATA1
sdb           8:16   0 953,9G  0 disk 
├─sdb1        8:17   0   300M  0 part 
├─sdb2        8:18   0 944,8G  0 part 
└─sdb3        8:19   0   8,8G  0 part 
nvme0n1     259:0    0 931,5G  0 disk 
├─nvme0n1p1 259:1    0   300M  0 part /boot/efi
└─nvme0n1p2 259:2    0 931,2G  0 part

In diesem Beispiel wurde die gewünschte SATA Hot Plug Festplatte als device /dev/sdb erkannt, um den dazu passenden SATA Port zu ermitteln machen wir:

user@pc ~> udevadm info -a -n /dev/sdb

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:17.0/ata2/host1/target1:0:0/1:0:0:0/block/sdb':
    KERNEL=="sdb"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{alignment_offset}=="0"
    ATTR{capability}=="50"
    ATTR{discard_alignment}=="0"
    ATTR{events}==""
    ATTR{events_async}==""
    ATTR{events_poll_msecs}=="-1"
    ATTR{ext_range}=="256"
    ATTR{hidden}=="0"
    ATTR{inflight}=="       0        0"
    ATTR{integrity/device_is_integrity_capable}=="0"
    ATTR{integrity/format}=="none"
    ATTR{integrity/protection_interval_bytes}=="0"
    ATTR{integrity/read_verify}=="0"
    ATTR{integrity/tag_size}=="0"
    ATTR{integrity/write_generate}=="0"
    ATTR{mq/0/cpu_list}=="0, 1, 2, 3, 4, 5, 6, 7"
    ATTR{mq/0/nr_reserved_tags}=="0"
    ATTR{mq/0/nr_tags}=="32"
    ATTR{power/control}=="auto"
    ATTR{power/runtime_active_time}=="0"
    ATTR{power/runtime_status}=="unsupported"
    ATTR{power/runtime_suspended_time}=="0"
    ATTR{queue/add_random}=="0"
    ATTR{queue/chunk_sectors}=="0"
    ATTR{queue/dax}=="0"
    ATTR{queue/discard_granularity}=="512"
    ATTR{queue/discard_max_bytes}=="2147450880"
    ATTR{queue/discard_max_hw_bytes}=="2147450880"
    ATTR{queue/discard_zeroes_data}=="0"
    ATTR{queue/fua}=="0"
    ATTR{queue/hw_sector_size}=="512"
    ATTR{queue/io_poll}=="0"
    ATTR{queue/io_poll_delay}=="-1"
    ATTR{queue/io_timeout}=="30000"
    ATTR{queue/iosched/async_depth}=="1"
    ATTR{queue/iosched/fifo_batch}=="16"
    ATTR{queue/iosched/front_merges}=="1"
    ATTR{queue/iosched/read_expire}=="500"
    ATTR{queue/iosched/write_expire}=="5000"
    ATTR{queue/iosched/writes_starved}=="2"
    ATTR{queue/iostats}=="1"
    ATTR{queue/logical_block_size}=="512"
    ATTR{queue/max_discard_segments}=="1"
    ATTR{queue/max_hw_sectors_kb}=="32767"
    ATTR{queue/max_integrity_segments}=="0"
    ATTR{queue/max_sectors_kb}=="1280"
    ATTR{queue/max_segment_size}=="65536"
    ATTR{queue/max_segments}=="168"
    ATTR{queue/minimum_io_size}=="512"
    ATTR{queue/nomerges}=="0"
    ATTR{queue/nr_requests}=="64"
    ATTR{queue/nr_zones}=="0"
    ATTR{queue/optimal_io_size}=="0"
    ATTR{queue/physical_block_size}=="512"
    ATTR{queue/read_ahead_kb}=="128"
    ATTR{queue/rotational}=="0"
    ATTR{queue/rq_affinity}=="1"
    ATTR{queue/scheduler}=="[mq-deadline] kyber bfq none"
    ATTR{queue/stable_writes}=="0"
    ATTR{queue/throttle_sample_time}=="20"
    ATTR{queue/virt_boundary_mask}=="0"
    ATTR{queue/wbt_lat_usec}=="2000"
    ATTR{queue/write_cache}=="write back"
    ATTR{queue/write_same_max_bytes}=="0"
    ATTR{queue/write_zeroes_max_bytes}=="0"
    ATTR{queue/zone_append_max_bytes}=="0"
    ATTR{queue/zone_write_granularity}=="0"
    ATTR{queue/zoned}=="none"
    ATTR{range}=="16"
    ATTR{removable}=="0"
    ATTR{ro}=="0"
    ATTR{size}=="2000409264"
    ATTR{stat}=="     155        0     8031       63        2        0        0        0        0       40       63        0        0        0        0        2        0"
    ATTR{trace/act_mask}=="disabled"
    ATTR{trace/enable}=="0"
    ATTR{trace/end_lba}=="disabled"
    ATTR{trace/pid}=="disabled"
    ATTR{trace/start_lba}=="disabled"

  looking at parent device '/devices/pci0000:00/0000:00:17.0/ata2/host1/target1:0:0/1:0:0:0':
    KERNELS=="1:0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS=="sd"
    ATTRS{blacklist}==""
    ATTRS{device_blocked}=="0"
    ATTRS{device_busy}=="0"
    ATTRS{dh_state}=="detached"
    ATTRS{eh_timeout}=="10"
    ATTRS{evt_capacity_change_reported}=="0"
    ATTRS{evt_inquiry_change_reported}=="0"
    ATTRS{evt_lun_change_reported}=="0"
    ATTRS{evt_media_change}=="0"
    ATTRS{evt_mode_parameter_change_reported}=="0"
    ATTRS{evt_soft_threshold_reached}=="0"
    ATTRS{inquiry}==""
    ATTRS{iocounterbits}=="32"
    ATTRS{iodone_cnt}=="0xcf"
    ATTRS{ioerr_cnt}=="0xb"
    ATTRS{iorequest_cnt}=="0xdc"
    ATTRS{model}=="TS1TSSD420I     "
    ATTRS{ncq_prio_enable}=="0"
    ATTRS{power/autosuspend_delay_ms}=="-1"
    ATTRS{power/control}=="on"
    ATTRS{power/runtime_active_time}=="4884"
    ATTRS{power/runtime_status}=="active"
    ATTRS{power/runtime_suspended_time}=="0"
    ATTRS{queue_depth}=="32"
    ATTRS{queue_ramp_up_period}=="120000"
    ATTRS{queue_type}=="simple"
    ATTRS{rev}=="5CE "
    ATTRS{scsi_level}=="6"
    ATTRS{state}=="running"
    ATTRS{timeout}=="30"
    ATTRS{type}=="0"
    ATTRS{vendor}=="ATA     "
    ATTRS{vpd_pg0}==""
    ATTRS{vpd_pg80}==""
    ATTRS{vpd_pg83}==""
    ATTRS{vpd_pg89}==""
    ATTRS{wwid}=="t10.ATA     TS1TSSD420I                             F510080042          "

  looking at parent device '/devices/pci0000:00/0000:00:17.0/ata2/host1/target1:0:0':
    KERNELS=="target1:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""
    ATTRS{power/control}=="auto"
    ATTRS{power/runtime_active_time}=="4884"
    ATTRS{power/runtime_status}=="active"
    ATTRS{power/runtime_suspended_time}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:17.0/ata2/host1':
    KERNELS=="host1"
    SUBSYSTEMS=="scsi"
    DRIVERS==""
    ATTRS{power/control}=="auto"
    ATTRS{power/runtime_active_time}=="4885"
    ATTRS{power/runtime_status}=="active"
    ATTRS{power/runtime_suspended_time}=="693698"

  looking at parent device '/devices/pci0000:00/0000:00:17.0/ata2':
    KERNELS=="ata2"
    SUBSYSTEMS==""
    DRIVERS==""
    ATTRS{power/control}=="on"
    ATTRS{power/runtime_active_time}=="698584"
    ATTRS{power/runtime_status}=="active"
    ATTRS{power/runtime_suspended_time}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:17.0':
    KERNELS=="0000:00:17.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="ahci"
    ATTRS{ari_enabled}=="0"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x010601"
    ATTRS{consistent_dma_mask_bits}=="64"
    ATTRS{d3cold_allowed}=="1"
    ATTRS{device}=="0xa282"
    ATTRS{dma_mask_bits}=="64"
    ATTRS{driver_override}=="(null)"
    ATTRS{enable}=="1"
    ATTRS{irq}=="125"
    ATTRS{local_cpulist}=="0-7"
    ATTRS{local_cpus}=="ff"
    ATTRS{msi_bus}=="1"
    ATTRS{msi_irqs/125}=="msi"
    ATTRS{numa_node}=="-1"
    ATTRS{power/control}=="on"
    ATTRS{power/runtime_active_time}=="698715"
    ATTRS{power/runtime_status}=="active"
    ATTRS{power/runtime_suspended_time}=="0"
    ATTRS{power/wakeup}=="disabled"
    ATTRS{power/wakeup_abort_count}==""
    ATTRS{power/wakeup_active}==""
    ATTRS{power/wakeup_active_count}==""
    ATTRS{power/wakeup_count}==""
    ATTRS{power/wakeup_expire_count}==""
    ATTRS{power/wakeup_last_time_ms}==""
    ATTRS{power/wakeup_max_time_ms}==""
    ATTRS{power/wakeup_total_time_ms}==""
    ATTRS{power_state}=="D0"
    ATTRS{remapped_nvme}=="0"
    ATTRS{revision}=="0x00"
    ATTRS{subsystem_device}=="0x7a64"
    ATTRS{subsystem_vendor}=="0x1462"
    ATTRS{vendor}=="0x8086"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""
    ATTRS{power/control}=="auto"
    ATTRS{power/runtime_active_time}=="0"
    ATTRS{power/runtime_status}=="unsupported"
    ATTRS{power/runtime_suspended_time}=="0"
    ATTRS{waiting_for_supplier}=="0"

Aus den Infos kann man /devices/pci0000:00/0000:00:17.0/ata2/host1/target1:0:0/1:0:0:0/block/sdb also host1 rauslesen, merken, das brauchen wir gleich!

Die ALPM Settings wurden auf meinem Problemrechner durch den TLP Dienst gesetzt:

user@pc ~> systemctl status tlp.service
● tlp.service - TLP system startup/shutdown
     Loaded: loaded (/usr/lib/systemd/system/tlp.service; enabled; vendor preset: disabled)
     Active: active (exited) since Thu 2021-10-21 21:34:49 CEST; 12min ago
       Docs: https://linrunner.de/tlp
    Process: 712 ExecStart=/usr/bin/tlp init start (code=exited, status=0/SUCCESS)
   Main PID: 712 (code=exited, status=0/SUCCESS)
        CPU: 164ms

Okt 21 21:34:49 it04097 systemd[1]: Starting TLP system startup/shutdown...
Okt 21 21:34:49 it04097 tlp[712]: Applying power save settings...done.
Okt 21 21:34:49 it04097 tlp[712]: Setting battery charge thresholds...done.
Okt 21 21:34:49 it04097 systemd[1]: Finished TLP system startup/shutdown.

Der TLP Dienst kann SATA Ports vom Power Management ausnehmen! Dazu muss die Datei /etc/tlp.conf bearbeitet werden:
sudo nano /etc/tlp.conf

STRG+W und nach SATA_LINKPWR_DENYLIST suchen. Am Anfang der Zeile die Raute (#) entfernen. Der Wert muss in meinem Beispiel auf host1 geändert werden, Deinen Wert hast Du eben selber ermittelt. Hier ein Auszug aus der Datei wie es aussehen soll:

(...)

# AHCI link power management (ALPM) for SATA disks:
#   min_power, med_power_with_dipm(*), medium_power, max_performance.
# (*) Kernel 4.15 (or newer) required, then recommended.
# Multiple values separated with spaces are tried sequentially until success.
# Default:
#  - "med_power_with_dipm max_performance" (AC)
#  - "med_power_with_dipm min_power" (BAT)

#SATA_LINKPWR_ON_AC="med_power_with_dipm max_performance"
#SATA_LINKPWR_ON_BAT="med_power_with_dipm min_power"

# Exclude SATA links from AHCI link power management (ALPM).
# SATA links are specified by their host. Refer to the output of
# tlp-stat -d to determine the host; the format is "hostX".
# Separate multiple hosts with spaces.
# Default: <none>

SATA_LINKPWR_DENYLIST="host1"

(...)

Nun die Datei im Editor (nano) speichern und schließen: STRG+O > ENTER > STRG+X

Rechner neustarten! Nun sollte SATA Hot Plug auf dem eingestellten Port automatisch funktionieren. FERTIG! :slight_smile:

Nochmal die ALPM Einstellungen überprüfen:

user@pc ~> cat /sys/class/scsi_host/host*/link_power_management_policy
med_power_with_dipm
max_performance
med_power_with_dipm
med_power_with_dipm
med_power_with_dipm
med_power_with_dipm

Hier sollte jetzt der gewünschte SATA Hot Plug Port im max_performance Modus laufen. :slight_smile:

Eine Alternative wäre TLP zu entfernen. Auf einem System das nicht zwischen Netz und Akku Betrieb wechseln muss(kann), macht TLP keinen Sinn und führt immer nur zu Problemen.

Der Vorteil von TLP ist, dass automatisiert bei einem Wechsel vom Netz zum Akku Betrieb verschiede Stromspar Einstellungen gesetzt werden können. Das gibt es aber bei einem Desktop nicht und die Defaults von TLP sind für Latops gedacht(auch die des Netz Betriebes) und nicht für Desktops.

Sofern die sonstigen Energiespareinstellungen von TLP nicht zu Problemen führen, find ich Energiesparen immer eine gute Sache. Aber Du hast natürlich Recht @xabbu, deaktivieren von TLP geht auch.

Für den Linux Neuling @Michi, das geht so:

sudo systemctl stop tlp.service
sudo systemctl disable tlp.service

Rechner neustarten.

Was systemd (systemctl) genau ist kannst Du hier nachlesen: systemd – wiki.archlinux.de

das allein schafft bei mir noch kein Hot-Plug.
aber das hier furnktioniert prima:
sudo su

echo 0 0 0 | tee /sys/class/scsi_host/host*/scan

Wie merkt Ihr Euch diese Befehlszeile? Oder schaut Ihr, so wie ich, jedesmal in einem Text nach und kopiert ihn da raus?

Ich würde mir vermutlich ein bash Skript unter /usr/local/bin ablegen. Zum Beispiel so:
sudo nano /usr/local/bin/sata_scan
Folgendes in den Editor kopieren:

#!/usr/bin/env bash

echo 0 0 0 | tee /sys/class/scsi_host/host*/scan

Nun die Datei im Editor (nano) speichern und schließen: STRG+O > ENTER > STRG+X

Nun noch das Skript ausführbar machen:
sudo chmod a+rx /usr/local/bin/sata_scan

Dann kannst Du im Terminal mit sudo sata_scan, die gewünschte Zeile ausführen.

Aber nochmal zurück zum Problem
Was kommt denn bei Dir als Ausgabe?

cat /sys/class/scsi_host/host*/link_power_management_policy

und

sudo grep -irn med_power_with_dipm /etc/

und

systemctl status tlp.service

das kommt raus:

[michae1@T7-Manjaro ~]$ cat /sys/class/scsi_host/host*/link_power_management_policy
max_performance
max_performance
max_performance
max_performance
max_performance
max_performance
[michae1@T7-Manjaro ~]$ sudo grep -irn med_power_with_dipm /etc/
[sudo] Passwort für michae1: 
/etc/tlp.conf:228:#   min_power, med_power_with_dipm(*), medium_power, max_performance.
/etc/tlp.conf:232:#  - "med_power_with_dipm max_performance" (AC)
/etc/tlp.conf:233:#  - "med_power_with_dipm min_power" (BAT)
/etc/tlp.conf:235:#SATA_LINKPWR_ON_AC="med_power_with_dipm max_performance"
/etc/tlp.conf:236:#SATA_LINKPWR_ON_BAT="med_power_with_dipm min_power"
[michae1@T7-Manjaro ~]$ systemctl status tlp.service
○ tlp.service - TLP system startup/shutdown
     Loaded: loaded (/usr/lib/systemd/system/tlp.service; disabled; vendor pres>
     Active: inactive (dead)
       Docs: https://linrunner.de/tlp
lines 1-4/4 (END)

Mit max_performance müsste es aber gehen… Dann hab ich auch keine Idee mehr.

1 Like

Es geht!!!
Habe im Laufenden Betrieb die HDD über eSATA angeschlossen und nach ganz wenigen Sekunden war sie da!!
Es hatte nur nicht gereicht

sudo systemctl stop tlp.service
sudo systemctl disable tlp.service

Ein Neustart war nötig, dachte wohl, dass disalble tlp.service das Gleiche macht.

lexaiden, ich danke Dir sehr. Und gewonnen haben wir, weil Du eingestanden hast, Du hättest keine Idee mehr. Das hilft in vielen Fällen. Das Wissen und Wollen stößt an seine Grenzen, man lässt los und plötzlich passt alles.
Also, tausend Dank für Deine Zähigkeit Deine Ideen und Deine Zeit.