NFSでシンボリックリンクを追跡する方法は?

NFSでシンボリックリンクを追跡する方法は?

写真付きの別のディスクがあります。

/media/drive1/pictures/
/media/drive2/pictures/
/media/drive3/pictures/
/media/drive4/pictures/
# ...

というファイルがあります共有するシンボリックリンクがありますすべて各サブフォルダ各ドライブのディレクトリです。各サブフォルダを次のスクリプトにマージします。

# I do this for every drive
for item in "/media/drive1/pictures/"*
do
    target=/media/share/pictures/`basename "$item"`
    if [ ! -d "$target" ]; then
        ln -s "$item" "$target"
        chown -h lsc:lsc "$target"
    fi
done

私はしばらくSambaとうまく共有してきました。

[global]
# ...
follow symlinks = yes

これは純粋なプライベートネットワークであり、共有は読み取り専用なので、セキュリティはあまり問題になりません。

### /etc/exports
/media/share *(ro,async)

共有をマウントすると、mount 1.2.3.4:/ fooシンボリックリンクはlocalhostで追跡を試みます。

私の質問:シンボリックリンクでフォルダを共有する方法存在する共有マウントホスト?

メモ:bind bind各サブフォルダが異なる場所/ディスクを指しているため、ここではソリューションは/etc/fstab機能しません。/media/share/

ベストアンサー1

すべてのシンボリックリンクを比較的に作成できないのはなぜですか?それはすべてです。

NFSサーバー(1.2.3.4)に次のデバイスがインストールされているとします(物理ドライブが異なる場合があります)。

/media/drive1/pictures/
/media/drive2/pictures/
/media/drive3/pictures/
/media/drive4/pictures/
# ...

スクリプトのln行を次に変更します。

 ln -s "$item" "$target"

読む

 ln -s "../${item#/media/}" "$target"

これにより、次の形式のシンボリックリンクが生成されます。

../drive1/pictures/...

これがプライベートネットワークであり、セキュリティは問題にならないと述べたので、エクスポートを次のように設定できます。

### /etc/exports
/media *(ro,async)

その後、NFSがマウントされたクライアントシステムで

mkdir -p foo; mount 1.2.3.4:/media foo

fooには、共有、ドライブ1、ドライブ2、ドライブ3、ドライブ4などが表示されます。

したがって、実際にはクライアントにメディアディレクトリ全体がマウントされ、シンボリックリンクが相対的であるため、正常に機能します。必要な変更は非常に少なく、${item#/media/}あなたのbashバージョンはこの構文をサポートまたはサポートしていない可能性があり、同等のコマンドであればすべて可能です(sedコマンド、awk、または/ media /を切り捨てるのに慣れているコマンドを使用できます)。 。

次のフォルダまたはファイルがある場合、残りの唯一の問題は一意の名前です。

/media/drive1/pictures/same_name1
/media/drive2/pictures/same_name1

現在のコード

if [ ! -d "$target" ]; then
    ln -s "$item" "$target"
    chown -h lsc:lsc "$target"
fi

最初のターゲットが見つかったら、シンボリックリンクの生成をスキップします。したがって、その名前がす​​でに別のドライブで使用されているため、純粋にシンボリックリンクが見つからないファイルがいくつかある可能性があります。

このような場合に一種の一意の識別子を追加するには、シンボリックリンク名を変更する必要があります。

if [ -d "$target" ]; then
    #extract out the "drive1" part from $item and prepend it to target 
    target="$(echo item | sed -e 's!/media/\([^/]*\)/pictures.*!\1!g')_${target}"
fi

if [ ! -d "$target" ]; then
    ln -s "$item" "$target"
    chown -h lsc:lsc "$target"
fi

おすすめ記事