martes, 16 de octubre de 2012

Conectar y desconetar un disco en caliente en Linux

Inumerables de veces he tenido tenido que conectar un dispositivo de almacenamiento a mi PC y a la vez era impensado apagar mi equipo para hacerlo, entonces la alternativa era hacerlo en caliente.

Inventigando un poco me he topado con el siguiente comando para hacer un scan de nuevos discos SCSI que es válido para los discos SATA:

echo "- - -" > /sys/class/scsi_host/host#/scan
donde se reemplaza # con el número de controlador adecuado de su controlador SCSI.

Ejemplo:

Listamos todos los scsi_host disponibles:
[root@danispiri ~]# ll /sys/class/scsi_host
lrwxrwxrwx. 1 root root 0 oct  4 02:55 host0 -> ../../devices/pci0000:00/0000:00:11.0/ata1/host0/scsi_host/host0
lrwxrwxrwx. 1 root root 0 oct  4 02:55 host1 -> ../../devices/pci0000:00/0000:00:11.0/ata2/host1/scsi_host/host1
lrwxrwxrwx. 1 root root 0 oct  4 02:55 host2 -> ../../devices/pci0000:00/0000:00:11.0/ata3/host2/scsi_host/host2
lrwxrwxrwx. 1 root root 0 oct  4 02:55 host3 -> ../../devices/pci0000:00/0000:00:11.0/ata4/host3/scsi_host/host3
lrwxrwxrwx. 1 root root 0 oct  4 02:55 host4 -> ../../devices/pci0000:00/0000:00:14.1/ata5/host4/scsi_host/host4
lrwxrwxrwx. 1 root root 0 oct  4 02:55 host5 -> ../../devices/pci0000:00/0000:00:14.1/ata6/host5/scsi_host/host5
Observamos cuales están siendo utilizadas:
[root@danispiri ~]# ll /sys/block
...
lrwxrwxrwx. 1 root root 0 oct  4 02:55 sda -> ../devices/pci0000:00/0000:00:11.0/ata1/host0/target0:0:0/0:0:0:0/block/sda
lrwxrwxrwx. 1 root root 0 oct  4 09:41 sr0 -> ../devices/pci0000:00/0000:00:11.0/ata3/host2/target2:0:0/2:0:0:0/block/sr0
lrwxrwxrwx. 1 root root 0 oct  4 09:41 sr1 -> ../devices/pci0000:00/0000:00:14.1/ata6/host5/target5:0:0/5:0:0:0/block/sr1
/dev/sda es el Disco Duro del sistema actual de 1 TB, /dev/sr0 es un lector/grabador DVD y /dev/sr1 un lector/grabador Blu-ray

En mi caso conecté un Disco Duro Sata II de 250 GB con dos particiones NTFS en la controladora 5. Hacemos un scan de nuevos discos SCSI:
echo "- - -" > /sys/class/scsi_host/host5/scan
Verificar si el nuevo disco SCSI es reconocido por el SO:
[root@danispiri ~]# ll /sys/block/
...
lrwxrwxrwx. 1 root root 0 oct  4 02:55 sda -> ../devices/pci0000:00/0000:00:11.0/ata1/host0/target0:0:0/0:0:0:0/block/sda
lrwxrwxrwx. 1 root root 0 oct  4 10:07 sdb -> ../devices/pci0000:00/0000:00:14.1/ata6/host5/target5:0:1/5:0:1:0/block/sdb
lrwxrwxrwx. 1 root root 0 oct  4 09:41 sr0 -> ../devices/pci0000:00/0000:00:11.0/ata3/host2/target2:0:0/2:0:0:0/block/sr0
lrwxrwxrwx. 1 root root 0 oct  4 09:41 sr1 -> ../devices/pci0000:00/0000:00:14.1/ata6/host5/target5:0:0/5:0:0:0/block/sr1
/dev/sdb es el Disco Duro recientemente conectado
[root@danispiri ~]# fdisk -l

Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders, 1953525168 sectores en total
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identificador del disco: 0x00043f52

Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200  1953523711   975712256   8e  Linux LVM

...

Disk /dev/sdb: 250.1 GB, 250059350016 bytes
224 heads, 19 sectors/track, 114754 cylinders, 488397168 sectores en total
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identificador del disco: 0x6f35861f

Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/sdb1   *          19    41942879    20971430+   7  HPFS/NTFS/exFAT
/dev/sdb2        41942880   488393023   223225072    7  HPFS/NTFS/exFAT
Ya podemos montarlo y utilizarlo.


Para desconectar el disco en caliente con Linux, se recomienda utilizar la herramienta sdparm que lo instalamos si aun no lo hicimos, en RedHat y derivados:
yum install sdparm
Desmontamos el disco primero, luego ejecutamos las siguientes lineas:
sdparm --command=sync /dev/sdb
sdparm --command=stop /dev/sdb
echo 1 >/sys/block/sdb/device/delete
Verificamos que el SO ya no reconoce el disco SCSI:
[root@danispiri ~]# ll /sys/block
...
lrwxrwxrwx. 1 root root 0 oct  4 02:55 sda -> ../devices/pci0000:00/0000:00:11.0/ata1/host0/target0:0:0/0:0:0:0/block/sda
lrwxrwxrwx. 1 root root 0 oct  4 09:41 sr0 -> ../devices/pci0000:00/0000:00:11.0/ata3/host2/target2:0:0/2:0:0:0/block/sr0
lrwxrwxrwx. 1 root root 0 oct  4 09:41 sr1 -> ../devices/pci0000:00/0000:00:14.1/ata6/host5/target5:0:0/5:0:0:0/block/sr1
Ahora podemos desconectarlo sin problemas.

Fuente: Managing SCSI disk connectivity on a Linux host, elotrolado.net

HOLA