設定は簡単です。前面に24個の5インチドライブベイを備えたラックサーバーがあります。サーバーはPLEXを実行しています。各HDDはルートのオプションのフォルダーとしてNTFSに分割されています。あります。
要件: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