Библиотека сайта 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.
| Назад | Оглавление | Вперед |
