Hàng loạt xóa một thư mục lớn trên ZFS mà không duyệt qua nó một cách đệ quy


9

Tôi muốn xóa một thư mục có số lượng lớn dữ liệu trên đó. Đây là mảng sao lưu của tôi, là một hệ thống tập tin ZFS , nhịp tuyến tính, nhóm đơn gọi là "san". San được gắn kết /san vì vậy tôi muốn loại bỏ hàng loạt / san / thispc / nhất định

$ du -h -d 1 certainFolder/
1.2T    certainFolder/

Thay vì phải chờ đợi, rm -rf certainFolder/tôi không thể phá hủy tay cầm vào thư mục đó để nó có thể ghi đè lên (thậm chí bằng cùng một tên thư mục nếu tôi chọn tạo lại nó) ??

Vì vậy, ví dụ như không biết nhiều về zfs fs nội bộ cụ thể như thế nào nó ánh xạ các thư mục, nhưng nếu tôi thấy bản đồ đó nói ví dụ, và loại bỏ các mục đúng cho ví dụ, thư mục sẽ không còn hiển thị và không gian mà thư mục trước đó đã giữ phải được loại bỏ khỏi một số loại kiểm toán là tốt.

Có một cách dễ dàng để làm điều này, ngay cả khi trên ext3 fs, hoặc đó đã là điều mà lệnh loại bỏ đệ quy phải làm ở vị trí đầu tiên, tức là ăn cắp thông tin và chỉnh sửa các tạp chí?

Tôi chỉ hy vọng làm được điều gì đó giống như kill thisDirnơi nó chỉ cần loại bỏ một số loại ID và thư mục không còn hiển thị nữa ls -lavà dữ liệu vẫn còn trên ổ đĩa, nhưng không gian sẽ được sử dụng lại ( ghi đè), bởi vì ZFS chỉ là tuyệt vời?

Ý tôi là tôi nghĩ zfs thật tuyệt, làm sao chúng ta có thể làm được? Lý tưởng nhất? xoa hai bàn tay vào nhau :-)

Trường hợp sử dụng cụ thể của tôi (bên cạnh tình yêu của tôi dành cho zfs) là quản lý kho lưu trữ sao lưu của tôi. Thư mục sao lưu này được đẩy đến thông qua freefilesync (CHƯƠNG TRÌNH TUYỆT VỜI) trên hộp Windows của tôi để chia sẻ tệp smb, nhưng cũng có một thư mục phiên bản nơi chứa các tệp cũ. Tôi đang xóa các thư mục cấp cao nhất nằm trong bản sao lưu chính, được sao chép vào phiên bản - ví dụ /san/version/someStuff, như một lần dọn dẹp hai tháng một lần rm -rf /san/version/someStuff/*từ một thiết bị đầu cuối putty, bây giờ tôi phải mở một thiết bị đầu cuối khác; không muốn làm điều đó mỗi lần, tôi mệt mỏi vì vô dụng khi phải theo dõi rm -rf.

Ý tôi là, có lẽ tôi nên đặt lệnh để chỉ giải phóng tay cầm, sau đó in ra std out, điều đó có thể tốt. Thực tế hơn , tạo lại tập dữ liệu trong vài giây zfs destroy san/version; zfs create -p -o compression=on san/versionsau những suy nghĩ từ phản hồi từ @Gilles.


FYI, tôi đã chạy lệnh này để tạo các bộ dữ liệu hiện đang sử dụng .. `zfs create dataset -p -o compression=on yourPoolName/BackupRootDir/hostNameYourPc/somesubdir
Brian Thomas

Vui lòng chấp nhận câu trả lời nếu một người giải quyết vấn đề được mô tả trong câu hỏi ban đầu của bạn. Vấn đề bạn vừa thêm vào câu hỏi của bạn có vẻ khá khác nhau nên thực sự nên được hỏi trong một câu hỏi mới.
jlliagre

Câu trả lời:


12

Theo dõi các khối được giải phóng là không thể tránh khỏi trong bất kỳ hệ thống tệp tốt nào và ZFS cũng không ngoại lệ . Tuy nhiên, có một cách đơn giản trong ZFS để xóa thư mục gần như tức thời bằng cách "trì hoãn" việc dọn dẹp bên dưới. Về mặt kỹ thuật nó rất giống với đề xuất của Gilles nhưng vốn đã đáng tin cậy mà không cần thêm mã.

Nếu bạn tạo một ảnh chụp nhanh của hệ thống tệp của mình trước khi xóa thư mục, việc xóa thư mục sẽ rất nhanh vì không cần phải khám phá / giải phóng bên dưới nó, tất cả vẫn được tham chiếu bởi ảnh chụp nhanh. Sau đó, bạn có thể phá hủy ảnh chụp nhanh trong nền để không gian sẽ dần được phục hồi.

d=yourPoolName/BackupRootDir/hostNameYourPc/somesubdir
zfs snapshot ${d}@quickdelete && { 
    rm -rf /${d}/certainFolder
    zfs destroy ${d}@quickdelete & 
}

ok, tôi đã không quen thuộc với ảnh chụp nhanh. Điều đó có thể giúp tôi. tôi đã xóa / di chuyển cả ngày vẫn còn. Tôi đã tạo các bộ dữ liệu cho không chỉ thư mục sao lưu chính, mà cả các thư mục cấp cao nhất bên trong, mỗi thư mục bắt đầu bằng tên máy chủ và một vài cấp cao nhất .., vì vậy tôi có một chút linh hoạt ở đó để phá hủy và tạo lại một nhóm, nhưng nó không hoàn hảo , bởi vì tôi không muốn xóa toàn bộ thư mục nhóm này, nên tôi sẽ phải tạo nhiều hơn nữa, và đó là rất nhiều việc tạo dữ liệu, vì vậy tôi thích đề xuất của bạn vì lý do đó!
Brian Thomas

4
Nếu có sẵn, feature@async_destroycũng có thể giúp tăng tốc điều này (từ quan điểm của người dùng hoặc quản trị viên) nếu được bật; thấy zpool get all $pool. Lưu ý rằng ít nhất tôi đã xem xét, nếu có một quá trình hủy đang chờ xử lý trong quá trình nhập nhóm , thì việc hủy đó sẽ trở nên đồng bộ và quá trình nhập nhóm sẽ không kết thúc cho đến khi hủy hoàn tất. Xem ra nếu bạn cần khởi động lại!
một CVn

Tôi có một khách hàng với một freenas bị mất kết nối SMB khi xóa lớn. Sau khi kích hoạt ảnh chụp nhanh định kỳ (và tự động xóa), sự cố "biến mất". việc giải phóng không gian mất nhiều thời gian hơn trong nền, nhưng SMB-Share vẫn có thể truy cập mọi lúc.
Martin Seitl

6

Những gì bạn đang yêu cầu là không thể. Hay chính xác hơn, có một chi phí phải trả khi xóa một thư mục và các tập tin của nó; nếu bạn không trả nó vào thời điểm xóa, bạn sẽ phải trả nó ở nơi khác.

Bạn không chỉ xóa một thư mục - đó sẽ là gần như ngay lập tức. Bạn đang xóa một thư mục và tất cả các tệp bên trong nó và cũng có thể loại bỏ đệ quy tất cả các thư mục con của nó. Xóa tệp có nghĩa là giảm số lượng liên kết của nó và sau đó đánh dấu tài nguyên của nó (các khối sử dụng cho nội dung tệp và siêu dữ liệu tệp và inode nếu hệ thống tệp sử dụng bảng inode) miễn phí nếu số lượng liên kết đạt 0 và tệp không mở. Đây là một thao tác phải được thực hiện cho mọi tệp trong cây thư mục, vì vậy thời gian cần ít nhất là tỷ lệ thuận với số lượng tệp.

Bạn có thể trì hoãn chi phí đánh dấu các tài nguyên là miễn phí. Ví dụ, có các hệ thống tệp được thu gom rác, nơi bạn có thể xóa thư mục mà không xóa các tệp chứa trong đó. Việc chạy trình thu gom rác sẽ phát hiện các tệp không thể truy cập thông qua cấu trúc thư mục và đánh dấu chúng là miễn phí. Thực hiện rm -f directory; garbage-collecttrên một hệ thống tập tin rác được thực hiện tương tự nhưrm -rftrên một hệ thống tập tin truyền thống, với các kích hoạt khác nhau. Có một vài hệ thống tập tin được thu gom rác bởi vì GC là độ phức tạp bổ sung hiếm khi cần thiết. Thời gian GC có thể đến bất cứ lúc nào, khi hệ thống tập tin cần một số khối miễn phí và không tìm thấy bất kỳ, vì vậy hiệu suất của một hoạt động sẽ phụ thuộc vào lịch sử trong quá khứ, không chỉ trong hoạt động, thường không mong muốn. Bạn cần chạy trình thu gom rác chỉ để có được dung lượng trống thực tế.

Nếu bạn muốn mô phỏng hành vi GC trên một hệ thống tệp bình thường, bạn có thể thực hiện:

mv directory .DELETING; rm -rf .DELETING &

(Tôi đã bỏ qua nhiều chi tiết quan trọng như kiểm tra lỗi, như khả năng phục hồi khi mất điện, v.v.) Tên thư mục trở nên không tồn tại ngay lập tức; không gian được khai hoang dần dần.

Một cách tiếp cận khác nhau để tránh phải trả chi phí trong quá trình loại bỏ mà không có GC sẽ là trả nó trong quá trình phân bổ. Đánh dấu cây thư mục là đã xóa và đi qua các thư mục đã xóa khi phân bổ các khối. Điều đó sẽ khó hòa hợp với các liên kết cứng, nhưng trên một hệ thống tập tin không có liên kết cứng, nó có thể được thực hiện với phân bổ tăng chi phí O (1). Tuy nhiên, điều đó sẽ làm cho một hoạt động rất phổ biến (tạo hoặc mở rộng một tệp) đắt hơn, với lợi ích duy nhất là một hoạt động tương đối hiếm (loại bỏ một cây thư mục lớn) rẻ hơn.

Bạn có thể xóa hàng loạt cây thư mục nếu cây đó được lưu trữ dưới dạng nhóm khối riêng của nó. . Nhưng bạn sẽ làm gì với không gian trống? Nếu bạn chỉ định lại nó cho một nhóm khác, điều đó có chi phí, mặc dù ít hơn nhiều so với việc xóa các tệp riêng lẻ. Nếu bạn để lại không gian dưới dạng không gian dự trữ chưa sử dụng, bạn không thể lấy lại ngay lập tức. Có một nhóm riêng cho một cây thư mục có nghĩa là thêm chi phí để tăng hoặc giảm kích thước của nhóm đó (có thể đang hoạt động hoặc rõ ràng). Làm cho cây lưu trữ riêng của nó cũng làm tăng chi phí di chuyển các tệp vào và ra khỏi cây.


Ok câu trả lời tuyệt vời! Nửa đầu trong số đó là hoàn toàn thỏa đáng trên một hệ thống bình thường. ZFS có một số mánh khóe, chẳng hạn như không cần định dạng nó, vì vậy nếu tôi phá hủy pool, điều mà tôi nghĩ tôi sẽ làm trong lần tới chỉ là làm cho pool (số nhiều) giống như tôi nghĩ, sau đó ti biến mất radar ngay lập tức, và không gian đó ngay lập tức có sẵn. Tôi đoán tôi đang cố gắng tạo lại điều đó trên zfs, trên một thư mục bên trong một pool và tôi nghĩ vì nó không phải là một pool nên bản chất của nó trở nên chuẩn hơn và phương pháp bạn đề cập dường như được áp dụng trong trường hợp đó. hấp dẫn.
Brian Thomas

Tôi nghĩ rằng đó là nơi tôi đã phạm sai lầm, tôi đã đọc một bài báo tối qua, tôi không biết liệu tôi có thể tìm thấy nó không, điều đó chứng tỏ rằng các hồ bơi shoudl sẽ được sử dụng như các thư mục giới hạn ở ~ 18,446,744 Trillion pool tối đa trên FS. Nếu tôi tạo các thư mục sao lưu phía trên của mình dưới dạng các nhóm, thì khi sao lưu sẽ ghi vào chúng, thư mục sẽ sẵn sàng, đó là một nhóm dễ xóa .. Nếu nhóm không tồn tại, sao lưu sẽ chỉ tạo thư mục và hồ bơi sẽ không được nhìn thấy trong zfs list. Cho đến lúc đó, hy vọng ai đó có một số thông tin về cách để delte số lượng lớn trên ZFS trong một nhánh con của một nhóm. :-)
Brian Thomas

Ngoài ra, khi đọc phản hồi đầu tiên của bạn, suy nghĩ đầu tiên của tôi là; "ĐÚNG!", "Chi phí"! đó là những gì tôi đã chạm vào khi tôi đang nói về việc xóa các mục tạp chí. như tôi nghi ngờ chết tiệt Tuy nhiên, bạn đang đi đúng hướng. Hãy nghĩ ra một cái gì đó ở đây, vì vậy chúng ta có thể có được một kịch bản cùng nhau thực hiện điều này có thể ... một ý nghĩ :-)
Brian Thomas

Brian, hãy cẩn thận để không nhầm lẫn zpool và bộ dữ liệu. Mặc dù thực sự không có giới hạn mã hóa cứng có thể tiếp cận đối với số lượng zpool bạn có thể tạo, bạn sẽ nhanh chóng bị giới hạn bởi số lượng thiết bị cơ bản (ví dụ: phân vùng) có sẵn trên máy của bạn. Hơn nữa, có các pool dành riêng cho các thư mục đơn sẽ đánh bại một số tính năng zfs có giá trị và khiến hoạt động di chuyển chậm hơn nhiều.
jlliagre

về nhận xét này bạn đã thực hiện ở đây @Gilles "Nhưng bạn sẽ làm gì với không gian trống? Nếu bạn gán lại nó cho một nhóm khác, điều đó có chi phí, mặc dù ít hơn nhiều so với việc xóa các tệp riêng lẻ" tôi không chắc chắn, nhưng tôi không nghĩ là có là một hình phạt tạo ra một nhóm mới, tôi nghĩ rằng tôi chỉ giải quyết nó trong thời gian viết. không bao giờ cần phải phân vùng vì cùng một lý do .. tôi tin rằng đây là cơ chế tương tự ..
Brian Thomas

1

Nếu nó phải nhanh chóng, tôi tạo một thư mục tạm thời mới, mvthư mục bên dưới nó và sau đó xóa đệ quy tạm thời:

t=`mktemp -d`
mv certainFolder $t/
rm -rf $t &

& gỡ bỏ xử lý, hoặc lỗi squash?
Brian Thomas

1
Điều này không thực sự khác với đề xuất của Gilles và có cùng một lỗ hổng. Nếu hệ điều hành được khởi động lại hoặc rmlệnh không hoàn thành vì một số lý do khác, thư mục ảo bị bỏ lại không bị xóa.
jlliagre

ahh đúng, nhưng & là mới đối với tôi, đó là một phần của câu đố ... tôi muốn thoát khỏi tay cầm. tuy nhiên, quyền của bạn, không muốn rác đó nếu có vấn đề ..
Brian Thomas

@BrianThomas &chỉ đơn giản là nền tảng cho quá trình, vì vậy bạn có thể tiếp tục làm những việc khác trong cùng một vỏ trong khi xóa đang diễn ra (chịu bất kỳ hình phạt hiệu suất liên quan nào).
một CVn
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.