2011年12月28日 星期三

如何調整 BIOS設定 提升電腦速度

各家BIOS畫面以及項目並不相同,不過,不論那一家的主機板或BIOS,其主要需要設定的項目倒是差不多的,以下就列舉常見的主要項目來作說明:

一.STANDARD COMS SETUP
標準COMS設定:
設定日期,時間,軟硬碟規格,顯示器種類
1.Date(mm:dd:yy) 日期設定
2.Time(hh:mm:ss) 時間設定
3.Primary Master 開機磁碟參數設定
4.Primary Slave 第二台磁碟參數設定
5.Drive A: 軟式磁碟機A:種類設定
6.Drive B: 軟式磁碟機B:種類設定
7.Video 顯示卡介面設定
可設定為Mono(單色螢幕)EGA/VGA(彩色螢幕)
現在的電腦都是彩色螢幕所以應設為EGA/VGA
8.Halt On 暫停
在這個設定裡有以下幾個參數可設定
(1)All Errots : 只要有偵測到裝置錯誤或沒反應,就顯示錯誤訊息。
(2)All Error , But Keyboard : 忽略掉鍵盤的偵測其餘同1。
(3)All Error , But Diskette : 忽略掉磁碟機的偵測其餘同1。
(4)All Error , But Disk/Key : 忽略掉磁碟機與鍵盤的偵測其餘同1。
(5)No Error : 直接開機不偵測鍵盤及磁碟機。

二.BIOS FEATURES SETUP
若您調好了這裡的設定,可以充分發揮整部電腦的最大效益。
在選項裡有※表是為出廠預設值,Disabled關閉,Enabled開啟
項目名稱
1.Virus Warning --- 機型病毒警告,日後若有程式要改變啟動磁區時會出現警告訊息
※Disabled . Enabled
2.CPU Internal Cache --- CPU內部快取(L1 Cache)
※Enabled . Disabled
3.External Cache --- 主機板上的快取記憶體(L2 Cache)
※Enabled . Disabled
4.Quick Power On Self Ttet --- 開機時進行快速的開機自我檢查程序
※Enabled . Disabled
PS:一般BIOS開機時期,會對記憶體做三次存取測試,調成Enabled後則只會做一次,設定成Disabled可加快開機的時間5.Boot Sequence --- 最常用,指定開機的優先順序,現較新BIOS的可從CD-ROM,LS-120..等等開機※A ,C , SCSI , CD-ROOM ....(在安裝win2000,winXP,Linux等作業系統時會要求從光碟開機)
6.Swap Floppy Drive --- 更換磁碟機代號
※Disabled . Enabled
7.Boot Up Floppy Seek --- 在開機時對磁碟機做搜尋磁軌檢查,以確定磁碟機的Type
※Disabled . Enabled
PS:設定成Disabled可加快開機速度8.Boot Up NumLock Status --- 開機後是否打開鍵盤上的NumLock
※Off . On
9.Boot Up System Speed --- 開機時預設的系統速度,此項目現在大都已刪除
※High . Low
10.Typematic Rate Setting --- 調整鍵盤的反應速率
※Disabled . Enabled
PS:要將此項設成Enabled,才能設定接下來的二項功能
11.Typematic Rate(Chars/Sec) --- 每秒鍵盤送出字元數
※6~30
PS:建議您設成30,可加快你的字元輸出12.Typematic Delay(Msec) --- 按鈕間隔為千分之多少秒※250/500/750/1000
PS:建議您設定成25013.Security Option
※Setup . System
Setup是當您一開機是按Del鈕進入 CMOS Setup時詢問密碼
System則是每次開機時都會詢問密碼
PS:此項功能您須有設定BIOS裡的PASSWORD SETTING才有用14.PCI/VGA Palette Snoop --- 監控VGA調色盤的狀態
※Disabled . Enabled
PS:早期有些MPEG卡插在主機皮時,會發生顏色偏差或異常反白的情形,此處就必須設成Enabled,以改善這種現象15.OS Select For DRAM > 64MB
※Non-OS2 . OS2
PS:若您是灌OS/2作業系統,且記憶體大於64MB,則此項必須設為OS2
16.Video BIOS Shadow --- 使用Shadow加速功能
※Disabled . Enabled
PS:建議您設成Enabled,可加快顯示速度
17.C8000-CBFFF Shadow
※Disabled . Enabled

三.CHIPSET FEATURES SETUP
晶片組進階功能設定,每塊主機板的晶片皆不大相同,一般不建議使用者去更改

四.POWER MANAGEMENT SETUP
電源管理設定
電源管理主要控制項是Power Managemen,有幾個選擇
Max saving 最大省電模式,系統閒置一小段時間就進入Suspend狀態(時間依廠商設定)
Min saving 最小省電模式,系統閒置一大段時間才會進入Suspend狀態(時間依廠商設定)
Disabled :系統永遠不會進入省電狀態
User Definde :如果你想自己設定那就可以選這一項,一但選這一項,以下的選擇功能便會開啟,讓你選擇閒置時間
其他幾個相關選項
Vdeo Off Option螢幕電源管理設定:
Always on(都不進入Vdeo off),Suspend->Off(系統進入Suspend狀態,Vdeo也進入Off)
Disabled(關閉)
HDD Power Down 設定關閉硬碟的時間,若設10min則是系統閒置10分鐘後關閉硬碟電源,建議Disabled
PWR Up Modem Act是否允許數據機開機,又稱Resume By Ring
Wake On LAN 是否可以由區域網路啟動系統
Automatic Power Up設定系統的開機時刻,選項有:
Disabled(關閉)
Everyday(每一天)
By date(單單針對某一天)

五.PNP/PCI CONFIGURATION
隨插隨用與PCI匯排流設定,定原理較艱難,一般不建議使用者去動它.

六.LOAD BIOS DEFAULT
選擇還原BIOS出廠時的CMOS設定值,無法開機時可選擇此項,較能進入開機狀態.等有需要時再做更改設定.

七.LOAD SETUP DEFAULT
當你更改BIOS設定後造成系統不穩,或無法開機你可以選擇還原SETUP的CMOS設定值,這個設定較能發揮主機板速度的設定

八.INTEGARATED PERIPHERALS
設定週邊硬體.不是Enabled,就是Auto可以不用去修改它.
但其中有一項必須注意:
Parallel Port Mode並列埠模式選擇,有七個選擇
1. SPP
2. Normal
3. EPP 1.7 + SPP
4. EPP 1.9 + SPP
5. EPP
6. EPP 1.7 + ECP
7. EPP 1.9 + ECP
一般選用ECP(最快)因為都是用新型的印表機,當你要用就型的印表機記得去修改成SPP模式(最慢),不然會印出亂碼

九.SUPERVISOR PASSWORD
密碼管理設定.若單獨設定其中一個,其權限一樣大,若兩個都設則SUPERVISOR權限較大,故一般只設SUPERVISOR,可做配BIOS FEATURES SETUP裡的Security Option選項使用,選setup則只有要進入BIOS時才需輸入密碼,若選擇System則每一次開機都要輸入密碼,不然無法開機進入windows,
設定密碼的方法是連輸入兩次一樣的密碼即可,需注意有大小寫之分.取消密碼的方法為進入後重設密碼,不要輸入任何字,壓Enter鍵就可以了.
另外,若你忘了設定的密碼,要怎麼辦呢? 簡單-將主機板上的圓型鋰電池拔掉,待10-20分鐘後再重新裝上電池即可.

十.IDE HDD AUTO DETECTION
硬碟自動偵測.用來抓硬碟的各項參數,然後套用在STANDARD CMOS SETUP裡的硬碟參數設定

十一.SAVE & EXIT SETUP
儲存BIOS設定,然後離開.

十二.EXIT WITHOUT SAVE
不儲存BIOS更改,直接離開.

參考文章:
http://drvcity.blogspot.com/2010/04/bios.html
http://blog.xuite.net/jin117/blog/15790921

2011年12月23日 星期五

[Linux] How to Auto login x window

本次實驗系統Centos 5.7版

Part 1: auto-login x window by root

step 1:
  1. [root@localhost /]# vi etc\inittab
不正確的 /etc/inittab 設會使得系統不正常,而且無法登入,所以修改 /etc/inittab 前請先做好備分,/etc/inittab 的設定如下:
  1. root@: ~# vi /etc/inittab
    #
    # inittab       This file describes how the INIT process should set up
    #               the system in a certain run-level.
    #
    # Author:       Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
    #               Modified for RHS Linux by Marc Ewing and Donnie Barnes
    #
    # Default runlevel. The runlevels used by RHS 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:
    
    # System initialization.
    si::sysinit:/etc/rc.d/rc.sysinit
    
    l0:0:wait:/etc/rc.d/rc 0
    l1:1:wait:/etc/rc.d/rc 1
    l2:2:wait:/etc/rc.d/rc 2
    l3:3:wait:/etc/rc.d/rc 3
    l4:4:wait:/etc/rc.d/rc 4
    l5:5:wait:/etc/rc.d/rc 5
    l6:6:wait:/etc/rc.d/rc 6
    
    #Trap CTRL-ALT-DELETE
    ca::ctrlaltdel:/sbin/shutdown -t3 -r now
    
    # When our UPS tells us power has failed, assume we have a few minutes
    # of power left.  Schedule a shutdown for 2 minutes from now.
    # This does, of course, assume you have powerd installed and your
    # UPS connected and working correctly.  
    pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
    
    # If power was restored before the shutdown kicked in, cancel it.
    pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
    
    # Run gettys in standard runlevels
    1:2345:once:/sbin/mingetty --autologin root tty1
    2:2345:respawn:/sbin/mingetty tty2
    3:2345:respawn:/sbin/mingetty tty3
    4:2345:respawn:/sbin/mingetty tty4
    5:2345:respawn:/sbin/mingetty tty5
    6:2345:respawn:/sbin/mingetty tty6
    
    # Run xdm in runlevel 5
    x:5:respawn:/etc/X11/prefdm -nodaemon
step 2:
  1. [root@localhost /]# vi root\.bash_profile
    ......
    ......
    #最後一行加入
    startx

Centos 6.2版

auto-login x window by root

#gdmsetup 這個指令主要是修改 /etc/gdm/custom.conf 設定檔
  1. [root@localhost /]# vi /etc/gdm/custom.conf 
    [daemon]
    AutomaticLoginEnable=true
    AutomaticLogin=root


Part 2: auto-login x window by user

#gdmsetup 這個指令主要是修改 /etc/gdm/custom.conf 設定檔
  1. [root@localhost /]# vi /etc/gdm/custom.conf 
    [daemon]
    AutomaticLoginEnable=true
    AutomaticLogin=username #注意:username 請改成做用者帳號。
    TimedLoginEnable=true 
    TimedLogin=username #注意:username 請改成做用者帳號。
    TimedLoginDelay=0

2011年12月21日 星期三

[Linux] 如何自動登入

Part 1 : Linux自動登入文字介面
修改 /etc/inittab
  1. [root@localhost /]# vi /etc/inittab
    #1:2345:respawn:/sbin/mingetty tty1
    1:2345:once:/sbin/mingetty --autologin root tty1
我只設定 tty1 自動登入,可以依需求把其他的 tty 都改成自動登入.

Part 2: 如何讓 X-Window 自動 login 的方法

首先說設定讓 X-Window 自動 login 的方法只是用於特定場所,如實驗室等測試環境,正式環境不建議使用.

Non - Root User

先建立一個非 root 的帳號並且不要設定其密碼的使用者帳號, 例如: abc.
  1. [root@localhost /]# useradd abc
    [root@localhost /]# passwd –d abc
root 預設是無法使用自動 login 的方法,後面會再介紹一種方式可以讓 root 自動登入到 x-windows,要讓非 root 使用者自動登入 x-windows 首先需要編輯 /etc/X11/gdm/gdm.conf 這一個檔案.
  1. [root@localhost /]# vi /etc/X11/gdm/gdm.conf
    #--- gdm-conf ---
    [daemon]
    AutomaticLoginEnable=true
    AutomaticLogin=abc
    ....
    ....
    ....
    TimedLoginEnable=true
    TimedLogin=abc
    TimedLoginDelay=30
    [security]
    AllowRemoteAutoLogin=true
    #-- end ---
1.AutomaticLoginEnable=true
=> 設定開機時, 自動登入
2.AutomaticLogin=abc
=> 填入指定使用者名稱
3.TimedLoginEnable=true
=> 在登出以後 如果使用者在登入畫面沒有動作, 等待一定時間後會自動登入.
4.TimedLogin=abc
=> 填入指定使用者名稱
5.TimedLoginDelay=30
=> 接下來重新開機就可以用 abc 這個使用者自動登入到 x-window

Root User

因為系統無法直接讓 root 自動登入 x-window 所以我們先讓 Linux 系統自動登入文字介面,先修改 /etc/inittab 檔案.
  1. [root@localhost /]# vi /etc/inittab
    #1:2345:respawn:/sbin/mingetty tty1
    1:2345:once:/sbin/mingetty --autologin root tty1
在所需的 tty# 加入 --autologin root 就可以自動登入到文字介面.接下來修改 root 的 .bash_profile
  1. [root@localhost /]# vi /root/.bash_profile
    # .bash_profile
    # Get the aliases and functions
    if [ -f ~/.bashrc ]; then
      . ~/.bashrc
    fi
    # User specific environment and startup programs
    PATH=$PATH:$HOME/bin
    export PATH
    unset USERNAME
    startx
.bash_profile 是 login system 時會用到的其中一個 shell,主要在最後一行加入 startx 即可,重新開機就可以讓 root 自動登入到 x-window.

在 RHEL 6 和 ubuntu 採用了 FreeDesktop.org 的規格,FreeDesktop.org 的官方網站 http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html,他定義了基本的 Linux 下的 X Window System (X11) 以及其他 Unix-like 作業系統的桌面環境.主要是為了增加 free software desktop environments 的互通性,而這環境簡稱為 XDG(X Desktop Group).

所以上述的方式在新的桌面環境已經不適用了,如果要用 x-window 自動登入請自行參考

Part 3:

Ubuntu 在安裝的時候可以選擇是不是要由特定的使用者自動登入,如果在安裝時沒選定自動登入,這時可以透過 Ubuntu 桌面系統 "gdm" 的工作環境設定程式,#gdmsetup選擇要自動登入的使用者即可.


#gdmsetup 這個指令主要是修改 /etc/gdm/gdm.conf 設定檔,當我們要將 root 設定為自動登入的使用者時, 也只有直接透過修改設定檔才可以達成.
  1. [root@localhost /]# sudo gedit /etc/gdm/gdm.conf
    [daemon]
    
    TimedLoginEnable=true
    AutomaticLoginEnable=true
    TimedLogin=root
    AutomaticLogin=root
    TimedLoginDelay=30
    DefaultSession=gnome
參考文件:
http://benjr.tw/node/671

2011年12月20日 星期二

[Linux] 實作在centos裡插入USB自動執行某個script

Part 1: register 一個callback script


本文的重點不(not)在於如何撰寫(writing)或修改 udev 規則(rules),也不在於如何更改新增裝置的名稱及權限。而在於,脫離 udev rules 的特殊語法(syntax),另外以我們已經熟悉的 Bourne-shell-script 來設計當週邊設備有所異動時,我們想要的反應及動作,例如,發出聲響(sound effects),跳出視窗(pop-up windows),或是自動 mount 之後,備份特定檔案(file backup)等。

如果你在指令行下
$ ps -e | grep udev
可以看到 udevd 的話,就表示說,你的 Linux 系統上已經有一個所謂的 udev deamon 正在管理核心(kernel)裡所傳送出來的 uevents。這時,/dev/ 資料夾裡的檔案是動態配置的(dynamically polulated),譬如說,如果系統上沒有 sdg 這個 block device,那麼在 /dev/ 裡也不會有 sdg 這個檔案。如果你的 kernel 版本(可以 uname -r 查詢)是 >= 2.6.13 的話,那麼你就可以跟著本文一步一步地來玩一些有趣的實驗,這可能包括像是插入(insert)或拔出(unplug)一個隨身碟(thumb-drive)或一張記憶卡(SD card)時,讓電腦發出你所要的聲音(sound),或是跳出一個視窗(pop-up window),或者是自動 mount 一個 partition,或是甚至於在 mount 之後自動播放影音或是自動瀏覽照片(media-players)。雖然我們不建議像 autorun.bat 這種極具安全疑慮(security issues)的功能,但是這自然也是很容易辦到的。

因為我個人所使用的是 kernel 版本 2.6.27.59 上的 Debian Etch 或 Lenny,所以我們接下來就以此平台為基礎,開始做一些簡單有趣的實驗。

我們先以 root 的權限在 /etc/udev/rules.d/ 這個資料夾裡建立一個新檔:
$ sudo vim /etc/udev/rules.d/z100_run_my_script.rules
檔案內容只要一行:
RUN+="/home/my_script"
my_script 是放在 HOME 裡的任何一個可執行的程式。我們將用 shell-script 來示範這個程式如何被 udev 執行。其實在你建好  z100_run_my_script.rules  之後,udev 就已經開始執行 my_script 這個程式了。雖然此刻它還不存在,但是 udev 系統在找不到這個檔案的時候也不會抱怨。每次有電腦周邊元件異動時(uevent),例如,usb device 插入或拔出時,udev 系統都會去 /etc/udev/rules.d/ 資料夾裡依序查看並執行所有的 rules,當輪到我們剛剛才建立的  z100_run_my_script.rules  時,它便會去執行 my_script。

接下來我們便要來寫個叫做 my_script 的程式:
$ cd ~/
$ vim my_script
裡面的內容就先放兩行就好了:
#!/bin/sh
sudo /home/rs232
其中第一行是 UNIX 標準的 shell-script "shebang",它是用來告訴系統,這個 script 是要由 /bin/sh 來執行。第二行則呼叫一個程式出來執行。儲存這個檔案,再做(必要!):
$ chmod 755 my_script
然後先測試一下,是否有執行:
$ ./my_script
再來,你就可以拿任何一個 usb 隨身碟插進去,試試看囉!你每次一插進去一個隨身碟,就會去執行rs232

如果發生原因不明的問題的話,可以試試看:
$ sudo /etc/init.d/udev reload
我們剛剛建立了 /etc/udev/rules.d/ z100_run_my_script.rules  之後,沒有執行以上的 reload,是因為它是新建立的規則檔案(new rule files),但是如果這個檔案的內容經過修改的話,則必須執行以上的 reload,修改過的內容才會生效。

如果讓 my_script 的執行指令在背景執行的話,例如:
#!/bin/sh
sudo /home/rs232 &
這個指令被放到背景執行(backgrounding)之後,這個程式就結束了,而 udev 系統很快地再次執行這一行指令時,也會一再地放到背景去執行……,不能清楚地算出是被執行了幾次。

Part2: 如何加入debug msg到script

我們已經建立起一個機制(mechanism),這包含一個所有 uevent 的萬能勾(universal hook),也就是 /etc/udev/rules.d/ z100_run_my_script.rules ,以及讓這個勾勾直接跳過來執行(execute)、放在家裡面(HOME)的一個叫做 my_script 的程式。也就是:
$ cat /etc/udev/rules.d/ z100_run_my_script.rules
RUN+="/home/my_script"
$ ls -l ~/my_script
-rwxr-xr-x 1 home home 1056 Nov 22 03:04 /home/my_script
因為這個程式執行的時候並沒有 tty,也就是說,它不能夠印出任何我們看得到的訊息(messages),所以我們就用 sudo 來執行一個檔案,來通知(notify)我們這個程式的執行狀況,例如,到底有沒有被執行到、被執行了幾次,或是在什麼情況下會被執行。但是為了寫一個有用的程式,我們終究必須要讓這個程式印出可以看得到的訊息,以便監控程式發展過程的任何問題。


所以在這個單元,我們就必須要先建立好程式發展環境,讓我們可以鉅細靡遺地監控這個程式的執行細節,也讓我們可以 debug 寫程式時無法迴避的許多錯誤。沒有 tty 怎麼辦呢?一個簡單的辦法就是讓 my_script 這個程式把所有的訊息輸出到一個 logfile,例如:
#!/bin/sh
LOGFILE=/tmp/my_script.log
sudo /home/rs232
date >> $LOGFILE
這裡 ">>" 的意思,就是把 date 這個指令所產生的 stdout 都附加(append) 到 $LOGFILE 裡。但是 ">>" 並不包括 stderr。所以萬一系統找不到 date(1) 這個程式的話,例如,你把 "date" 錯打成 "data",在 $LOGFILE 裡還是看不到像是
bash: data: command not found
的錯誤訊息,因為,像上列這種錯誤訊息,通常是輸出到 stderr,而 ">>" 只 redirect 了 stdout。

我們現在就先檢查一下,到底 $LOGFILE 有沒有真的被產生出來、檔案屬性如何、檔案裡面到底有沒有東西:
$ ls -l /tmp/my_script.log
-rw-r--r-- 1 root root 348 Nov 4 22:10 /tmp/my_script.log
$ less /tmp/my_script.log

請注意,它所有權屬於 root,這一點很重要,因為,雖然我們的程式 my_script 屬於一個一般的使用者(user permission),例如 "home",然而它是由 udev 系統叫出來執行的,所以這個 process 也跟著具有 root 的權限(permission),而其所產生的檔案,自然也具有 root 的預設權限 644。我們可以再看一次 my_script 這個檔案的屬性:
$ ls -l ~/my_script
-rwxr-xr-x 1 home home 188 Nov 4 22:23 my_script
接下來,為了可以在 $LOGFILE 裡記錄下來這個程式所產生的所有錯誤訊息(error messages),我們在下一個範例,故意漏打 "home" 的 "e",讓 sudo 找不到這個檔,而發出送到 stderr 的錯誤訊息。同時,在這一行最後面加上 "2>> $LOGFILE"。這個意思是說,把所有的 stderr 重新導向(redirect),並附加(append)到 $LOGFILE 這個檔案裡。
#!/bin/sh
LOGFILE=/tmp/my_script.log
sudo /hom/rs232 2>> $LOGFILE
date >> $LOGFILE
修改好以上的 my_script 並儲存好新版之後,再插上或拔除任何一個 usb 隨身碟,就應該可以在 $LOGFILE 裡邊找到 sudo 那一行所產生的錯誤訊息。因為這一行執行有誤(syntax error),所以這一次我們看不到任何反映。

為了避免必須在每一個指令後面都必須加上 ">> $LOGFILE" 或是 "2>> $LOGFILE",我們要介紹一個一勞永逸的方法,來把這個程式所產生的所有 stdout 以及 stderr 都 redirect 到 $LOGFILE 裡。修改 my_script 成為:
#!/bin/sh
LOGFILE=/tmp/my_script.log
exec 3>> $LOGFILE && exec >& 3 && exec 2>&1
sudo /home/rs232
date 
以上新版 my_script 的第 3 行,會把從第四行開始,所產生的所有 stdout 以及 stderr 都重新導向(redirect),並附加(append)到 $LOGFILE 裡去。自然,這一行必須放在所有可能會輸出文字的指令之前。

我們很快地就會發現,logfile 裡面所記錄的資料,在先後順序有一點混亂(scrumbled order)。這是因為 uevent 是很頻繁(frequent)發生的事件,而每一次的 uevent 都會觸發 my_script 的執行,所以常常同一個時間(concurrently)會有 my_script 的許多分身(processes)同時、但不同步地(asynchronously)在執行,而它們都正在寫入這個 logfile,彼此之間會形成一種競爭(competitive)的態勢,導致所寫入資訊的前後順序交錯(disorder),以至於看起來好像並沒有按照 my_script 裡的執行順序輸出。其實,順序交錯的輸出是導因於 my_script 的許多不同分身,以非同步的競爭狀況交錯寫入的結果。因此,udev 系統每次呼叫我們的 my_script 時,都會設定一個環境變數 SEQNUM 來顯示該事件(uevent)的產生順序。事實上,udev 系統執行 my_script 時,會設定更多對有用的變數(defined variables)。這可以用 udevmonitor(8) 加上 --env 的選項來監看。


Part 3: 寫一個偵測USB插入script


插入一個 USB 隨身碟時,系統上會產生許多次的 uevents。拔除時亦然。我們再複習一下這個簡單的掛勾機制(hook):

$ cat /etc/udev/rules.d/ z100_run_my_script.rules
RUN+="/home/my_script"
$ ls -l ~/my_script
-rwxr-xr-x 1 home home 1056 Nov 22 03:04 /home/my_script

為了篩選出(match)方便與之掛勾的特定事件(uevent),我們必須更進一步追蹤這些事件的內幕。首先,把 my_script 改寫為以下 3 行:

#!/bin/sh
echo $SEQNUM $SUBSYSTEM $ACTION $DEVNAME >> /tmp/my_script.log
exit $?

先以 root 的權限把 logfile /tmp/my_script.log 的內容清空,再插入,或拔除手邊任何一個 USB 隨身碟。然後再看看在 /tmp/my_script.log 這個檔案裡面,我們到底收集到了那些情資。結果大概會很接近如下所示的內容:
2124 usb add /dev/1-6
2125 usb add
2126 scsi_host add
2127 usb_device add /dev/bus/usb/001/007
2134 bdi add
2128 scsi add
2129 scsi_disk add
2131 scsi change
2130 scsi_device add
2132 block add /dev/sda
2133 block add /dev/sda1
2136 scsi_disk remove
2135 scsi_device remove
2137 block remove /dev/sda1
2140 scsi remove
2143 usb_device remove /dev/bus/usb/001/007
2138 bdi remove
2141 scsi_host remove
2142 usb remove
2139 block remove /dev/sda
2144 usb remove /dev/1-6
其中第一個 field 是環境變數 SEQNUM 的值,可用來判別事件發生的先後順序,第二個是 SUBSYSTEM,第三個是 ACTION,第四個則為 DEVNAME 的值,其中,DEVNAME 有時候並未設定。細數後可知,插入 USB 的動作導致系統上一共產生了 11 次的 uevents,拔除時,則產生了 10 次的 uevents。在這眾多的 uevents 當中,特別適合用來唯一識別 USB 裝置插入(insert)及拔除(remove)動作的事件,也就是只發生過一次的事件可說是:

SUBSYSTEM==usb_device
ACTION==add
以及
SUBSYSTEM==usb_device
ACTION==remove
以下這個 my_script 示範如何限縮這個 script 的反應,只在插入或移除一個 USB device 時,而且分別只執行一次:

case 1:

#!/bin/sh
LOGFILE=/tmp/my_script.log # 定義變數 LOGFILE
exec 3>> $LOGFILE && exec >& 3 && exec 2>&1 # 把 stdout/stderr 導入 $LOGFILE
USB_INSERT="/home/rs232"

if [ "$SUBSYSTEM" = "usb_device" -a "$ACTION" = "add" ]
then
    echo ""
    echo "=============================="
    date "+%G-%m-%dT%H:%M:%S %z"
    echo "$SUBSYSTEM $ACTION"
    echo "sudo -q \"$USB_INSERT\""
    sudo -q "$USB_INSERT"
fi
exit $?

以case 1在執行時會發現無反應看/tmp/my_script.log時會看到

            sudo :sorry,you must have a tty to run sudo

所以要把 sudo 改權限

            sudo bash

script也要修改

case 2:

#!/bin/sh

LOGFILE=/tmp/my_script.log # 定義變數 LOGFILE

exec 3>> $LOGFILE && exec >& 3 && exec 2>&1 # 把 stdout/stderr 導入 $LOGFILE

if [ "$SUBSYSTEM" = "usb_device" -a "$ACTION" = "add" ]

then


    echo ""

    echo "=============================="

    date "+%G-%m-%dT%H:%M:%S %z"

    echo "$SUBSYSTEM $ACTION"

    ./home/rs232
fi
exit $?

編輯 my_script 的時候,要確認聲音檔是不是存在。編輯完畢之後,要記得做
$ chmod 755 ~/my_script
以上的 script 是說,當(if) SUBSYSTEM 這個變數的值等於(=)usb_device,而且(-a)當 變數 ACTION 的值為 add 的時候,就(then)執行一些 echo(1), date(1), sudo(1) 的指令。請注意,方括號 [ 及 ] 跟 = 的前後,要有空白(space),變數(variable)的前後,也必須加上雙引號(double quotation marks),因為變數值可能會包含空白字元(embedded spaces)。

最後一個指令 "exit $?",是要結束這個 script 並把當時的執行結果傳回(return)給呼叫這個 script 的任何程式。想要省略掉的話,也沒什麼問題,然而我們必須平時就養成撰寫程式的正確習慣,在 UNIX 系統上,任何程式、函式都必須要有傳回值,就算是不知道有誰會去用它。我們不希望看到那一天,當有人突然去用它的時候,就必須面對噩運。這看似小事一件,然而缺乏持續性對小節的正確習慣或態度。


做完以上的 script,只要隨手找個 USB 設備插入,或拔出,就都會執行。這是採用正面表列只當變數 SUBSYSTEM 內傳過來的值為 usb_device 時,才依變數 ACTION 的值是 add 或是 remove 來採取行動。


此篇文章參考
random notes

2011年12月19日 星期一

[Linux] Writing to serial port

目的:
寫一個傳送data到serial port code

CODE:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <memory.h>

#define BAUDRATE B115200 /* 鮑率設定被定義在 <asm/termbits.h>, 這在 <termios.h> 被引入 */
#define MODEMDEVICE "/dev/ttyUSB0" /* 定義正確的序列埠 */
#define _POSIX_SOURCE 1 /* POSIX 系統相容 */
#define STOP '@'

int main()
{
    int fd, c=0, res;
    struct termios oldtio, newtio;
    char ch;
    char s1[8];
    int data[7];
    printf("Start...\n");
/*
開啟數據機裝置以讀取並寫入而不以控制 tty 的模式
因為我們不想程式在送出 CTRL-C 後就被殺掉.
*/
    printf("start Open port...\n");
    fd = open(MODEMDEVICE,  O_RDWR | O_NOCTTY);
    if (fd < 0)
    {
         perror(MODEMDEVICE);
         return 1;
    }   

    tcgetattr(fd, &oldtio); /* 儲存目前的序列埠設定 */
    memset(&newtio,0, sizeof(newtio)); /* 清除結構體以放入新的序列埠設定值 */
/*
BAUDRATE: 設定 bps 的速度. 你也可以用 cfsetispeed 及 cfsetospeed 來設定.
CRTSCTS : 輸出資料的硬體流量控制 (只能在具完整線路的纜線下工作
參考 Serial-HOWTO 第七節)
CS8     : 8n1 (8 位元, 不做同位元檢查,1 個終止位元)
CLOCAL  : 本地連線, 不具數據機控制功能
CREAD   : 致能接收字元
IGNPAR  : 忽略經同位元檢查後, 錯誤的位元組
ICRNL   : 比 CR 對應成 NL (否則當輸入訊號有 CR 時不會終止輸入)
在不然把裝置設定成 raw 模式(沒有其它的輸入處理)
*/
    newtio.c_cflag = BAUDRATE|CS8|CLOCAL|CREAD;
    newtio.c_iflag = IGNPAR;
/*
Raw 模式輸出.
*/
    newtio.c_oflag = 0;
/*
ICANON  : 致能標準輸入, 使所有回應機能停用, 並不送出信號以叫用程式
*/
    newtio.c_lflag = ICANON;
/*
現在清除數據機線並啟動序列埠的設定
*/
    tcflush(fd, TCIFLUSH);
    tcsetattr(fd, TCSANOW, &newtio);
    printf("Writing...\n");
 
    {
    s1[0]=0xC0;
    s1[1]=0x63;
    s1[2]=0x07;
    s1[3]=0x0A;
    s1[4]=0x00;
    s1[5]=0x00;
    s1[6]=0xAE;
    res = write(fd, &s1, 7);
    }
    printf("Close...\n");
    close(fd);
/* 回存舊的序列埠設定值 */
    tcsetattr(fd, TCSANOW, &oldtio);
    return 0;
}


此程式參考文章

2011年12月12日 星期一

[Linux] 如何進入liunx single user mode

開機看到GRUB畫面時, 按"e"
會看到三行:
root(hd0,0)
kernel /boot/bmlin..........ro root=/dev/hda1
initrd /boot/initrd-............
將游標移到第二行,按"e"
在此行最後面加上 -s or single
按Enter
按"b"就會啟動到 Single User Mode

2011年12月9日 星期五

[Linux] How to install Mplayer into CentOS

如何安裝Mplayer到CentOS 5
方法一: yum install
1. yum list mplayer*
上面指令會把mplayer需要安裝的物件列出來
2. yum install mplayer*
會自動把list裡的東西安裝
3. reboot
重開機後就可以應用程式影音看到Mplayer


方法二:
Linux 上的 MPlayer 就好比是 Windows 上的 KMPlayer 或暴風影音,內含 Player 及各種 Codec,只要安裝好,就可以播放任何格式的影片及音樂檔,以下介紹 MPlayer 的 TarBall 及 RPM 的安裝方法。 安裝好之後,"mplayer" 為文字介面的播放程式,而 "gmplayer" 為圖形介面的播放程式。下列的安裝步驟,如果選用 TarBall 的方式安裝,在安裝時則已設定好中文介面了,而 RPM 的方式只能裝在 CentOS 4.x 或 RHEL 4.x 的版本,並且介面為英文。以原始碼 TarBall 方式的安裝步驟

  • 先安裝可能缺少的套件:
    yum install libpng*
    yum install gtk2-devel
  • 下載並複製 codec:
    cd /usr/local/src
    wget http://www.mplayerhq.hu/MPlayer/releases/codecs/all-20061022.tar.bz2
    tar -jxvf all-20061022.tar.bz2
    mv all-20061022 /usr/lib/codecs
  • 下載 mplayer 原始檔:
    cd /usr/local/src
    wget http://www.mplayerhq.hu/MPlayer/releases/MPlayer-1.0rc1.tar.bz2
    tar -jxvf MPlayer-1.0rc1.tar.bz2
    cd MPlayer-1.0rc1
  • 編譯及安裝 mplayer (安裝路徑為 "/usr/local/MPlayer1.0〃):
    ./configure --enable-gui --with-codecsdir=/usr/lib/codecs --with-win32libdir=/usr/lib/codecs --with-reallibdir=/usr/lib/codecs --with-xanimlibdir=/usr/lib/codecs --disable-inet6 --language=zh_TW,en --prefix=/usr/local/MPlayer1.0 --charset=utf8
    make
    make install
  • ============== ./configure參數解說=================
    --prefix:主程式的安裝目錄
    --enable-gui:支援圖形介面
    --enable-largefiles :可讀取超過2G以上的檔案
    --enable-menu :支援選單功能
    --language:支援的語系
    ===============================================
  • 設定字幕的字型檔 (其中的 ukai.ttf 可替換為任何 Unicode 的中文字型檔):
    cp /usr/share/fonts/chinese/TrueType/ukai.ttf ~/.mplayer/subfont.ttf
  • 安裝預設的 skin 給 gmplayer 使用:
    wget http://www1.mplayerhq.hu/MPlayer/Skin/PowerPlayer-1.1.tar.bz2
    tar -jxvf PowerPlayer-1.1.tar.bz2
    mv PowerPlayer /usr/local/MPlayer1.0/share/mplayer/skins/default
  • 建立程式聯結,以便直接執行執行程式:
    ln -s /usr/local/MPlayer1.0/bin/mplayer /usr/local/bin/
    ln -s /usr/local/MPlayer1.0/bin/gmplayer /usr/local/bin/
  • 額外的 Skin 可以到這裡下載,下載完,請解開放到 [/usr/local/MPlayer1.0/share/mplayer/skins/]


    如何安裝Mplayer到CentOS 6.2 LIVE CD
    昨天在安裝CentOs 6.2 Live CD到硬碟後發現
    yum list mplayer*後一直出現找不到.
    在CentOS官網中有說明
    http://wiki.centos.org/TipsAndTricks/MultimediaOnCentOS


    Step 1: Add RPMforge repository access for your CentOS system. (Required for the majority of multimedia packages.)
    方法一:
    i686
    wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.i686.rpm
    or
    x86_64
    wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
    Install DAG's GPG key
    rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
    If you get an error message like the following the key has already been imported:
    error: http://apt.sw.be/RPM-GPG-KEY.dag.txt: key 1 import failed.
    
    Verify the package you have downloaded
    rpm -K rpmforge-release-0.5.2-2.el6.rf.*.rpm
    Install the package
    rpm -i rpmforge-release-0.5.2-2.el6.rf.*.rpm
    Then try to install something like this
    yum install htop
    

    方法二: 自己KEY IN
    在/etc/yum.repos.d/下
    新增一個檔案 atrpms.repo
    root@ vi /etc/yum.repos.d/atrpms.repo
    [atrpms]
    name=Fedora Core $releasever - $basearch - ATrpms
    baseurl=http://dl.atrpms.net/el$releasever-$basearch/atrpms/stable
    gpgkey=http://ATrpms.net/RPM-GPG-KEY.atrpms
    gpgcheck=1
    enable=1
    Step 2: Install the multimedia applications.
    yum install compat-libstdc++-33 libdvdcss libdvdread libdvdplay libdvdnav lsdvd libquicktime
    yum install flash-plugin mplayerplug-in mplayer mplayer-gui gstreamer-ffmpeg gstreamer-plugins-bad gstreamer-plugins-ugly
    Step 3: Install the w32Codecs. (Required for xvid and other proprietary formats.)
    wget http://www.mplayerhq.hu/MPlayer/releases/codecs/all-20110131.tar.bz2
    mkdir -p /usr/lib/codecs
    or 
    mkdir -p /usr/lib64/codecs
    tar -jxvf all-20110131.tar.bz2 --strip-components 1 -C /usr/lib/codecs/
    or 
    tar -jxvf all-20110131.tar.bz2 --strip-components 1 -C /usr/lib64/codecs/