심볼릭 링크를 생성하면 디렉터리 오류를 덮어쓸 수 없습니다.

심볼릭 링크를 생성하면 디렉터리 오류를 덮어쓸 수 없습니다.

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_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 명령으로 생성하도록 하는 것입니다.

먼저 다음 사항에 유의하세요.LN두 개체를 연결하지 않습니다. 장소에서 특정 이름을 가진 대상에 대한 링크를 생성합니다.

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

를 사용하여 링크를 생성할 때 lnNAME 인수는 아직 존재하지 않는 객체를 나타내야 하며 해당 객체는 명령의 결과로 생성됩니다. 귀하의 경우에는 이미 해당 디렉토리( ~/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

관련 정보