VirtualBox Network Bridge Setting in Linux

在購入 EeeBox 之前,Broso 的舊主機是跑 Ubuntu,當時為了在 Ubuntu 上面可以執行 VirtualBox 來跑 WinXP,研讀了一下 VirtualBox 官方的 User Manual,才終於設定好 Guest OS (WinXP) 的網路設定。無奈當時並沒有寫篇文章來當作筆記,等換到了 EeeBox 時代,我改用了 Fedora Core 9 作為 Host OS,又要重新再研究一次,這時就後悔當時懶惰沒記錄下來。

其實設定方法不難,大抵上就是先建立一個虛擬的網路介面 tap1,未來 VirtualBox 的 Guest OS 就使用這個虛擬的網路介面。其次建立一個網路橋接器 br0,然後將 原本的實體的網路介面綁到這個橋接器,同時再將虛擬的網路介面 tap1 也綁到這個橋接器就可以了。

我這次寫了一個 shell script (setupVirtualBoxBridge.sh) ,將所有的步驟放在裡面,並且特地放在 /usr/local/bin 下面。這是因為 /usr/local/bin 這個目錄,每天都在我的備份排程清單中,所以未來也不用再特別寫一次了,呵…

-rwxr-xr-x 1 root root 365 2008-09-07 15:13 backup_sys.sh
-rwxr-xr-x 1 root root 804 2008-09-07 15:13 backupphoto.sh
-rwxr-xr-x 1 root jack 347 2008-09-30 13:11 check_diskusage.sh
-rwxr-xr-x 1 root jack 385 2008-12-20 22:19 setupVirtualBoxBridge.sh
[root@broso bin]# cat setupVirtualBoxBridge.sh
#!/bin/sh
# create a virtual network adapter device 'tap1' for VirtualBox
tunctl -t tap1 -u cychien
# create a network bridge 'br0' for both eth0 and tap1
brctl addbr br0
# configure eth0 to use network bridge 'br0'
ifconfig eth0 0.0.0.0 promisc
brctl addif br0 eth0
dhclient br0
# configure tap1 to use network bridge 'br0'
brctl addif br0 tap1
# restart network service
/etc/rc.d/init.d/network restart

然後將這個 shell scrpt 放入 /etc/rc.d/rc.local 中即可,開機時就會自動將橋接器設定好了

而 VirtualBox Guest OS 網路的設定如下即可

1. 調整網路介面設定

2. 調整網路介面為主端介面

3. 開機後的畫面

4. 透過 DHCP 取得獨立 IP

玻璃工程

由於我們的空間很小,設計師運用了開放空間、大量的拉門以及玻璃工程,來增加視覺上的透通感。並且整體木作櫃體配色採用白橡木、波紋版以及白色烤漆上色,來擴大視覺上的空間效果。

玄關部分是用清玻璃,再加上稍密一點的線簾來達成可遮蔽視線,卻又可稍微透通視線的效果。

Read more

燈具工程

適當的室內燈具光線,可以增加居家的溫馨感覺。最近裝潢工程將近尾聲,設計師讓我們選了一些我們想要的燈具,並且請水電安裝上去,效果的確還不錯。

一進入玄關,玄關上方選了一盞奧地利進口紫絲罩水晶吊燈,搭配玄關上方以及鞋櫃下方的間接照明,真的還蠻美的。

 

Read more

新家廚具的選購

廚具的面板材質,價錢由低至高可分為美耐板、水晶面板、結晶鋼烤以及鋼琴烤漆,而質感的優劣則是剛好相反過來。而檯面的材質,價錢由低至高則可分為美耐板、珍珠板,另外還有現在很流行使用的人造石檯面。

我跟 Reyna 都不常自己開伙煮東西吃,正是所謂的老外一族,感覺上似乎廚具材質選一般的就可以了。所以設計師一開始也是推薦使用水晶面板,搭配富美家的人造石檯面,在費用上也符合我的預算。設計師廚具的示意圖如下:

Read more

油漆工程及燈具安裝完畢了

印象中的油漆工程大概就是師傅拿著刷子在刷牆壁,但在這次的裝修工程時所看到的油漆工程似乎跟想像中的很不一樣。看到現場機具還真是不少,噴槍、打磨機、砂紙,師傅不斷的用噴槍上了一層一層的漆,再用打磨機以及砂紙一層一層的打磨,經過六七道的程序之後,沒想到原本有點紋路的木皮,竟然像是上了烤漆般的光滑,真是佩服師傅的上漆技巧。

不過由於層層的打磨,現場到處都是油漆被磨下來的灰,每次下班後去察看工地後,黑西裝褲及皮鞋上一定沾滿了白灰,所以可以想見師傅是在滿天飛灰的環境下工作,真的是很辛苦的職業。

今天選完廚具之後,下午五點多再去工地看一次。拜高樓層之賜,旁邊沒有比我們還高的建築物,不開燈的情形下採光還是很好。左邊弧形包樑的部分,油漆過後完全感覺不出來那邊有一支大樑。

Read more

JFreeChart 在 Linux 下中文亂碼的問題

使用 Jakarta JMeter 來自動量測網銀效能已經一段時間了,直到今年五月前都是請工讀生將量測的數據用 Excel 整理成報表。不過由於工讀生人力縮減,這項整理報表工作勢必得想辦法變成自動化,於是我便找時間將報表分析作業用 Struts / Spring,弄了一個小網站方便查詢整理分析的效能數據。

其中有項報表是以曲線圖表顯示每項量測個案歷史區間的效能起伏變化,原本 Excel 拿來作圖表非常簡單,但是換成用程式自動產生圖表就有點麻煩了。後來找到一個 OpenSource 繪製圖表的 Library – JFreeChart,這個函式庫支援非常多的圖表,舉凡柱狀圖、圓餅圖、曲線圖、DashBoard…,實在是不勝枚舉。研究了一下,加上股溝上面找來的 sample code,七拼八湊終於也完成了這個圖表。

不過等到部署到 Broso Fedora 上面後,才發現怎麼原本在 Windows Desktop 上顯示正常的中文字體,在 Linux 執行後全部變成了小方塊。

 

查了一下才知道,原來必須將中文字體加入 JRE Library 的 font path 中。稍微記錄一下。

  1. 察看 /usr/share/fonts/zh_TW/TrueType,下面有沒有中文字型檔,如果沒有,將 Windows 下的細明體檔案複製到此。
  2. 察看 $JAVA_HOME/jre/lib 下面有沒有 fontconfig.RedHat.properties 這個檔案。如果沒有,複製 fontconfig.RedHat.properties.src 成為 fontconfig.RedHat.properties。
  3. 修改 fontconfig.RedHat.properties ,新增一組設定。filename.-misc-zysong18030-medium-r-normal–*-%d-*-*-c-*-iso10646-1=/usr/share/fonts/zh_TW/TrueType/bsmi00lp.ttf。
  4. 重新啟動 Application Server,搞定。

木工退場囉

自從泥作退場後,為期三週的木工作業就展開了,在這三週當中我三不五時去工地查看施作進度,看著房子依照設計圖一步步完成的感覺真的很有成就感。Joshua 的這組木工師傅感覺工還蠻細的,一些該注意的小地方都不需要屋主來提醒,一次到位,感覺還不錯。

從客廳陽台往大門看

Read more

eee Box in Fedora

去年底華碩首先推出 mini book 類型的 eee PC,一推出馬上席捲市場,搞得各家廠商紛紛也得推出類似的產品來應戰,像是 Acer Aspire One、HP Mini 等等。不過這類產品對我來說大概只有出國攜帶方便的好處而已,雖然非常省電,不過螢幕只有 7" 對我來說瀏覽網頁是吃力了點,所以對這類產品一直不是很感興趣。但是最近華碩 eee 系列再度推出 eee Box 超小型的桌上型系統,搭載 Intel ATOM N270 處理器 / Intel 945G / 1G DDR2-667 / 80G 硬碟,號稱待機時僅耗電 14W,全速執行時也僅耗電 24W,更難得的是整體售價僅台幣 7988 元,再加上美觀的外型,一推出的確非常令人注目。

由於目前我的 Broso 主機是每天 24 小時不關機,這個用 P4 2.8GHz CPU 跑的耗電大怪物,讓我家每個月的電費大約都在 3000 元左右,如果是夏季吹冷氣那電費就更可觀了。因此為了節省電費,在去年底時我也曾經採買了 ITX 規格的小主機板與外殼,再加上 P4-M 1.8GHz 這顆便宜的筆記型專用處理器,搭配組成一台小型的伺服器,效能跑起來也是還不賴,不過幾個月跑下來電費是少了一點,但是卻也沒有明顯的減少。另外可能是因為 Case 非常小的緣故,機殼內的空氣流通不佳,24 小時跑起來整個機殼一直持續都很熱,高溫持續下來對機器來說當然是不太好,終於到了今年大約 5 月時,ITX 主機板終於燒壞了,於是我又回到以前用 P4 跑 Linux 來當伺服器的時代。

因此我又繼續尋找節能省電的小型桌上型主機,其實也不難找,像是同樣搭載 ATOM 處理器的 聯強Lemel Q-PC Smart,規格也還不賴,但是 1 萬多的售價真的讓人下不了手啊。因此尋尋覓覓了好一段時間,此時剛好華碩推出了 eee Box,而且一推出就缺貨,於是我就直接在 Y 購上刷卡預購,等了兩個多禮拜,終於收到 Y 購的出貨通知,東西在本週二到手。

東西到手後,就開始灌 Fedora,不過過程不是很順利,為了避免我下次重灌時還要再重新爬文一次,還是再多寫篇小筆記吧。用外接光碟機開機後,進入圖形安裝介面,沒多久螢幕訊號就消失了,試了兩三次都一樣。於是我改用 Text 模式來安裝,Text 模式就非常順利,一路安裝完畢後,最後重開機進入 Fedora 的設定畫面,

設定到 X configuration 時,螢幕訊號再度消失,於是只好重開機 (後記:其實此時應該可以按下 ALT-CTRL-BackSpace 回到 console 介面),再進入設定一次仍然相同,猜想應該是 Fedora 的 X Server 還不支援 Intel 945G chipset driver。求助於 Google,爬文了很久,終於有人提到類似的問題 Installing Linux – Ubuntu on EEE Box install succeeded.。於是依樣畫葫蘆修改 /etc/X11/xorg.conf,將下列 Driver 設定從 intel 改為 vesa,

Section "Device"
   Identifier "Videocard0"
   # Driver "intel"
   Driver "
vesa"
EndSection

再次進入 X configuration 去偵測顯卡驅動程式及螢幕,果然就 X Windows 畫面就正常出現,真是感動!不過由於先前安裝完畢首次進行 X 設定時未能設定成功,所以預設系統的 run level 是設定在 init 3,也就是 full multiuser mode,不會自動進入 X Window Login,必須再去調整一下 /etc/inittab,然後將 run level 從 init 3 改為 init 5

# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/event.d/rcS
#
# Individual runlevels are started by /etc/event.d/rc[0-6]
#
# Ctrl-Alt-Delete is handled by /etc/event.d/control-alt-delete
#
# Terminal gettys (tty[1-6]) are handled by /etc/event.d/tty[1-6] and
# /etc/event.d/serial
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(8), initctl(8), and events(5).
#
# Default runlevel. The runlevels used are:
# 0 – halt (Do NOT set initdefault to this)
# 1 – Single user mode
# 2 – Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 – Full multiuser mode
# 4 – unused
# 5 – X11
# 6 – reboot (Do NOT set initdefault to this)
#
# id:3:initdefault:
id:5:initdefault:/etc/X11/prefdm

其餘就沒什麼特別的地方,將網頁資料 / 相關批次作業 / crontab 設定 從原來的 P4 怪物機,移轉到新的 eee Box 後,剩下的就是靜待後面幾個月的的電費帳單來比較看看省電效果了。

GoogleDesktopProxy

自從使用了 GoogleDesktop 之後,它強大的搜尋信件文件能力,讓我減少了許多尋找資料的時間。尤其是在辦公室裡,常常記得某個資料曾經看過,找了很久但就是找不到放在哪兒。這個時候,GoogleDesktop 就發揮了很大的效用,輸入關鍵字後,馬上就幫你將所有相關的文件通通找出來列給你。

最近公司同事想把一些文件整理以後放在一台公用電腦上面,然後利用 GoogleDesktop 讓大家可以利用關鍵字搜尋來尋找有用的資料。經過實驗之後,假設公用電腦的 IP 是 192.168.1.100,由於 GoogleDesktop 只會 Listen 127.0.0.1 這個 loopback 的 IP,因此其他同網段(192.168.1.*) 的電腦無法連結到 GoogleDesktop 的搜尋網址。

碰到這種問題,最直接的想法就是搞一個 proxy server,讓 proxy server listen 192.168.1.100:4664,然後將所有連往 192.168.1.100:4664 的 packet 全部 forward 到 127.0.0.1:4664,如此一來應該就可以連到 GoogleDesktop 的搜尋網址。不過很遺憾的,經過實驗結果,會出現下面情形..

我初步猜想是 Browser 送過來的 HTTP header 中,GoogleDesktop 只接受 Host: 127.0.0.1:4664。所以馬上用 telnet 動手實驗了一下

[root@broso shell]# telnet 192.168.1.12 4664
Trying 192.168.1.12…
Connected to 192.168.1.12.
Escape character is '^]'.
GET /&s=Gcp35yLaRKNq-qK-MNo25UNQjO0 HTTP/1.1
Host: 192.168.1.12:4664
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: zh-tw,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Big5,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Proxy-Connection: keep-alive

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Pragma: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Cache-control: no-cache, no-store, must-revalidate
Connection: close

<!–
Content-type: fix-mhtml

–><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><title>錄無效的要求</title>
<style>

後面省略

把上行的 Host: 192.168.1.12:4664 改為 Host: 127.0.0.1:4664 之後,結果真的就成功了,GoogleDesktop 就會回覆正確的搜尋頁面了..

[root@broso shell]# telnet 192.168.1.12 4664
Trying 192.168.1.12…
Connected to 192.168.1.12.
Escape character is '^]'.
GET /&s=Gcp35yLaRKNq-qK-MNo25UNQjO0 HTTP/1.1
Host: 127.0.0.1:4664
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: zh-tw,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Big5,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Proxy-Connection: keep-alive

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Pragma: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Cache-control: no-cache, no-store, must-revalidate
Connection: close

<!–
Content-type: fix-mhtml

–><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><title>Google 桌面</title>

後面省略

知道 GoogleDesktop 原理之後,馬上動手來改寫個小型 Proxy Server。先前為了能夠從公司內部自由穿梭到外部 internet 世界,曾經寫了一個小型 SSL 加密的 Proxy Server(這個以後有機會再來寫),因此我的想法很簡單,是只要將中間穿梭的封包加以處理一下,碰到 Host: 192.168.1.100:4664 的 HTTP header,就置換為 Host: 127.0.0.1:4664。理論上應該就沒問題才是。

改完之後,馬上試驗一下,果然頁面很成功出現了。

不過再試下去,又發現一些問題…

咦,怎麼網址又被改為 http://localhost 了,看起來除了上行的 HTTP Header 要置換之外,連下行的 HTTP Header 及 HTML content 都得做一下過濾跟置換。所以又修改了一下程式,碰到 http://localhost 或是 http://127.0.0.1 都置換為 http://192.168.1.100:4664 。修改完畢後,馬上又試驗了一下… 

果然馬上就成功了。有興趣的人可以在這裡下載 GoogleDesktopProxy

簡單說明一下安裝方法:

  1. 將下載回來的 GoogleDesktopProxy.rar 解開放在同一個目錄下。
  2. 修改 start_proxy.cmd,將 "C:\Program Files\Java\jre1.6.0_03\bin\java" 改為你所使用的 JRE 或 JDK 路徑
  3. 修改 proxy.properties 中,我標為黃色字體的部分

參數 Host 指的是安裝 GoogleDesktop 那台電腦的 IP
參數 AllowList 指的是允許連接 GoogleDesktopProxy 的 IP 清單,所以沒列在裡面的 IP 都會被檔掉唷
參數 ReplaceLineFrom 跟 ReplaceLineTo 這兩個參數是成對的,GoogleDesktopProxy 會過濾所有經過的封包,是不是包含了 ReplaceLineFrom 所指定的字串,如果有,就置換為 ReplaceLineTo 所指定的字串。
所以 ReplaceLineFrom_1 請同樣修改為安裝 GoogleDesktop 那台電腦的 IP。ReplaceLineFrom_2 跟 ReplaceLineTo_3 亦同。


Host=192.168.1.12
Port=4664
TargetHost=127.0.0.1
TargetPort=4664
LeftSSL=0
RightSSL=0

AllowList=127.0.0.1,192.168.1.*,10.23.4.*
LogDir=log

SSLTimeOut=300
SSLKeystore=KEYSTORE.jks
SSLKeystorePassword=broso.net
SSLTruststore=TRUSTSTORE.jks
SSLTruststorePassword=broso.net

ReplaceLineFrom_1=Host: 192.168.1.12:4664
ReplaceLineTo_1=Host: 127.0.0.1:4664

ReplaceLineFrom_2=http://127.0.0.1:4664
ReplaceLineTo_2=http://192.168.1.12:4664

ReplaceLineFrom_3=http://localhost:4664
ReplaceLineTo_3=http://192.168.1.12:4664

之後如果有機會的話,再來說明一下上述 SSL 相關參數的使用方法。

有興趣研究原始碼的人,可以留言跟我索取。