シンボリックリンクを作成するとディレクトリを上書きできないというエラーが発生する

シンボリックリンクを作成するとディレクトリを上書きできないというエラーが発生する

私は postgresql バックエンドを備えた Django アプリを持っています。Postgresql は時々一時ファイルを作成します。ディスク容量が重要な場合 (私の場合がそうです)、これは致命的になる可能性があります。

この問題を軽減する方法の 1 つは、ディスク領域がボトルネックにならない別のストレージ場所へのシンボリックリンクを作成することです。私の場合、postgresql は に一時ファイルを保存します/$PGDATA/base/pgsql_tmp。 に大きな SSD がマウントされている/mntので、代わりにそこに一時ファイルを保存したいと考えています。次の方法でこの問題を解決できます。

ln -sTf /mnt/pgsql_tmp $PGDATA/base/pgsql_tmp
chown -R postgres /mnt/pgsql_tmp #ensuring user 'postgres' has the right perms
chmod o+x /mnt

これを本番環境で実行する前に、ローカルでテストすることにしました。デスクトップに/mntと を作成し/pgsql_tmp、 を試しましたln -sTf /home/hassan/Desktop/mnt/pgsql_tmp /home/hassan/Desktop/pgsql_tmp

しかし、結局、 という結果になりますln: ‘/home/hassan/Desktop/pgsql_tmp’: cannot overwrite directory。私が間違っているところを誰か指摘してもらえますか? 初心者なので、これがどのように機能するかを理解しようとしています。

答え1

最善策は、 を削除し~/pgsql_tmp、 ln コマンドで作成することです。

まず、翻訳2 つのオブジェクトをリンクするのではなく、場所の特定の名前を持つターゲットへのリンクを作成します。

ln [OPTION]... [-T] TARGET LINK_NAME

でリンクを作成する場合ln、NAME 引数はまだ存在しないオブジェクトを示す必要があり、コマンドの結果として作成されます。あなたの場合は、すでに~/pgsql_tmpディレクトリとして ( ) 作成されています。

通常、-fスイッチを使用して、NAME のパスとすでに重複しているものを強制的に削除できますが、あなたの場合は、-Tディレクトリではなくファイルとしてリンクを作成することを指定しました。そのため、-fNAME のオブジェクトを上書きしようとすると、ディレクトリをファイルで上書きしようとします。

したがって、リンクをディレクトリとして作成して -f を使用するか、NAME と重複するオブジェクトを削除してからリンクを作成することができます。後者が最適なオプションです。

#create a test target with a file, but without an object at lnname
~/tmp$ mkdir lntarget
~/tmp$ touch lntarget/contentfile1
~/tmp$ ln -sTf lntarget lnname
~/tmp$ ls ./lnname
contentfile1

答え2

古い質問であることは承知していますが、詳細を追加したいと思います。

ご質問のとおり、ソース = "/$PGDATA/base/pgsql_tmp"、宛先 = "/mnt/pgsql_tmp"

したがって、宛先で「pgsql_tmp」を指定する必要はありません。「ln -sf」を実行すると、新しい「pgsql_tmp」が作成されるか、すでに存在する場合はソースにリンクされます。したがって、コマンドは次のようになります。

ln -sf /$PGDATA/base/pgsql_tmp /mnt/

上記のケースは、ソースに「pgsql_tmp」があり、それが宛先にも同じになるように、ソースと同じ名前の宛先リンクを設定する場合です。宛先ディレクトリ名が異なる場合は、以下のようにスイッチ T を使用します。

ln -sfT /$PGDATA/base/pgsql_tmp /mnt/new_dir

関連情報