顯示具有 virtualbox 標籤的文章。 顯示所有文章
顯示具有 virtualbox 標籤的文章。 顯示所有文章

2013年10月12日 星期六

縮小 VirtualBox VDI 格式占用硬碟的空間

先說作法, 再提冗長的碎碎念雜談。

作法

參考 How to shrink a dynamically-expanding guest virtualbox image | dantwining.co.uk 簡化的作法如下:

首先要在 Guest VM 將沒用到的磁區填為 0, 這樣 Host VM 才知道那些空間沒有被用到:

  • $ sudo aptitude install zerofree
  • $ sudo reboot
  • 開機時按下 left shift -> 選取 recovery mode -> 選取 Drop to root shell prompt
  • $ mount -n -o remount,ro -t ext3 /dev/sda1 /
  • $ zerofree -v /dev/sda1
  • $ shutdown -h now

奇怪的是, zerofree 填到 7x% 的時候, 整台電腦會當掉出現藍白畫面。

再來在 Host VM 壓縮 VM (VirtualBox 4.x 後支援):

  • $ VBoxManage modifyhd my.vdi –compact

結果出現 VBOX_E_FILE_ERROR, 參考 VirtualBox Solved VBOX_E_FILE_ERROR 0x80BB0004 » deltalounge 得知可能是 VDI 上面有壞軌。於是再參考 The How-To Geek Guide to Using Check Disk in Windows 7 or Vista 用 Windows 內建的圖型介面要求 Windows 7 在下次開機時使用 chkdsk 掃壞軌。這回明確找出 VDI 檔內有壞軌, 幸好沒有遺失資料。

解決壞軌問題後, zerofree 可以正常處理完整個 partition, VBoxManage modifyhd 也正常運作了。

碎碎念雜談

最近工作用的筆電三不五時就當一下, 有時是 VM 當掉 (Ubuntu), 有時是 Host OS 當掉 (Win 7), 直到某次重開機出現硬碟掃描, 掃完後說壞了八個 sector, 才確定應該是 SSD 快掛了, 只好來備份資料。

為了方便備份 Ubuntu VM, 想說買個 64GB 的隨身碟來用, 看了Tom's Hardware 針對 USB 3.0 隨身碟的評測, 想買超級威的 SanDisk Extreme (sequential write 220 MB/s), 不過價錢稍貴, 最後選了評測上沒有但是同牌的 SanDisk Ultra, 產品號稱讀取有 80 MB/s (*1)。

買好隨身碟後才發現我用的 VM 雖然沒有用到 64G, 但是 VDI 已長到 100G, 所以就照前面描述的流程瘦身、處理壞軌, 然後才能備份資料。掃完壞軌後電腦好像正常多了, 也懶得重灌, 先放著繼續一陣子, 順便了解一下 SSD 的壽命。話說用電腦用了十年多, 這是第一次在自己的工作用電腦上出現壞軌, 也是第一次大量使用 SSD ...。

Btw, 除了電腦偶而藍白一下外, 先前還有發覺 mercurial 回報 meta data 少了一些檔案, 無法進行操作, 用 find 找了一下, 發現有數個空檔案, 只好整個砍掉, 從別台電腦再複製一份過來, 壞軌真是可怕啊。

PS

  1. 實測的結果, 備份 50G 檔案的寫入速度是 10MB/s, 應該是比一般 USB 隨身碟快很多, 不過等了一小時半, 還是有點久。還沒測讀取的速度。

2013年7月18日 星期四

VirtualBox 使用 Bridged Adapter 的方法

打從開始用 VirtualBox 到現在, 一直沒有成功地用過 Bridged Adapter, 所幸 cmd 很自然地使用 Bridged Adapter, 比對一下成功的設置方式, 總算明白我搞錯的地方。

Bridged Adapter 的設定幾乎和 NAT 一樣簡單, 在 guest OS 關機狀態下, 從 VM 的 Settings -> Network -> Attached to 選擇 Bridged Adapter 即可。若 host OS 是透過 DHCP 取得上網 IP (比方說家裡有裝 IP 分享器), 那 guest OS 無須設定, 開機後也會從 DHCP 取得 IP 上網。

若 host OS 是用 PPPoE 連上網路, guest OS 也需要設定 PPPoE 才能連上網。可以想成 guest OS 和 host OS 是連上同一個 LAN 的另一台機器。Btw, 可以參考這裡了解 Ubuntu 設定 PPPoE 的方法, 作法也很簡單。

2012年1月16日 星期一

VirtualBox 改變 vdi 的大小

花了一整個晚上的血淚談。

注意事項

  • 目前 (4.x) 只支援在沒有 snapshots 的情況下改變 vdi 大小
  • 若目前有用 snapshot, VBoxManage 也不會阻止你改變大小, 只是改完就沒救了, 會無法刪掉最早的 snapshot, 推測是因為硬碟上的 vdi 檔案資訊和 snapshot 內的 vdi 不合。可以刪除中間的 snapshot, 因為那沒有涉及硬碟上的 vdi 檔

擴大 vdi

  • 關掉 guest OS
  • 砍掉所有 snapshot, 只剩 current state: 在命令列下使用 VBoxManage modifyhd --resize NUM_MB /path/to/vdi
  • 用 Ubuntu CD 開機 (現在已沒有 "live CD" 的名稱了, Ubuntu 安裝光碟本身就可當 "live CD"), 使用 gparted 調整硬碟大小
  • 重開 guest OS, 可用 df -h 確認實際大小確實有改變 (或用 sudo fdisk -l /dev/sda 看 partition 資訊)。

若不幸在砍 snapshot 前先用 VBoxManage 改了大小, 就無解了。目前只有看到一位仁兄用 Mac 的 Time Machine 還原到他做蠢事前的狀態, 解決這個砍不掉的問題 ... 。

我用另一台電腦的 VirtualBox 實驗以上步驟沒有問題, 確認問題出在我先改了 vdi 大小。

縮小 vdi

我沒試過這個, 順便筆記一下

  • VBoxManage --resize 只支援擴大, 要縮小的話要換指令
  • 先在 guest OS 針對要縮小的 partitoin, 用對應的工具重整 partition (zerofree on Linux)
  • 使用指令 VboxManage modifyhd --compact /path/to/vdi

參考資料

下次用這類 VM 的指令, 一定要熟讀手冊再下手啊 ...

2011年12月7日 星期三

VirtualBox 設 shared folder

《How To Share Files In VirtualBox With Vista Guest And Ubuntu Host》設定 host OS。

若 client 是 Linux, 見 《HOWTO: Use Shared Folders》, 就一行指令啦:

sudo mount -t vboxsf SHARE_FOLDER_NAME /mnt/share

SHARE_FOLDER_NAME 是在 host OS 設定時打的名稱。

2011年8月27日 星期六

virtualbox 使用 USB 裝置

2012-12-16 更新

  • 現在 (4.x 版) 似乎無需做任何設定, 只要有裝 Oracle VM VirtualBox Extension Pack, 在 VirtualBox 視窗右下角按 USB 的圖示, 再點目標裝置, 即可加入或移除該裝置
  • 同一時間只有 host 或 guest 可擁有該裝置, 所以從 guest OS 移除, 相當於接回 host OS
  • 目前 VirtualBox 只支援 USB 2.0 的插槽, 若偵測不到時, 注意一下是否為這個問題
  • 有時拔拔插插, VirtualBox 會進入奇怪的狀態, 接上去 guest OS 無法連接且跳出 device is busy 的錯誤訊息。試看看拔除該裝置, 重開 guest OS
  • (續上則) 若重開 guest OS 無效, 並且 host OS 已移除該裝置, VirtualBox 的 USB 清單卻仍顯示 "captured", 試看看拔除該裝置, 重開 host OS

原文

網路上搜一下, 比較多是 Ubuntu 當 host 的解法, 我的情況是 Win7 當 host, Ubuntu 當 guest。

這兩篇說明很詳細

現在的版本圖形介面很好用了, 不用像第二篇說的那樣用指令操作。這裡記下我的操作步驟:

  1. 關掉 guest OS
  2. 在 VirtualBox 選單, 選擇 guest OS -> Settings -> USB -> Enable USB 2.0
  3. 會出現訊息框, 說明要安裝 Oracle VM VirtualBox Extension Pack。下載後安裝它
  4. host OS 插入 USB 隨身碟
  5. 在 VirtualBox 選單, 選擇 guest OS -> Settings -> USB, 點右邊有綠色 "+" 的 USB 頭的圖示, 選擇該 USB 隨身碟, 加入它的 filter
  6. 從 host OS 移除 USB 隨身碟
  7. 開啟 guest OS
  8. 插入 USB 隨身碟, 於是 guest OS 會自動偵測隨身碟, 掛到 "/media/USB DISK"

相關查看的指令:

  • 用 sudo fdisk -l 查看所有硬碟裝置, 我的情況是, 原本只有 /dev/sda, 隨身碟自動掛上去後, 多了 /dev/sdb。另外 ls -l /dev/disk/by-id 可看到 USB 隨身碟的名稱, 用 soft link 連到 /dev/sdb。
  • lsusb 列出 USB bus 資訊, 不清楚還能查什麼。裝完 Extension Pack 後多了 Linux Foundtation 2.0 root hub, 原本只有 1.1
  • 之後可自己用 sudo umount ... 和 sudo mount /dev/sdb1 SOME_DIR 來掛載和移除 USB 隨身碟

備註

  • 加好 USB filter 後, 插入該 USB 隨身碟都是掛到 guest OS, 若要將它掛到 host OS, 大概要關掉 guest OS, 等有需求時再看看怎麼處理較好
  • 加入 USB filter 時, 我一開始是先點藍色的 "o" 圖示, 加入一個空的 filter。原本猜說是全部放行的意思, 不過試了以後, 在插入 USB 隨身碟時, Win7 就當了

2011年6月9日 星期四

virtualbox port forwarding 太慢的原因和解法

這標題其實不太正確, 這是一連串的巧合造成的誤會。我的配置如下:

  • Windows 7 當 host OS
  • Ubuntu 當 guest OS
  • 網路模式用 NAT mode
  • 有設 port forwarding, 像是 host 的 10022 會導向 guest 的 22; 18000 會導向 guest 的 8000。

所以, 我可以在 Windows7 用 putty 連向 localhost 10022, 開始寫程式, 要跑 web dev server 時, 就跑在 port 8000。於是可在 Windows 7 裡打開瀏覽器, 連向 localhost:18000, 連上 Ubuntu 裡的 web dev server

但詭異的是, 連 ssh 和 apache2 都沒問題, 連向 web dev server 時卻會很慢。另外試了 python SimpleHTTPServer 也很慢。

卡了好幾天後, 聽同事 P 的建議, 用 tcpdump 在 guest OS 裡看封包狀況, 發現它會五秒傳一批, 等五秒再傳下一批。讀一次網頁包含 css、js 等, 一次會下載多個檔案, web dev server 則是十秒回傳一個, 相當有規律。

看到這種規律的延遲情況, 讓我想到可能原因是 domain name 反查 time out, 之前在連 ssh連 mysql 時都發生過。

但是這回我有在 guest 的 /etc/hosts 設自己的 IP 反查, 不明白原因在那。最後亂試發現, 在 /etc/hosts 裡設 gateway 的 IP 反查就解決了 (用 route 查 gateway IP; 名稱可以隨便設, 反正都是區網 IP)。再研究一陣子才發覺, 連向 host 透過 port forwarding 傳向 guest 時, 來源 IP 會變成 guest 的 gateway。而上述兩個會延遲的 web server, 都會顯示來源連線的 domain name, 查不到時才會改顯示 IP。因此固定延遲五秒

附帶一提, 這次我又犯之前的錯, 改了 /etc/hosts 後用 host 和 nslookup 測, 結果一直沒反應。看到之前的心得才發覺它們沒有呼叫 gethostbyaddr()。用 ltrace 跑 dev server 有看到 gethostbyaddr 的字, 但是是出現在 memcpy 的參數裡, 不知實際情況怎麼運作的。之後有機會再來連研究上述兩者 web dev server 的原始碼。

2011年5月4日 星期三

VirtualBox 調大 guest OS 的螢幕解析度

這篇有清楚的圖解和文字說明, 摘要如下:
  1. 在開啟 guest OS 的情況下, 在 guest OS 的視窗上方點「裝置」 -> 「安裝 Guest Additions」。不要像我一樣傻傻地一直在 VirtualBox 管理員視窗一直找都找不到
  2. 開 terminal, 切到 /media/cdrom0 目錄下
  3. sudo ./autorun.sh。若結果不如網頁裡提的畫面, 改用 sudo ./VBoxLinuxAdditions.run
  4. 重開 guest OS
  5. 點 System -> Preference -> Screen resolution (或是 Monitor / Display, 看你的 Ubuntu 版本), 會有更多種解析度可選。不過我弄好後它就自動改選最大的了。
理論上中間執行 autorun.sh 後要 OK, 但我執行的結果是沒反應。於是改用 sudo sh -x autorun.sh 看 shell script 執行過程, 發覺它沒有成功執行, 最後有行錯誤訊息要我自己執行 ./VBoxLinuxAdditions.run, 但因為原本執行 autorun.sh 會跳出另一個視窗, 顯示錯誤訊息後又自己關掉視窗, 最好是看得清楚 .......。

2011年5月1日 星期日

使用 Virtual Box 從 host OS 連向 guest OS

2011-06-05 更新

剛發現可以透過 GUI 介面直接從 Network -> Advanced -> Port forwarding 裡新增 forwarding rules, 以下的記錄就當歷史吧......。

( 原文如下 )

之前在 Windows 下試過一些寫 Python 的方案, 最後得到的結論是: 裝 andLinux 再用 putty 連 localhost 開 screen 最好用!! 姑且不論這種作法到底還算不算是「在 Windows 下寫 Python」, 我個人覺得這樣滿順手的, 而且只要習慣一種開發環境即可。不幸的是, andLinux 無法裝在 64bit Windows 下, 只好改裝 VirtualBox 再裝 Ubuntu 10.04。

裝 VirtualBox 和 Ubuntu 10.04 超級簡單, 就和裝一般軟體沒兩樣。反正是 VM, 而且是自己練習 coding 用的系統, 直接一個大 partition 搞定, 什麼設定也不管, 沒多久就裝好了。裝好後如同 andLinux, 網路都設好了, guest OS 透過 host OS 用 NAT 的方式可連到 Internet。但是, host 預設無法連回 guest, 於是找了一下設法。

參考 Howto Access via ssh a Virtualbox Guest machine 的說明和留言的指示, 外加一些 try & error, 整理出方法如下:
  1. 在 guest OS 用 ifconfig 找出網卡名稱 (如 eth0)
  2. 在 guest OS 用 dmesg 配合網卡名稱找出 device (?) 類型 (dmesg | grep eth0), 可能會找到 pcnet 或 e1000。我的情況是 e1000
  3. 在 host OS 的命令列執行指令 VBoxManage (Windows 的見下面補充說明):
    VBoxManage setextradata "GuestName" "VBoxInternal/Devices/e1000/0/LUN#0/Config/ssh/HostPort" 2222
    VBoxManage setextradata "GuestName"  "VBoxInternal/Devices/e1000/0/LUN#0/Config/ssh/GuestPort" 22
    VBoxManage setextradata "GuestName" "VBoxInternal/Devices/e1000/0/LUN#0/Config/ssh/Protocol" TCP
  4. 用 VBoxManage getextradata "Guest Name" enumerate 查看是否有設進去。
  5. 關閉 guest OS, 再重開 guest OS。記得要關掉再開機, 不能用 reboot, 因為要重設 VM 的網路設定
  6. 成功的話, 若 host OS 是 Windows, 應該會跳出防火牆設定的通知, 詢問是否同意讓 VirtualBox 使用網路之類的問題。接著按「允許」
  7. 用 ssh/putty 連向 localhost 的 port 2222, 會透過 port forwarding 的方式導到 guest OS 的 22 port。
補充說明
  1. Windows 7 的 VBoxManage 放在 c:\Program Files\Oracle\VirtualBox\ 下, 進 cmd 後要切到該目錄下才能執行。不然就是將它加到 environment path 裡
  2. 注意大小寫, 別把 VBoxInternal 打成 VboxInternal, 或是 Protocol 打成 Protocal
  3. 注意 guest OS 用的 device adapter, 網路上的範例有的是 pcnet 有的是 e1000, 要查一下自己的是什麼
  4. 在 Windows 下可用 netstat -a 確認是否有聽 port 2222; 在 Linux 下用 netstat -lntp 查看。
  5. 若用 VBoxManage 設錯 extradata, 刪除的方法是用 setextradata 配合空的 value 
滿好奇背後是怎麼運作的, VirtualBox 怎麼將 guest 和 host 的網路串起來? 改天有機會再來看看吧。

2011-06-05 更新
透過指令列用 VBoxManage 設定實在是太麻煩了, 試了一下, 找出直接改設定檔的方法。首先要關掉 virtual box host server, 不然手動改完後之後又會被覆蓋回去。關掉 server 後編輯 C:\Users\*YOUR_ACCOUNT*\VirtualBox VMs\*YOUR_VM*\*YOUR_VM*.vbox。改完後再啟動 virtual box host server。

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...