tập tin / dev / null trở thành tập tin thông thường


19

Trong máy chủ sản xuất của chúng tôi đột nhiên /dev/nulltrở thành một tệp thông thường và do dịch vụ sshd này đã bị dừng và không thể đăng nhập máy chủ. Và chúng tôi cũng đã thử các bước dưới đây để định cấu hình lại tệp thiết bị ký tự,

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

Ngay sau khi chúng tôi chạy, rmlệnh /dev/nullsẽ được tạo lại như một tệp thông thường trước khi mknodcó thể chạy. Chúng tôi không thể tìm hiểu làm thế nào điều này xảy ra và thành phần nào đang tạo tập tin này. Vì vậy, cho đến khi chúng tôi giải quyết vấn đề này, chúng tôi không thể tạo /dev/nulldưới dạng tệp thiết bị ký tự.


Bạn đang sử dụng hệ điều hành và bản phát hành nào trên máy chủ? udev có thể đang tạo tập tin.
ptman

Centos 5.2 và bạn có thể vui lòng giải thích cách udev tạo tệp này.
dùng197719

man fuser, bạn có thể tìm thấy một quá trình truy cập một tập tin và giết nó. Bạn có thể đặt một thuộc tính trên tập tin đó - man chattr.
jirib

Tôi không có máy centos tiện dụng, nhưng Ubuntu 12.04 có một quy tắc trong /lib/udev/rules.d/50-udev-default.rulesviệc tạo/dev/null
ptman

3
lsof /dev/nulllà bạn của bạn.
Andrew B

Câu trả lời:


29

Khi bạn xóa (rm) / dev / null, mọi chương trình / tập lệnh đang chạy và cần "> / dev / null" hoặc tương đương sẽ tạo lại một tệp mới (thông thường) với tên đó. Và chúng có thể sinh sản bất cứ lúc nào (và một số cũng có thể liên tục viết cho nó)

Để đánh bại họ:

bạn tạo một tệp đặc biệt mới / dev / null (dưới một tên khác)

mknod /dev/newnull c 1 3
chmod 777 /dev/newnull

và bạn di chuyển nó qua (như root) những cái được tạo liên tục:

mv -f /dev/newnull /dev/null

Và chỉ sau đó bạn mới có thể khởi động lại (không khởi động lại mà không có tệp / dev / null thích hợp ... thường không dễ dàng) [Tôi quên bước đó, tất nhiên là cần thiết. Cảm ơn @ Random832 đã nhắc nhở!]

Cuối cùng, bạn cần khởi động lại, để thoát khỏi chương trình hiện có, người vẫn sẽ mở "/ dev / null" và vẫn sẽ ghi vào hệ thống tệp ngay cả khi bạn thay thế nó sau đó, lấp đầy hệ thống tệp đó từng chút một) (Thật vậy , giống như khi xóa một tệp, bất kỳ chương trình nào vẫn mở mô tả tệp đó sẽ vẫn có thể ghi vào nút cũ, ngay cả khi tên tệp hiện đang trỏ đến tệp mới)


2
Anh ta vẫn nên khởi động lại máy chủ sau đó - bất cứ điều gì đã bắt đầu ghi vào tệp thông thường sẽ tiếp tục ghi vào tệp đã xóa và sử dụng hết dung lượng đĩa.
Random832

@ Random832: rất đúng, nhưng ít nhất việc khởi động lại SAU khi có tệp đúng / dev / null mới dễ dàng hơn nhiều ... ( nhiều chương trình và tập lệnh phụ thuộc vào nó để hoạt động chính xác)
Olivier Dulac

8

Bạn có thể chạy lsof /dev/nullvà xem nếu có một quá trình mở nó ra nhưng nó sẽ không cho bạn thấy những gì đang xảy ra trong thời gian thực.

Một lựa chọn khác là làm cho thiết bị và di chuyển nó vào vị trí.

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

Nhưng tôi muốn biết cái gì đang phá vỡ hệ thống trước. Bạn đã thay đổi bất cứ điều gì gần đây có thể gây ra điều này?


7

Lý do tại sao bạn không thể tạo lại /dev/nullcó khả năng là một cái gì đó liên tục viết cho nó như thế này:

echo "foo" > /dev/null

Kiểm tra nội dung của tệp sẽ cho bạn biết quy trình có thể là gì.

Để khắc phục hệ thống của bạn bây giờ, hãy làm theo các hướng dẫn sau:

  1. tắt hệ thống
  2. khởi động với init=/bin/bash
  3. kể lại / viết
  4. tạo thiết bị char
  5. khởi động lại

Tôi thực sự khuyên bạn nên kiểm tra hệ thống mạnh mẽ để xác định cách / dev / null bị xóa. Đảm bảo hệ thống của bạn không bị xâm phạm, hãy kiểm tra nhật ký hệ thống của bạn thật kỹ.


4

Tôi đã tìm ra nguyên nhân và cách khắc phục trên hệ thống archlinux của mình.

Nếu bạn sử dụng bash và HISTFILE = / dev / null trong môi trường, bạn không nên thực thi nhiều lệnh hơn $ HISTFILESIZE hoặc $ HISTSIZE. Nếu bạn đã thực thi nhiều lệnh hơn $ HISTFILESIZE trên bash trong khi HISTFILE là / dev / null và bạn đã thoát bash, bash di chuyển / dev / null ở một nơi khác và tạo lại / dev / null dưới dạng tệp thông thường với quyền 600.

Nếu bạn sử dụng tramp trên emacs 24.4, tramp-sh.el sẽ đặt HISTFILE thành / dev / null. Do đó, nếu bash là shell cho root và nếu bạn thực hiện nhiều thao tác root với tramp trên emacs 24.4, khi bạn giết emacs, tramp sẽ khiến bash xóa / dev / null.

Vui lòng kiểm tra xem HISTFILE được đặt thành / dev / null trong .bashrc hoặc trong các chương trình như emacs 24.4.

Trong trường hợp của tôi, việc thay đổi shell thành zsh hoạt động xung quanh thực tế là tramp làm cho bash xóa / dev / null trên emacs 24.4.


Không có lý do gì để viết LỊCH SỬ thành / dev / null. Bạn nên đặt HISTSIZE thành "0" để tắt hoàn toàn LỊCH SỬ.
Tim Haegele

Bạn cũng có thể unset HISTFILEvô hiệu hóa lịch sử mà không cần làm gì với / dev / null.
Michael Hampton

Tuy nhiên, tramp-sh.el trên emacs 24.4 đặt HISTFILE thành / dev / null và hiện tại tôi không thể làm gì về điều đó. Tôi symlinked / bin / dash to / bin / sh để khắc phục sự cố.
crocket
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.