프로덕션 서버에서 갑자기 /dev/null
일반 파일이되었고이 sshd 서비스로 인해 서버에 로그인 할 수 없었습니다. 또한 문자 장치 파일로 다시 구성하기 위해 아래 단계를 시도했습니다.
rm -rf /dev/null
mknod /dev/null c 1 3
실행하자마자 rm
명령 을 실행 /dev/null
하기 전에 일반 파일로 다시 작성 mknod
합니다. 어떻게 이런 일이 발생하고 어떤 구성 요소가이 파일을 생성하고 있는지 파악할 수 없습니다. 따라서이 문제를 해결하기 전까지는 /dev/null
문자 장치 파일 로 만들 수 없습니다 .
답변
(rm) / dev / null을 삭제하면 실행 중이고 “> / dev / null”또는 이와 동등한 프로그램 / 스크립트가 해당 이름의 새 파일 (일반)을 다시 만듭니다. 그리고 그것들은 언제라도 스폰 될 수 있습니다 (일부는 지속적으로 쓸 수도 있습니다)
그들을 이길 :
새로운 / dev / null 특수 파일을 생성합니다 (다른 이름으로)
mknod /dev/newnull c 1 3
chmod 777 /dev/newnull
그리고 지속적으로 생성 된 것들 위로 (루트로) 이동하십시오.
mv -f /dev/newnull /dev/null
그런 다음에야 재부팅 할 수 있습니다 (적절한 / dev / null 파일없이 재부팅하지 마십시오 … 일반적으로 쉽지 않습니다) [물론 그 단계를 잊었습니다. 상기시켜 주셔서 감사합니다 @ Random832!]
“/ dev / null”을 열어두고 나중에 교체하더라도 파일 시스템에 기록하는 기존 프로그램을 제거하려면 결국 재부팅해야합니다. 파일 시스템을 조금씩 채 웁니다. 파일을 삭제할 때와 마찬가지로 파일 설명자가 열려있는 프로그램은 파일 이름이 이제 새 파일을 가리 키더라도 이전 inode에 쓸 수 있습니다.)
답변
실행 lsof /dev/null
중인 프로세스가 있는지 확인하고 실시간으로 진행중인 작업을 표시하지는 않습니다.
다른 옵션은 장치를 만들어 제자리에 옮기는 것입니다.
mknod /dev/null.tmp c 1 3 && mv /dev/null.tmp /dev/null
그러나 나는 시스템을 먼저 깨뜨리는 것이 무엇인지 알고 싶습니다. 최근에이 문제를 일으킬 수있는 것을 변경 했습니까?
답변
다시 만들 수없는 이유 /dev/null
는 무언가가 다음과 같이 연속해서 작성하기 때문일 수 있습니다 .
echo "foo" > /dev/null
파일 내용을 검사하면 어떤 프로세스인지 알 수 있습니다.
지금 시스템을 수정하려면 다음 지시 사항을 따르십시오.
- 시스템을 종료
- 로 부팅
init=/bin/bash
- 재 장착 가능
- 문자 장치를 만듭니다
- 재부팅
/ dev / null이 어떻게 삭제되었는지 확인하기 위해 시스템을 철저히 검사하는 것이 좋습니다. 시스템이 손상되지 않았는지 확인하고 시스템 로그를 철저히 확인하십시오.
답변
내 아치 리눅스 시스템에서 원인과 수정 사항을 찾았습니다.
bash를 사용하고 HISTFILE = / dev / null이 환경에 있으면 $ HISTFILESIZE 또는 $ HISTSIZE보다 많은 명령을 실행하지 않아야합니다. HISTFILE이 / dev / null 인 동안 bash에서 $ HISTFILESIZE보다 많은 명령을 실행하고 bash를 종료 한 경우 bash는 / dev / null을 다른 곳으로 이동하고 / dev / null을 권한 600의 일반 파일로 다시 만듭니다.
emacs 24.4에서 tramp를 사용하는 경우 tramp-sh.el은 HISTFILE을 / dev / null로 설정합니다. 따라서 bash가 루트의 쉘이고 emacs 24.4에서 tramp로 많은 루트 작업을 수행하는 경우 emacs를 종료 할 때 tramp는 bash가 / dev / null을 삭제하게합니다.
.bashrc 또는 emacs 24.4와 같은 프로그램에서 HISTFILE이 / dev / null로 설정되어 있는지 확인하십시오.
필자의 경우 쉘을 zsh로 변경하면 tramp가 emacs 24.4에서 bash delete / dev / null을 만드는 사실을 해결합니다.