Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Ошибка базы данных: Table 'a111530_forumnew.rlf1_users' doesn't exist

Приемы работы в Ubuntu.
Глава 8: Администрирование

Оригинал: "Ubuntu Hacks: Chapter 8 - Administration"
Авторы: Кайл Ранкин, Джонатан Оксер, Билл Чайлдерс (Kyle Rankin, Jonathan Oxer, Bill Childers)
Дата публикации: June 2006
Перевод: Н.Ромоданов
Дата перевода: октябрь 2010 г.

Совет # 83: Монтируем сменные устройства под одними и теми же именами

Смонтируйте ваш диск USB так, чтобы он каждый раз отображался как /media/music. Смонтируйте ваш диск FireWire так, чтобы он каждый раз отображался как /media/data.

Мои хранилища данных настроены на моей домашней машине с Ubuntu несколько необычно. У меня есть внешний диск, предназначенный для хранения музыки, и еще один внешний диск, который является резервной копией музыкального диска. У меня также есть внешний диск, на котором находятся все мои личные документы, фотографий и фильмы, а также еще четвертый диск, который является резервной копией третьего диска. Все эти четыре диски подключены к моему настольному компьютеру через FireWire. Наконец, у меня есть еще один внешний носитель, который используется как временное хранилище: когда я скачиваю новый фильм или серию картинок, или копирую с нового CD аудиозапись, я помещаю все эти файлы на временный диск, пока не смогу их правильно разместить на музыкальном диске или на диске с личными данными. В отличие от первых четырех дисков, диск с временным хранилищем данных использует подключение через USB.

Пять дисков звучит здорово, но с этим связана одна большая неприятность. Когда я перезагружаю Ubuntu (случается редко, но, конечно, это происходит), то точки монтирования изменяются. Иногда диск FireWire с номером 1 монтируется как /media/sdb1, а иногда — как /media/sdc1. То же самое происходит и с другими дисками, и, в результате, возникают проблемы с работой моих скриптов резервного копирования и с моими попытками подключиться через SSH из других машин, и это лишь только две проблемы, с которыми я столкнулся. Я хочу, чтобы имена этих устройств не менялись, так чтобы диск FireWire с номером 1 всегда назывался /media/<что-то>, диск FireWire с номером 2 всегда назывался /media/<что-то еще>, и так далее.

После долгих поисков, я нашел ответ на форумах Ubuntu по ссылке http://ubuntuforums.org/showthread.php?t=91948 и в прекрасном обзоре Даниэль Дрейка (Daniel Drake) под названием "Записываем правила udev" (http://www.reactivated.net/writing_udev_rules.html). В сущности в Ubuntu есть технология udev, которая управляет динамически подключаемыми устройствами. Я могу указать udev, как я хочу обозначить каждый отдельный диск, когда он подключается, что гораздо более эффективно и полезно, чем метод, используемый по умолчанию. Это делается следующим образом.

Вам нужно будет отредактировать файл /etc/udev/rules.d/10-local.rules. Убедитесь в том, что этот файл уже есть на жестком диске:

$ ls /etc/udev/rules.d/10-local.rules

Если он уже существует, то вам следует отредактировать его, а если его в настоящее время нет, то двигайтесь дальше и создайте пустой файл с соответствующем именем и правами доступа:

$ sudo touch /etc/udev/rules.d/10-local.rules
$ sudo chmod 777 /etc/udev/rules.d/10-local.rules

В конце процедуры, описываемой в данном совете, в файле 10-local.rules будут указаны все устройства. Например, запись, касающаяся диска USB, будет выглядеть следующим образом:

BUS=="usb", SYSFS{serial}=="6R0000065086", NAME{all_partitions}=="temp"

Первая часть, BUS=="usb", очевидна; в ней указано как этот диск подключается к машине. Третья часть, NAME{all_partitions}=="temp", также интуитивно понятна, поскольку "temp" это имя, которое, как я хочу, будет использоваться в качестве точки монтирования вместо /media/sdb1 или еще чего-нибудь, что решит использовать Ubuntu. Но что означает вторая часть? Откуда взято "6R0000065086"?

Для того, чтобы udev выполнял свою работу, он должен знать, какому конкретно диску я хочу присвоить метку "temp". Когда я подключаю диск (или любое динамически подключаемое устройство), диск идентифицирует себя по целому ряду параметров. Мне нужно выбрать уникальные данные, которые я могу передать в udev для идентификации. Для того, чтобы выяснить, какие данные видны udev, когда вы подключаете диск, я выполню следующую команду (заметьте, что указанный путь является текущим, который система Ubuntu назначила диску, в данном случае - /dev/sda):

$ udevinfo -a -p $(udevinfo -q path -n /dev/sda)

Как только я нажму клавишу Enter, будет выдан огромный поток данных, похожий на то, что приведено ниже (длина приведенного ниже листинга была существенно сокращена):

device '/sys/block/sda' has major:minor 8:0
  looking at class device '/sys/block/sda':
    SUBSYSTEM=="block" 
    SYSFS{dev}=="8:0" 
    SYSFS{range}=="16" 
  SYSFS{removable}=="0" 
 SYSFS{size}=="488397168" 
    SYSFS{stat}==" 2159 102 16586 1871738 28 17 360 204 0 14257  1871942" 

...

  looking at the device chain at 
'/sys/devices/pci0000:00/0000:00:1e.0/0000:05:09.2/usb4/4-1/4-1.2/4-1.2:1.0':
 BUS=="usb" 
    ID=="4-1.2:1.0" 
    DRIVER=="usb-storage" 
    SYSFS{bAlternateSetting}==" 0" 
    SYSFS{bInterfaceClass}=="08" 
    SYSFS{bInterfaceNumber}=="00" 
    SYSFS{bInterfaceProtocol}=="50" 
    SYSFS{bInterfaceSubClass}=="06" 
    SYSFS{bNumEndpoints}=="02" 
    SYSFS{modalias}=="usb:v04B4p6830d0001dc00dsc00dp00ic08isc06ip50" 

  looking at the device chain at 
'/sys/devices/pci0000:00/0000:00:1e.0/0000:05:09.2/usb4/4-1/4-1.2':
    BUS=="usb" 
    ID=="4-1.2" 
    DRIVER=="usb" 
    SYSFS{bConfigurationValue}=="1" 
    SYSFS{bDeviceClass}=="00" 
    SYSFS{bDeviceProtocol}=="00" 
    SYSFS{bDeviceSubClass}=="00" 
    SYSFS{bMaxPower}=="  0mA" 
    SYSFS{bNumConfigurations}=="1" 
    SYSFS{bNumInterfaces}==" 1" 
    SYSFS{bcdDevice}=="0001" 
    SYSFS{bmAttributes}=="c0" 
    SYSFS{configuration}=="" 
    SYSFS{devnum}=="3" 
    SYSFS{idProduct}=="6830" 
    SYSFS{idVendor}=="04b4" 
    SYSFS{manufacturer}=="Cypress Semiconductor" 
    SYSFS{maxchild}=="0" 
    SYSFS{product}=="USB2.0 Storage Device" 
    SYSFS{serial}=="6R0000065086" 
    SYSFS{speed}=="480" 
    SYSFS{version}==" 2.00" 

...

Видите строку, в которой указано SYSFS{serial}=="6R0000065086"? Это уникальный серийный номер этого устройства, так что это именно то, что я буду использовать в строке, которую я добавляю к файлу 10-local.rules. Обратите внимание, что также присутствует BUS=="usb" на случай, если я не знаю, каким образом устройство /dev/sda подключается к моей машине (конечно, если дисков только 5, то такого не случится!). Поэтому новая строка в файле /etc/udev/rules.d/10-local.rules будет выглядеть следующим образом:

BUS=="usb", SYSFS{serial}=="6R0000065086", NAME{all_partitions}=="temp"

Я также должен повторить эту процедуру для всех остальных дисков. Хотя все остальные четыре диска подключаются с помощью FireWire, процедура будет такой же, просто будут отличаться выдаваемые листинги:

$ udevinfo -a -p $(udevinfo -q path -n /dev/sdb)

device '/sys/block/sdb' has major:minor 8:16
  looking at class device '/sys/block/sdb':
    SUBSYSTEM=="block" 
    SYSFS{dev}=="8:16" 
    SYSFS{range}=="16" 
 SYSFS{removable}=="0" 
 SYSFS{size}=="234441648" 
    SYSFS{stat}=="1166 102 8386 739882 27 16 344 52 0 6575 739934" 

...

  looking at the device chain at 
'/sys/devices/pci0000:00/0000:00:1e.0/0000:05:04.0/fw-host0/0030e0f4e020dca0/0030e0f4e020dca0-0':
 BUS=="ieee1394" 
    ID=="0030e0f4e020dca0-0" 
    DRIVER=="sbp2" 
  SYSFS{address}=="0x0000fffff0000830" 
    SYSFS{ignore_driver}=="0" 
    SYSFS{length}=="0" 
    SYSFS{model_id}=="0x000001" 
    SYSFS{model_name_kv}=="OXFORD IDE Device LUN 0 " 
    SYSFS{specifier_id}=="0x00609e" 
    SYSFS{version}=="0x010483" 

  looking at the device chain at 
'/sys/devices/pci0000:00/0000:00:1e.0/0000:05:04.0/fw-host0/0030e0f4e020dca0':
 BUS=="ieee1394" 
    ID=="0030e0f4e020dca0" 
    DRIVER=="unknown" 
 SYSFS{bus_options}=="IRMC_0_ CMC_0_ ISC_0_ BMC_0_ PMC_0_ GEN_0_ 
   LSPD_2_ MAX_REC_64_ MAX_ROM_0_ CYC_CLK_ACC_255_" 
    SYSFS{capabilities}=="0x0083c0" 
    SYSFS{guid_vendor_id}=="0x0030e0" 
 SYSFS{guid}=="0x0030e0f4e020dca0" 
    SYSFS{nodeid}=="0xffc0" 
    SYSFS{tlabels_allocations}=="1262" 
    SYSFS{tlabels_free}=="64" 
    SYSFS{tlabels_mask}=="0x05965272090596527209" 
    SYSFS{vendor_id}=="0x0030e0" 
    SYSFS{vendor_name_kv}=="Oxford Semiconductor Ltd.   " 

...

В этом случае udevinfo сообщает мне, каким образом этот диск подключен к моему настольному компьютеру с Ubuntu: BUS=="ieee1394" (не забудьте, что IEEE1394 - это официальное название FireWire). Для устройств FireWire отсутствует запись SYSFS{serial}, которая есть для устройств USB; вместо этого в качестве уникальных идентификаторов используется SYSFS{guid}. На данном диске находятся мои персональные файлы, так что я хочу, чтобы он отображался как /media/data. Соберем все вместе и добавим в файл /etc/udev/rules.d/10-local.rules следующую строку:

BUS=="ieee1394", SYSFS{guid}=="0x0030e0f4e020e229", NAME{all_partitions}=="data"

После выполнения этой же самой процедуры еще три раза файл /etc/udev/rules.d/10-local.rules будет выглядеть следующим образом:

BUS=="usb", SYSFS{serial}=="6R0000065086", NAME{all_partitions}=="temp" 
BUS=="ieee1394", SYSFS{guid}=="0x0030e0f4e020e229", NAME{all_partitions}=="data" 
BUS=="ieee1394", SYSFS{guid}=="0x0030e0f4e020dca0", NAME{all_partitions}=="data_copy" 
BUS=="ieee1394", SYSFS{guid}=="0x0030e0f4e020912c", NAME{all_partitions}=="music" 
BUS=="ieee1394", SYSFS{guid}=="0x0030e0f4e020c727", NAME{all_partitions}=="music_copy"

Теперь мне необходимо проверить мои изменения с тем, чтобы убедиться, что они действительно работают. Во-первых, мне нужно перезагрузить udev, подсистему, которая обеспечивает управление всем этим безумием:

$ sudo /etc/init.d/udev restart

Теперь я буду проверять правила для внешнего диска USB, чтобы убедиться, что все работает. Для проверки я воспользуюсь командой udevtest. Команда имеет следующий синтаксис:

$ sudo udevtest sysfs_device_path subsystem

Как я смогу узнать значения sysfs_device_path и subsystem? Вспомните, когда я запускал команду udevinfo -a -p $(udevinfo -q path -n /dev/sda) и обратите внимание, какие именно данные мне прежде всего были выданы:

looking at class device '/sys/block/sda':
  SUBSYSTEM=="block"

Поэтому моя команда udevtest будет выглядеть следующим образом:

$ sudo udevtest /sys/block/sda block

Сразу за командой будет выдан результат (был удален ряд сообщений об ошибках, связанных с другими элементами в udev, которые здесь не рассматриваются):

udevtest.c: looking at device '/block/sda' from subsystem 'block'
...
udevtest.c: opened class_dev->name='sda'
udev_rules.c: configured rule in '/etc/udev/rules.d/10-local.rules:1' applied, 'sda' becomes 'temp'
udev_add.c: creating device node '/dev/temp', major = '8', minor = '0', mode = '0640', uid = '0', gid = '46'
udev_add.c: creating device partition nodes '/dev/temp[1-15]'

Отлично! Теперь я знаю, что udev создаст в действительности имя устройства /dev/temp и, следовательно, точку монтирования на /media/temp вместо /dev/sda и /media/sda и всегда в будущем будет использовать это имя. Кстати, не беспокойтесь, несмотря на то, что в выходных данных сказано, что были созданы узлы, в действительности это не так. Это лишь информационное сообщение.

Итак, я знаю, диск USB работает, но что относительно одного из устройств FireWire?

$ sudo udevtest /sys/block/sdd block

Вот результаты для этого диска (опять же, ненужные данные были удалены):

udevtest.c: looking at device '/block/sdd' from subsystem 'block'
...
udevtest.c: opened class_dev->name='sdd'
udev_rules.c: configured rule in '/etc/udev/rules.d/10-local.rules:5' applied, 'sdd' becomes 'music_copy'
udev_add.c: creating device node '/dev/music_copy', major = '8', minor = '48', mode = '0640', uid = '0', gid = '46'
udev_add.c: creating device partition nodes '/dev/music_copy[1-15]'

Именно то, что я хотел, так что похоже, что все будет работать так, как предполагалось. Теперь перезагрузите компьютер, и, вот, появились мои диски так, как я хотел:

/media/temp
/media/data
/media/data_copy
/media/music
/media/music_copy

Конечно, ничто вам не мешает продолжить настройку udev так, чтобы цифровая камера всегда изображалась как /media/camera. Или чтобы ваш музыкальный проигрыватель IRiver Music постоянно монтировался как /media/iriver. И так далее. В принципе, если ваша система видит устройство как динамически монтируемое, вы можете использовать udev для отображения его в конкретную точку монтирования. Благодаря udev стало намного проще пользоваться системой Ubuntu.


Назад Оглавление Вперед



Комментарии