Tôi có thể đọc từ / dev / null; Làm thế nào để sửa nó?


80

Tôi đọc bài viết trên Wikipedia/dev/null và đang chơi xung quanh bằng cách di chuyển các tệp đến /dev/null.

Đối với điều này, tôi đã tạo test_filevà đặt một số nội dung trong đó:

$ touch test_file
$ echo "This is written by Aditya" > test_file
$ cat test_file
This is written by Aditya

Sau đó tôi đã cố gắng chuyển tập tin sang /dev/null:

$ mv test_file /dev/null
mv: inter-device move failed: ‘test_file’ to ‘/dev/null’; unable to remove target: Permission denied

Vì, điều này đã cho tôi một Permission deniedLỗi; Tôi đã đi trước và sử dụng sudonhư tôi thường làm bất cứ khi nào tôi gặp một Permission deniedlỗi.

$ sudo mv test_file /dev/null

Lệnh đã thành công và test_filekhông còn hiện diện trong thư mục.

Tuy nhiên, bài viết trên Wikipedia nói rằng không thể khôi phục bất cứ thứ gì được chuyển đến /dev/nullvà nó cung cấp cho EOFbất kỳ quá trình nào cố gắng đọc từ nó. Nhưng, tôi có thể đọc từ /dev/null:

$ cat /dev/null
This is written by Aditya

Tôi đã làm gì sai và làm cách nào để khắc phục /dev/nulltrở lại bình thường? Và tại sao tôi gặp Permission deniedlỗi ở nơi đầu tiên?

Câu trả lời:


147

/dev/nulllà một tập tin Một tập tin đặc biệt. Một tệp thiết bị như / dev / sda hoặc / dev / tty nói chuyện với một phần cứng trên hệ thống của bạn.

Sự khác biệt duy nhất /dev/nulllà không có phần cứng được liên kết với nó. Bất kỳ dữ liệu bạn gửi đến nó sẽ được loại bỏ âm thầm. Giống như lệnh sau:

echo "Hello World" > /dev/null

sẽ không in bất cứ thứ gì trên thiết bị đầu cuối của bạn bởi vì bạn gửi đầu ra echothành null, do đó, một lỗ đen.

Nhưng khi bạn mv test_file /dev/nullđã thay thế tệp đặc biệt /dev/nullbằng một tệp văn bản bình thường, giữ một bản sao nội dung của bạn test_file. Nói cách khác, bạn đã mất /dev/null.

Bây giờ, những gì bạn phải làm là (để xây dựng lại nó):

sudo rm /dev/null
sudo mknod -m 0666 /dev/null c 1 3

Bạn nên xây dựng lại nó bởi vì rất nhiều tập lệnh theo mặc định gửi đầu ra tới /dev/null. Nếu /dev/nullkhông còn là một lỗ đen mà là một tệp văn bản thông thường, nó có thể phát triển, phát triển và lấp đầy hệ thống tệp của bạn. Và tôi chắc chắn bạn muốn tránh điều này.

Và nguy hiểm hơn nhiều, rất nhiều kịch bản cho rằng đọc từ /dev/nullsẽ không đọc được gì; phá vỡ giả định này có thể dẫn đến rác ngẫu nhiên được ghi trong các tệp xung quanh hệ thống của bạn ... thực tế không thể sửa chữa.

Và hãy nhớ rằng Linux là đa tác vụ: trong khi bạn đang chơi /dev/null, rất nhiều quy trình đang chạy và có thể tàn phá ngay cả trong vài giây "cửa sổ cơ hội".

Nếu bạn muốn chơi với /dev/nullbạn, bạn có thể tạo một bản sao và thử nghiệm với nó:

sudo mknod -m 0666 /tmp/null c 1 3 

Sẽ tạo một /tmp/nulltệp hoạt động theo cùng một cách chính xác /dev/nullnhưng bạn có thể thao tác và kiểm tra mà không có bất kỳ rủi ro nào cho hệ thống của bạn.


16

Có một sự khác biệt lớn giữa ghi đè một tệp và ghi vào một tệp.

Khi bạn viết một cái gì đó cho /dev/null , ví dụ,

$ echo Hello > /dev/null

... nó bị âm thầm loại bỏ. Đối với điều này, bạn cần có quyền ghi /dev/null, mà mọi người đều có:

$ ls -l /dev/null 
crw-rw-rw- 1 root root 1, 3 Mar 18 13:17 /dev/null

Khi bạn ghi đè /dev/null , như bạn đã làm với mvlệnh, bạn thay thế tệp đặc biệt /dev/nullbằng bất cứ thứ gì bạn chuyển đến đó. Đừng làm điều này! Lý do bạn cần quyền root để thực hiện điều đó là vì để ghi đè tệp, bạn cần quyền ghi vào thư mục chứa tệp , trong trường hợp này /dev:

$ ls -ld /dev
drwxr-xr-x 16 root root 4640 Mar 18 13:17 /dev

Để khôi phục /dev/null, ban hành các lệnh

$ sudo rm /dev/null
$ sudo mknod -m 0666 /dev/null c 1 3

(Cũng xem StackExchange của U & L: Cách tạo/dev/null )


8

Khi bạn chạy lệnh

$ sudo mv test_file /dev/null

bạn đã thay thế tệp đặc biệt /dev/nullbằng tệp văn bản của bạn. Các lần thử tiếp theo để đọc từ /dev/nulltrả về nội dung của tệp văn bản của bạn và các chương trình cố gắng sử dụng /dev/nulltheo cách thông thường có thể sẽ bị hỏng.

Thay thế hoặc xóa các tập tin thiết bị trong /dev/yêu cầu đặc quyền siêu người dùng, đó là lý do tại sao nỗ lực không sudo của bạn không thành công với một lỗi.

Xem câu trả lời của Benoit để biết thông tin về cách khôi phục /dev/nullthủ công, nhưng vì hầu hết (nếu không phải tất cả) nội dung /dev/được udev quản lý một cách linh hoạt, tôi nghi ngờ việc khởi động lại đơn giản cũng có thể khắc phục nó.


6

Để trả lời câu hỏi của bạn về những gì bạn nên làm, để xóa một tệp, bạn làm:

rm test_file

Như những người khác đã nêu, / dev / null là đích đến cho đầu ra của các chương trình.


2
Tôi đã không downvote, nhưng câu hỏi không phải là về việc xóa tập tin ... Tôi biết chúng tôi sử dụng rmđể xóa tập tin / thư mục ... Tôi chỉ đọc /dev/nullvà để hiểu thêm về nó, tôi đã cố gắng di chuyển tập tin đến /dev/nullvà xem Hiệu ứng .. Câu hỏi này là về việc hiểu những gì tôi đã làm sai bằng cách di chuyển các tệp đến /dev/nullkết quả mà tôi có thể đọc từ đó ... Câu hỏi không phải là về cách xóa tệp khỏi hệ thống ... Tôi hy vọng đó là rõ ràng ... Nhưng câu trả lời của bạn vẫn được chào đón và đủ tốt để được giữ lại như một câu trả lời ... :-)
Aditya

7
Để công bằng, hỏi những kiểu gọi "Tôi đã làm gì sai" để giải thích về những gì đáng lẽ phải được thực hiện thay thế. Nó có thể là tầm thường đối với hầu hết người dùng nhưng không có câu trả lời nào khác thậm chí đề cập đến nó.
kapex
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.