HotSwapping da unidade dinâmica

1

A configuração é simples. Eu tenho um servidor montado em rack com 24 5 "compartimentos de unidade na frente. O servidor é executado PLEX. Cada disco rígido é particionado por NTFS e contém pastas opcionais na raiz. Servidor está executando o Debian8 (3.16.51-3)

Requisitos: Eu preciso ser capaz de usar HDDs plug-and-play, auto-montar partições NTFS, verificar a existência de pastas pré-definidas e criar um link simbólico para um diretório orientado pelo PLEX. Montagens e links simbólicos devem usar como padrão o UUID

Diretório opcional de pastas / Plex:

/plex
    /movies
    /tvseries
    /music
    /audiobooks

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

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

* Nota: udevadm control --reload-rules para recarregar depois de fazer alterações * Nota: udevadm monitor --udev pode ser usado para ver mudanças de montagem

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[a-z][0-9]):.*\bUUID\b[=]["]([^"]*)["].*$//p')
    UUID=$(echo '$block' | sed -rn 's/^(\/dev\/sd[a-z][0-9]):.*\bUUID\b[=]["]([^"]*)["].*$//p')
    echo "\tMounting Point: $BLK > $UUID" >> /plex/log.txt
done

* Observação: esse script precisa ser CHOWN root:root new_drive.sh e CHMOD +x new_drive.sh para que o UDEV tenha acesso

Log.txt atual:

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

Saída de blkid | grep (foreach)

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

Saída de sed (na saída acima)

 = /dev/sdf1
 = A2F66547F6651CB3

O problema atual parece estar no loop for-in, que o código está ignorando. Toda a minha pesquisa sugere que deve funcionar, não sei por que não é.

Para fins de teste, o gancho UDEV terá que ser modificado para seus próprios sistemas caso você decida usar fontes de mídia alternativas, como 'sd?' irá corresponder apenas unidades baseadas em SATA, apenas na unidade raiz (IE não / dev / sdf1), e assume que nada mais é conhecido sobre a unidade antes da execução do script.

    
por Komak57 05.08.2018 / 23:27

1 resposta

0

Houve alguns problemas que tive que corrigir. Em primeiro lugar, for block in $(...) resultou em 4 linhas de dados, não no único. A linha também era extremamente mesquinha sobre como eu adicionei a variável, e pularia se não fosse perfeita. Ao obter o BLK e o UUID, é importante observar que ' do apóstrofo não lê variáveis.

#!/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[a-z][0-9]):.*\bUUID\b[=]["]([^"]*)["].*$//p')
    UUID=$(echo "$block" | sed -rn 's/^(\/dev\/sd[a-z][0-9]):.*\bUUID\b[=]["]([^"]*)["].*$//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

Esse script funciona desde que a unidade não tenha o sinalizador "protegido pelo Windows", corrigido por NTFSFIX "$BLK" , mas não importa o quanto eu tente, não consigo corrigi-lo de forma síncrona com a atividade do script ( novo problema eu vou ter que pesquisar). Eu confirmei que é executado, mas a montagem subseqüente parece ser executada antes de terminar. Eu suponho isso porque eu tenho que primeiro desmontar a unidade, em seguida, execute o NTFSFIX e monte novamente a unidade. Eu também encontrei um problema menor com a unidade não desmontar automaticamente, e iria remontar com uma nova letra de unidade a cada vez subseqüente. Isso foi resolvido por outro script com outro argumento 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
    
por 06.08.2018 / 06:46