설정은 간단합니다. 전면에 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