dock usb pour disque de sauvegarde : gestion du disque

Pàgina inicial

Reply to this message
Autor: anne.guilde@free.fr
Data:  
A: ML Guilde
Assumptes nous: sdparm bind unbind
Assumpte: dock usb pour disque de sauvegarde : gestion du disque
bonjour,

Cela fait un certain temps que je farfouille pour gérer la mise en
veille du disque de sauvegarde de mon serveur.

J'ai regardé des prises de courant programmables via usb ou lan...
Elles sont toutes avec des logiciels sous win rien sous mac ou linux.
Si, j'ai trouvé un driver linux mais le kernel de mon serveur est trop
ancien, même le kernel de ma debian est trop vieux...
noyau de mon serveur (centos)
# uname -r
2.6.32-642.11.1.el6.x86_64
noyau de ma debian
# uname -r
3.16.0-4-amd64

udisctl éteint le disque et le dock. Donc pas la bonne solution sans
prise de courant programmable.
Pas envie de me lever la nuit pour débrancher et rebrancher la prise usb ;)

On m'a filé un script usb à tester.

https://github.com/mlogic/suspend-usb-device

----
#!/bin/bash

## set -x

#
#
# suspend-usb-device: an easy-to-use script to properly put an USB
# device into suspend mode that can then be unplugged safely
#
# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016,
# Yan Li <elliot.li.tech@???>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# To reach the auther, please write an email to the address as stated
# above.

#  ACKNOWLEDGEMENTS:
#      Christian Schmitt <chris@???> for firewire supporting
#      David <d.tonhofer@???> for improving parent device
#      search and verbose output message



usage()
{
     cat<<EOF
suspend-usb-device  Copyright (C) 2009-2016, Yan Li 
<elliot.li.tech@???>


This script is designed to properly put an USB device into suspend
mode that can then be unplugged safely. It sends a SYNCHRONIZE CACHE
command followed by a START-STOP command (if the device supports it),
unbinds the device from the driver and then suspends the USB
port. After that you can disconnect your USB device safely.

usage:
$0 [options] dev

sample:
$0 /dev/sde

options:
   -l     show the device and USB bus ID only
   -h     print this usage
   -v     verbose


This program comes with ABSOLUTELY NO WARRANTY. This is free
software, and you are welcome to redistribute it under certain
conditions; for details please read the licese at the beginning of the
source code file.
EOF
}

set -e -u

SHOW_DEVICE_ONLY=0
VERBOSE=0
while getopts "vlh" opt; do
     case "$opt" in
         h)
             usage
             exit 2
             ;;
         l)
             SHOW_DEVICE_ONLY=1
             ;;
         v)
             VERBOSE=1
             ;;
         ?)
             echo
             usage
             exit 2
             ;;
     esac
done
DEV_NAME=${!OPTIND:-}


if [ -z ${DEV_NAME} ]; then
     usage
     exit 2
fi


# mount checking
if mount | grep "^${DEV_NAME}[[:digit:]]* "; then
     1>&2 echo
     1>&2 echo "the above disk or partition is still mounted, can't 
suspend device"
     1>&2 echo "unmount it first using umount"
     exit 1
fi


# looking for the parent of the device with type "usb-storage:usb", it
# is the grand-parent device of the SCSI host, and it's devpath is
# like
# /devices/pci0000:00/0000:00:1d.7/usb5/5-8 (or /fw5/fw5-8 for firewire
devices)

# without an USB hub, the device path looks like:
#
/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host5/target5:0:0/5:0:0:0
# here the grand-parent of host5 is 2-1

# when there's a USB HUB, the device path is like:
#
/devices/pci0000:00/0000:00:1d.0/usb5/5-2/5-2.2/5-2.2:1.0/host4/target4:0:0/4:0:0:0
# and the grand-parent of host4 is 5-2.2

DEVICE=$(udevadm info --query=path --name=${DEV_NAME} --attribute-walk | \
     egrep "looking at parent device" | head -1 | \
     sed -e "s/.*looking at parent device 
'\(\/devices\/.*\)\/.*\/host.*/\1/g")


if [ -z $DEVICE ]; then
     1>&2 echo "cannot find appropriate parent USB/Firewire device, "
     1>&2 echo "perhaps ${DEV_NAME} is not an USB/Firewire device?"
     exit 1
fi


# the trailing basename of ${DEVICE} is DEV_BUS_ID ("5-8" in the
# sample above)
DEV_BUS_ID=${DEVICE##*/}

[[ $VERBOSE == 1 ]] && echo "Found device $DEVICE associated to
$DEV_NAME; USB bus id is $DEV_BUS_ID"

if [ ${SHOW_DEVICE_ONLY} -eq 1 ]; then
     echo Device: ${DEVICE}
     echo Bus ID: ${DEV_BUS_ID}
     exit 0
fi


# flush all buffers
sync

# root check
if [ `id -u` -ne 0 ]; then
     1>&2 echo error, must be run as root, exiting...
     exit 1
fi



# send SCSI sync command, some devices don't support this so we just
# ignore errors with "|| true"
[[ $VERBOSE == 1 ]] && echo "Syncing device $DEV_NAME"
sdparm --command=sync "$DEV_NAME" >/dev/null || true
# send SCSI stop command
[[ $VERBOSE == 1 ]] && echo "Stopping device $DEV_NAME"
sdparm --command=stop "$DEV_NAME" >/dev/null

# unbind it; if this yields "no such device", we are trying to unbind 
the wrong device
[[ $VERBOSE == 1 ]] && echo "Unbinding device $DEV_BUS_ID"
if [[ "${DEV_BUS_ID}" == fw* ]]
then
     echo -n "${DEV_BUS_ID}" > /sys/bus/firewire/drivers/sbp2/unbind
else
     echo -n "${DEV_BUS_ID}" > /sys/bus/usb/drivers/usb/unbind


     # suspend it if it's an USB device (we have no way to suspend a
     # firewire device yet)


     # USB power level control is deprecated since 2.6.32. If both 
power/control
     # and power/level files exist, we are using a new kernel that 
doesn't support
     # force suspending a USB device. If only the power/level file 
exists, we
     # will try to suspend the device.
     [[ $VERBOSE == 1 ]] && echo "Checking whether $DEVICE can be suspended"
     POWER_LEVEL_FILE=/sys${DEVICE}/power/level
     POWER_CONTROL_FILE=/sys${DEVICE}/power/control
     if [ ! -f "$POWER_CONTROL_FILE" -a ! -f "$POWER_LEVEL_FILE" ]; then
         1>&2 cat<<EOF
It's safe to remove the USB device now but better can be done. The
power level control file $POWER_LEVEL_FILE
doesn't exist on the system so I have no way to put the USB device
into suspend mode, perhaps you don't have CONFIG_USB_SUSPEND enabled
in your running kernel.


Read
http://elliotli.blogspot.com/2009/01/safely-remove-usb-hard-drive-in-linux.html
for an detailed explanation.
EOF
         exit 3
     elif [ ! -f "$POWER_CONTROL_FILE" ]; then
         # Only the power/level file exists, try to suspend the device
         [[ $VERBOSE == 1 ]] && echo "Suspending $DEVICE by writing to 
$POWER_LEVEL_FILE"
         echo 'suspend' > "$POWER_LEVEL_FILE"
     fi
     # Do nothing if power/control or both files exist.
fi
----


J'ai installé sdparm

J'ai mis un disque de 2to pour mes sauvegardes

l# lsusb
...
Bus 001 Device 011: ID 152d:2352 JMicron Technology Corp. / JMicron USA
Technology Corp. ATA/ATAPI Bridge
...

# ls -al /dev/sd*
brw-rw---- 1 root disk 8, 0 22 janv. 21:23 /dev/sda
brw-rw---- 1 root disk 8, 1 22 janv. 21:23 /dev/sda1
brw-rw---- 1 root disk 8, 2 22 janv. 21:23 /dev/sda2
brw-rw---- 1 root disk 8, 3 22 janv. 21:23 /dev/sda3
brw------- 1 root root 8, 16 23 janv. 22:50 /dev/sdb
brw------- 1 root root 8, 17 23 janv. 22:50 /dev/sdb1
brw------- 1 root root 8, 18 23 janv. 22:50 /dev/sdb2

Je recheche le bus
    
# ./suspend-usb-device.sh -vl /dev/sdb
Found device /devices/pci0000:00/0000:00:12.2/usb1/1-2/1-2.5/1-2.5.5
associated to /dev/sdb; USB bus id is 1-2.5.5
Device: /devices/pci0000:00/0000:00:12.2/usb1/1-2/1-2.5/1-2.5.5
Bus ID: 1-2.5.5

A la fin du traitement de la sauvegarde, je mets le disque en standby.
# ./suspend-usb-device.sh -v /dev/sdb
Found device /devices/pci0000:00/0000:00:12.2/usb1/1-2/1-2.5/1-2.5.5
associated to /dev/sdb; USB bus id is 1-2.5.5
Unbinding device 1-2.5.5
Checking whether /devices/pci0000:00/0000:00:12.2/usb1/1-2/1-2.5/1-2.5.5
can be suspended

# ls -al /dev/sd*
brw-rw---- 1 root disk 8, 0 22 janv. 21:23 /dev/sda
brw-rw---- 1 root disk 8, 1 22 janv. 21:23 /dev/sda1
brw-rw---- 1 root disk 8, 2 22 janv. 21:23 /dev/sda2
brw-rw---- 1 root disk 8, 3 22 janv. 21:23 /dev/sda3

Plus de disque /dev/sdb
Le disque c'est arrêté de tourner et donc ne chauffe plus.

Je remets le disque en fonction
# echo -n "1-2.5.5" >/sys/bus/usb/drivers/usb/bind

# sdparm --command=start /dev/sdb

Si des personnes ont des commentaires à faire
J'accepte toutes idées

Anne