vagrant virtualbox provider 加載磁碟

前兩天想練習 LVM,所以試著在既有的 RHEL VM 裡加磁碟,但是事情沒有想的那麼簡單。原本以為就是照 Vagrant Disk Usage 文件的說明,在 Vagrantfile 裡加入

config.vm.disk :disk, size: "100GB"

就可以,但這樣不行,vagrant reload 以後,並沒有磁碟出現。

上網找解決方法,找到這篇:Add a second disk to system using vagrant

才知道是要用 provider 的 customize() 去建立磁碟並加載才行 (參考資料:Add a second disk to system using vagrant):

    tower.vm.provider "virtualbox" do |v|
      file_to_disk1 = "mydisk1.vmdk"
      unless File.exist?(file_to_disk1)
        v.customize [
           "createmedium", "disk", "--filename", file_to_disk1, "--format", "vmdk", "--size", 1024 * 1
         ]
      end
      file_to_disk2 = "mydisk2.vmdk"
      unless File.exist?(file_to_disk2)
        v.customize [
           "createmedium", "disk", "--filename", file_to_disk2, "--format", "vmdk", "--size", 1024 * 1
         ]
      end
      v.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', file_to_disk1]
      v.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', 2, '--device', 0, '--type', 'hdd', '--medium', file_to_disk2]
    end

在建立前,先使用 File.exists? 去做檢查磁碟映像檔是否存在,不存在,就呼叫 createmedium 來建立。接著再用 storageattach 加載到 VM 上就可以了。

如果有錯誤訊息,說沒有 SATA Controller,請開啟 VirtualBox 去看該 VM 是不是有 SATA Controller。

參考資料:

  1. vagrant – Set storage size on creation of VM VirtualBox – Unix & Linux Stack Exchange
  2. Vagrant Tricks: Add extra disk to box – real world IT
  3. https://gist.github.com/leifg/4713995

VirtualBox guestcontrol

VirtualBox 可以用 vboxmanage guestcontrol 來有限度的控制 VM 裡的 GuestOS。

GuestOS 是 Ubuntu 的話,得安裝 virtualbox-guest-utils, virtualbox-guest-dkms ,安裝完以後,重新開機。

在 HostOS 裡,就可以用 vboxmanage guestcontrol 指令了。

# VirtualBox 5.x
vboxmanage --nologo guestcontrol "Ubuntu 16.04" run --exe /sbin/ifconfig --username ubuntu --passwordfile password.txt --wait-stdout --wait-stderr --verbose

參考資料:

docker-machine 的 port forwarding

最近在 Windows 試 docker-toolbox,想讓外部連線連到 host 時,其實是連接到 在 VM 裡服務的 docker container,所以查了看怎麼做。

結果比想像中還要簡單,就是利用 vboxmanage controlvm 去設定 port forwarding 就可以了。

/c/Program\ Files/Oracle/VirtualBox/VBoxManage.exe controlvm vm_name natpf1 "rule1,tcp,,80,,80"

那要刪除掉這條 port forwarding 的規則,用

/c/Program\ Files/Oracle/VirtualBox/VBoxManage.exe controlvm vm_name natpf1 delete rule1

即可。

那在 linux 下也可以用同樣的方式來做 port forwarding,唯一的限制是非 root 用戶,沒辦法做 port 1024 以下的 port forwarding。

說明:

  • docker-toolbox 其實是把 docker, docker-machine, docker-compose, virtualbox 等工具包裝起來的一個便捷安裝包
  • vm_name 可以用 vboxmanage list vms 取得
  • 也可以開啟 VirtualBox ,在左側選到虛擬機,再進設定去改動。

參考資料:

phpvirtualbox

無意在 /etc/init.d 下看到 vboxweb-service 這個服務,好奇的把名字丟到 google 去找,才知道是 virtualbox 要提供給 phpvirtualbox 使用的服務。

安裝方法不難,不過我還是搞了好一陣子 (大約4個小時吧),以下是我所參考的文件。

我遇到的問題:

  1. nginx + php5-fpm 只為特定 location 啟用 PHP :這部份卡了我好一陣子,後來是找到這篇:php – nginx projects in subfolders,參考裏面的作法去設定。大致是這樣:
    location /wiki {
        root /var/www/wiki/public;
    }
    
    location ~ /wiki/.+\.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_param  SCRIPT_FILENAME /var/www/wiki/public$fastcgi_script_name;
    }
    
  2. 無法啟動 vboxweb-service,出現 “vboxwebsrv: error: failed to initialize COM”:原本以為是沒加 dialout 群組的關係,後來根據某篇討論(網址不小心被我丟了)仔細推敲以後,發現是因為 VBOXWEB_USER 所指定的使用者沒有 HOME 資料夾,幫這個使用者建立 HOME 以後,就可以順利啟動 vboxweb-service 了。
  3. 無法登入 phpvirtualbox:這是我自己搞錯了,原本以為 config.php 裡指定的 username 跟 password 就是用來登入 phpvirtualbox 的帳號跟密碼,但後來才知道這組帳密是讓 phpvirtualbox 與 vboxweb-service 溝通用的,預設的 phpvirtualbox 帳密是 admin/admin。要修改的話,登入以後再變更就可以。
  4. RDP(Remote display) 不能用:這要先查到 virtualbox 的版本號碼,然後到Virtualbox download site下載對應的 .vbox-extpack 檔案,再用 vboxmanage extpack install 安裝。安裝完成以後,要重新啟動 vboxweb-service 與 vboxdrv 這兩個服務。最後用瀏覽器開啟 phpvirtualbox 頁面,去設定指定的 VM,就可以看到 Remote display 可以設定了。啟動 VM 以後,就可以用遠端桌面連線連上並看到這台 VM。連線所指定的 IP 是 host phpvirtualbox 這台機器的 IP,port 則是 3389。

另外,啟動所需要的光碟 ISO 檔案或是已經有打包好的 disk image 無法透過 phpvirtualbox 上傳,必須要事先透過 SSH、FTP 等傳輸協定放到 host 上。

其他參考資料 (與 nginx/php5-fpm 相關的):

Prolific pl2303 usb to serial In Virtualbox

原本以為,在 USB 那邊切過去就可以,但 Guest 裡的 Windows XP 在安裝驅動程式以後還是無法使用。

後來還是在 VirtualBox 裡設定,啟用 COM1,然後連接埠模式選”主機裝置”,連接埠設 Ubuntu Host 偵測到的 “/dev/ttyUSB0″。這樣應該是沒問題,再看看。

vboxdrv: Unknown symbol mcount

公司的桌機是用 Ubuntu 12.04 LTS,今天發現 virtualbox 不能執行了,就順道把 Kernel 升級到 trusty (linux-image-generic-lts-trusty),然後重新安裝 virtualbox,發現不行,Ubuntu 附的 virtualbox-ose 會說沒有適合現在 kernel 的 module,改用 oracle virtualbox-4.3 則會出現模組無法驗證的訊息。

模組無法驗證,上網 Google 了一下,發現應該是 Kernel 啟用了 CONFIG_MODULE_SIG 的緣故,參考 Signed kernel module support – Gentoo Wiki ,研判是需要 key 才能編譯出 sign 過的 module,但實在找不到 key,就放棄了。

退到 saucy 的 kernel (linux-image-generic-lts-saucy),一樣用 oracle virtualbox,這次在編譯時有警告 (這可以參考 /var/lib/dkms/vboxhost/ 目錄裡的 make.log ),insmod 時,出現 vboxdrv: Unknown symbol mcount (err 0) 的錯誤。Virtualbox issue tracker 有人回報過此問題:dkms unknow symbol mount (err0) ,結論是 gcc 版本過舊而導致。所以安裝 gcc-4.6 以後,再參考這篇 Choose gcc and g++ version ,把預設的 gcc 改為 gcc-4.6 之後就可以編譯出沒問題的模組了。(備註:文章裡是以 4.3 與 4.4 為例,相信你知道如何改動)