ダイナミックドライブホットスワッピング

ダイナミックドライブホットスワッピング

設定は簡単です。前面に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

関連情報