2009年4月17日 星期五

VirtualBox 2.1 的新網路功能!

在 Linux 上面用過 VirtualBox 的人都知道它的好。雖然和 VMWare 比起來又穩又快,唯獨網路功能的部份卻缺少了 bridge mode選項,而且也沒有支援 Host LAN。不過這些都在 2.1 版以後開始改變了。

VirtualBox 2.1 之後支援 bridge mode,可以和 Host 共用一張網卡上網。除了使用無線網卡做 bridge 的時候無法自動取得 IP 外(Guest 為 Windows),其他大致上都正常。從此可以跟那些會讓自己建立到腦羞又不方便的 br0/tap0 裝置說掰掰囉。 2.2 以後更加入了以往所缺乏的 Host LAN,host 終於是可以和 quest 直接透過內部虛擬網路互相連線了。

除了有新的網路模式可以選擇外,新的 VirtaulBox 還有 3D 加速等等新功能。跑起來有比以前快了一些些。在 Windows 上可以選擇使用 VMWare,不過在 Linux 上還是強烈建議使用 VirtualBox。

NetworkManager-0.6.6 重新連線失敗的問題

NetworkManager 算是 Linux 的桌面環境上管理無線網路連線最方便的工具之一。他提供了自動化的 AP 列表、自動連接 AP 、以及根據是否有插網路線自動切換有線/無線網路。但是 0.6.6 版的 NetworkManager 卻發生了重新連線(例如我要換個 AP )時無法取得 IP 的問題。

出現問題的時候,系統 log 會出現以下的錯誤訊息:
Couldn't send DHCP 'up' message because: name 'com.redhat.dhcp.OperationInProgress', message 'interface wlan0 is being released. Please try again later.'.
其實這個不是 NetworkManager 的問題,反而是他的相依套件 dhcdbd-3.0 的 Bug。 據說是因為 NetworkManager 命令 dhcdbd 釋放網路裝置後, dhcdbd 沒有正確的更新他自己的狀態,而是停留在"釋放中"的狀態。所以導致 NetworkManager 再次向 dhcdbd 要求取得 IP 時被拒絕。

由於 NetworkManager-0.7 以後不會繼續使用 dhcdbd,所以不知道會不會有人去把這個問題修好。目前用來作為替代方案的問題解決方法就是重新啟動 dhcdbd 服務以後再用 NetworkManager 重新連線。在 Gentoo 上就是下面這個指令:
/etc/init.d/dhcdbd restart

2009年2月5日 星期四

Gnome位置選單中的家目錄以及桌面都變成用壓縮檔管理員開啟?

這個小小地怪問題也不知道是什麼時候發生的。而且只有 Gnome 位置選單中的家目錄和桌面會這樣而已,其他所有在 nautilas 中的資料夾都可以正常打開。這確實困擾了我好一陣子。每次想要開家目錄變成必須從桌面的圖示點進去,真的很麻煩。起先我還以為是 nautilus 還是 Gnome menu 又出問題了(因為我都是用 unstable 的套件),結果 google 了半天沒有人跟我有相同的問題。最後才發現是"預設開啟程式"選項搞的鬼。要解決這個問題,隨便找一個資料夾按滑鼠右鍵打開 "屬性 -> 使用指定軟體開啟" ,看看是不是設定跑掉了。要選擇 "開啟資料夾" 才是對的喔~

2009年2月4日 星期三

以Linux為Host的VirtualBox開啟分享資料夾時速度緩慢的問題

Virtualbox 是一個非常好用的虛擬機器軟體。他跟 VMware 比起來,不只是免費,而且安裝在以 Linux 為 Hos t 的環境下相當的穩定。也不會像VMware一樣用久了以後會出現許許多多的怪問題。
VMware有的功能Virtualbox幾乎也都有,唯一的缺點大概就是要讓虛擬機器與 Host 在同一個 virtual LAN 裡面的話設定比較麻煩。

Virtualbox也支援 Host 對 Guest 的資料夾分享功能。它跟 VMware 所提供的一樣,都是模擬網路芳鄰中的遠端分享資料夾來達成。不過 Virtualbox 有可能會遇到開啟分享資料夾時久久沒有回應的問題。 Virtualbox 使用
/vboxsvr/share_folder

這樣的 URL 當作網路芳鄰中的分享連結。 雖然這個分享資料夾是 Virtualbox 透過 Guest Addition 套件 產生出來的, Window 還是會去解析 vboxsvr 這個 domainname 所代表的 IP 。但是會因為找不到而停住不動。

有一個方便的解決方法,就是更改 guest Windows 的 host list 。這個檔案的位置(Winodws XP)是
"C:\WINDOWS\system32\drivers\etc\host"

用記事本打開以後修改成這樣
127.0.0.1 localhost vboxsvr VBOXSVR

這樣下次打開分享資料夾的時候 Windows 就不會查半天囉。

2009年1月18日 星期日

更新到gdm-2.20以後custom session無法開啟?

最近更新 gnome 以後,輸入帳號密碼登入的時候竟然跳出了:
"你的 session 在10秒內登出~這是不正常的!"
這樣的錯誤訊息。但是我在 GDM 中按下 F10 叫出 session 選單,把原本的 session 由 custom 改成 Gnome 卻又可以正常登入。

我原本都是用 custom session 加上 ~/.xsession 來啟動 Gnome 。因為我有使用 SCIM 輸入法,這個輸入法如果沒有跑 "scim -d" 並且 "export XMODIFIERS=@im=SCIM" 的話,在 Java 程式中就別想使用中文輸入法了。

所以我把 gdm 中負責啟動 session 的那幾個 script 挖出來看,發現原來是 gdm 自己惹的禍。它原本應該在呼叫 exec 之前把 custom 轉換成 $HOME/.xsession 。但是不知道是寫錯了還是怎樣,它把轉換的動作放在呼叫 exec 之後。結果就是它跑了 "exec custom" ,這樣當然不會正常囉~

過程中我也發現gdm的session管理方式有改,變成一個session會對應到 "/etc/X11/xdm/dm" 下的一個 .desktop 檔案。 例如 gdm 中的 custom 會對應到 custom.desktop 這個檔案。現在倒是可以利用這檔案幫我把 custom session 搞回來。先來看一下這個檔案(這個檔案我做過了修改):
/etc/X11/dm/Sessions/custom.desktop:

[Desktop Entry]
Encoding=UTF-8
# The names/descriptions should really be better
Name=Lunker Session
Comment=This starts a custom session
#Exec=custom
Exec=$HOME/.xsession
# The "custom" Exec is a very special one and is handled specially in
# the Xsession script and just runs "~/.xsession" directly
Icon=
Type=Application

裡面的重點是 "Exec=custom" 這一行,這裡指定的就是 gdm 在準備好各種環境變數後要呼叫的 script。既然 gdm 沒有幫我們把 custom 換成 ~/.xsession ,那只好手動自己改囉。完成後再用 custom session 登入就沒有問題了。

2008年9月10日 星期三

如何讓系統自動掛載usb儲存裝置

在Gnome或者是KDE環境下,當一個USB儲存裝置插入到USB槽時,這些桌面管理程式會幫忙使用者做掛載的動作。但是如果我想要在console模式中就可以自動掛載USB隨身碟時,又要如何解決?

其中一種辦法是使用autofs,但是這種辦法是屬於比較被動的掛載。它是在有人訪問到某個資料匣時才會嘗試去檢查是否有可東西可以掛載在這個資料匣下。要更讓掛載更加自動化,可以改為使用udev的rules。

首先於 /dev/udev/rules.d 下建立檔案 99-usb-automount.rules:
KERNEL=="sd[a-z]1", RUN+="/usr/local/bin/usb_mount", ENV{REMOVE_CMD}="/usr/local/bin/usb_mount"


其中 /usr/local/bin/usb_mount 是一個shellscript,主要作用為依照udev所給的資訊進行掛載與卸載的動作。內容如下:
#!/bin/bash
# $Id$
#
# Script to automaticlly mount usb devices. This script is designed to work
# with udev
#

#commands used in the script
MOUNT="/bin/mount"
UMOUNT="/bin/umount -l"
MKDIR="/bin/mkdir -p"
RMDIR="/bin/rmdir"

#the root of where all auto mouted devices will be mounted to.
MOUNT_ROOT=/mnt
MNT_POINT=$MOUNT_ROOT/${DEVNAME##/dev/}

logger "running $0"
logger "ACTION=$ACTION ID_BUS=$ID_BUS DEVNAME=$DEVNAME
ID_FS_TYPE=$ID_FS_TYPE"

# check we are adding a usb device
if [ "$ID_BUS" != "usb" ]
then
logger "ignoring non usb device"
exit 0
fi

#check the action to process
case "$ACTION" in
add )
logger "mounting new device"

#create the directory we will mount to
$MKDIR "$MNT_POINT"

#
#mount the usb device with the following options
#
# ro - read only
# noexec - Do not allow direct execution of any binaries on the mounted file system
# nodev - Do not interpret character or block special devices on the file system
#
#$MOUNT -t $ID_FS_TYPE $DEVNAME $MNT_POINT -o ro,noexec,nodev
$MOUNT -t $ID_FS_TYPE $DEVNAME $MNT_POINT -o noexec,nodev

#check if mount suceeded
if [ $? -eq 0 ]
then
# sucess, we mounted ok.
logger "mounted $DEVNAME at $MNT_POINT"
else
# we failed to mount so remove the mount point
logger "failed to mount $DEVNAME at $MNT_POINT"
$RMDIR "$MNT_POINT"
fi
;;

remove )

logger "unmounting existing device"

# check if the device is really mounted
#if [ (grep -q "^$DEVNAME" /proc/mounts || grep -q "^$DEVNAME" /etc/mtab) ]
#then
# logger "$DEVNAME not mouted"
#endif

#unmount the device. We will refer using the mount point not the device name
#becase there is a posibility the device could be removed before we
#do the umount.
$UMOUNT "$MNT_POINT"

#remove the mount point
$RMDIR "$MNT_POINT"

logger "unmounted $DEVNAME and removed $MNT_POINT"
;;

* )
logger "ignoring unkown action"
;;

esac

這樣當USB儲存裝置一插入usb差槽後就可以看到裝置出現在 /mnt 下面。

原始文章來源在此
(想複製此script的人記得貼上後要檢查一下指令與註解有沒有因為html顯示的關係被斷行喔!)

2008年9月3日 星期三

OpenOffice中無法使用scim輸入法的解決方法

OpenOffice在Linux中使用XIM(X Input Method)作為輸入中文的方法,scim即是架構在XIM上。

為了要讓OpenOffice知道可以用scim輸入,需要在環境變數中加入下面這些項目。這幾行可以放在xorg啟動時會讀取的 ~/.xsession 之中,或是設定成全域變數。
export XMODIFIERS=@im=SCIM
export GTK_IM_MODULE="scim"
export QT_IM_MODULE="scim"

最後再用 "scim -d" 啟動輸入法即可。

如果這樣還不能在OpenOffice中啟動scim。則檢查一下在其他程式,如gnome-terminal中是否可以啟動scim。如果其他程式裡面可以啟動scim的話,代表OpenOffice有問題。可以到 ~/.xsession-error 中搜尋 "soffice" 看看是否有錯誤訊息。如果看到如下面所列的錯誤訊息:
(soffice:8397): Gtk-WARNING **: Loading IM context type 'scim' failed

(soffice:8397): Gtk-WARNING **: usr/lib/openoffice/program/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by /usr/lib/gtk-2.0/immodules/im-scim.so)

代表OpenOffice內附的libstdc++.so與libgcc_s.so與scim所編譯的版本不匹配。解決方法就是找出系統上的libstdc++.so與libgcc_s.so並且做個symbolic link過去。在一個使用4.3.1版gcc的gentoo linux中,指令會像下面這樣:
ln -s /usr/lib/gcc/i686-pc-linux-gnu/4.3.1/libstdc++.so.6 /usr/lib/openoffice/program/libstdc++.so.6
ln -s /usr/lib/gcc/i686-pc-linux-gnu/4.3.1/libgcc_s.so.1 /usr/lib/openoffice/program/libgcc_s.so.1