Làm thế nào để không lấp đầy không gian trống của đĩa ảo trên windows để nén tốt hơn?


46

Làm thế nào để không lấp đầy không gian trống của đĩa ảo trên windows để nén tốt hơn?

Tôi muốn một công cụ nguồn mở đơn giản (hoặc ít nhất là miễn phí) cho điều đó. Nó có lẽ nên viết một tập tin lớn nhất có thể 0và xóa nó sau đó. Chỉ một lần vượt qua (điều này không phải vì lý do bảo mật mà là để nén, chúng tôi đang sao lưu các máy ảo).

Nên chạy từ bên trong windows chứ không phải từ đĩa.

Trên Linux tôi làm như thế này (với tư cách là người dùng):

cd
mkdir wipe
sudo sfill -f -l -l -z ./wipe/

Chỉnh sửa 1: Tôi quyết định sử dụng sdelete từ câu trả lời được chấp nhận. Tôi đã xem xét sự giúp đỡ của sdelete:

C:\WINDOWS\system32>sdelete /?

SDelete - Secure Delete v1.51
Copyright (C) 1999-2005 Mark Russinovich
Sysinternals - www.sysinternals.com

usage: sdelete [-p passes] [-s] [-q] <file or directory>
       sdelete [-p passes] [-z|-c] [drive letter]
   -c         Zero free space (good for virtual disk optimization)
   -p passes  Specifies number of overwrite passes (default is 1)
   -q         Don't print errors (Quiet)
   -s         Recurse subdirectories
   -z         Clean free space

Đây là một phiên bản cũ. Tôi đã sử dụng khóa chuyển đổi -c từ lệnh gọi thứ 2 và thao tác này khá nhanh (cú pháp chỉ hợp lệ cho các phiên bản cũ hơn trước V1.6):

c:\>sdelete -c c: (OUTDATED!)

Tôi có ấn tượng này làm những gì tôi muốn. Công cụ sdelete rất dễ sử dụng và dễ dàng để có được.

Chỉnh sửa 2: Như scottbb đã chỉ ra trong câu trả lời của mình bên dưới, đã có một sự thay đổi vào tháng 9 năm 2011 đối với công cụ (phiên bản 1.6) Các tùy chọn -c và -z đã thay đổi ý nghĩa. Cách sử dụng đúng từ 1.6 trở đi là

c:\>sdelete -z c:

Chỉnh sửa 3: Có phiên bản 2.0 của sdelete và sdelete64. Chúng có vẻ là lỗi khi zeroing. Nó sẽ xuất hiện để bị mắc kẹt ở 100% trong thời gian rất dài. Một số người đã báo cáo dài hơn 10 - 40 lần. Phiên bản cũ hơn 1.61 không có vấn đề này. Xem https://social.technet.microsoft.com/Forums/en-US/2ffb2539-34ba-4378-aa8a-941d243f117e/sdelete-hangs-at-100?forum=miscutils

Chỉnh sửa 4: Bây giờ có vấn đề về không gian đĩa ảo được phân bổ động . Nếu bạn có đĩa 100 GB không đầy và chỉ sử dụng 30 GB trên máy chủ, thì việc điền vào không nên tăng đáng kể kích thước của đĩa vì điều đó mâu thuẫn với mục đích phân bổ động . Có một câu trả lời cho Oracle VM VirtualBox https://superuser.com/q/907196/44402 - nhưng trên các ngăn xếp khác như VMWare, Xen, XenServer, v.v., điều này cần phải được trả lời riêng.


2
sdeletelà công cụ phù hợp cho công việc, nhưng thay đổi vào tháng 9 năm 2011 đối với công cụ (phiên bản 1.6) làm cho các câu trả lời trên không chính xác. Các tùy chọn -c-zđã thay đổi ý nghĩa. Cách sử dụng đúng bây giờ làsdelete -z c:\
scottbb

Ngoài ra, hãy đảm bảo bạn sử dụng hình ảnh kiểu COW (Sao chép trên ghi) nếu bạn có nhiều máy dựa trên cùng một cài đặt cơ bản.
Matt

Câu trả lời:


46

Trên các cửa sổ, sử dụng công cụ sysiternals sdelete để loại bỏ tất cả các khoảng trống. Lệnh bạn muốn sẽ trông như thế này sdelete -z c:.

Cách sử dụng: sdelete [-p pass] [-s] [-q] ...  
sdelete [-p pass] [-z | -c] [ký tự ổ đĩa] ...  
-a Xóa thuộc tính Chỉ đọc.  
-c Làm sạch không gian trống.  
-p Pass Chỉ định số lần ghi đè (mặc định là 1).  
-q Đừng in lỗi (Yên lặng).  
-s hoặc -r Recurse thư mục con.  
-z Không gian trống (tốt cho tối ưu hóa đĩa ảo).

Đối với Linux, tôi khuyên bạn nên sử dụng zerofree .


Đến đây để thu gọn VHD của tôi. Chia sẻ một số liên kết liên quan từ TechNet .. technet.microsoft.com/en-us/l Library / cc708394% 28v = ws.10% 29.aspx technet.microsoft.com / en-us / l Library /
Faiz

Tôi tự hỏi, nếu điền không sẽ có bất kỳ tác động tích cực nào đối với ổ đĩa được mã hóa theo tiêu chuẩn Linux LUKS dm-crypt . trước khi tôi cho toàn bộ máy khởi động từ một bootstick clonezilla và sao lưu vật lý của toàn bộ ổ đĩa. - Phần zeroed trong mã hóa sẽ dẫn đến phần zeroed trên đĩa bên ngoài? Hoặc nó vẫn sẽ viết tiếng ồn (chưa phân bổ) vì lý do bảo mật? Hoặc tôi nên bằng không ổ đĩa mã hóa được gắn kết thô (không nhìn vào nội dung được mã hóa)? (Và đó có phải là một ý tưởng tốt tức là bảng phân bổ đáng tin cậy trong bối cảnh ổ đĩa được mã hóa không?)
Frank Nocke

Tôi sẽ bị sốc nếu nó làm bất cứ điều gì khác ngoài việc mã hóa null và ghi "tiếng ồn" được mã hóa vào đĩa.
Dan Pritts

15

Windows đã có một công cụ dòng lệnh tích hợp thực hiện việc này: CIPHER. Xem tùy chọn / W của nó.

Vì vậy, lệnh hoàn chỉnh sẽ là: mật mã / w: c: (thay thế c: bằng ký tự ổ đĩa thực tế)

.


3
cách tiếp cận thú vị. Phá vỡ thực thi ngay trước khi nó bắt đầu hoàn tác tất cả các số không. +1 cho giải pháp sáng tạo bằng các công cụ đã có sẵn!
PsychoData

Tôi tự hỏi liệu có thể phát hiện khi nào nó viết xong số không và sau đó hủy bỏ nó ...
Frederick Nord

Nếu bạn sử dụng ổ cứng SSD, hãy kiểm tra xem bạn đã bật TRIM chưa. Sau đó, tất cả các khối không sử dụng sẽ nhanh chóng bị xóa sạch với mẫu 0xFF bởi phần sụn ổ cứng. Điều này rất có thể sử dụng trên các hình ảnh đĩa ảo được thực hiện bởi các máy chủ ảo. Hình ảnh đó sẽ được lấp đầy dưới dạng các khoảng trống và sẽ giải phóng các khối hệ thống tệp trên hệ thống lưu trữ tệp.
Znik

Điều này hoạt động rất tốt và nhanh hơn rất nhiều so với SDelete -z (đã bị kẹt ở mức 100% mà không đưa ra bất kỳ phản hồi nào khác).
psychowood

6

SDelete sẽ không chiếm không gian cho việc nén đĩa ảo. SDelete bắt đầu bằng cách xóa không gian trống, nhưng sau đó lấp đầy nó bằng 0xff và sau đó là byte ngẫu nhiên Xem Cách chuẩn bị tệp đĩa cứng ảo Virtual Server 2005 để gửi tới Dịch vụ hỗ trợ sản phẩm của Microsoft Để biết cách thiết lập VHD để nén

Precompact.exe có thể khó tìm vì một số lý do. Tôi tìm thấy một bản sao có thể tải xuống riêng biệt ở đây . Tuy nhiên, nếu bạn có PC ảo Windows, bạn cũng có thể lấy nó từ% chương trình (x86)% \ Windows Virtual PC \ Integration Linh kiện \ Precompact.iso


2
sdelete với tùy chọn -c là không điền. Có lẽ bạn đang nghĩ đến tiện ích mật mã tích hợp trong Windows không có tùy chọn chỉ có 0?
Jeremy M

"SDelete thực hiện việc dọn dẹp và vệ sinh tiêu chuẩn DOD 5220.22-M của Bộ Quốc phòng" (từ các tài liệu) mà không chỉ đơn giản là loại bỏ một cụm. sdelete -c không có không gian trống (sau khi lấp đầy nó), tuy nhiên phương thức mà sdelete sử dụng không giống như tiền xử lý và trong nhiều trường hợp sẽ dẫn đến một ổ đĩa lớn hơn so với tiền xử lý, được thiết kế để loại bỏ các ổ đĩa ảo
Jim B

Điều này là thú vị để biết về một công cụ khác. Cảm ơn bạn
mit

2
SDelete có thể rời khỏi đĩa với 0s, nhưng tiền xử lý hoạt động nhanh hơn nhiều và có nghĩa là cho loại tình huống này.
Chris S

2
@romkyns Không còn quan trọng nữa vì tất cả các phiên bản hiện đại của Windows và Hyper-V đều hỗ trợ trim(kể từ Win7 và Hyper-V 2012), không cần phải làm gì trước khi nén. Tiện ích PreCompact chỉ có các phần không của đĩa với các tệp đã bị xóa, phần chưa từng được sử dụng đã bị bỏ qua. Sử dụng một cái gì đó như sdeletesẽ lấp đầy đĩa động thành kích thước tĩnh, sau đó có thể được nén lại xuống chỉ còn kích thước thực sự được sử dụng.
Chris S

6

fsutilkhông phải là nguồn mở, nhưng được phát hành cùng với Windows và do đó không tốn thêm bất kỳ chi phí nào. Tôi đã sử dụng nó để giải phóng không gian trống trên ổ WD 250 GB 7200 RPM trống ( F:). Đây là những gì tôi chạy từ dòng lệnh:

fsutil volume diskfree f:

Trong đó cho thấy báo cáo này:

Total # of free bytes        : 249899469856
Total # of bytes             : 249997291520
Total # of avail free bytes  : 249899469856

Tôi đã sử dụng Total # of avail free bytestrong các lệnh sau:

fsutil file createnew F:\clear 249899469856
fsutil file setvaliddata F:\clear 249899469856
fsutil file setzerodata offset=0 length=249899469856 F:\clear
del f:\clear

Mất khoảng 4 giờ để viết 250GB số không.


3

Tôi cũng đã tìm cách sử dụng Crypt để chỉ viết 0x00 rồi thoát khi bắt đầu ghi 0xFF vào không gian trống. Điều này sẽ cho phép không gian trống tối đa được nén. Tôi đã nghĩ ra công việc PowerShell cơ bản sau

thay thế d: \ bằng ổ đĩa yêu cầu

Function CipherFreeSpace
{
    $cipherjob = @()
    $Job = start-job -ScriptBlock {cipher /w:d:\ }
    while ($cipherjob -notcontains "Writing 0xFF")
    {
        Write-host "." -nonewline 
        Start-Sleep 2
        $cipherjob += $job | Receive-Job 
    }
    $Job | Stop-Job | Remove-Job -Force
}
CipherFreeSpace

Trân trọng Simon


1

Nếu bạn đang sử dụng VMware, một cách tốt hơn nhiều là sử dụng các công cụ được tích hợp trong VMware để lấy lại mọi không gian chưa sử dụng trên ổ đĩa ảo.

Tôi đã sử dụng điều này để giảm kích thước của đĩa ảo từ 28 gigabyte xuống còn 13 gigabyte. Số dặm của bạn có thể thay đổi.

Khi tôi thử sử dụng sdelete -z c:, nó thực sự đã tăng kích thước của các ổ đĩa ảo lên 30 gigabyte, đây là kích thước tối đa của nó.

Xem trang web VMware và Compact a Virtual Hard Disk , bên dưới Using VMware Workstation > Configuring and Managing Devices > Configuring and Maintaining Virtual Hard Disks.

Cập nhật

Đôi khi, các công cụ GUI không hoàn toàn đáng tin cậy như các công cụ dòng lệnh. Tôi đã gặp phải các vấn đề trong đó các công cụ GUI không thành công, nhưng các công cụ dòng lệnh chỉ hoạt động tốt. Dưới đây là các tùy chọn cho VMware Desktop 10:

C:\Program Files (x86)\VMware\VMware Workstation>vmware-vdiskmanager -h
Diskname or some other argument is missing.
VMware Virtual Disk Manager - build 1895310.
Usage: vmware-vdiskmanager.exe OPTIONS <disk-name> | <mount-point>
Offline disk manipulation utility
  Operations, only one may be specified at a time:
     -c                   : create disk.  Additional creation options must
                            be specified.  Only local virtual disks can be
                            created.
     -d                   : defragment the specified virtual disk. Only
                            local virtual disks may be defragmented.
     -k                   : shrink the specified virtual disk. Only local
                            virtual disks may be shrunk.
     -n <source-disk>     : rename the specified virtual disk; need to
                            specify destination disk-name. Only local virtual
                            disks may be renamed.
     -p                   : prepare the mounted virtual disk specified by
                            the mount point for shrinking.
     -r <source-disk>     : convert the specified disk; need to specify
                            destination disk-type.  For local destination disks
                            the disk type must be specified.
     -x <new-capacity>    : expand the disk to the specified capacity. Only
                            local virtual disks may be expanded.
     -R                   : check a sparse virtual disk for consistency and attempt
                            to repair any errors.
     -e                   : check for disk chain consistency.
     -D                   : make disk deletable.  This should only be used on disks
                            that have been copied from another product.

Dưới đây là một ví dụ về thu nhỏ đĩa. Dòng lệnh này đã hoạt động, mặc dù cùng một lệnh từ GUI không thành công:

C:\Program Files (x86)\VMware\VMware Workstation>vmware-vdiskmanager.exe -k
 "H:\VMware\WindowsXP.vmdk"
  VixDiskLib: Invalid configuration file parameter.  Failed to read configuration file.
  Shrink: 100% done.

Thông báo lỗi bắt đầu bằng VizDiskLibVMware Desktop 10 và có thể bỏ qua một cách an toàn.


1
bản thân sdelete không có nghĩa là thu nhỏ kích thước vmdk. Nó được sử dụng để biến tất cả không gian trống có sẵn thành số 0 để chuẩn bị cho hoạt động thu nhỏ. Nếu bạn không làm điều này, các tệp đã xóa và dữ liệu mồ côi khác sẽ vẫn hiện diện trên đĩa. Các công cụ VMWare sẽ không thể lấy lại được dung lượng đĩa vẫn bị chiếm bởi các tệp đó. Biến các "tệp đã xóa" này thành số không làm cho không gian đĩa có thể được phục hồi hoàn toàn khi bạn chạy công cụ thu nhỏ. Lý do bạn thấy sự gia tăng kích thước tệp trên đĩa ảo là vì sdelete lấp đầy tất cả không gian có sẵn với số không.
Leon Lucardie

Cảm ơn đã làm rõ điều này. Methinks rằng các công cụ có thể được hưởng lợi từ việc đặt tên tốt hơn và / hoặc mô tả một dòng về những gì công cụ làm khi bạn chạy nó.
Contango


-1

Mít,

Tôi thấy rằng tập lệnh powershell của Simon đã làm chính xác những gì bạn cần, mà không có vấn đề về phiên bản của sdelete. (công tắc làm những việc khác nhau trong các phiên bản khác nhau)

Nó có một vấn đề, mật mã đó vẫn tiếp tục chạy, nhưng tôi đã sửa nó.

Tôi tiếp tục sửa đổi tập lệnh để dọn dẹp thư mục tạm thời:

Bạn sẽ cần thay thế F: \ bằng ký tự ổ đĩa của mình ở cả hai nơi.

Function CipherFreeSpace
{
    $cipherjob = @()
    $Job = start-job -ScriptBlock {cipher /w:F:\ }
    while ($cipherjob -notcontains "Writing 0xFF")
    {
        Write-host "." -nonewline 
        Start-Sleep 2
        $cipherjob += $job | Receive-Job 
    }
    Stop-Process -processname cipher
    Start-Sleep -s 3
    Remove-Item -recurse F:\EFSTMPWP
    $Job | Stop-Job | Remove-Job -Force
}
CipherFreeSpace

-4

Tại sao các công cụ của bên thứ ba, khi Windows đã bao gồm tất cả những gì bạn cần, miễn phí và nhanh nhất có thể là:

1) format X: /fs:XXXX /p:#, Xký tự ổ đĩa ở đâu; XXXXlà hệ thống tập tin, Yeither và #là số lần vượt qua;

2) cleanlệnh Diskpart : http://technet.microsoft.com/l Library / cc766465.aspx , http://support.microsoft.com/kb/300415 ;

Btw, bạn cũng không cần nhiều hơn một lượt - một yêu cầu khác là thông tin lỗi thời đối với các chiến lược ghi / đỏ đĩa lỗi thời, mọi người đẩy sản phẩm, điều trị hoang tưởng hoặc bs chuyển qua như "lời khuyên của chuyên gia".

Chỉnh sửa: nvm, bỏ lỡ phần không gian trống ...


1
Trong nhiều trường hợp, có các công cụ của bên thứ ba có sẵn để thực hiện công việc tốt hoặc tốt hơn, dễ cài đặt hơn hoặc đáng tin cậy hơn. Nhưng đây hoàn toàn là OT, câu hỏi không phải là về người viết nó. Ngoài điều này, Microsoft Sysiternals (người đã viết SSDelete) bởi vì chúng là lightyears tốt hơn so với các công cụ dựng sẵn. Chỉ cần so sánh ProcessExplorer với sản phẩm MS "Trình quản lý tác vụ" -1 để bắt đầu một flamewar
Alojz Janez

Bạn đã bỏ lỡ yêu cầu "nguồn mở" trong câu hỏi, phải không?
Alojz Janez
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.