Каждое утро в 9 утра мы подключаем внешний жесткий диск к нашему офисному серверу (всегда к одному и тому же USB-порту).
Каждый день HD новые, но все они сделаны одним производителем (Freecom).
Ежедневно в 12 часов утра запускается сценарий для резервного копирования всего на жесткий диск.
Первый шаг - смонтировать HD следующим образом:
mount /dev/sdc1 /mnt/backup
Проблема в том, что иногда файл устройства - это не / dev / sdc1, а что-то еще (например, / dev / sdd1). Я до сих пор не могу понять, почему, поскольку мы ничего не подключаем и всегда используем один и тот же порт.
Итак, моя проблема в том, как очень безопасным способом программно определить нужный файл устройства. Пока что моя единственная идея - выполнить поиск содержимого каталога / dev / disk / by-id, чтобы найти и извлечь / dev / xxx из этой строки:
lrwxrwxrwx 1 root root 10 Sep 24 11:03 usb-Freecom_ToughDrive_1A90102657FF-part1 -> ../../sdc1
Есть предложения лучше? Есть опасения по поводу моего пути?
Я очень удивлен, как lsusb не может мне так сильно помочь.
в by-id
запись - это ссылка, в большинстве случаев вы можете просто использовать ее вместо /dev/sdc1
. если нет, вы можете разыменовать его с помощью readlink
readlink -f /dev/disk/by-id/usb-Freecom_ToughDrive_1A90102657FF-part1
/dev/sdc1
Вы можете легко исправить это с помощью правил udev. Правила udev запускаются при загрузке и при различных событиях горячей замены для запуска специальных программ / служб обработки или установки имен устройств. Похоже на то, что вы хотите, чтобы правило udev согласовывало имя вашего диска с чем-то вроде / dev / backup, чтобы запись mtab могла последовательно монтировать / dev / backup в / mnt / backup (вы даже можете установить устройство автоматически, если вы мне нравится.
Вот более старое, но все еще актуальное руководство по написание правил udev. В последних дистрибутивах Linux udevinfo
функциональность была свёрнута в udevadm
команда. Использование такой команды должно помочь вам выяснить, какие именно поля вы хотите сопоставить:
udevadm info -q all --path=/sys/block/sdc
Как только вы узнаете, каких полей достаточно для сопоставления, вы захотите создать файл правил udev в /etc/udev/rules.d/
(отмечая, что файлы правил оцениваются в естественном порядке сортировки, и ваш дистрибутив может иметь собственные правила, хранящиеся где-то, например /lib/udev/rules.d/
так назовите соответственно). Вы захотите создать правило, которое выглядит примерно так, которое создаст /dev/backup
символическая ссылка, указывающая на то, что устройство названо:
ENV{DEVTYPE}=="disk", ID_SERIAL=="Freecom_ToughDrive_1A90102657FF", SYMLINK+="backup"
ENV{DEVTYPE}=="partition", ID_SERIAL=="Freecom_ToughDrive_1A90102657FF", SYMLINK+="backup%n"
Заметка: Я предполагаю, что серийный номер выше на основе /dev/disk/by-id/
вы перечисляете выше. Это может не совпадать в правом поле или правильном значении. Также обратите внимание, что это соответствует определенному серийному номеру и, следовательно, конкретному устройству, вам необходимо изменить это, если вы меняете устройства.
Надеюсь, это поможет!
Простой подход: Поскольку я все время использую udev, чтобы довести продукты до потребителя, это часто первое, к чему я обращаюсь. udev уже делает то, что вы хотите, создавая уникальное устройство /dev/disk/by-id
записи. Просто измени свой /etc/mtab
установить /dev/disk/by-id/Freecom_ToughDrive_1A90102657FF-part1
в /mnt/backup
. А mount /mnt/backup
в вашем скрипте хватит для монтирования.
Если вы это сделаете
tail /var/log/messages
сразу после того, как вы вставите USB, вы увидите, какое устройство оно было распознано.
Я столкнулся с той же проблемой в одной из моих реализаций, поэтому, найдя решение, написал статью. Это может помочь другим найти устройство USB в Linux в случае UDEV, который автоматически создает устройства или управляет ими.