Énumérer tous les modes d'utilisation d'un périphérique en mode bloc

Je veux être sûr qu'un disque dur amovible (USB, mais cela n'a pas d'importance) peut être retiré en toute security. Disons que ce lecteur est sdb .

Évidemment, je dois m'assurer qu'il n'y a pas de système de files monté sur ce disque. grep /dev/sdb /proc/mounts me le dira.

Mais ce n'est pas toute l'histoire. Par exemple, s'il existe un volume physique LVM sur sdb , je dois désactiver tous les groupes de volumes contenant un volume physique situé sur sdb ( lvchange -an my_volume_group/my_logical_volume puis vgchange -an my_volume_group ). S'il existe un volume RAID, il est possible que je devrais le désactiver ( mdadm -S ), ou je souhaiterais marquer le composant comme ayant échoué ( mdadm -f ).

Existe-t-il un moyen de répertorier tous les modes d'utilisation d'un disque? Pour mon cas d'utilisation, je dois être sûr que cette list est exhaustive, afin que je puisse détwigr l'appareil si la list est vide.

Si vous pouvez ouvrir un périphérique bloc O_EXCL , il n'est pas utilisé par le kernel ( O_EXCL prend un verrou de périphérique dans ce cas particulier). lsof (/ proc scan) devrait find d'autres users (les ordinateurs virtuels peuvent avoir l'appareil ouvert, et souvent ne pas ouvrir exclusivement).

+1 pour la réponse de Gabriel – O_EXCL est exactement la solution que j'ai utilisée dans ce scénario. Voici la fonction Perl que j'ai écrite pour vérifier si un périphérique est en cours d'utilisation:

 use Fcntl; use Errno; sub device_in_use($) { my $device = shift; # open with O_EXCL returns EBUSY if a device is in use # http://www.kernel.org/doc/man-pages/online/pages/man2/open.2.html return $!{EBUSY} if (!sysopen my $fh, $device, O_EXCL); close $fh; return 0; } 

Attention toutefois à ne pas manipuler correctement les erreurs – il s'attend à ce que le périphérique existe et que vous ayez des droits root.