Câu trả lời:
Có ba điều có thể xảy ra:
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.
Segmentation fault
và bạn tuyên bố rằng nó đã hoàn thành thành công ...?
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.
Từ mmap
trang 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 mmap
hàm. Một MAP_PRIVATE
ánh xạ kiểu được yêu cầu (tìm trong fs/binfmt_elf.c
câ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 dd
tự 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 dd
gọi trước .
Đú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 ...
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.
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ả.