Sẽ
dd if=/dev/zero of=somepartition bs=512
cũng xóa sạch phân vùng sau somepartition
hoặc dừng ở cuối somepartition
?
Sẽ
dd if=/dev/zero of=somepartition bs=512
cũng xóa sạch phân vùng sau somepartition
hoặc dừng ở cuối somepartition
?
Câu trả lời:
dd
dd
là một công cụ rất mạnh mẽ nhưng cũng nguy hiểm. Nó làm những gì bạn bảo nó làm mà không có câu hỏi. Vì vậy, nếu bạn bảo nó xóa ảnh gia đình, ... và đó là một lỗi đánh máy nhỏ.
Nhưng nếu bạn kiểm tra và kiểm tra lại, bạn có thể sử dụng nó.
dd if=/dev/zero of=somepartition bs=512
hoặc tôi sẽ đề nghị
dd if=/dev/zero of=/dev/sdxn bs=4096
trong đó x
là ký tự ổ đĩa và n
là số phân vùng và kích thước khối 4096 byte làm cho quá trình ghi nhanh hơn.
Điều quan trọng là bạn viết vào một phân vùng trong trường hợp này. Nếu bạn ghi vào toàn bộ ổ đĩa (đầu ổ đĩa) /dev/sdx
, toàn bộ ổ đĩa sẽ bị ghi đè. Nhưng việc ghi vào phân vùng sẽ bị gián đoạn ở cuối phân vùng và các phân vùng phía sau nó sẽ được giữ nguyên. ( Bây giờ tôi đã thử nghiệm trên một ổ USB trong LubFi 16.04 LTS, vì vậy tôi biết rằng nó hoạt động như vậy.)
Có một ngoại lệ cho một phân vùng mở rộng (là một thùng chứa cho các phân vùng hợp lý, để có nhiều hơn bốn phân vùng trong bảng phân vùng MSDOS). Điều này được mô tả trong liên kết sau đây,
Tôi có thể tạo hình ảnh của phân vùng 'mở rộng' bằng dd không?
Nhưng có một vấn đề khác nữa. Tôi đã kiểm tra lệnh của bạn trong môi trường thử nghiệm và dd chỉ đọc một kibibyte (1024 byte) khi tôi muốn nó tạo ra hình ảnh của một phân vùng mở rộng.
Bây giờ tôi cũng đã thử nghiệm điều này trên một ổ USB trong LubFi 16.04 LTS và điều này áp dụng cho việc viết (cũng như đọc). Chỉ có kibibyte đầu tiên được ghi đè.
Vì vậy, để tóm tắt, ghi đè các phân vùng chính và phân vùng logic hoạt động theo mô tả chính trong câu trả lời này. Nhưng không sử dụng phương pháp này để ghi đè lên một phân vùng mở rộng vì chỉ có kibibyte đầu tiên sẽ bị ghi đè. Các phân vùng logic của phân vùng mở rộng sẽ không còn được tìm thấy qua bảng phân vùng, nhưng dữ liệu được lưu trữ trong chúng vẫn còn đó.
dd
và nó có rủi ro, do đó bạn rất cẩn thận khi sử dụng nó. Chúc may mắn :-) Nói chung, bạn phải luôn có một bản sao lưu của tất cả các tệp mà bạn không thể để mất.
Ghi vào một thiết bị phân vùng sẽ không ghi bên ngoài phân vùng đó, với dd hoặc bất cứ thứ gì khác. Bạn sẽ cần sử dụng một thiết bị wholedisk để có bất kỳ ảnh hưởng nào bên ngoài một phân vùng duy nhất.
(Hãy cẩn thận: trừ khi đĩa của bạn có bảng phân vùng với các phân vùng chồng chéo, điều này sẽ không bao giờ xảy ra.)
Tôi nghĩ rằng câu hỏi của bạn dựa trên sự hiểu lầm cơ bản về cách thức dd
(và trên thực tế các hệ điều hành giống Unix nói chung) hoạt động:
dd
không thể ghi đè lên các phân vùng liền kề, đơn giản vì dd
không thể ghi đè lên các phân vùng, dấu chấm .
dd
chỉ cần ghi vào tập tin . Đó là nó.
Bây giờ, nếu bạn vượt qua dd
một tệp đại diện cho nhiều phân vùng, thì dd
sẽ ghi đè lên tệp đó . Nhưng trong trường hợp đó, nó không dd
viết quá cuối phân vùng. dd
sẽ vẫn ghi cho đến hết tập tin và chỉ cho đến khi kết thúc tập tin.
Nhưng, nếu bạn vượt qua dd
một tệp chỉ đại diện cho một phân vùng, thì nó dd
sẽ không ghi quá cuối phân vùng này. Một lần nữa, điều này không có gì để làm với dd
. dd
chỉ cần ghi vào tập tin mà bạn bảo nó ghi vào. Thực tế là tệp này đại diện cho một phân vùng duy nhất (trong trường hợp này) được đảm bảo bởi trình điều khiển thiết bị khối trong kernel. dd
không có gì để làm với điều đó.
Vì vậy, trong ngắn hạn: dd
ghi vào các tập tin. Những gì các tập tin đại diện, không phải làdd
phải là mối quan tâm của. dd
không biết gì về phân vùng.
dd
để ghi vào phân vùng thô. Bạn chỉ có thể ghi vào tập tin. Tất nhiên bạn có thể ghi vào một tệp thiết bị khối đại diện cho một phân vùng (chẳng hạn như /dev/sda1
), nhưng bạn không thể ghi vào một phân vùng thô. Và vì bạn chỉ có thể ghi vào một tệp đại diện cho một phân vùng, nên bạn không thể ghi qua phần cuối của phân vùng, vì tệp chỉ đại diện cho phân vùng, chứ không phải phân vùng và một chút qua cuối.
/dev/sda
trong trình soạn thảo văn bản của mình và thay đổi dữ liệu, dd
không khác với bất kỳ chương trình nào khác về khả năng truy cập các phân vùng. Câu trả lời rất hay!
Có một kịch bản đặc biệt nguy hiểm, nhưng hiếm gặp, trong đó điều này có thể xảy ra ngay cả với trình điều khiển thiết bị không có lỗi:
Bạn phải cẩn thận với dd vì nếu bạn mắc lỗi, bạn có thể ghi đè nhiều hơn bạn đã mặc cả và điều đó phụ thuộc vào việc bạn đang sử dụng dd để làm gì (OP mơ hồ trong việc sử dụng dd và cú pháp chính xác của dd chỉ huy).
Nếu bạn chỉ định một phân vùng, nó sẽ ghi vào phân vùng đó cho đến khi phân vùng đầy.
Nếu bạn mắc lỗi và đặt toàn bộ ổ đĩa, ví dụ = = dev / sda, dd sẽ ghi vào toàn bộ ổ đĩa để kết thúc bỏ qua (và ghi đè) bảng phân vùng của bạn.
Bạn cũng có thể cho chúng tôi dd trên một phân vùng để ghi đè lên các tệp đã bị xóa (các tệp đã xóa có thể vẫn còn trên phân vùng và được phát hiện bởi các công cụ khôi phục khác nhau với nhiều mức độ thành công khác nhau cho đến khi chúng được viết xong. Trong trường hợp này, bạn có thể sử dụng dd để lấp đầy không gian trống viết vào một tập tin.
dd if=/dev/zero of=/path/to/mount_point/zero_file bs=4096
rm -f /path/to/mount_point/zero_file
Tuy nhiên, tùy thuộc vào những gì bạn đang làm, bạn có thể muốn sử dụng một công cụ thay thế để xóa các tệp một cách an toàn. Xem Cách xóa (các) tệp theo cách an toàn? cho các tùy chọn.
dd
không phải là cấp thấp. Trong thực tế, hầu hết những điều mọi người sử dụng dd
có thể đã được thực hiện giống như vậy với cat
. Trong thực tế cat
là nhanh hơn một chút vì nó sử dụng các khối lớn hơn so với dd
mặc định. Tất cả các mã cấp thấp là trong kernel. Và trình điều khiển không thực sự quan tâm nếu bạn đang sử dụng dd
hoặc cat
.
dd if=/dev/zero of=/dev/sda bs=512 count=1
hoặc dd if=/dev/zero of=/dev/sda bs=512
là những ví dụ. Với lệnh thứ hai, nó sẽ tiếp tục ghi và điền vào toàn bộ đĩa "bỏ qua" bảng phân vùng. Nếu bạn chỉ định một phân vùng, dd if=/dev/zero of=/dev/sda1
nó sẽ không vượt ra ngoài phân vùng. Sắp xếp phụ thuộc vào những gì bạn muốn làm với dd.
of=somepartition
, vì vậy trường hợp bạn ghi vào toàn bộ thiết bị đĩa không áp dụng. dd
không thể vượt qua giới hạn của trình điều khiển thiết bị.
/dev/sda1
, được tạo bởi kernel theo cách không thể truy cập vào bộ lưu trữ liền kề thông qua chúng (giả sử bảng phân vùng không bị thay đổi sau khi kernel đọc nó lần cuối). Nếu bạn có thể truy cập vào bộ lưu trữ liền kề theo cách đó, nó sẽ được coi là một lỗi rất lớn.