Điều gì xảy ra nếu tôi dd số không vào ổ đĩa nơi dd cư trú?


10

Lệnh này có dd if=/dev/zero of=/dev/sda bs=1Mthành công không nếu lệnh dd ban đầu được bật / dev / sda? Điều này sẽ hoàn thành bởi vì dd có trong bộ nhớ tại thời điểm đó?

Câu trả lời:


40

Có ba điều có thể xảy ra:

  1. Lệnh bắt đầu, chạy cho đến khi hoàn thành và bạn bị rơi trở lại dấu nhắc. Vì đĩa được xóa sạch một cách hiệu quả, bạn không thể làm gì nhiều sau đó, mặc dù bạn có thể gặp may mắn với một số lệnh tích hợp shell.
  2. Lệnh bắt đầu. Tại một số điểm, nó được phân trang do áp lực bộ nhớ. Thông thường đây không phải là vấn đề vì các phần của nó chỉ có thể được tải lại từ đĩa (dữ liệu không thay đổi) từ trao đổi. Tuy nhiên nếu bạn vừa xóa sạch chúng thì lệnh dd sẽ bị lỗi một phần mặc dù việc lấp đầy đĩa.
  3. Tùy chọn thứ ba là một cái gì đó từ BSD. MBR trên đĩa được gắn được bảo vệ khỏi ghi đè. Ngay cả khi bạn chạy lệnh như root. Có hàng tá bản phân phối Linux, tất cả chỉ khác nhau một chút. Hoàn toàn có khả năng một số người trong số họ mô phỏng điều này.


Cho đến nay cho lý thuyết. Bây giờ cho một bài kiểm tra thực tế.

Tôi đã cài đặt Ubuntu 12.10 mới trên máy ảo. (Máy trạm VMware trên win7-x64, sử dụng các tùy chọn mặc định và đĩa ảo 10 GB).

Lệnh dd đã hoàn thành thành công và tôi đã quay trở lại với những gì có vẻ như là một dấu nhắc làm việc. Tôi có thể nhập các lệnh mới, mặc dù chúng sẽ thất bại vì những lý do rõ ràng.

Ảnh chụp màn hình của máy ảo Ubuntu sau khi xóa đĩa


9
+1 lớn cho bài kiểm tra thực tế!
Doug Harris

10
Tôi thấy Segmentation faultvà bạn tuyên bố rằng nó đã hoàn thành thành công ...?
Alvin Wong

1
Đúng vậy Nó làm cho đĩa không thể đọc được. Tôi nghĩ đó là mục tiêu. Để xóa an toàn, bạn thực sự nên thử một cái gì đó khác (chẳng hạn như lệnh xóa an toàn).
Hennes

một trong những câu trả lời hay nhất tôi từng nhận được Cảm ơn!
agz

6

Một thử nghiệm nhanh trong một máy ảo sử dụng Damn Small Linux cho thấy lệnh dd thực sự hoàn thành, như mong đợi; chương trình ban đầu được tải vào bộ nhớ để chạy và rất ít có ý nghĩa để tải thực thi nhiều lần trong suốt quá trình. Cuối cùng, dd sẽ thoát và báo cáo 'không còn chỗ trống trên thiết bị'.

Sau đó, hệ điều hành dường như hoạt động bình thường ngay từ cái nhìn đầu tiên, nhưng bị treo sau lệnh đầu tiên, nó không còn có thể thực thi vì lý do rõ ràng và trở nên không phản hồi. Một kiểm tra ngắn gọn về nội dung ổ cứng cho thấy phân vùng thực sự đã bị xóa.


4

Từ mmaptrang trên Linux:

MAP_SHARED Share this mapping.  Updates to the mapping are visible to other processes that map this  file,
           and  are  carried  through  to the underlying file.  The file may not actually be updated until
           msync(2) or munmap() is called.


MAP_PRIVATE
           Create a private copy-on-write mapping.  Updates to the mapping are not visible to other  pro‐
           cesses  mapping  the  same  file,  and  are  not carried through to the underlying file.  It is
           unspecified whether changes made to the file after the mmap() call are visible  in    mapped
           region.

Các tệp thực thi được ánh xạ tới bộ nhớ bởi kernel thông qua một cuộc gọi nội bộ đến mmaphàm. Một MAP_PRIVATEánh xạ kiểu được yêu cầu (tìm trong fs/binfmt_elf.ccây nguồn kernel).

Vì vậy, nó tập trung vào hành vi mmap: liệu các thay đổi trong tệp, hoặc thiết bị khối bên dưới mà tệp đó được tham chiếu, được truyền trở lại các trang của ánh xạ đã được phân trang và hiện diện.

Trang đó dựa trên các tiêu chuẩn API, thay vì hành vi kernel, do đó "không xác định". Hành vi thực tế là các thay đổi đối với tệp không được truyền trở lại các trang đã có. Tất nhiên, nếu chương trình đột nhiên nhảy đến một trang mã chưa được phân trang và việc xóa đã diễn ra, thì nó sẽ nhận được một trang gồm tất cả các số không.

Nhưng, rất có thể, theo thời gian ddtự xóa, nó đã phân trang trong tất cả các trang mã cần thiết để tiếp tục vòng lặp xóa. Có khả năng là một khi vòng lặp chấm dứt, nó có thể gặp một số mã trong một trang không có mặt: như, nói rằng một hàm trải dài qua một ranh giới trang, vì vậy để đến được lệnh trả về, một trang phải được tìm nạp.

Nhưng trang đó cũng có thể được lưu trong bộ nhớ cache từ lần ddgọi trước .


1

Đúng. Tất nhiên, nó cũng sẽ tiêu tốn của bạn phần lớn hệ thống tập tin của bạn, nhưng có lẽ bạn đã biết rằng ...


0

Tôi đã phạm một sai lầm gần đây. Tôi dự định dd 2 GB img vào Thẻ SD, nhưng đã nhầm lẫn với sda dd if=rasberrypi.img of=/dev/sda. Nhận ra lỗi của tôi và hủy dd, nhưng sau đó ~ 600 MB (trên đĩa có ~ 500GB đã sử dụng) đã được ghi. Bảng phân vùng đã bị hủy hoại.

Máy tính để bàn (có bộ nhớ 10 GB trở lên trong nhiều tuần) tiếp tục hoạt động trong vài giờ nếu không có gì xảy ra. Được quản lý để nhận các tệp quan trọng gần đây đã thay đổi thành dropbox, được duyệt trong chrome thông thường. Trong thực tế, tôi có thể chạy dd sang thẻ SD như tôi mong muốn ban đầu, hoạt động tốt.

Sau một vài giờ, hệ thống tập tin của tôi chuyển sang chế độ chỉ đọc và các chương trình ngẫu nhiên bắt đầu chết. Tôi đã được đưa vào nhiều hệ thống khác, tôi có thể tiếp tục sử dụng các phiên đó, nhưng làm cho phiên mới có lỗi mà nó không thể tìm thấy chương trình ssh. Tại thời điểm này tôi có thể chuyển đổi các tab đang mở bằng chrome, nhưng nội dung của các tab dường như đã "treo". Nếu tôi làm mới, tôi sẽ có được màn hình trắng mãi mãi. rsyslogd đã lấy 100% cpu (1 lõi) vì một số lý do, có lẽ nó đã bị nhầm lẫn tại sao nó không thể xóa các bản ghi vào đĩa ... có thể.

Tôi đã có một video 350 MB được mở (và tạm dừng) trong VLC, tôi vẫn có thể phát video đó và bỏ qua bất kỳ phần nào của video. Có lẽ kể từ khi tải về gần đây.

Tôi có thể tắt hệ thống bình thường bằng GUI, không có lỗi.

Vì vậy, điều này không trả lời chính xác câu hỏi của bạn, nhưng cho biết điều gì sẽ xảy ra nếu bạn xóa sạch đĩa ..

Hầu hết mọi thứ trên đĩa vẫn có thể phục hồi được, nhưng tôi sẽ không bận tâm vì (hy vọng) mọi thứ tôi quan tâm đều được sao lưu.


-1

Nhiều khả năng nó sẽ không hoàn thành, vì một số thành phần thực thi khác sẽ yêu cầu một tệp bị thiếu và hoảng loạn kernel. nếu bạn thực sự muốn làm trống đĩa, hãy sử dụng đĩa CD trực tiếp; nếu không bạn không bao giờ có thể đảm bảo kết quả.


2
Yêu cầu một tệp bị thiếu sẽ không khiến kernel bị hoảng loạn. Nếu vậy, máy móc sẽ sập nếu chúng chỉ có một đĩa không đáng tin cậy.
David Schwartz

@DAvid Schwartz, nếu đó là trường hợp, thì #rm -rf / sẽ thực sự xóa toàn bộ hệ thống tệp. Tôi biết từ các thí nghiệm đó không phải là trường hợp. hệ thống không thể duy trì hoạt động hoàn toàn từ ram trừ khi một số loại công nghệ ramdisk được triển khai, không theo tiêu chuẩn.
Frank Thomas

@FrankThomas: Nhân có hoảng không?
David Schwartz

vâng, tắt màn hình đen.
Frank Thomas
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.