I found some valuable Linux specific hotswap stuff today for working with hot-swappable SCSI disks. This should be pretty distro agnostic as well. I've been using FreeBSD, where you use camcontrol/atacontrol, for so long now that I had kind of forgotten how to do this stuff in Linux. Now it's time to make a record.
Good ol' linux and it's proc
pseudo-filesystem. Essentially, all we are doing is checking a file and echoing commands into the same file for all our operations. The magic file here is /proc/scsi/scsi
.
First let's see what's in our file. You should see something like the following, but obviously it will differ depending on hardware.
# cat /proc/scsi/scsi vnb1:~ # cat /proc/scsi/scsi Attached devices: Host: scsi0 Channel: 00 Id: 00 Lun: 00 Vendor: FUJITSU Model: MAT3073NC Rev: 0104 Type: Direct-Access ANSI SCSI revision: 03 Host: scsi0 Channel: 00 Id: 01 Lun: 00 Vendor: SEAGATE Model: ST373207LC Rev: 0002 Type: Direct-Access ANSI SCSI revision: 03 Host: scsi0 Channel: 00 Id: 06 Lun: 00 Vendor: SDR Model: GEM318P Rev: 1 Type: Processor ANSI SCSI revision: 02 Host: scsi1 Channel: 00 Id: 02 Lun: 00 Vendor: QUANTUM Model: SDLT320 Rev: 5252 Type: Sequential-Access ANSI SCSI revision: 02 Host: scsi2 Channel: 00 Id: 00 Lun: 00 Vendor: ATL Model: M2500 Rev: 12.0 Type: Medium Changer ANSI SCSI revision: 02 Host: scsi2 Channel: 00 Id: 01 Lun: 00 Vendor: QUANTUM Model: SDLT320 Rev: 5252 Type: Sequential-Access ANSI SCSI revision: 02 Host: scsi3 Channel: 00 Id: 00 Lun: 00 Vendor: NETAPP Model: VTL Rev: 0001 Type: Medium Changer ANSI SCSI revision: 02 Host: scsi3 Channel: 00 Id: 00 Lun: 01 Vendor: QUANTUM Model: SDLT320 Rev: 022C Type: Sequential-Access ANSI SCSI revision: 02 Host: scsi3 Channel: 00 Id: 00 Lun: 02 Vendor: QUANTUM Model: SDLT320 Rev: 022C Type: Sequential-Access ANSI SCSI revision: 02 Host: scsi3 Channel: 00 Id: 00 Lun: 03 Vendor: QUANTUM Model: SDLT320 Rev: 022C Type: Sequential-Access ANSI SCSI revision: 02 Host: scsi3 Channel: 00 Id: 00 Lun: 04 Vendor: QUANTUM Model: SDLT320 Rev: 022C Type: Sequential-Access ANSI SCSI revision: 02
Now, first I want to remove the first device since it failed. Then we will see that it no longer shows up.
# echo 'scsi remove-single-device 0 0 0 0' > /proc/scsi/scsi # cat /proc/scsi/scsi Attached devices: Host: scsi0 Channel: 00 Id: 01 Lun: 00 Vendor: SEAGATE Model: ST373207LC Rev: 0002 Type: Direct-Access ANSI SCSI revision: 03 Host: scsi0 Channel: 00 Id: 06 Lun: 00 Vendor: SDR Model: GEM318P Rev: 1 Type: Processor ANSI SCSI revision: 02 Host: scsi1 Channel: 00 Id: 02 Lun: 00 Vendor: QUANTUM Model: SDLT320 Rev: 5252 Type: Sequential-Access ANSI SCSI revision: 02 Host: scsi2 Channel: 00 Id: 00 Lun: 00 Vendor: ATL Model: M2500 Rev: 12.0 Type: Medium Changer ANSI SCSI revision: 02 Host: scsi2 Channel: 00 Id: 01 Lun: 00 Vendor: QUANTUM Model: SDLT320 Rev: 5252 Type: Sequential-Access ANSI SCSI revision: 02 Host: scsi3 Channel: 00 Id: 00 Lun: 00 Vendor: NETAPP Model: VTL Rev: 0001 Type: Medium Changer ANSI SCSI revision: 02 Host: scsi3 Channel: 00 Id: 00 Lun: 01 Vendor: QUANTUM Model: SDLT320 Rev: 022C Type: Sequential-Access ANSI SCSI revision: 02 Host: scsi3 Channel: 00 Id: 00 Lun: 02 Vendor: QUANTUM Model: SDLT320 Rev: 022C Type: Sequential-Access ANSI SCSI revision: 02 Host: scsi3 Channel: 00 Id: 00 Lun: 03 Vendor: QUANTUM Model: SDLT320 Rev: 022C Type: Sequential-Access ANSI SCSI revision: 02 Host: scsi3 Channel: 00 Id: 00 Lun: 04 Vendor: QUANTUM Model: SDLT320 Rev: 022C Type: Sequential-Access ANSI SCSI revision: 02
Now, a quick explanation of the device address. The “0 0 0 0” used in the remove-single-device
command above is the SCSI address of the first drive. The address translates as follows:
First zero | Host: scsi0 |
---|---|
Second zero | Channel: 00 |
Third zero | Id: 00 |
Fourth zero | Lun: 00 |
So, if we wanted to remove the second drive instead of the first (the Seagate), the address would be “0 0 1 0”.
NOTE: The following process can be used to just simply add a disk to the system.
Now we can add the new drive that we swapped in. We use the same addressing scheme as above. After the add, we should see it in the /proc/scsi/scsi
file again.
# echo 'scsi add-single-device 0 0 0 0' > /proc/scsi/scsi # cat /proc/scsi/scsi Attached devices: Host: scsi0 Channel: 00 Id: 01 Lun: 00 Vendor: SEAGATE Model: ST373207LC Rev: 0002 Type: Direct-Access ANSI SCSI revision: 03 Host: scsi0 Channel: 00 Id: 06 Lun: 00 Vendor: SDR Model: GEM318P Rev: 1 Type: Processor ANSI SCSI revision: 02 Host: scsi1 Channel: 00 Id: 02 Lun: 00 Vendor: QUANTUM Model: SDLT320 Rev: 5252 Type: Sequential-Access ANSI SCSI revision: 02 Host: scsi2 Channel: 00 Id: 00 Lun: 00 Vendor: ATL Model: M2500 Rev: 12.0 Type: Medium Changer ANSI SCSI revision: 02 Host: scsi2 Channel: 00 Id: 01 Lun: 00 Vendor: QUANTUM Model: SDLT320 Rev: 5252 Type: Sequential-Access ANSI SCSI revision: 02 Host: scsi3 Channel: 00 Id: 00 Lun: 00 Vendor: NETAPP Model: VTL Rev: 0001 Type: Medium Changer ANSI SCSI revision: 02 Host: scsi3 Channel: 00 Id: 00 Lun: 01 Vendor: QUANTUM Model: SDLT320 Rev: 022C Type: Sequential-Access ANSI SCSI revision: 02 Host: scsi3 Channel: 00 Id: 00 Lun: 02 Vendor: QUANTUM Model: SDLT320 Rev: 022C Type: Sequential-Access ANSI SCSI revision: 02 Host: scsi3 Channel: 00 Id: 00 Lun: 03 Vendor: QUANTUM Model: SDLT320 Rev: 022C Type: Sequential-Access ANSI SCSI revision: 02 Host: scsi3 Channel: 00 Id: 00 Lun: 04 Vendor: QUANTUM Model: SDLT320 Rev: 022C Type: Sequential-Access ANSI SCSI revision: 02 Host: scsi0 Channel: 00 Id: 00 Lun: 00 Vendor: FUJITSU Model: MAT3073NC Rev: 0104 Type: Direct-Access ANSI SCSI revision: 03
Now, checking dmesg
, we should see what device the new drive was assigned to:
# dmesg | tail sdc: Spinning up disk..........ready SCSI device sdc: 143638992 512-byte hdwr sectors (73543 MB) SCSI device sdc: drive cache: write back SCSI device sdc: 143638992 512-byte hdwr sectors (73543 MB) SCSI device sdc: drive cache: write back sdc: sdc1 sdc2
Now you can use your disk: /dev/sdc
.
You can also use the following to scan the SCSI bus for new devices:
# echo 'scsi scan-new-devices' > /proc/scsi/scsi