오늘날 /tmp
디렉토리는 직장의 컴퓨터에 가득 찼습니다. 문제는 매우 크지 않은 루트 파티션에 있다는 것입니다. 이 문제를 해결하기 위해 동료는 /new/tmp
다른 곳에 디렉토리를 작성하고 모든 내용을 새 디렉토리에 복사하고 원본을 제거하고 /tmp
symlink를 만들었습니다 /tmp -> /new/tmp
.
그가 파일을 복사했을 때 (실제로 이것은 내가 아닌 다른 사람이었습니다!) 그는 사용하지 않았 -a
으므로 모든 파일의 소유자 /new/tmp
는 root
입니다. 또한 /new/tmp
디렉토리 의 권한을 기본값 0755로 설정하지 않았습니다. 이로 인해 문제가 발생하지 않았으며 조정 모드 및 소유권 비트가 기계를 허용 가능한 작동 상태로 복원하지 못했습니다. 나는 모든 것을 핵화 /tmp
하고 재부팅해야했습니다.
/tmp
사람들의 무리가 VNC를 통해 그놈을 실행하기 때문에 디렉토리, 다양한 소켓과 파이프와 이것 저것을 포함, 내가 사용하는 screen
자신의 파이프를 가지고있다.
실행중인 시스템에서 다른 볼륨으로 디렉토리 를 이동 하는 안전한 방법이 /tmp
있습니까? 모든 것이 제대로 작동하기 위해 실제로 무엇을했는지 잘 모르겠습니다. 파이프와 소켓에 어떤 일이 일어나는지 특히 궁금합니다.
답변
“클라이언트”시스템에서 안전한 이동 방법 /tmp
은 재부팅하는 것입니다. 여기서 클라이언트에 따르면 소켓을 넣는 프로그램 /tmp
, 특히 X 서버 및 화면 을 실행하는 모든 것을 의미 합니다.
새로운 기능 /tmp
에는 반드시 올바른 권한 (1777)이 있어야합니다. 그렇지 않으면 작동중인 시스템을 가질 수 없습니다.
의 경우 /tmp
파일을 거의 복사 할 수 없습니다. 대부분의 /tmp
경우 파일 을 열어 두는 프로그램이 있기 때문 입니다. 파일을 복사하면 내용이 복사되지만 프로그램에서 여전히 기존 파일이 열려 있습니다. 디버거 ( ptrace
)를 사용하여 연결할 수는 있지만 재부팅보다 훨씬 복잡하며 많은 프로그램을 사용하면 충돌 할 수 있습니다.
당신이 경우 /tmp
전체이며 라이브 새로 전환하려면, 당신은 열려있는 파일이있는 모든 프로그램을 다시 시작해야합니다. 그것은 X와 스크린 세션을 재시작한다는 것을 의미하기 때문에 재부팅하는 것보다 낫지 않습니다.
새 프로그램으로 전환 할 수 있지만 공용 마운트 를 사용하여 기존의 열린 파일을 그대로 유지하십시오 . (원칙은 건전하지만 시도한 적이 없으므로 예상치 못한 문제가있을 수 있습니다.) Linux에서이를 수행하는 방법은 다음과 같습니다.
/tmp
수동으로 선택한 몇 개의 큰 파일을 제외하고 모든 기존 파일을 유지하십시오 ./tmp.new
(모드 1777)을 만듭니다 ./tmp
다른 경로에 노출하십시오 :mount --bind / /.root.only
. 이것은 다음 단계가 어두워지기 때문에 필요합니다/tmp
. 이 단계를 필요로하지 않는 다른 통합 마운트 구현이있을 수 있습니다./.root.only/tmp
및/tmp.new
에 탑재 된 유니온 마운트를 만듭니다/tmp
. 이 방법으로 작성된 새 파일/tmp
은로 작성/tmp.new
되지만의 파일/.root.only/tmp
도 아래에 표시됩니다/tmp
. 하나의 가능성은
unionfs 퓨즈 :unionfs-fuse /tmp.new:/.root.only/tmp /tmp
.
통합 마운트 루트를 사용하지 않으려면 (예 : 플랫폼에서 사용할 수 없거나 너무 많은 문제로 인해) 이전 디렉토리를 삭제하지 마십시오. 실행중인 프로그램이 이전 디렉토리를 계속 사용하고 새 프로그램이 새 디렉토리를 사용하도록 이동 하십시오. (물론 , 어디에 위치를 /tmp
설정 TMPDIR
하거나 달리 지시하지 않으면 새로운 프로그램은 소켓이나 파이프 인을 통해 기존 프로그램과 통신 할 수 없습니다 .)
mv /tmp /tmp.old && mkdir /tmp