Intereting Posts
Ctrl-y, yanking содержимое x-clipboard на терминал добавляет строку командной строки оболочки Как скопировать каталог и вложенные папки, но игнорировать определенные файлы в подпапке? Рекомендации по распределению для настройки мультисезона с использованием двухголовочного и поддерживающего прямого рендеринга за цикл над списком Ограничение переадресации IP между определенными интерфейсами / сетями Как правильно удалить код выхода / обработать ошибки при использовании замещения процесса? Использование различных профилей (.kshrc_xxx) в ksh Не удается установить php-mssql или freetds на Centos7 Может ли zswap сократить свопинг IO? Как удалить файл с помощью команды mv? Установка GPG вместе с запущенным: сконфигурировать проблему? nginx ./configure не может найти openssl Подтвердите и / или удалите возможную настройку формирования трафика Как напечатать '-e' с эхом? Обратный порядок элементов с точками в строке

Динамический привод HotSwapping

Установка проста. У меня есть монтируемый в стойку сервер с 24 5-дюймовыми отсеками для дисков в передней части. На сервере работает PLEX. Каждый жесткий диск имеет раздел NTFS и содержит дополнительные папки в корневом каталоге. Сервер работает под управлением Debian8 (3.16.51-3)

Требования: мне нужно иметь возможность подключать и воспроизводить жесткие диски, автоматически монтировать разделы NTFS, проверять наличие предопределенных папок и символическую ссылку на каталог, ориентированный на PLEX. Mounts и Symlinks должны по умолчанию использовать UUID

Каталог дополнительных папок / Plex:

/plex /movies /tvseries /music /audiobooks 

Крюк UDEV: /etc/udev/rules.d/sata-rackmount.rules

 ACTION=="add", KERNEL=="sd?", RUN+="/plex/new_drive.sh" 

* Примечание: udevadm control --reload-rules для перезагрузки после внесения изменений * Примечание: udevadm monitor --udev можно использовать для просмотра изменений в монтировании

BASH: /plex/new_drive.sh

 #!/bin/sh echo "New Drive Detected" >> /plex/log.txt echo "\tLABEL: ${ID_SERIAL_SHORT}" >> /plex/log.txt echo "\tNAME: ${DEVNAME}" >> /plex/log.txt echo "\tMOUNT required" >> /plex/log.txt for block in $( blkid -t TYPE=ntfs | grep "${DEVNAME}" ) do echo "\t > Block Found" BLK=$(echo '$block' | sed -rn 's/^(\/dev\/sd[az][0-9]):.*\bUUID\b[=]["]([^"]*)["].*$/\1/p') UUID=$(echo '$block' | sed -rn 's/^(\/dev\/sd[az][0-9]):.*\bUUID\b[=]["]([^"]*)["].*$/\2/p') echo "\tMounting Point: $BLK > $UUID" >> /plex/log.txt done 

* Примечание: этот сценарий должен быть CHOWN root:root new_drive.sh и CHMOD +x new_drive.sh чтобы UDEV имел доступ

Текущий log.txt:

 New Drive Detected LABEL: WD-WCANKC405910 NAME: /dev/sdf MOUNT required 

Вывод blkid | grep (foreach)

 /dev/sdf1: UUID="A2F66547F6651CB3" TYPE="ntfs" PARTUUID="1549f232-01" 

Выход sed (на выходе выше)

 \1 = /dev/sdf1 \2 = A2F66547F6651CB3 

Похоже, что текущая проблема связана с моим циклом for-in, который код пропускает прямо сейчас. Все мои исследования показывают, что это должно работать, но не знаю, почему это не так

В целях тестирования хук UDEV придется модифицировать для ваших собственных систем на случай, если вы решите использовать альтернативные медиа-источники, как ‘sd?’ будет соответствовать только дискам на основе SATA, только на корневом диске (IE не / dev / sdf1) и предполагает, что до запуска скрипта больше ничего не известно о диске.

Было несколько проблем, которые мне пришлось исправить. Во-первых, for block in $(...) получено 4 строки данных, а не одна. Строка также очень скупа на то, как я добавил переменную, и пропустит, если она не будет идеальной. При получении BLK и UUID важно отметить, что апострофы «не читают переменные».

 #!/bin/sh echo "New Drive Detected" >> /plex/log.txt echo "\tLABEL: ${ID_SERIAL_SHORT}" >> /plex/log.txt echo "\tNAME: ${DEVNAME}" >> /plex/log.txt #fixed to collect output line, instead of arguments for block in "$( blkid -t TYPE=ntfs | grep ${DEVNAME} )"; do echo "\tPartition Found: $block" >> /plex/log.txt BLK=$(echo "$block" | sed -rn 's/^(\/dev\/sd[az][0-9]):.*\bUUID\b[=]["]([^"]*)["].*$/\1/p') UUID=$(echo "$block" | sed -rn 's/^(\/dev\/sd[az][0-9]):.*\bUUID\b[=]["]([^"]*)["].*$/\2/p') echo "\tMounting Point: $BLK > /media/$UUID" >> /plex/log.txt mkdir -p "/media/$UUID" #repair in case of exclusivity #ntfsfix "$BLK" mount -t ntfs-3g -U "$UUID" "/media/$UUID" if [ -d "/media/$UUID/movies" ]; then echo "\tMovie Directory Found" >> /plex/log.txt mkdir -p "/plex/movies" ln -s "/media/$UUID/movies" "/plex/movies/$UUID" fi if [ -d "/media/$UUID/tvseries" ]; then echo "\tTV Directory Found" >> /plex/log.txt mkdir -p "/plex/tvseries" ln -s "/media/$UUID/tvseries" "/plex/tvseries/$UUID" fi if [ -d "/media/$UUID/anime" ]; then echo "\tAnime Directory Found" >> /plex/log.txt mkdir -p "/plex/anime" ln -s "/media/$UUID/anime" "/plex/anime/$UUID" fi if [ -d "/media/$UUID/music" ]; then echo "\tMusic Directory Found" >> /plex/log.txt mkdir -p "/plex/music" ln -s "/media/$UUID/music" "/plex/music/$UUID" fi if [ -d "/media/$UUID/audiobooks" ]; then echo "\tAudio Book Directory Found" >> /plex/log.txt mkdir -p "/plex/audiobooks" ln -s "/media/$UUID/audiobooks" "/plex/audiobooks/$UUID" fi done 

Этот сценарий работает до тех пор, пока на накопителе отсутствует флаг «windows protected», установленный NTFSFIX "$BLK" , но как бы я ни старался, я не могу заставить его исправить синхронно с действием сценария (новый проблема мне придется исследовать). Я подтвердил, что он выполняется, но последующее монтирование выполняется до его завершения. Я предполагаю это, потому что мне нужно сначала размонтировать диск, затем запустить NTFSFIX, а затем снова смонтировать диск. Я также обнаружил небольшую проблему с автоматическим отключением диска, и каждый последующий раз менялся с новой буквой диска. Это было решено другим скриптом с другим аргументом UDEV:

UDEV: /etc/udev/rules.d/sata-rackmount.rules

 ACTION=="add", KERNEL=="sd?", RUN+="/plex/new_drive.sh" ACTION=="remove", KERNEL=="sd??", RUN+="/plex/rem_drive.sh" 

/plex/rem_drive.sh

 #!/bin/sh echo "Drive Lost" >> /plex/log.txt echo "\tLABEL: ${ID_SERIAL_SHORT}" >> /plex/log.txt echo "\tNAME: ${DEVNAME}" >> /plex/log.txt echo "\tDismounting..." >> /plex/log.txt umount "${DEVNAME}" echo "\tDone!" >> /plex/log.txt