동적 드라이브 핫 스와핑

동적 드라이브 핫 스와핑

설정은 간단합니다. 전면에 24개의 5" 드라이브 베이가 있는 랙 서버가 있습니다. 서버는 PLEX를 실행하고 있습니다. 각 HDD는 루트의 선택적 폴더로 NTFS로 파티션되어 있습니다. 서버는 Debian8(3.16.51-3)을 실행하고 있습니다.

요구 사항: HDD를 연결하고 재생할 수 있어야 하고, NTFS 파티션을 자동으로 마운트하고, 사전 정의된 폴더가 있는지 검색하고, PLEX 지향 디렉터리에 대한 심볼릭 링크를 연결할 수 있어야 합니다. 마운트 및 심볼릭 링크는 기본적으로 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[a-z][0-9]):.*\bUUID\b[=]["]([^"]*)["].*$/\1/p')
    UUID=$(echo '$block' | sed -rn 's/^(\/dev\/sd[a-z][0-9]):.*\bUUID\b[=]["]([^"]*)["].*$/\2/p')
    echo "\tMounting Point: $BLK > $UUID" >> /plex/log.txt
done

*참고: 이 스크립트에 액세스 CHOWN root:root new_drive.sh하려면 UDEV가 필요합니다.CHMOD +x new_drive.sh

현재 log.txt:

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

blkid(foreach)의 출력 |

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

sed의 출력(위 출력)

\1 = /dev/sdf1
\2 = A2F66547F6651CB3

이것현재 문제코드가 건너뛰는 for-in 루프와 관련된 것 같습니다. 내 연구에서는 이것이 작동해야 한다고 말하지만 왜 작동하지 않는지 잘 모르겠습니다.

테스트 목적으로 대체 미디어 소스(예: "sd?")를 사용하기로 결정한 경우 자체 시스템에 맞게 UDEV 후크를 수정해야 합니다. 루트 드라이브(IE는 /dev/sdf1이 아님)에서만 SATA 기반 드라이브와 일치하며 스크립트가 실행되기 전에 드라이브에 대해 알려진 것이 없다고 가정합니다.

답변1

내가 해결해야 할 몇 가지 문제가 있습니다. 첫째, 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[a-z][0-9]):.*\bUUID\b[=]["]([^"]*)["].*$/\1/p')
    UUID=$(echo "$block" | sed -rn 's/^(\/dev\/sd[a-z][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

관련 정보