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

2008年4月24日 星期四

解決gmplayer顯示中文字幕時偶爾會出現亂碼的情況

使用gmplayer的人通常會嘗試去修改設定選項中,字幕選項的字幕編碼。但是常會發現,設定好編碼後,上了srt字幕後,字幕顯示時會出現亂碼。

其實在gmplayer中設定字幕編碼是沒有用的。mplayer有一個叫做 "sub_cp"的參數,設定這個才能夠真正幫mplayer指定字幕編碼。這個設定比需要被放置在gmplayer的設定檔中,位置在 "~/.mplayer/gui.conf"。 假如我想要使用utf8編碼的srt檔作為字幕,就要在理面加這樣一行:
sub_cp=utf8
這樣就可以顯示utf8編碼的srt字幕了。

2008年4月2日 星期三

如何在html上面嵌入quicktime plugin播放RTP視訊

我找了半天都找不到一個可以work的方法。大多數的sample code頂多只能讓我成功播放mp4檔案而以,只要我一把src改成"rtsp://xxx",他就掛在那邊了。

後來終於在一個mail list裡面找到一個可以work的寫法(資料來源),以下是擷取出來的sample code:
<EMBED
   src="test.mp4";
   qtsrc="rtsp://210.243.241.203:554/v2";
   scale="tofit" qtsrcdontusebrowser=true width=320 height=240
   autoplay=true controller=true loop=false
   pluginspage="http://www.apple.com/quicktime/download/";
   align="center" border="1">
</EMBED>

根據文件的說法是這個程式碼會用src參數裡面的影片把quicktime帶起來,但是不會真的播放他,改為播放qtsrc這個參數中的影片來源。不過無論如何,這個code可以在windows平台上的IE瀏覽器以及Firefox瀏覽器上執行。而Linux平台的Firefox的話,根據我查到的資料,目前是無論如何都無法播放quicktime的RTP的。

2008年3月7日 星期五

Linux VMware Workstation無法對wireless裝置開啟bridge mode?

Linux上的VMware沒辦法使用wireless網卡做bridge mode,我自己試過5.5和6.0的版本都不行。找了不少資料後發現,原來是vmware-modules裡面的vmnet.ko這個網路模組的問題。

這個網路模組在處理bridge mode的source code裡面只有檢查RADIO裝置(為什麼是RADIO我沒研究)的條件句,但是卻沒有檢查wireless(802.11),的條件句。 所以想當然爾沒辦法使用wireless裝置做bridge mode。為此有人提供了一個完整的patch來修正這個問題。

以下是我在Gentoo Linux裡面使用這個patch的步驟:
  1. http://www.hauke-m.de/fileadmin/vmware/vmnet.tar下載Hauke-m修改過後的vmnet.tar(這個檔案要供奉起來了)
  2. 到/opt/vmware/workstation/lib/modules/source/目錄下
  3. 把目錄下的vmnet.tar重新命名為vmnet.tar.old(備份用)
  4. 把下載下來的vmnet.tar搬過來
  5. 重新執行vmware-config.pl並重新設定網路設定
  6. 打開vmware來試試看吧
也許有些人這樣就能用了,但是發現我遇到另外一個問題。我有eth0 <-> vmnet0和wlan0 <-> vmnet2兩個bridge設定,但是我的vmware只認得vmnet0這個bridge。

我在vmware裡面增加了兩張bridge mode的網卡,可是兩張都只對應到vmnet0,vmnet2變成孤兒了。最後沒有辦法,只好把第二張網卡設定成為NAT mode,雖然沒辦法拿到真正的實體IP,不過至少是可以透過無線網路連接上網路了。

2008年2月25日 星期一

如何讓Huawei E220 3G USB網卡(中華電信出售)在linux上動起來

最近拿到了一張CHT出的USB 3G網卡,找了半天資料終於把他弄好了。基本上一般的USB網卡都是以模擬tty的方式來運作,因此我們會需要使用到一些tty kernel選項。

首先需要在kernel裡面加入下面幾項支援(gentoo-sources-2.6.22-r9):

 Device Drivers
  ---> Network device support
      ---> PPP (point-to-point protocol) support
        [ ] PPP multilink support
        [ ] PPP filtering
        <*> PPP support for async serial ports
        <*> PPP support for sync tty ports
        <*> PPP Deflate compression
        <*> PPP BSD-Compress compression
        <*> PPP over Ethernet

  ---> USB support
      ---> USB Serial Converter support
        <m> USB Serial Converter support
        [*] USB Generic Serial Driver (沒這個insmod usbserial會錯誤)
        <m> USB Prolific 2303 Single Port Serial Driver

上面PPP支援是為了以後能夠順利利用3G網卡撥號。由於這張USB網卡kernel並不知道要幫他載入什麼dirver,因此需要把USB Serial Converter作成model,以便之後能夠以手動的方式強迫這個USB裝置裝載此driver。

處理好以後重新載入kernel,把網卡插入USB port,在 "/proc/bus/usb/devices" 裡面找找看有沒有一個 "Product=HUAWEI Mobile" 的裝置。這個裝置就是這張3G網卡了。我們需要把這個裝置的Vendor與ProdID抄下來(我的是 Vendor=12d1 ProdID=1003),接下來會需要用到這兩個參數。

再來就試試看是否能夠幫這張3G網卡裝載driver了。裝載時需要帶入剛剛抄下來的Vendor與ProdID。以我自己的裝置為例,命令為 'modprobe usbserial vendor=0x12d1 product=0x1003' ,如果沒有任何錯誤提示出現,恭喜你! driver已經成功載入了。你可以用 'dmesg' 來查看新增的裝置。如果發生錯誤,你也可以利用 'dmesg' 來看問題到底出在哪裡。

為了要能夠方便的設定撥號設定,這裡介紹一個相當好用的程式"wvdial"(其實沒介紹,裝了就知道)。安裝完以後直接下 'wvdialconf' 這個指令就可以自動偵測可以用的USB網卡。(事實上它會把所有可能的裝置都掃一遍,並且自動偵測網卡參數並寫入設定檔!)找到的網卡,他的設定會寫入到 '/etc/wvdial.conf' 裡面。你需要打開這個檔案並且修改裡面的"Phone"、"Username"、與"Password"參數。我是用中華的sin卡,所以我讓"Phone=*99#"。(其他業者的應該也一樣,國外的我就不知道了)而帳號與密碼隨便打就可以,只要不是空就好。最後把第一行 "[Dialer Default]" 改成 "[Dailer xxxx]" , 其中"xxxx"用你喜歡的名字。

完成後存檔,在命令列下打 'wvdial xxxx' ("xxxx"是你剛剛所使用的名字)。接下來應該就可以看到一連串的連線訊息跑出來。這時候就可以打開瀏覽器看看是否已經可以上網了!

下次要使用這個3G網卡的話,其實只要載入driver後打 'wvdial xxxx' 即可。所以我們甚至可以寫一個script讓udev在發現這個裝置時自動的撥號上網!

最後附上我自己參考了幾個網站別人的設定以後改的"wvdail.conf"檔:

  [Dialer cht]
  Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
  Modem Type = Analog Modem
  Phone = *99#
  ISDN = 0
  Username = a
  Init1 = ATZ
  Password = a
  Modem = /dev/ttyUSB0
  Baud = 460800
  Stupid Mode = 1
  FlowControl = Hardware (CRTSCTS)

2008年2月23日 星期六

Unicode環境下使用mplayer中文字幕

我目前使用的linux為gentoo,mplayer版本為1.0_rc2_p24929-r1。
雖然mplayer算是字幕支援度相當完善的播放軟體,但是要讓他真正能夠合我的心意還真是花了一點時間。

要讓mplayer可以使用自己指定的TTF字型來作為字幕顯示時使用,有幾點需要注意的地方:
  1. 編譯mplayer時,USE參數要加入"truetype"支援,不然在mplayer中設定tff字型給字幕用時,mplayer會警告無法使用該字型。
  2. 在"/etc/mplayer/mplayer.conf"中的"fontconfig=1"要改成"0"。如果發現明明已經給了一個支援繁簡字型的utf8字型後,字幕卻出現許多底線(下劃線, "_"),就代表fontconfig被設定成為"1"了。這是因為mplayer支援三種字幕字型指定方式:
    1. 使用fontconfig,設定畫面中要指定的是"字體名"而非"字體檔路徑"。(打"fc-list"就可以知道何謂字體名)
    2. 停用fontconfig,設定畫面中指定字體檔路徑。(我心理真正想用的方法)
    3. 停用fontconfig,設定畫面中指定font.desc檔路徑。
換句話說,如果沒有把"fontconfig"設定為"0",mplayer就會把你輸入的TFF檔案路徑當作是字體名了,結果當然就是沒辦法用對的字型來顯示字幕囉。