2013/03/22 updated.
大杀器
Step1. 已删除文件的扇区置零
Guest OS=Windows,使用SDelete。下载地址:http://technet.microsoft.com/en-us/sysinternals/bb897443.aspx。在Guest OS里执行:sdelete -c c:\ (c:\ d:\e:\ 指定盘符)
Guest OS=Linux,使用zerofree。zerofree的困难之处是必须要将目标磁盘mount为只读,有各种办法处理起来都不是很方便。经过多种尝试,可以使用内含zerofree的Parted Magic启动,只读加载硬盘,使用zerofree进行置零。Parted Magic下载: http://partedmagic.com/doku.php?id=downloads#.UUwvexzUM3A。使用其他的Linux LiveCD也可以,不过我用了CDLinux和Gentoo,启动后,mount -n -o ro -t ext4 /dev/sda1 /meida/your mount folder之后,再执行其他命令,会出现-bash: commond not found,不是很清楚什么原因造成的。启动Parted Magic后,mount -n -o ro -t ext4 /dev/sda1 /media/sda1,zerofree /dev/sda1,执行时间很长并且无任何提示。
VMWare Player在执行完SDelete,运行cmd:
VMTools ui don't exist so do the shrink in an (elevated) cmd
prompt:
cd "C:\Program Files\VMWare\VMTools"
VMwareToolboxCmd.exe disk shrink c:\
Step2. 压缩
关闭虚拟机,使用VBOXManage modifyvdi xxx.vdi compact进行压缩
========================================================
==OLD==
瘦身原理: 由于虚拟硬盘不会再利用已删除文件的区域,造成虚拟硬盘不断增大。而虚拟机本身带的瘦身工具,只针对磁盘扇区字节都是00的情况。不论Guest OS是Windows还是Linux,删除文件仅仅是将文件分配表做改动,实际文件所占位置没有置零,造成虚拟机的瘦身工具无用武之地。Guest OS是Windows的情况,比较好处理,网上很多教程,下载SDelete,在虚拟机里运行,然后关闭虚拟机,使用虚拟机的瘦身工具就可以减肥了。Guest OS是Linux的,网络上只是简单介绍了一下,没有详细步骤,估计一般都卡在只读加载硬盘这里,至少我使用init 1直接挂在启动界面无反应。由于装的Guest OS是Ubuntu,这里也只能以Ubuntu为例来说明。下面的方法来源于网络,必要地方加了补充。不仅仅针对VirtualBox,其他虚拟机也适用,比如VMWare。
===============================
如果guestos是windows的话比较简单,网上有很多教程。
对于ubuntu的情况,有不少文档介绍使用remount 根文件系统为read only的方法(init 1),这种方法在文件系统为ext4时无效。
所以在这里我们采用另一种方式来实现。
1.) Install “zerofree” on your virtualbox guest machine.
2.) Boot to safe mode (recovery mode) where you can access your root partition (/dev/sda1).
进入recovery mode的方式:ubuntu启动时按住右側shift,就会出现GRUB选项,进入recovery的menu,然后选择最后一项root以根用户进入
3) vi /etc/fstab
编辑fstab,将/dev/sda1的mount方式改为ro 。具体方法请自行查阅相关资料。
注释掉原来/dev/sda1那行
增加:
UUID=xxx /dev/sda1 ext4 ro 0 0
4.) Restart to safe mode again and then Run “zerofree /dev/sda1″
5.) Shutdown the virtual machine and run “VBoxManage modifyhd –compact /path/to/virtualboximage.vdi”
6.) Enter the recovery mode again, select "root"--->Enter "mount -o remout,rw /" ----> Enter "vi /etc/fstab", change the mode from "ro" to "rw" ---->save and exit
7.) Restart
===============================================
找到一个详细介绍瘦身的,转贴如下。http://cypromet.site90.net/blog/?p=41
另外,由瘦身有想到能否直接使用物理硬盘和分区,伟大的VBOX也提供了方法,同样转贴在下面。http://blog.163.com/ksharp_dabu/blog/static/1954880222011102121517766/
VDI大瘦身
Promet | 2010 年 06 月 09 日
好不容易終於找到一些比較進階的東西可以寫了。(拖
在虛擬化大行其道的今天,相信很多人家中都應該有裝VirtualBox/VMware玩玩才是。
一般的家用虛擬機器,由於不涉及重大的操作,在建立虛擬硬碟的時候,多會選用「動態延伸存放功能」,就是說,當我建立一個20GB的虛擬硬碟的時候,並不會馬上佔用20GB的硬碟空間,而只有一個300多KB的映像檔,隨後映像檔會隨著實際的使用而增長,直到設定的20GB完全用完為止。這樣的功能,聽起來很有彈性,但我玩了VM三、四年,直到最近才發現這種功能有個很大的問題 - 虛擬硬碟只會大不會小!如果一度在虛擬系統內安裝了很多軟體,再將它們統統移除,你會發現,那極速膨脹的硬碟映像檔,根本不會隨著軟體的移除而縮小,最後只會越來越肥大……
我使用的VM軟體是VirtualBox,Google一下的話,會發現處理這種情形的方法有很多,不過再仔細看看,大部份的相關資料都有一段時日了,而且要命的是眾說紛云,有人說這個方法好,有人說那個方法不行…….事情到最後,是我新安裝好、編譯了近一週的Gentoo被玩壞了。Orz
可幸的是,後來我在壓縮我的Arch Linux虛擬硬碟的時候,取得了很好很有用的經驗。
其實要壓縮VDI的體積只需兩步功夫:
1.將硬碟映像檔內的資料變得分散
2.利用VirtualBox的文字模式管理指令VBoxManage將VDI壓縮
不完成第一步的話,使用VBoxManage的壓縮指令其實是得不到效果的。如果你VBox裡裝的是Windows,那麼第一步很簡單,微軟本身提供了一個名為SDelete的工具,只要運行sdelete -c就可以了。
如果你的虛擬機器裡面裝的是Linux的話,傳統上可以用dd指令來完成這個效果,不過dd指令本身很複雜、效率很慢,而且據說在壓縮前反而會讓映像檔急速脹大;鑑於dd的種種不便,有人就開發了zerofree這個小程式取代。你只需要下載zerofree的原始碼,解壓縮,再直接用make編譯好,一個zerofree的執行檔就會出現了,你可以將它複製到/usr/bin或/usr/sbin中方便之後使用(個人覺得不複製也沒關係,不過一定要記得zerofree擺放的位置)。
接下來的步驟才是問題所在:很多人建議直接在你的虛擬系統裡轉到Single User Mode(init 1)使用zerofree,個人卻發現這個方法不怎麼可行。這個方法是建議在Single User Mode中remount根目錄所在的硬碟,然後執行zerofree,但我在進行這個操作時,卻遇到不少問題。首先是系統經常抱怨Device /dev/hda1(我的根目錄硬碟) is busy而不能重新掛載;就算掛載成功,zerofree運行起來也怪怪的,最終導致我的Gentoo毀於一旦了……..
後來終於在VBox的Trac裡一個討論串中找到一個可行的辦法 - 用LiveCD執行zerofree!!
討論串裡面的人建議用Ubuntu的安裝光碟作為執行zerofree的LiveCD,我個人則建議可以找更輕便的LiveCD代替,比如Parted Magic或者Gentoo的Minimal LiveCD都是不錯的選擇(個人更推崇後者,因為後者只有純文字模式操作,boot起來快多了)。啟動之後,先掛載你的Linux系統的硬碟(先假定你的硬碟是hda1):# mount -n -o ro -t ext4 /dev/hda1 /mnt/hda1
記得必須要將硬碟掛載成ro(唯讀)
然後執行zerofree# /mnt/hda1/usr/bin/zerofree /dev/hda1
若果當初將zerofree放在虛擬系統的/usr/sbin裡的話,改成/mnt/hda1/usr/sbin/zerofree即可
雖然zerofree號稱速度快,但個人的經驗是,兩個系統(Arch和Debian)執行zerofree的時間分別需要90分鐘和75分鐘,所以請耐心等待,不要以為沒反應就覺得出事了。
等到zerofree執行完畢後,可以安全卸載硬碟,然後關閉虛擬機器。這時候再用VBoxManage指令壓縮vdi:VBoxManage modifyvdi XXX.vdi compact
要留意VBoxManage指令要以創建該VDI的使用者的身分執行,比如你以用戶tom身分建立了該VDI,必須要以tom的身分下此指令,否則即使用root亦不能對該vdi進行壓縮;此外VDI亦必須要標明其絕對路徑,比如上面的XXX.vdi是放在/home/tom/.VirtualBox/XXX.vdi裡面的話,你在指令中要清楚指示,所以上面的指令不能夠照搬,否則VBoxManage會抱怨出錯。
VBoxManage指令事實上相當好用,我的Arch和Debian兩個虛擬硬碟在壓縮前分別為4.5GB及4.1GB,壓縮之後只有2.5及2.9GB而已,差異可謂相當的大。
VirtualBox直接使用物理硬盘(linux,windows XP)
2011-11-21 14:15:17| 分类: 虚拟机|字号 订阅