建立符號連結會出現無法覆蓋目錄錯誤

建立符號連結會出現無法覆蓋目錄錯誤

我有一個帶有 postgresql 後端的 Django 應用程式。 Postgresql 不時建立臨時檔案——如果磁碟空間很重要(就像我的情況),這可能是個殺手。

緩解該問題的一種方法是建立指向磁碟空間不是瓶頸的其他儲存位置的符號連結。就我而言,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_tmpln -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 指令建立它。

首先要注意的是閃電網路不連結兩個對象;它創建一個從某個地方到具有特定名稱的目標的連結。

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

當您使用 建立連結時ln,NAME 參數應指示一個尚不存在的對象,並且它將作為命令的結果建立。在您的情況下,您已經將其建立~/pgsql_tmp為目錄 ( )。

通常,您可以使用該-f開關強制刪除已經與名稱路徑重疊的任何內容,但在您的情況下,您指定了-T這意味著您希望將連結建立為文件,而不是目錄。因此,當-f要覆寫 NAME 處的物件時,它會嘗試用檔案覆寫目錄。

因此,您可以將連結建立為目錄並使用 -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

相關內容