Пример A-23. Монтирование USB-устройств флэш-памяти.

Пример A-23. Монтирование USB-устройств флэш-памяти.

  1. #!/bin/bash
  2. # ==> usb.sh
  3. # ==> Сценарий монтирует и устанавливает USB-устройства флэш-памяти.
  4. # ==> Запускается с правами root во время загрузки системы (см. ниже).
  5.  
  6. #  Этот сценарий распространяется на условиях GNU GPL license версии 2 или выше.
  7. #  Полный текст лицензии вы найдете на <a href="http://www.gnu.org/.
  8. #
  9. #" title="http://www.gnu.org/.
  10. #
  11. #">http://www.gnu.org/.
  12. #
  13. #</a>  Часть кода заимствована из сценария usb-mount, автор Michael Hamilton (LGPL)
  14. #+ см. <a href="http://users.actrix.co.nz/michael/usbmount.html
  15. #
  16. #" title="http://users.actrix.co.nz/michael/usbmount.html
  17. #
  18. #">http://users.actrix.co.nz/michael/usbmount.html
  19. #
  20. #</a>  УСТАНОВКА
  21. #  ---------
  22. #  Поместите сценарий в каталог /etc/hotplug/usb/diskonkey.
  23. #  Затем скопируйте все описания устройств usb-storage из  /etc/hotplug/usb.distmap
  24. #+ в /etc/hotplug/usb.usermap, заменяя "usb-storage" на "diskonkey".
  25. #
  26. #  TODO
  27. #  ----
  28. #  Обслуживание более одного устройства diskonkey (например /dev/diskonkey1
  29. #+ и /mnt/diskonkey1), и т.д. Наибольшая проблема здесь состоит в работе с
  30. #+ devlabel.
  31. #
  32. #  АВТОР и ПОДДЕРЖКА
  33. #  -------------------
  34. #  Konstantin Riabitsev, <icon linux duke edu>.
  35. #  Сообщения об обнаруженных ошибках отправляйте мне на электронный адрес.
  36. #
  37. # ==> Комментарии добавленные автором книги.
  38. SYMLINKDEV=/dev/diskonkey
  39. MOUNTPOINT=/mnt/diskonkey
  40. DEVLABEL=/sbin/devlabel
  41. DEVLABELCONFIG=/etc/sysconfig/devlabel
  42. IAM=$0
  43. ##
  44. # Функция заимствована из usb-mount.
  45. #
  46. function allAttachedScsiUsb {
  47.     find /proc/scsi/ -path '/proc/scsi/usb-storage*' -type f | xargs grep -l 'Attached: Yes'
  48. }
  49. function scsiDevFromScsiUsb {
  50.     echo $1 | awk -F"[-/]" '{ n=$(NF-1);  print "/dev/sd" substr("abcdefghijklmnopqrstuvwxyz", n+1,
  51. 1) }'
  52. }
  53. if [ "${ACTION}" = "add" ] && [ -f "${DEVICE}" ]; then
  54.     ##
  55.     # заимствовано из usbcam.
  56.     #
  57.     if [ -f /var/run/console.lock ]; then
  58.         CONSOLEOWNER=`cat /var/run/console.lock`
  59.     elif [ -f /var/lock/console.lock ]; then
  60.         CONSOLEOWNER=`cat /var/lock/console.lock`
  61.     else
  62.         CONSOLEOWNER=
  63.     fi
  64.     for procEntry in $(allAttachedScsiUsb); do
  65.         scsiDev=$(scsiDevFromScsiUsb $procEntry)
  66.         #  Это ошибка в usb-storage?
  67.         #  Разделы не появляются в /proc/partitions до тех пор
  68.         #+ пока к ним не было хотябы одного обращения.
  69.         /sbin/fdisk -l $scsiDev >/dev/null
  70.         ##
  71.         #  Большинство устройств имеет информацию о разделах, например
  72.         #+ /dev/sd?1. Однако, некоторые устройства не имеют разделов
  73.         #+ выделяя под данные весь объем памяти. Здесь делается
  74.         #+ попытка определить такие устройства, т.е. имеется ли /dev/sd?1
  75.         #+ или нет.
  76.         #
  77.         if grep -q `basename $scsiDev`1 /proc/partitions; then
  78.             part="$scsiDev""1"
  79.         else
  80.             part=$scsiDev
  81.         fi
  82.         ##
  83.         #  Изменение владельца устройства, чтобы пользователь
  84.         #+ мог смонтировать его.
  85.         #
  86.         if [ ! -z "$CONSOLEOWNER" ]; then
  87.             chown $CONSOLEOWNER:disk $part
  88.         fi
  89.         ##
  90.         # Здесь проверяется — зарегистрирован ли UUID с помощью devlabel.
  91.         # Если нет, то устройство добавляется в список.
  92.         #
  93.         prodid=`$DEVLABEL printid -d $part`
  94.         if ! grep -q $prodid $DEVLABELCONFIG; then
  95.             # скрестим пальцы, надеюсь это поможет
  96.             $DEVLABEL add -d $part -s $SYMLINKDEV 2>/dev/null
  97.         fi
  98.         ##
  99.         # Если точка монтирования отсутствует, то она создается.
  100.         #
  101.         if [ ! -e $MOUNTPOINT ]; then
  102.             mkdir -p $MOUNTPOINT
  103.         fi
  104.         ##
  105.         # Позаботиться о создании соответствующей записи в /etc/fstab.
  106.         #
  107.         if ! grep -q "^$SYMLINKDEV" /etc/fstab; then
  108.             # Добавить запись в fstab
  109.             echo -e \
  110.                 "$SYMLINKDEV\t\t$MOUNTPOINT\t\tauto\tnoauto,owner,kudzu 0 0" \
  111.                 >> /etc/fstab
  112.         fi
  113.     done
  114.     if [ ! -z "$REMOVER" ]; then
  115.         ##
  116.         # Обеспечить запуск сценария при извлечении устройства.
  117.         #
  118.         mkdir -p `dirname $REMOVER`
  119.         ln -s $IAM $REMOVER
  120.     fi
  121. elif [ "${ACTION}" = "remove" ]; then
  122.     ##
  123.     # Если устройство смонтировано — отмонтировать его.
  124.     #
  125.     if grep -q "$MOUNTPOINT" /etc/mtab; then
  126.         # отмонтировать
  127.         umount -l $MOUNTPOINT
  128.     fi
  129.     ##
  130.     # Удалить запись из /etc/fstab, если она там имеется.
  131.     #
  132.     if grep -q "^$SYMLINKDEV" /etc/fstab; then
  133.         grep -v "^$SYMLINKDEV" /etc/fstab > /etc/.fstab.new
  134.         mv -f /etc/.fstab.new /etc/fstab
  135.     fi
  136. fi