/ dev / null 파일이 일반 파일이되었습니다


19

프로덕션 서버에서 갑자기 /dev/null일반 파일이되었고이 sshd 서비스로 인해 서버에 로그인 할 수 없었습니다. 또한 문자 장치 파일로 다시 구성하기 위해 아래 단계를 시도했습니다.

rm -rf /dev/null
mknod /dev/null c 1 3

실행하자마자 rm명령 을 실행 /dev/null하기 전에 일반 파일로 다시 작성 mknod합니다. 어떻게 이런 일이 발생하고 어떤 구성 요소가이 파일을 생성하고 있는지 파악할 수 없습니다. 따라서이 문제를 해결하기 전까지는 /dev/null문자 장치 파일 로 만들 수 없습니다 .


서버에서 어떤 OS 및 릴리스를 사용하고 있습니까? udev가 파일을 작성 중일 수 있습니다.
ptman

Centos 5.2와 udev가이 파일을 작성하는 방법을 자세히 설명해 주시겠습니까?
user197719

man fuser, 파일에 액세스하여 프로세스를 종료하는 프로세스를 찾을 수 있습니다. 그러한 파일에 속성을 넣을 수 있습니다-man chattr.
jirib

편리한 centos 머신은 없지만, 우분투 12.04는 /lib/udev/rules.d/50-udev-default.rules생성 규칙이 있습니다/dev/null
ptman

3
lsof /dev/null당신의 친구입니다.
앤드류 B

답변:


29

(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에 쓸 수 있습니다.)


2
이후에도 여전히 서버를 다시 시작해야합니다. 일반 파일에 쓰기 시작한 항목은 삭제 된 파일에 쓰기를 계속하고 디스크 공간을 계속 사용합니다.
Random832

@ Random832 : 매우 사실,하지만 적어도 재부팅의 자리에 새 올바른을 / dev / null 파일을 한 후에는 (... 훨씬 더 쉽게 많은 프로그램과 스크립트가 제대로 작동하려면에 의존)
올리비에 Dulac

8

실행 lsof /dev/null중인 프로세스가 있는지 확인하고 실시간으로 진행중인 작업을 표시하지는 않습니다.

다른 옵션은 장치를 만들어 제자리에 옮기는 것입니다.

mknod /dev/null.tmp c 1 3 && mv /dev/null.tmp /dev/null

그러나 나는 시스템을 먼저 깨뜨리는 것이 무엇인지 알고 싶습니다. 최근에이 문제를 일으킬 수있는 것을 변경 했습니까?


7

다시 만들 수없는 이유 /dev/null는 무언가가 다음과 같이 연속해서 작성하기 때문일 수 있습니다 .

echo "foo" > /dev/null

파일 내용을 검사하면 어떤 프로세스인지 알 수 있습니다.

지금 시스템을 수정하려면 다음 지시 사항을 따르십시오.

  1. 시스템을 종료
  2. 로 부팅 init=/bin/bash
  3. 재 장착 가능
  4. 문자 장치를 만듭니다
  5. 재부팅

/ dev / null이 어떻게 삭제되었는지 확인하기 위해 시스템을 철저히 검사하는 것이 좋습니다. 시스템이 손상되지 않았는지 확인하고 시스템 로그를 철저히 확인하십시오.


4

내 아치 리눅스 시스템에서 원인과 수정 사항을 찾았습니다.

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을 만드는 사실을 해결합니다.


/ dev / null에 HISTORY를 쓰는 이유는 없습니다. HISTORY를 완전히 비활성화하려면 HISTSIZE를 "0"으로 설정해야합니다.
Tim Haegele

unset HISTFILE/ dev / null에 대한 작업을 수행하지 않고 기록을 비활성화 할 수도 있습니다 .
Michael Hampton

그러나 emacs 24.4의 tramp-sh.el은 HISTFILE을 / dev / null로 설정하고 지금은 할 수있는 일이 없습니다. 문제를 해결하기 위해 / bin / dash를 / bin / sh에 연결했습니다.
로켓
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.