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!
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.