Bug 44724

Summary: grub2: 30_os-prober: SATAIII removables are not always removable
Product: Sisyphus Reporter: viy <viy>
Component: grub-commonAssignee: Николай Костригин <nickel>
Status: ASSIGNED --- QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: iv, nickel, placeholder, rider
Version: unstable   
Hardware: x86_64   
OS: Linux   

Description viy 2022-12-24 09:32:14 MSK
Устанавливал племяннику alt, столкнулся с тем, что наш /etc/grub.d/30_os-prober в упор не видел винды на отдельном ssd.

После расследования оказалось, что 30_os-prober полагается на свойство устройства /removable ( /sys/block/${DEVICE_KDNAME}/removable ),
однако ssd с виндой внутри был подключен в плату расширения - китайский sata3 PCIE контроллер (на мат плате был только SATA2) который из коробки был в eSATA3 режиме (плюсы: можно более длинный кабель, hotplug).
Раз он hotplug, то в ядре он /removable, но по факту нет.

подобная фигня случается и под винды тоже
https://winitpro.ru/index.php/2019/04/11/sata-ssd-disk-otobrazhaetsya-removable/

Надо бы усложнить логику.

Например, добавить в /etc/sysconfig/grub2 поддержку переменных явного списка устройств removable и not_removable:
что-то вроде 
GRUB_OVERRIDE_REMOVABLE_DEVICES="..."
GRUB_OVERRIDE_NOT_REMOVABLE_DEVICES="..."

Возможно, лучше считать устройства, подключенные через SATA,
not_removable по умолчанию.

К примеру, если устройств /removable
смотреть еще его udevadm info --query=all
и если там ID_ATA_SATA=1,
то 
если дополнительно не выставлено
UDISKS_SYSTEM_INTERNAL=0
то полагать, что это не /removable.
а иначе (если выставлено UDISKS_SYSTEM_INTERNAL=0)
полагать, что это все же /removable.

Выставить UDISKS_SYSTEM_INTERNAL=0
можно через udev rules, для случаев, когда eSATA там не случайно, а именно для hotplugging.
Comment 1 Николай Костригин 2022-12-25 20:21:03 MSK
Спасибо за подробную диагностику и предложенные решения.
Поэкспериментирую.
Comment 2 viy 2022-12-27 20:00:23 MSK
еще бы посоветовал посмотреть на 
30_os-prober
в других дистрибутивах, fedora, mageia, opensuse
в поисках вдохновения и интересного кода.
там 30_os-prober совсем другой.