Xóa 1 MB cuối cùng của ổ cứng


25

Có một lệnh dễ dàng mà tôi có thể sử dụng để loại bỏ 1 MB cuối cùng của ổ cứng không?

Để bắt đầu ổ đĩa tôi sẽ dd if=/dev/zero of=/dev/sdx bs=1M count=1. Các seeklựa chọn cho vẻ dd hứa hẹn, nhưng không ai có một cách dễ dàng để xác định chính xác tôi nên tìm cách bao xa?

Tôi có một thiết bị RAID phần cứng, lưu trữ một số cấu hình RAID ở cuối ổ đĩa. Tôi cần thiết bị RAID để xem các ổ đĩa chưa được định cấu hình, vì vậy tôi muốn xóa cấu hình RAID mà không phải dành thời gian để xóa toàn bộ ổ đĩa. Tôi có một tá ổ đĩa 2TB và việc xóa toàn bộ các ổ đĩa đó sẽ mất nhiều thời gian.

Câu trả lời:


22

Cách đơn giản nhất trên Linux để lấy kích thước của đĩa là blockdev --getsz:

sudo -s
dd bs=512 if=/dev/zero of=/dev/sdx count=2048 seek=$((`blockdev --getsz /dev/sdx` - 2048))

Tuyệt vời, tôi biết phải có một công cụ có thể có được kích thước dễ dàng.
Zoredache

1
Mặc dù tôi thích giải pháp này, nhưng việc sử dụng sdalàm ví dụ sẽ nguy hiểm khủng khiếp nếu bạn sao chép và dán và quản lý để sao chép vận chuyển được sao chép. sdxsẽ phù hợp hơn nhiều Tôi đề phòng, nhưng chỉ vì chúng mà tôi không phá hủy đĩa của tôi ngay bây giờ.
emk2203

@ emk2203 Điểm tốt. Tôi tò mò, bạn có biện pháp phòng ngừa nào cho các tình huống như vậy?
Hashim

1
Tôi sử dụng một trích dẫn trước khi dán. Nếu dòng chứa trở lại vận chuyển, nó bị bắt bởi dấu nhắc shell vì kết thúc bị thiếu cho báo giá. Nếu mọi thứ đều ổn, tôi đi đến đầu dòng bằng Ctrl-A, sau đó xóa trích dẫn, sau đó quay lại. Thêm ba tổ hợp phím cho bảo hiểm, giá trị nó.
emk2203

Thay vì / dev / sdx, hãy xem các liên kết trong / dev / đĩa / by-id / chẳng hạn như nvme-SAMSUNG_MZVLW1TXXXX-000XX_XXXXXXXXX. ls -l / dev / đĩa / by-id / sẽ hiển thị tên liên kết và / dev / sdX mà nó liên kết đến.
RCpa0

6

Kích thước của mỗi phân vùng có sẵn trong /proc/partitions. Lệnh sau cho thấy kích thước của sdx(tính theo đơn vị kB):

awk '$4 == "sdx" {print $3}' </proc/partitions

Như vậy:

dd if=/dev/zero of=/dev/sdx bs=1k count=1024 \
   seek=$(($(awk '$4 == "sdx" {print $3}' </proc/partitions) - 1024))

Lý do cho -1024 ở cuối là gì?
Hashim

1
@Hashim Câu hỏi hỏi làm thế nào để xóa 1 MB cuối cùng. 1 MB cuối cùng bắt đầu 1024kB trước khi kết thúc.
Gilles 'SO- ngừng trở nên xấu xa'

3

Sử dụng tìm kiếm để đi đến cuối ổ đĩa hoạt động rất tốt, tức là:

tìm kiếm = $ (( blockdev --getsz /dev/sda- 2048))

Tuy nhiên, khi bạn sử dụng điều này, tôi khuyên bạn nên biết rằng giá trị đếm của bạn là chính xác hoặc hoàn toàn không sử dụng nó. Lý do tôi nói điều này là các ổ đĩa có thể có các cung 512 byte hoặc 4k cung và nếu bạn sử dụng giải pháp này với ổ có 4k cung trên đó, bạn sẽ không đi đến cuối ổ có giá trị đếm đó, và có thể bỏ lỡ thông tin RAID ở cuối (tôi đã gặp phải vấn đề này).


Bạn có thể chia sẻ bằng cách nào đó chính xác những gì bạn chạy vào? Tôi tò mò, tự hỏi liệu tôi có hiểu nhầm cách xử lý các ddkhu vực khi được sử dụng với các bsgiá trị tùy chỉnh nhỏ hơn / lớn hơn sau đó kích thước khối thực tế được báo cáo bởi phần sụn của thiết bị hoặc nhân linux.
sjas

2

Bạn có thể lấy số lượng cung trên đĩa hdparm -v /dev/sdx. Hãy thử tìm kiếm number_of_sector - 2048 (giả sử các cung 512 byte).


hdparm có vẻ tiện dụng, nhưng làm cách nào để kiểm tra kích thước cung?
Peter.O

1
/sys/block/sdx/queue/physical_block_sizecó thể cung cấp cho bạn thông tin nhưng một số đĩa mới hơn phát nhanh và lỏng với kích thước cung mà chúng báo cáo. Có lẽ tốt hơn để đọc nhãn trên đĩa hoặc tra cứu nó trong bảng dữ liệu của nhà sản xuất.

1
Cảm ơn .. Tôi vừa nhận thấy rằng hdparm -I /dev/sdaliệt kê 2 "phiên bản" của quy mô ngành: LogicalPhysical. Đây có phải là những gì bạn có nghĩa là "nhanh và lỏng"? .... Tôi không có "cảm giác" rằng nếu có bất cứ điều gì sẽ hành xử theo cách như vậy thì đó cũng có thể là một hệ thống RAID ..
Peter.O

1
@red: Bây giờ tôi không thể truy cập tài liệu tham khảo nhưng tôi đã đọc ở đâu đó rằng một số ổ đĩa có 4096 byte cung cấp sẽ báo cáo với hệ thống rằng chúng là 512byte và sau đó xử lý nội bộ chuyển đổi.

1

Bạn có thể sử dụng ddvà lấy kích thước thiết bị thông qua fdisk:

dd if=/dev/zero of=/dev/sda bs=1k \
   seek=$(( (`fdisk -l /dev/sda | grep 'Disk /' | cut -d' ' -f 5` -1024*1024)/1024  )) count=1024

Tôi không sử dụng kích thước khối 1m để tránh lỗi làm tròn.

Ngoài ra, bạn có thể viết một chương trình C (hoặc tập lệnh) nhỏ để gọi lseekhàm với SEEK_ENDvà độ lệch âm là 1mb và sau đó gọi write.

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.