Utworzenie dowiązania symbolicznego nie może zastąpić błędu katalogu

2

Mam aplikację Django z zapleczem postgresql. Postgresql od czasu do czasu tworzy pliki tymczasowe - może to zabijać, jeśli miejsce na dysku jest krytyczne (jak w moim przypadku).

Jednym ze sposobów rozwiązania tego problemu jest utworzenie dowiązania symbolicznego do innej lokalizacji magazynu, w której miejsce na dysku nie stanowi wąskiego gardła. W moim przypadku postgresql przechowuje pliki tymczasowe pod adresem /$PGDATA/base/pgsql_tmp. Mam zamontowany duży dysk SSD /mnt, więc chcę, aby pliki tymczasowe tam rezydowały. Należy się tym zająć:

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

Zanim zrobiłem to w produkcji, postanowiłem przetestować to lokalnie. Stworzyłem /mnti /pgsql_tmpna pulpicie, a następnie spróbowałem ln -sTf /home/hassan/Desktop/mnt/pgsql_tmp /home/hassan/Desktop/pgsql_tmp.

Ale to mi daje ln: ‘/home/hassan/Desktop/pgsql_tmp’: cannot overwrite directory. Czy ktoś może wskazać, co robię źle? Będąc neofitą, naprawdę próbuję owinąć głowę, jak to działa.

Hassan Baig
źródło
Myślę, że należy rozważyć sens Ti fflagi ln, a potem myślę, że nie powinien tego robić w ogóle. Po pierwsze, jest nieprzejrzysty. Po drugie, bazy danych uwielbiają mieć wszystko pod kontrolą, a nawet możliwe jest, że system nie otworzy takiego pliku, ponieważ open()można powiedzieć, że wywołania traktują dowiązania symboliczne jako błędy. Powodem jest to, że linki symboliczne mogą wskazywać niemal wszędzie. Pierwszym wyborem powinna być zmiana konfiguracji bazy danych.
Uruchom CMD
Taka konfiguracja jest standardową praktyką we wszechświecie postgresql
Hassan Baig
Dzięki za wskaźnik. Brzmi „Wierzę, że jest to zaakceptowana praktyka”, co nieco różni się od „to standardowa praktyka”. Ale z pewnością jest to dowód, że działał przynajmniej w niektórych konfiguracjach.
Uruchom CMD

Odpowiedzi:

2

Najlepiej jest usunąć ~/pgsql_tmpi pozwolić, aby polecenie ln go utworzyło.

Pierwsza uwaga, że LN nie łączy dwóch obiektów; tworzy link do celu o określonej nazwie z miejsca.

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

Podczas tworzenia łącza za lnpomocą argumentu NAZWA powinien wskazywać obiekt, który jeszcze nie istnieje, i zostanie utworzony w wyniku polecenia. W twoim przypadku już go utworzyłeś ( ~/pgsql_tmp) jako katalog.

Zwykle możesz użyć -fprzełącznika, aby wymusić usunięcie wszystkiego, co już pokrywa się ze ścieżką NAME, ale w twoim przypadku określiłeś, -Tco oznacza, że ​​chcesz utworzyć link jako plik, a nie katalog. Kiedy więc -fidzie nadpisać obiekt w NAME, próbuje on nadpisać katalog plikiem.

Możesz więc utworzyć łącze jako katalog i użyć opcji -f lub usunąć obiekt pokrywający się z NAZWĄ, a następnie utworzyć łącze. Później jest najlepszą opcją.

#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
Frank Thomas
źródło
Przypuszczam, że usunięcie /pgsql_tmpi pozwolenie na lnutworzenie polecenia było głównym składnikiem, którego mi brakuje. Powiedz mi coś. Mój prawdziwy scenariusz jest taki, że dzienniki postgresql są zapisywane /$PGDATA/base/pgsql_tmp, podczas gdy chcę, aby wszystkie one rezydowały /mnt/pgsql_tmp. Więc to jest to, co muszę zrobić: najpierw usuń folder pgsql_tmpwewnątrz /$PGDATA/base/. Utwórz folder o nazwie /pgsql_tmpwewnątrz mnt, a następnie uruchom ln -s /mnt/pgsql_tmp /$PGDATA/base/pgsql_tmp. Poprawny?
Hassan Baig
tak, ale prawdopodobnie w większości przypadków dane zostałyby przeniesione z, zamiast /$PGDATA/base/do mnt/pgsql_tmpnich.
Frank Thomas
you can either create the link as a directory and use -fNie widzę innego sposobu, aby lnzmienić katalog na dowiązanie symboliczne poza usunięciem katalogu przed uruchomieniem ln. Co w ogóle oznacza „utwórz link jako katalog”?
x-yuri