Xóa không gian không sử dụng với số không (btrfs)


10

Làm thế nào để xóa không gian không sử dụng với số không? (Tôi đang yêu cầu công cụ cho hệ thống tập tin btrfs )

Tôi đang tìm kiếm một cái gì đó thông minh hơn

cat /dev/zero > /mnt/X/big_zero ; sync; rm /mnt/X/big_zero

Giống như FSArchiver đang tìm kiếm "không gian đã sử dụng" và bỏ qua trang web không sử dụng, nhưng đối diện.

Mục đích: Tôi muốn nén hình ảnh phân vùng, vì vậy, việc lấp đầy không gian chưa sử dụng bằng số không được khuyến khích.

Btw. Đối với ext3, ext4: Xóa không gian chưa sử dụng bằng số không (ext3, ext4) . Ở đây tôi yêu cầu btrfs

Làm rõ về "thuật toán thông minh hơn": Như tôi thấy rằng "thuật toán thông minh hơn" dẫn đến sự nhầm lẫn, cuối cùng tôi đã quyết định thêm dòng về nó. Bạn đọc thân mến, hãy nghĩ về hệ thống tập tin như cơ sở hạ tầng. Để đơn giản hóa, hãy tưởng tượng bản đồ giữ cây đỏ đen tự cân bằng, được sử dụng làm mảng liên kết-> mảng giá trị, trong đó các giá trị là số nguyên. Mục tiêu là để xóa tất cả các giá trị âm với số không. Thuật toán "không thông minh" sẽ lặp lại trên nó và thêm các cặp khóa: value vào bản đồ mới (với sự thay đổi tiêu cực thành không). Thuật toán thông minh sẽ chỉ phát hiện những nơi lưu trữ giá trị âm và xóa chúng tại chỗ .


2
Bạn đã thử sfillgợi ý ? Có vẻ như nó không yêu cầu extX.
Kevin

1. Tôi biết bạn có thể điền vào các tệp hiện có với số không bằng shred, nhưng điều này có lẽ không phải vậy, phải không? 2. Làm thế nào bạn làm cho những hình ảnh? Có lẽ bạn có thể cắt ngắn ở đó?
Zlatko

@kevin: đó là lý do tại sao tôi đăng câu trả lời đầy đủ trong câu hỏi ban đầu. Tôi hiếm khi sử dụng các hệ thống tập tin ext2,3,4 vì vậy tôi thấy các tiện ích chỉ hoạt động trên ext * trở nên vô dụng một cách khó chịu.
cas

Tôi cần một cái gì đó "thông minh". Một cái gì đó chỉ lấp đầy không gian trống bằng số không mà không chạm vào nơi khác - ý tôi là không ảnh hưởng đến cấu trúc dữ liệu nội bộ, như B-Plants (Nếu bạn tò mò, tôi đã viết trong câu hỏi "nén" nhưng tôi cũng cần nó cho các mục đích khác, như fs sao chép, phân tích và nghiên cứu)
Grzegorz Wierzowiecki

chỉ cần sử dụng truncatevà / hoặcfallocate
mikeerv

Câu trả lời:


4

Đây là một bài đăng lại được sửa đổi và mở rộng nhiều câu trả lời của tôi cho câu hỏi trước đây của bạn:

sfilltừ secure-deletegói có thể làm những gì bạn muốn.

Không giống như zerofree (chỉ hoạt động với các hệ thống tệp ext2, ext3 và ext4), sfill sẽ hoạt động với bất kỳ hệ thống tệp nào.

ví dụ

sfill -l -l -z /mnt/X

Trang chủ sfill / safe-xóa bây giờ dường như đã biến mất, nhưng nó được đóng gói cho debian và ubfox. có lẽ các distro khác quá. nếu bạn cần mã nguồn, có thể tìm thấy nó trong kho lưu trữ của debian nếu bạn không thể tìm thấy nó ở bất kỳ nơi nào khác.

LƯU Ý: sfill chỉ hoạt động trên một hệ thống tập tin được gắn kết. Nếu bạn không điền các tệp hình ảnh từ hệ thống máy chủ thay vì từ trong VM, bạn sẽ cần phải gắn hình ảnh fs trên máy chủ. Phương pháp chính xác khác nhau tùy thuộc vào loại tệp hình ảnh (ví dụ: qcow2 hoặc thô).

Gắn hình ảnh 'thô' là dễ dàng và đơn giản. Chỉ cần sử dụng kpartxtrên tệp hình ảnh để tạo một thiết bị loopback và / dev / mapper / mục cho mỗi phân vùng có thể được gắn riêng lẻ.

đây là tập lệnh một phần được sửa đổi từ một đoạn tập lệnh mà tôi sử dụng để gắn hình ảnh đĩa cứng có thể khởi động mạng (được sử dụng để cập nhật bios trên các máy mà flashrom không hoạt động):

image="myrawimagefile.img"

# use kpartx to build /dev/mapper device nodes
KP=$(kpartx -a -v "$image")

# now mount each partition under ./hd/
for p in $(echo "$KP" | awk '/^add map/ {print $3}') ; do
  dm="/dev/mapper/$p"
  fp=$(echo "$p" | sed -r -e 's/^loop[0-9]+//')
  mkdir -p "./hd/$fp"
  mount "$dm" "./hd/$fp"
  sfill -l -l -v "./hd/$fp"
  umount "$dm"
done

# now remove the loopback device and /dev/mapper entries
kpartx -d "$image"

LƯU Ý: nó giả sử mọi phân vùng trong ảnh đều có thể gắn kết. đúng trong trường hợp sử dụng của tôi (một hình ảnh hd freedo với một phân vùng). không đúng nếu một trong các phân vùng là, trao đổi không gian. Phát hiện các phân vùng như vậy và sử dụng dd về 0, phân vùng trao đổi được để lại như một bài tập cho người đọc :)

Phương pháp này, hoặc một biến thể của nó, cũng hoạt động với khối lượng LVM.

Nếu hình ảnh của bạn là qcow thì bạn có thể sử dụng qemu-nbdcông cụ từ qemu-utilsgói, nó sẽ hiển thị tệp hình ảnh và phân vùng của nó dưới dạng thiết bị khối mạng - ví dụ / dev / nbd0 / dev / ndb0p1 - có thể được sử dụng theo cách tương tự với / thiết bị dev / mapper ở trên.

Có thể dễ dàng hơn và ít rắc rối hơn (nhưng tốn nhiều thời gian hơn) để sử dụng qemu-imgđể chuyển đổi từ qcow thành raw, sử dụng phương thức cho phần thô ở trên và sau đó chuyển đổi hình ảnh thô đã sửa đổi thành qcow2 đã nén. Điều này có thể sẽ dẫn đến hình ảnh nhỏ hơn một chút so với sử dụng qemu-nbd vì bạn sẽ nén hình ảnh qcow2 mới khi nó được tạo.


1
Ý tôi là, nó không được coi là cách "thông minh" để lấp đầy không gian không sử dụng bằng số không. Đó là cách rõ ràng nhất, điển hình để làm điều này. Tôi không hỏi về những điều như vậy.
Grzegorz Wierzowiecki

1
Vui lòng mô tả thuật toán "thông minh" không dành riêng cho một họ hệ thống tệp cụ thể (như zerofill dành cho ext2 / 3/4). Bạn muốn một chương trình có thể thực hiện công việc. Bạn đã không nói rằng nó cũng phải là phép thuật.
cas

1
và, thực sự, nếu hệ thống tập tin không được sử dụng (bởi vì, ví dụ, nó được gắn trên máy chủ để zerofilling) thì vấn đề là thuật toán thông minh đến mức nào? Đi qua siêu dữ liệu fs tìm kiếm các lĩnh vực trống sẽ không nhanh hơn hoặc tốt hơn là chỉ viết một khối lớn chứa đầy NUL ... hệ thống tệp đã đủ thông minh để tìm ra không gian trống ở đâu.
cas

2
Một mặt, cho nhu cầu của bạn là đủ - vì vậy câu hỏi của tôi đã chứa đoạn mã với giải pháp này - vì vậy câu trả lời của bạn không cung cấp bất cứ điều gì mới. Mặt khác, nhu cầu của tôi yêu cầu những gì tôi chỉ định, vì tôi muốn xóa không gian không sử dụng bằng số không mà không sửa đổi cấu trúc bên trong (ví dụ: cân bằng lại "Dancing B-Plants" hoặc loại cấu trúc dữ liệu khác (ví dụ để phân tích và khử trùng lặp mục đích)
Grzegorz Wierzowiecki

2
@cas - Tôi nghĩ rằng bạn đang thiếu thực tế rằng zero-fill là một bước thiết yếu trước khi nén các ổ đĩa cứng ảo trong máy ảo. Nếu bạn có đĩa mở rộng 500 GB, với 10 GB tệp và 10 GB dung lượng "trống" (nghĩa là các tệp đã bị xóa), việc chạy phương pháp "tệp không khổng lồ" ngây thơ sẽ mất nhiều thời gian hơn và yêu cầu VHD phải phồng lên 500 GB đầy đủ. Tôi cá là OP đang cho rằng tiện ích cũng phải cụ thể theo FS.
Tên giả

3

Cách chính xác và "thông minh" để xóa không gian trống đang sử dụng:

fstrim /mountpoint

Sử dụng điều này trên một hệ thống tập tin gắn kết.

Điều quan trọng cần lưu ý là không có lợi thế bảo mật cho việc này. Nếu bạn muốn xóa đĩa của mình để bảo mật, hãy sao lưu các tệp của bạn, zero toàn bộ đĩa bằng lệnh như "shred" và sau đó khôi phục các tệp của bạn.

Tuy nhiên, giải pháp hoạt động tốt nếu đĩa của bạn là một điều khoản mỏng trên hệ thống tệp thưa thớt và bạn muốn khôi phục không gian chưa sử dụng.

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.