Dd có thể ghi đè lên các phân vùng liền kề


15

Sẽ

dd if=/dev/zero of=somepartition bs=512

cũng xóa sạch phân vùng sau somepartitionhoặc dừng ở cuối somepartition?


5
Các thiết bị chặn đại diện cho các phân vùng, ví dụ /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.
David Foerster

Câu trả lời:


18

Ghi đè lên một phân vùng với dd

ddlà 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 đó xlà ký tự ổ đĩa và nlà 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.)

Ngoại lệ cho một phân vùng mở rộng

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 đó.


Tôi đã chấp nhận, nhưng nếu điều này là như vậy thì đây sẽ là câu trả lời chính xác.
LogicBreaker

3
@LogicBreaker, Có lẽ bạn có thể di chuyển sự chấp nhận. Nhưng điều đó không quan trọng. Điều quan trọng hơn là bạn hiểu cách sử dụng ddvà 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.
sudodus

1
Khi viết lên các phân vùng trống, bạn không có nhiều lựa chọn thay thế. Tôi di chuyển, nếu không nó sẽ gây hiểu lầm cho người khác.
LogicBreaker

1
Đây là lý do tại sao người dùng thường không thể truy cập các tập tin / dev / * ".
Thorbjørn Ravn Andersen

1
Nếu đây là bản sao duy nhất của ảnh gia đình bạn không có bản sao lưu, thì bạn có thể bị mất chúng bất cứ lúc nào do mất cắp, hỏa hoạn, tai nạn hoặc lỗi phần cứng đơn giản :-)
user334639

4

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.)


3
Một cảnh báo khác: nếu bạn đang sử dụng một cái gì đó như LVM, việc ghi vào một tập vật lý dĩ nhiên có thể ảnh hưởng đến nhiều khối lượng logic.
Tối đa

4

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:

ddkhông thể ghi đè lên các phân vùng liền kề, đơn giản vì ddkhông thể ghi đè lên các phân vùng, dấu chấm .

ddchỉ cần ghi vào tập tin . Đó là nó.

Bây giờ, nếu bạn vượt qua ddmột tệp đại diện cho nhiều phân vùng, thì ddsẽ ghi đè lên tệp đó . Nhưng trong trường hợp đó, nó không ddviết quá cuối phân vùng. ddsẽ 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 ddmột tệp chỉ đại diện cho một phân vùng, thì nó ddsẽ 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. ddchỉ 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. ddkhông có gì để làm với điều đó.

Vì vậy, trong ngắn hạn: ddghi 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. ddkhông biết gì về phân vùng.


Mmh ... với dd chỉ ghi vào tệp, bạn không thể sử dụng nó để ghi vào phân vùng thô.
LogicBreaker

1
Chính xác. Bạn không thể sử dụ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.
Jörg W Mittag

3
Jorg đề cập đến một trong những ý tưởng chính của triết lý Unix - "mọi thứ đều là một tập tin". Như vậy, kernel trình bày các phần, thiết bị, cổng, vv dưới dạng tệp. Kết quả là, mọi chương trình có thể ghi vào tệp có thể được sử dụng để ghi vào phân vùng hoặc thiết bị. Đó là công việc của kernel để thực thi ranh giới phân vùng. Bạn có thể mở /dev/sdatrong trình soạn thảo văn bản của mình và thay đổi dữ liệu, ddkhô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!
Sergey

1

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ảng phân vùng trên đĩa được thay đổi theo cách phân vùng x được thay đổi kích thước để kết thúc ở ranh giới thấp hơn trước. Phân vùng y phía sau nó được thay đổi kích thước bắt đầu ở ranh giới thấp hơn hoặc phân vùng y mới được thêm vào không gian.
  • Phân vùng y chứa đầy dữ liệu có liên quan bằng các phương tiện độc lập với bảng phân vùng, ví dụ: sử dụng dd với các tùy chọn bỏ qua / đếm trên toàn bộ thiết bị khối đĩa (ví dụ / dev / sda)
  • Ioctl yêu cầu kernel đọc lại bảng phân vùng không được cấp hoặc bị lỗi do các thiết bị bận
  • Phân vùng x được ghi bởi bất kỳ quá trình nào cố gắng ghi vào nó cho đến khi nó gặp phải một điều kiện lỗi.

0

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.


6
Nếu bạn có thể ghi vào / dev / sdcX và quản lý để ghi trên một ranh giới phân vùng, thì đó sẽ không phải là việc bỏ qua bảng phân vùng - đó sẽ là trình điều khiển thiết bị khối trong kernel bị lỗi và bỏ qua bảng phân vùng.
rackandboneman

1
@sudodus ddkhô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 ddcó thể đã được thực hiện giống như vậy với cat. Trong thực tế catlà nhanh hơn một chút vì nó sử dụng các khối lớn hơn so với ddmặ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 ddhoặc cat.
kasperd

1
@sudodus - Xin lỗi vì sự nhầm lẫn, tôi đã không rõ ràng như tôi dự định. dd chắc chắn có thể tiếp tục viết, phụ thuộc vào những gì bạn nói nó làm. dd if=/dev/zero of=/dev/sda bs=512 count=1hoặc dd if=/dev/zero of=/dev/sda bs=512là 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/sda1nó 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.
Panther

1
@Panther Câu hỏi đặc biệt nói 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. ddkhông thể vượt qua giới hạn của trình điều khiển thiết bị.
Barmar

1
@Bamar đọc lên tôi đã nhận xét về điều đó. Tôi đã thấy nhiều người dùng nhầm lẫn $ somepartition cho / dev / sda
Panther
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.