使用 Virtual Box Headless 跑 Virtual Machine

VirtualBox 是 Sun (後來被 Oracle 買下) 開發的一套虛擬化軟體。他的 Host OS 可以是 Windows, Linux, MacOS, FreeBSD。除此之外,VirtualBox 可以在 Terminal 下執行,顯示的畫面由 RDP/VNC 輸出,亦即 Headless 模式。要特別注意的是,RDP 輸出僅限於專屬授權版本,OSE (Open Source Edition) 版本是沒有這個功能的。

要使用 VNC 輸出,必須在安裝的時候加入 VNC 支援:

# cd /usr/ports/emulators/virtualbox-ose; make WITH_VNC=yes all install clean

安裝好 VirtualBox 之後,必須再安裝 kernel module:

# cd /usr/ports/emulators/virtualbox-ose-kmod; make install clean

接著把需要的 Kernel Module 載進來:

# kldload vboxdrv; kldload vboxnetadp; kldload vboxnetflt

之前寫在 /boot/loader.conf 會導致開機時 Kernel Panic,但如果開完機手動載入就不會,目前還沒找出原因。

接下來新增一個 Virtual Machine:(以下都可以不需要 root 權限)

% VBoxManage createvm winxp --register

然後設定 VM 的資源需求:

% VBoxManage modifyvm winxp --acpi on --ioapic on --memory 1024 --cpus 2 --nic1 bridged --nictype 82540EM --bridgeadapter1 em1

以上的範例分配了 1024MB (1GB) 的 RAM 與 2 個 Virtual CPU 給 winxp 這個 VM,另外建立了一張虛擬網卡,型號為 Intel 82540EM,橋接到實體的 em1 這張網卡上。

再來建立一個新的 120GB 虛擬硬碟:

% VBoxManage createhd --filename winxp --size 122880

在 VM 裡增加一個 IDE Controller:

% VBoxManage storagectl winxp --name "IDE Controller" --add ide

把硬碟與安裝 ISO 檔連接到 IDE Controller:

% VBoxManage storageattach winxp --storagectl "IDE Controller" --port 0 --device 0 --type hdd --medium winxp
% VBoxManage storageattachwinxp --storagectl "IDE Controller" --port 1 --device 0 --type dvddrive --medium winxp.iso

接著就可以開機了:

% VBoxHeadless -s winxp --vnc --vncport 5900 --vncpass password

執行成功後,可以用 VNC 連入看到安裝 Windows XP 的畫面:

關機、重開機可以使用 VBoxManage 來完成:

% VBoxManage controlvm winxp poweroff

Python 的 GIL (Global Interpreter Lock)

前幾個月在做專案的時候,發現用 mod_wsgi + web.py 寫的程式,理論上支援 multi-thread,應該可以完全利用在多核 CPU Server 的優勢;但實際上跑的時候,會有沒辦法把 CPU Resource 吃完的問題。當時因為時間很趕,想到的解法就是多跑幾個 Process:

<VirtualHost *:80> 
   DocumentRoot “/srv/web/webroot" 
   ServerName python.example.com 
   WSGIProcessGroup pythonexample 
   WSGIDaemonProcess pythonexample processes=16 threads=128 maximum-requests=1024 display-name=%{GROUP}
</VirtualHost>

COSCUPlwhsu 聊到這件事,他講到 CPython 的 GIL,回來查了一下果然就是這個原因。剛好 Web 不需要在每個 thread 之間互相傳資料,所以可以直接用多個 Process 解掉這個問題。

雖然 Python 在執行前就把程式碼轉成 byte code了,但因為這個 Lock 是實做在 CPython 的 Bytecode Interpreter 裡面,所以導致了同時只會有一個 thread 執行 Python bytecode,也因此無法利用到多核 CPU 的優勢 ((Stackoverflow: Python threading and gil))。

除了多跑幾個 Process 之外,也可以用 ctypes 配合用 C 寫的 library 來解決這個問題,不過以 Web 應用來說,寫 C 的機會不高就是了。

FreeBSD 的 EC2 AMI…

剛到公司就被DK長輩提醒,Amazon Web Services可以跑FreeBSD 64 bit 的 AMI 了(us-east 的 ami-c69862af)。一樣是Colin Percival做出來的AMI。

然後他的作法居然是開一台Windows的機器,然後把Kernel換掉 XD
這樣確實可以跑 HVM 沒錯,不過缺點是每小時的費用比較高(目前會計入微軟稅)。

作者也希望AWS能夠早日把HVM開放給非微軟平台,這樣就不用繳微軟稅了。

Flickr 提供 OAuth Core 1.0a 認證方法

Flickr 今天公佈了一個新功能:OAuth Core 1.0a 認證方法。現有的 API 方法不變,只有認證改用 OAuth Core 1.0a 的方法。原本的認證方法將在明年(2012年)移除。

另外, Flickr 也提供了舊API的轉換認證方式,只要用 Flickr 提供的  flickr.auth.oauth.getAccessToken API 就可以把舊的 Flickr  Access Token 轉為 OAuth 的 Access Token,也就是使用者不需要重新授權一次就可以轉換成 OAuth。

Linode 的 Load Balancer…

長輩那邊看到了Linode 也推出 Load balancer 服務… (剛開始 beta),於是就來測試一下:

這是增加一個 Port 的畫面,可以選 TCP 或 HTTP Protocol(沒有HTTPS),另外可以看Cookie或者查表來把同一個人導到同一台backend上。

Healthy Check 的部份有TCP、HTTP Valid Status 與 HTTP Body Regex,所以可以檢查回傳的頁面是不是正確(例如有沒有</html>)。但是不能指定 Host: 這個 Header。

設定完大概就長這樣:

然後接下來是加入 Member Node:

不能填非 192.168.*.* 或是 IPv6 Link Local Address 以外的值:

討論區的公告上面寫說支援IPv6,不過實際測試發現填不進去:

實際使用上是可以支援 IPv6 的,也有實做 X-Forwarded-For

實際使用上的問題有兩個:

  1. 跟之前的 AWS 的 ELB 一樣,有 Load Balancer IP 的信任問題。沒辦法確認這個 X-Forwarded-For 是不是被假造的。
  2. Node 的 Healthy Check UP/Down Status 更新速度很慢。我今天17:00加了新的Node進去,到現在(21:30)的 Status 還是 Unknown…

security/pam_google_authenticator: Two Factor Authentication PAM Module

security/pam_google_authenticator 是 Google 推出的 Open Source PAM Module,提供 RFC 4226 (HOTP: An HMAC-Based One-Time Password Algorithm) 的 OTP 功能。

只要使用 Android 手機(未來會支援iOS裝置),安裝 Google  提供的 App,開啟並設定 pam_google_authenticator,之後的 ssh 連線就可以使用 OTP 登入。

Linux 上的安裝方法可以看 @gasol 寫的替主機上第二道鎖 – Google Authenticator,這裡介紹的是 FreeBSD 上的安裝方法:

  1. 先安裝 security/pam_google_authenticator
  2. 執行 google-authenticator ,設定 secret key。螢幕上會出現一個 QR Code,用手機 App 掃描之後就會把 secret key 存到手機內。接著按照螢幕上指示把 secret key 存到 ~/.google_authenticator 裡。記得要 chmod 600。
  3. 設定 /etc/pam.d/sshd,在 auth pam_unix 下面增加一行:

auth required /usr/local/lib/pam_google_authenticator.so

這樣就生效了。要注意的是,這不會影響使用 Public/Private Key Pair 登入的使用者。另外,PAM設定完成之後,如果沒有設定 secret key 的使用者,就不能用帳號密碼登入了。

測試前記得請留下一個連線的 terminal,避免設錯導致人得跑到 console 前去處理。

Plurk 的 OAuth API…

聲明:我目前是 PIXNET 的員工。PIXNET 提供 OAuth API 服務給 PIXNET 本體與 Murmur.tw

Plurk 最近推出了新的 OAuth Core 1.0a API,終於是不用存帳號密碼了……今天晚上試著寫了一個機器人:台灣漫畫出版情報

現在的主要語言都有提供 OAuth Core 1.0a 的 Library,不過因為某些因素(其實就是懶……),我用的是 ronnywang 寫的 phppixnetapi 來改。其實也只要改掉前面定義的三個 URL,然後各個 function 照著 Plurk 提供的API寫就可以了。

寫完,測試發噗不會動……不過取得 Timeline 倒是成功了。檢查了老半天看不出什麼原因,最後把 POST 改成 GET 就可以了……OTL 真是令人絕望。

另外測試發噗的時候一如往常的遇到 Plurk 的防洪機制XD

Amazon Web Services 解釋這次掛掉的原因…

Amazon Web Services 今天在網站上公佈了 4/21 EBS 故障的原因。雖然一開始的人為操作失誤很快就回覆(roll-back)了,不過後面造成的骨牌效應還是讓整個系統掛了(不穩定)了三天……

文章裡面有一些設計系統的時候的重點:

  • 多次失敗重試的時候要把重試的間隔拉長(back off aggressively)。
  • 想辦法在要救資料的時候可以(半)自動化。
  • 限制失敗重試的次數,如果超過的話就暫時從整個系統中隔離。

另外 AWS 也提出了這次事件的賠償方式:

For customers with an attached EBS volume or a running RDS database instance in the affected Availability Zone in the US East Region at the time of the disruption, regardless of whether their resources and application were impacted or not, we are going to provide a 10 day credit equal to 100% of their usage of EBS Volumes, EC2 Instances and RDS database instances that were running in the affected Availability Zone. These customers will not have to do anything in order to receive this credit, as it will be automatically applied to their next AWS bill. Customers can see whether they qualify for the service credit by logging into their AWS Account Activity page.

簡譯如下:不論客戶是否受到影響,只要發生問題的當時在美東地區有使用 EBS 或是 RDS,AWS會賠償 10 個整天客戶所使用的資源,以 credit 的方式(未來可以抵)給客戶。

詳細的賠償額度可以看四月份的帳單。另外這次的賠償是不用另外申請的(EC2的SLA規定低於Service Level時要另外寫信去申請才能獲得賠償)

AWS Route53 的 CLI 管理工具:Net::Amazon::Route53

在找其他資料時意外發現的:Net::Amazon::Route53。Route53 的簡介可以看之前的文章:AWS 推出 Anycast DNS 服務:Amazon Route 53

比起 Amazon 提供的陽春工具好多了,加減一個Record不用寫XML寫到死……

列出 Zone 的 Records:

jnlin@Florence [1:57am] ~> route53 -keyname my-aws-account record list jnlin.org.
jnlin.org. A 3600 69.10.61.218
jnlin.org. NS 172800 ns-225.awsdns-28.com. ns-1456.awsdns-54.org. ns-804.awsdns-36.net. ns-1569.awsdns-04.co.uk.
jnlin.org. SOA 900 ns-225.awsdns-28.com. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400
test.jnlin.org. A 3600 127.0.0.1

刪掉一個 Record:

jnlin@Florence [1:59am] ~> route53 -keyname my-aws-account record delete jnlin.org. –name test.jnlin.org.
Record deleted

新增一個 Record:

jnlin@Florence [2:07am] ~> route53 -keyname my-aws-account record create jnlin.org. –name localhost.jnlin.org. –type A –ttl 86400 –value 127.0.0.1
Record created

Zerigo 的 GeoDNS 服務…

長輩幾個禮拜前介紹了ZerigoGeoDNS服務,這幾個禮拜測試起來還不錯,今天就把全部的量都丟上去了……

除了有一般的根據洲、國家的判斷,在北美還可以分四個區域分配不同的Server位置。另外也有提供API進去改設定…

如果付錢的話還可以客製化DNS回應的邏輯。可以用各種語言(Perl、Python、Ruby…)寫 prototype 給他們,由他們實做在他們的Server上。不過目前的GeoDNS應該就夠用了。

如果有興趣的人可以用下面的 Referral Code 註冊看看:http://www.zerigo.com/ref/kz0gcb