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