2010年8月31日 星期二

網卡綁定 Network Bonding


當我們一張網卡的速度不夠的時候,就可以試著兩張網卡綁在一起來使用。

環境介紹:
系統 ubuntu 9.04 64bit
2張Gigabit網卡: 主機板內建 Realtek RTL8111/8168B、PCI介面 Intel 82541PI
Switch: Linsys 48port Gigabit SRW2048

此server上有大量的影音檔,多是超過1G以上的大檔案,在區網多人存取檔案時,1張Gigabit的網卡可能不夠用,於是就想到了試試將兩張網卡綁在一起使用。


以下內容,紅字部份皆為指令或是您需要留意或修改的部份 ,藍字部份則為設定檔內容。

1.安裝套件

sudo apt-get install ifenslave

2.編輯設定檔

sudo vim /etc/modprobe.d/bonding.conf

########################
alias bond0 bonding
options bonding mode=0 miimon=100
########################

mode=0
有0~6底下這幾種模式可以設定


mode=0 (balance-rr)
負載平衡模式(Round-robin policy), 需有 switch 設定 (port trunk,或是 Link Aggregation ) 支援才能發揮實質效果,具容錯功能, 其中一張網卡失效仍可持續運作。運作模式就是所有綁定的網卡皆會依序的被使用到。
Round-robin policy: Transmit packets in sequential order from the first available slave through the last. This mode provides load balancing and fault tolerance.
   
mode=1 (active-backup)
同一時間只有單一網卡運作,需設定主要(primary)與次要網卡,當主要網卡失效時自動啟用次要網卡,不需 switch 支援。
Active-backup policy: Only one slave in the bond is active. A different slave becomes active if, and only if, the active slave fails. The bond's MAC address is externally visible on only one port (network adapter) to avoid confusing the switch. This mode provides fault tolerance. The primary option affects the behavior of this mode.
   
mode=2 (balance-xor)
XOR policy: Transmit based on [(source MAC address XOR'd with destination MAC address) modulo slave count]. This selects the same slave for each destination MAC address. This mode provides load balancing and fault tolerance.


mode=3 (broadcast)
所有 Slave 網卡一齊收送網路封包具容錯功能, 其中一張 Slave 網卡失效仍可持續運作
Broadcast policy: transmits everything on all slave interfaces. This mode provides fault tolerance.

mode=4 (802.3ad)
802.3ad是比較正規的做法,需 switch 支援及設定。參考資料1參考資料2
若有兩張網路卡,則進來流量為2000M出去流量為2000M,具容錯功能。ALA (Adapter Link Aggregation)

IEEE 802.3ad Dynamic link aggregation. Creates aggregation groups that share the same speed and duplex settings. Utilizes all slaves in the active aggregator according to the 802.3ad specification.
   
需求:
Ethtool support in the base drivers for retrieving the speed and duplex of each slave.
A switch that supports IEEE 802.3ad Dynamic link aggregation. Most switches will require some type of configuration to enable 802.3ad mode.


mode=5 (balance-tlb)
傳出自動負載平衡,傳入由次要網卡負責,具容錯功能, 其中一張次要網卡失效仍可持續運作,不需 switch 支援及設定 
Adaptive transmit load balancing: channel bonding that does not require any special switch support. The outgoing traffic is distributed according to the current load (computed relative to the speed) on each slave. Incoming traffic is received by the current slave. If the receiving slave fails, another slave takes over the MAC address of the failed receiving slave.
需求: Ethtool support in the base drivers for retrieving the speed of each slave.
   
mode=6 (balance-alb)
傳出及傳入皆自動負載平衡具容錯功能, 其中一張 Slave 網卡失效仍可持續運作;Slave 網卡 driver 需支援 setting hardware address 功能,不需 switch 支援及設定。  

若兩張網路卡設成ALB時,進來流量為1000M出去流量為2000M這時候無論接往何種交換器或集線器都可支援,ALB包含容錯功能如果一張網卡故障另一張依然運作,現在INTEL可以做到8張網卡併頻寬

Adaptive load balancing: includes balance-tlb plus receive load balancing (rlb) for IPV4 traffic, and does not require any special switch support. The receive load balancing is achieved by ARP negotiation. The bonding driver intercepts the ARP Replies sent by the local system on their way out and overwrites the source hardware address with the unique hardware address of one of the slaves in the bond such that different peers use different hardware addresses for the server.


3.檢查網卡是否支援 mii

有些較舊的網卡或driver可能不支援網卡綁定(bonding)的功能,可用以下指令確定

root@u21:/# mii-tool
eth0: negotiated 1000baseT-FD, link ok
eth1: negotiated 1000baseT-FD, link ok

上述的狀況是兩張網卡都有支援 mii

root@245 ~# mii-tool
SIOCGMIIPHY on 'eth0' failed: Operation not supported
SIOCGMIIPHY on 'eth1' failed: Operation not supported
no MII interfaces found

上述的狀況是兩張網卡沒有支援 mii 功能,也就是不能用 bonding




4.網卡設定

sudo vim /etc/network/interfaces

########################
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static

auto eth1
iface eth1 inet static

auto bond0
iface bond0 inet static
address 192.168.0.9
gateway 192.168.0.1
netmask 255.255.255.0
slaves eth0 eth1
bond-mode 0
bond-miimon 100
########################

sudo vim /etc/resolv.conf
########################
nameserver 168.95.192.1
nameserver 168.95.1.1
########################

紅字的部份說明:
由於 ubuntu 有內建圖型介面網路管理程式 (network-manager-gnome) 由這個套件所做的網路設定會跟我們設定在 /etc/network/interfaces 這裡面的內容相衝突。

換句話說,就是你一旦在 /etc/network/interfaces 裡面有針對網卡 (eth0, eth1) 做任何設定的話,圖型介面網路管理程式就會不起作用(會呈斷線狀態而無法設定,但實際上網路是通的),而以 /etc/network/interfaces 的設定內容為主。若你想回頭用圖型介面網路管理程式的話,那麼只要把 /etc/network/interfaces 此檔內與網卡 (eth0, eth1) 有關的設定清空後重開機,即可使用圖型介面網路管理程式,理解了這基本的情況之後,我們再來看看底下比較複雜的情況。

那4行紅字(eth0,eth1)的詳細說明:
auto eth0
iface eth0 inet static
auto eth1
iface eth1 inet static

現在的情況有些複雜,我按這兒的教學設定完(還沒有加那4行紅字),重開機之後,網路不通,得下指令 sudo /etc/init.d/networking restart 重啟一下網卡之後,網路才會通。每次開機都還要下這道指令才會通,太麻煩了。我估計是 (network-manager-gnome) 這個套件所引起的衝突,所以試著完整移除此套件,重開機之後,發現還是不行,它好像還是吃 (network-manager-gnome) 的設定,它的eth0還是會透過 dhcp 取得IP。後來找到了 (network-manager-gnome)  的設定檔是放在 /etc/NetworkManager 這個資料夾底下,於是我就把裡面的設定檔 (nm-system-settings.conf 和 dispatcher.d/01ifupdown) 給移除,重開機後,網路是通了,但是本機的 hostname 不見了,變成 localhost,雖然網路是通了,但我估計這樣可能還是會出問題,所以最後我才想到了這樣的解法。

我自己加進去的,那4行紅字(eth0,eth1),目地是讓 (network-manager-gnome) 判斷 /etc/network/interfaces 裡面已經有針對 eth0 和 eth1 的設定了,所以它就自動的不起作用了,而以 /etc/network/interfaces 的設定為主,若是不加這4行紅字的話 (network-manager-gnome) 會跑出來搗蛋。

bond-mode 0
這裡的 mode 有 0~6 幾種模式可選擇,請參考第2步驟的詳細說明


5.switch設定
每個不同廠牌的 switch 的設定方法都不同,這裡只能大概提一下,進 switch 設定畫面後,針對 port 位設定 trunk 或 Link Aggregation 即可。
Linsys switch 預設的帳號為 admin 密碼空白
我這台 Linsys switch 只能使用它的 web 介面 (IE only) 來設定
在web介面==>Port Management-->Link Aggregation-->Detail 然後選定幾個 port 位打勾之後,就可以將這些 port 位綁在一起使用。


6.速度測試

都設定好了之後,當然就要來試一下看看兩張網卡綁在一起的速度能不能超過 1000M

我們使用測網卡速度的程式是 iperf (中文介紹) ,  Windows 版本的執行檔 iperf.exe 可在此下載

iperf 是用來測網卡速度算是最好用的程式了,它可以排除硬碟資料傳輸不夠快的問題,直接操網卡的速度,當然你的CPU速度太慢的話,也是會影響網卡的速度。


ubuntu 底下,一行指令就能自動安裝 iperf 了

sudo aptitude install iperf

它的使用方法分成 server 端和 client 端。在我們這裡的情況,設定雙網卡綁定的那台機器就是要當 server 端,其它的電腦則當 client 端。

server 端,它的設定比較簡單,一行指令就搞定了
iperf -s

client 端的設定,它也是一行指令就行了,不過它帶的參數複雜一點。
指令範例如下:
iperf -c 192.x.x.x -i 10 -t 120 -P 10

-c 連線到某個 IP
-i 10 每10秒顯示一次
-t 120 持續運行120秒
-P 10  開 10 個線程

server 端若想要看當前網卡的流量,可用以下小程式來看

sudo aptitude install ifstat

ifstat -t


經過實測後,發現使用 mode=0 的模式,就能夠使server的頻寬超過 1000M 的速度。
也有自動容錯的功能,也就是說在傳檔案的途中,突然把一條網路線拔掉之後,它還是能正常的傳檔,只不過我在用 iperf 衝流量時,拔掉一條網路線時, iperf 曾引起server的網路當掉好一會兒,直到我把 iperf 這程序 kill 掉時,網路才恢愎正常,簡言之, mode=0 這個模式,就很好用啦!


補充說明:

傳輸速率
單顆 SATA 7200轉的硬碟 66~80 MB/s 左右
單顆   IDE 5400轉的硬碟 30~50 MB/s 左右
兩顆 SATA 7200轉的硬碟 110~120 MB/s 左右 (Raid 0)
10/100 Mbps 網卡 理論值可達 12.5 MB/s, 實際速度 11 MB/s 左右
10/100/1000 Mbps 網卡 理論值 125 MB/s,實際速度 110 MB/s 左右

由以上數字可知,在 1Gbps 的網路環境底下,單顆硬碟的傳輸速率根本達不到 1G 的速度,所以想要測網卡的速度,一定要排除硬碟的傳輸速率,這樣測出來的速度才會準確

測硬碟速率指令
hdparm -Tt /dev/sda



參考資料:
http://ubuntuforums.org/showthread.php?t=863316
http://www.howtoforge.com/network_bonding_ubuntu_6.10
https://help.ubuntu.com/community/UbuntuBonding
https://help.ubuntu.com/community/LinkAggregation
石頭閒語
Linux雙網卡綁定

想要自行查閱更多資料的話,可鍵入以下關鍵字搜尋: network bonding, Link Aggregation, teaming, 寬頻聚合, 頻寬聚合, 網卡綁定, 鏈路聚合...

LACP (Link Aggregation Control Protocal)
LACP 可稱為靜態埠聚集或頻寬聚集是 IEEE 標準規格 802.3ad 協定中的一部份


網卡綁定,別說中文沒有個統一的叫法,就連英文也都有他們自己的叫法:
INTEL 叫 LINK AGGREGATION
CISCO 叫 FAST ETHERCHANNEL
3COM 叫 PORT TRUNKING
國際標準叫 IEEE802.3ad

Ubuntu 客製化


Remastersys 是做客製化光碟最簡單的做法

1 裝好ubuntu,並改好所有設定和更新
2 安裝打包工具,Remastersys

a.編輯此檔,請下指令:

sudo gedit /etc/apt/sources.list



b.加入下列兩行:


註意:ubuntu 9.04 以前的版本,請加入底下這行
# Remastersys
deb http://www.geekconnection.org/remastersys/repository ubuntu/

註意: 若你是 ubuntu 9.10 或 10.04 以後的版本,要加入底下這行,因為它們使用的是 grub2 裝錯版本會使你的 ubuntu 不能開機
# Remastersys
deb http://www.geekconnection.org/remastersys/repository karmic/


c.請下指令

sudo apt-get update
sudo apt-get install remastersys



3.開始打包
請下指令

sudo remastersys backup custom.iso



運行時間大約10~20幾分鐘,此指令會備份你的系統,並產生一個 custom.iso 檔,位於 /home/remastersys 內,將此檔燒成光碟即可。用此光碟來安裝就可以你原來的設定安裝到別台上。(註:光碟開機會提示你要打install,才會進入安裝程序)


4.最後,清除由 remastersys 產生的臨時檔

sudo remastersys clean





參考資料1參考資料2


from http://dominic16y.world.edoors.com/CjNPYjaJc2Tk

tar 指令的常用語法

常用參數


  • -c 打包一個 tar 檔案

  • -x 解開一個 tar 檔案

  • -t 檢視 tar 檔案的內容

  • -z 使用 gzip 壓縮

  • -v 顯示建立 tar 檔案的過程

  • -P 使用絕對路徑

  • -f 指定 tar 檔案的檔案名稱(此參數的後面必須接目標檔名)

  • 常用語法

  • 建立壓縮檔

  • tar -czvf target.tgz /directory
    將 /directory 下的所有檔案及目錄打包成一個名稱為 target.tgz 的壓縮檔
  • 檢視壓縮檔的內容

  • tar -tzvf target.tgz
  • 解開壓縮檔的檔案到現行目錄

  • tar -xzvf target.tgz
  • 複製目錄

  • tar -cvf - /directory | tar -xvf -
    將 /directory 目錄下的檔案及次目錄複製到現行目錄,這樣做的好處是可以保留原來的檔案屬性

    SVN + Trac + Apache 完整安裝攻略

    2010年8月26日 星期四

    Installing SVN server on Fedora

    Step1 : Created a fedora virutal machine clone.
    Links :
    1) http://sysdigg.blogspot.com/2008/02/install-subversion-on-fedora-8-linux.html
    2) http://www.botsko.net/blog/2007/05/17/installing-subversion-on-fedora-core/
    3) http://www.ferdychristant.com/blog/articles/DOMM-6NFJ6J
    4)http://www.botsko.net/blog/2007/05/17/installing-subversion-on-fedora-core/
    I’ve been using subversion a lot recently – from using repositories with client development companies to installing it for clients – it seems to be the SVN month.
    Here’s how I installed subversion on a machine with Fedora Core 4. For anyone learning or using Subversion, I highly recommend that you read the book.
    You may already have subversion installed, if not, just run this:
    # yum install subversion
    # yum install mod_dav_svn
    Then you’ll need to setup at least one repository. I’m going to need multiple repositories that I can use for different clients so I have a bit of extra admin work ahead of me. You can setup as many repositories as you need, but no matter what you’ll need at least one. Here create the folders…
    # mkdir /svn
    # mkdir /svn/repos
    # mkdir /svn/users
    # mkdir /svn/permissions
    We need to give these folders the proper permissions
    # chown -R apache.apache /svn
    Then we need to tell subversion to make our first repository.
    # svnadmin create /svn/repos/myproject
    First, I need to setup a config file for svnserve.
    # vi /svn/repos/conf/svnserve.conf
    Then, look for variations of the following code and edit it as necessary. By default any anonymous user can access the code so to disable that you must include anon-access = none, just commenting the value out will not prevent anonymous access.
    anon-access = none
    password-db = passwdfile
    realm = My SVN Repository
    auth-access = write
    The password-db is just a path to a file containing usernames and passwords. You’ll create this file especially for SVN. I create each file inside of the repository conf directory. So, save your changes and then we’ll create said user file.
    # vi passwdfile
    Enter in something like:
    [users]
    username = password
    Anyway, you’ll need to start the svn server.
    # svnserve -d –listen-port=3690
    One side note – svnserve just runs and doesn’t have a way to stop besides killing the process. If you make changes to the svnserve.conf or user file you’ll need to restart svnserve.
    # killall svnserve
    Then, go ahead and test (best to do so on a different machine).
    # svn co –username=myusername svn://mydomain/svn/repos/myproject
    The system should then ask you for your password. Go ahead and run some tests.
    Now, let’s setup apache.
    Create a new apache include file that will hold our configurations (You may already have this is subversion was already installed).
    # vi /etc/httpd/conf.d/subversion.conf
    Now, this file will need to contain something like this to serve the repository through apache:
    LoadModule dav_svn_module modules/mod_dav_svn.so
    LoadModule authz_svn_module modules/mod_authz_svn.so
    DAV svn
    SVNPath /svn/repos
    AuthType Basic
    AuthName “Subversion Repository”
    AuthUserFile /svn/users/svnpass
    Require valid-user
    AuthzSVNAccessFile /svn/permissions/svnauthz.conf
    Now, this essentially tells apache to load the mods needed for svn. We need to create some files so that this config will work properly. The first is our htpasswd file which I named “/svn/users/svnpass”.
    # htpasswd -cb /svn/users/svnpass username password
    Next we need to create the svnauth file.
    # vi /svn/permissions/svnauthz.conf
    Inside we’ll place a list of users who have access to files:
    [/]
    username = rw
    The “rw” states that this user has read/write access to the root repository /.
    Restart your web server and you should be done.
    service httpd reload
    or you can use:
    /usr/sbin/apachectl restart – this option outputs better error messages in case you’ve made some syntax mistakes.
    Go to your repository and you should see subversion displaying the repo info.
    http://yoursite.com/svn/repos/

    2010年8月24日 星期二

    實作QOS頻寬管制(上下載)

    為什麼要頻寬管制,因為有人佔住了頻寬,所以我們要加以管制
    (切記,以下是在ubuntu 7.10底下實作,等我有時間會在CentOS4,5下試試是否可行)

    1.首先請先確定你的linux系統核心(kernel}有無支源HTB
    grep "HTB" /boot/config-`uname -r`
    有秀出config_net_sch_htb=m 就ok

    2..確認有無裝iproute 套件 因為套件裡需要用到tc指令
    apt-cache search iproute 確認看看 基本上ubunut7.10上已經有內建在核心了
    apt-cache show iproute 顯示套件資訊(題外話,供參考)
    apt-cache showsrc iproute顯示原始碼相關資料(題外話,供參考)
    apt-cache depends iproute 秀出相依性(題外話,供參考)

    開始實作,但實作前請先到
    這邊看一下基本語法
    然而這邊已假設您已經看過上述網頁 這邊引用文章裡的重要語法來說明
    有礙於篇幅,只能針對重點來說明:
    Linux QoS 的佇列規則有兩種:CBQ,HTB
    CBQ (Class Based Queueing) 的設定比較複雜,但可設定的東西較多,彈性較大
    HTB (Hierarchy Token Bucket) 是 CBQ 的改良版 ,設定較精簡,效能也比 CBQ 來的好
    所以以下步驟是以 HTB 為主。
    Linux QoS 過濾器有兩種:u32,fw
    u32: 設定比較複雜,需懂封包結構,才有辦法設定
    fw:fw 是靠 iptables 給封包貼標籤,設定比較簡單
    所以以下步驟是 fw 為主。
    另外您要對iptables 也要稍為有一些概念
    iptables 指令:
    Linux 負責防火牆功能的,是一個叫 NetFilter 的模組,而 iptables 就是用來設定 NetFilter 模組的指令。
    tc 指令:
    Linux 負責QoS (頻寬管制) 功能的,是一個叫 Traffic Control 的模組,而 tc 就是用來設定 Traffic Control 模組的指令。
    以下所有的編輯內容將會透過shell script來完成
    這樣除錯也方便,不是嗎! ^^
    (底下盡可能將在實作上遇到的一些轉換即路由封包的來源原理透過比較白話的方式表達)
    實作開始:
    筆者家中網路環境是:中華電信 8M / 640K
    先了解一下單位數
    ADSL 的頻寬單位,是 bps (bits per second)
    所以-->8M等於1024*8=8192k bps
    但因為HTB 佇列規則用的是 KByte/s
    故8 bps = 1 Byte/s
    所以8192/8=1024 kb/s
    下載總頻寬 8Mbps= 1024 KB/s
    上傳總頻寬 640kbps=80 KB/s
    接下來至
    hinet測速度網站得知大約值
    [ 5614 K bps ] (相當於 688 K bytes/sec )<--這是筆者這邊測的數據不代表你也是這個= =
    也就是說每秒最高可達688 kb(下載)當然因受距離與環境限制所以這個值還算可以接受
    我將這個平均值除以2取整數為300kb/s來當做我要Qos的總頻寬
    上載部份80/2=40kb/s
    實際規劃瓜分數據
    下載總頻寬=300kb/s
    上傳總頻寬=40kb/s
    將現有頻寬分為三塊
    1.高優先且頻寬給最多 (10:10)
    2.普通使用者(10:20)
    3.常透過Foxy將頻寬佔住的 畫分少量頻寬(10:30)
    (前者(160)為保證頻寬,後者(200)為最大頻寬)
    1.(10:10) 160~200 101
    2.(10:20) 90~150 102
    3.(10:30) 50~100 103
    原始碼/usr/local/bin/qos
    以下內容是根據上面的原則來規範
    (您必需知道的是在linux核心限制,CBQ與HTB最多能定義8層,但因包
    含最上層佇列規則,所以實施使用只能定義7層)
    #!/bin/bash
    #一開始就清除所有的佇列規則並且忽略錯誤訊息(2>/dev/null)
    tc qdisc del dev eth1 root 2>/dev/null
    #定義最頂層(根)佇列規則,並指定 default 類別編號
    tc qdisc add dev eth1 root handle 10: htb default 20
    # 定義第一層的 10:1 類別 (總頻寬)
    tc class add dev eth1 parent 10: classid 10:1 htb rate 300kbps ceil 300kbps
    # 定義第二層葉類別(rate 保證頻寬,ceil 最大頻寬,prio 優先權)
    tc class add dev eth1 parent 10:1 classid 10:10 htb rate 160kbps ceil 200kbps prio 0
    tc class add dev eth1 parent 10:1 classid 10:20 htb rate 90kbps ceil 150kbps prio 1
    tc class add dev eth1 parent 10:1 classid 10:30 htb rate 50kbps ceil 100kbps prio 2
    #------定義各葉類別的佇列規則---------------
    #parent 類別編號,handle 葉類別佇列規則編號
    #因上面已經用htb來頻寬管理了故後面用簡單無qos的佇列規則piffo即可
    tc qdisc add dev eth1 parent 10:10 handle 101: pfifo
    tc qdisc add dev eth1 parent 10:20 handle 102: pfifo
    tc qdisc add dev eth1 parent 10:30 handle 103: pfifo
    #---------------set filter--------------------------
    #FW可以依標籤將封包分類
    #指定貼有 10 標籤 (handle) 的封包,歸類到 10:10 類別,以此類推
    tc filter add dev eth1 parent 10: protocol ip prio 100 handle 10 fw classid 10:10
    tc filter add dev eth1 parent 10: protocol ip prio 100 handle 30 fw classid 10:30
    #---------------set iptables mangle-----------------
    #利用防火牆將封包貼上標籤
    iptables -F -t mangle
    iptables -t mangle -A POSTROUTING -d 192.168.1.99 -j MARK --set-mark 30

    大致上是這樣子,設定完記的為qos檔加上執行權限
    chmod 700 /usr/local/bin/qos
    接下來,開機要執行將qos檔加入/etc/rc.local裡就可以摟!
    如果要測試可以打source qos 或 . qos都可以唷 兩張方式
    然後用tc qdisc 觀看結果
    筆者測試方式是先用
    wget ftp://ftp.adsl.hinet.net/test_100m.zip
    此檔為
    中華電信網站
    所提供測試網站的檔案(下載速度測試,檔案大小 100 MB)
    測試電腦ip為192.168.1.99

    root@ubuntu # wget ftp://ftp.adsl.hinet.net/test_100m.zip
    ==>SYST...done.  ==> PWD...done.
    .....
    11%[             ]7,652,144   623.70K/s

    第一次測試差不多500~650kb左右 然後. qos 載入我剛打好的指令稿
    在跑一次

    root@ubuntu #source qos(秉持著沒有消息就是好消息的原則)成功載入
    root@ubuntu # wget ftp://ftp.adsl.hinet.net/test_100m.zip
    ....
    9%[             ]7,652,144   94.70K/s

    實際測試速度果然在控制範圍之內100kb之內
    這是因為上面我們定義mark 30的保證頻寬50kbps最大頻寬為100kbps
    保證一定在50以上但不會超過100,但這是因為Mark10與20都沒有人在下載東西
    你要注意Mark 30的優先順序是2(越小優先權越高),如果10與20都有電腦在抓東西
    那麼肯定30這台電腦絕對跑不到94.70應該就在50左右,頻寬會優先分給prio為0的電腦唷!

    另外來解釋一下這一行 為什麼是下載是POsTROUTING 而不是PREROUTING
    iptables -t mangle -A POSTROUTING -d 192.168.1.99 -j MARK --set-mark 30
    這邊會一併解釋下載與上傳的原理
    因為是透過NAT加兩張網卡,一張對內(eth1)一張對外(ppp0)
    故會用到兩種串鍊(chains)
    正常NAT架構是
    封包進來>(PREROUTING)>(INPUT)>本機電腦
    封包出去<(POSTROUTING)<(OUTPUT)< 本機電腦

    先要有一個概念就是內部電腦不管下載或上傳都是外送流量到nat主機上
    內部電腦(pc)下載的解釋:
    pc向internet請求封包(可想成在瀏覽網頁突然要下載東西)然後nat主
    機收到將封包傳給eth1(eth1在將封包外送給pc)所以下載就是eth1的
    外送流量,既然是將封包送出去所以當然是用(POSTROUTING)這個鍊摟!
    內部電腦(pc)上傳的解釋:
    假設內部有架設web Server,路人甲上網瀏覽透過你的網站下載了一個檔
    案,即是外網向PC請求封包,在封包進入對外PPP0介面時即透過PREROUTING
    轉向內部在透過PPP0外送流量給外網。
    所以上傳是設定在PPP0此介面,以下將會介紹如何頻寬管制(上傳篇)

    頻寬管制上傳實作設定:
    上傳總頻寬為40kb
    這邊一樣分成三塊
    佇列規則根為40: (自取名稱)
    1.(40:10)101 高優先且頻寬給最多
    2.(40:20)102 普通使用者
    3.(40:30)103 濫用網路的使用者
    這邊只基本的將要限至上傳的葉類別分成三塊

    原始碼/usr/local/bin/qosppp
    #!/bin/bash
    #一開始就清除所有的佇列規則並且忽略錯誤訊息
    tc qdisc del dev ppp0 root 2>/dev/null
    #定義最頂層(根)佇列規則,並指定 default 類別編號
    #default就是當沒有任何來源被指定標籤就會套用這個Default 20
    tc qdisc add dev ppp0 root handle 40: htb default 20
    # 定義第一層的 10:1 類別 (上傳總頻寬)
    tc class add dev ppp0 parent 40: classid 40:1 htb rate 40kbps ceil 40kbps
    # 定義第二層葉類別(rate 保證頻寬,ceil 最大頻寬,prio 優先權)
    tc class add dev ppp0 parent 40:1 classid 40:10 htb rate 24kbps ceil 40kbps prio 1
    tc class add dev ppp0 parent 40:1 classid 40:20 htb rate 10kbps ceil 20kbps prio 2
    tc class add dev ppp0 parent 40:1 classid 40:30 htb rate 6kbps ceil 10kbps prio 3
    #------定義各葉類別的佇列規則---------------
    #parent 類別編號,handle 葉類別佇列規則編號
    #因上面已經用htb來頻寬管理了故後面用簡單無qos的佇列規則piffo即可
    tc qdisc add dev ppp0 parent 40:10 handle 101: pfifo
    tc qdisc add dev ppp0 parent 40:20 handle 102: pfifo
    tc qdisc add dev ppp0 parent 40:30 handle 103: pfifo
    #FW可以依標籤將封包分類
    tc filter add dev ppp0 parent 40: protocol ip prio 100 handle 10 fw classid 40:10
    tc filter add dev ppp0 parent 40: protocol ip prio 100 handle 20 fw classid 40:20
    tc filter add dev ppp0 parent 40: protocol ip prio 100 handle 30 fw classid 40:30
    #利用防火牆將封包貼上標籤
    iptables -t mangle -A PREROUTING -s 192.168.3.11 -j MARK --set-mark 10
    iptables -t mangle -A PREROUTING -s 192.168.1.12 -j MARK --set-mark 30

    一樣將原始碼/usr/local/bin/qosppp 加在/etc/rc.local裡讓開機載入!
    實作完成後來透過內部的HTTP SERVER測試一下 以192.168.1.12 來測試
    透過外網來抓取內部的檔案就等於是192.168.1.12這台http server的上傳
    果然在實測部份每秒的傳輸速度都控制在6~10kb/s左右
    以上規則您可以照您的需求來變更~

    轉載自: http://ms2.chshs.tpc.edu.tw/blog/index.php?op=ViewA

    2010年8月22日 星期日

    Mac 鍵盤上尋找 Windows 按鍵


    Mac 鍵盤的鍵,有很多功能是與 Windows 鍵盤的鍵功能相同,但是它們的名稱不同。以下是其中一些:
    Windows 鍵
    Mac 鍵
    用途
    Alt
    Option
    輸入特殊字元,如 é。
    Control
    Command (⌘)
    執行動作或快速鍵。例如,按下 ⌘ + S,通常會儲存文件或檔案。
    Num Lock
    Num Lock
    Shift + Clear
    在某些應用程式中,控制是否按下數字鍵盤的按鍵來輸入數字或移動游標。
    Scoll Lock
    Control + F14
    在某些應用程式中,控制是否按下方向鍵來移動游標或在視窗中捲視。
    Print Screen
    ⌘ + Shift + 3
    ⌘ + Shift + 4
    拍攝螢幕照片。⌘ + Shift + 3 會擷取整個螢幕的畫面。⌘ + Shift + 4 會擷取您螢幕所選區域的畫面。

    2010年8月21日 星期六

    設定HDMI聲音輸出 (For Windows XP )

    設定HDMI聲音輸出
    Step 1 : 到[裝置管理員]查看是否有[ATI HDMI Audio]這一項, 用Driver CD重新安裝[ATI HDMI Driver]
    Step 2 : 按[開始]選[控制台]
    Step 3 : 選[聲音, 語音, 和音訊裝置]
    Step 4 : 選[聲音及音訊裝置]
    Step 5 : 在[聲音及音訊裝置 內容]
    1.選[音訊]
    2.選[Realtek HDA HDMI Out]
    3.按[確定]
    這樣就可以用HDMI聲畫同步輸出, 如果HDMI作音效輸出, 主板後方的音效插孔就會沒有作用, 不能輸出音效.
    HDMI output DTS

    2010年8月19日 星期四

    Linux burn ISO images to Cds and CD-RWs howto

    Linux comes with various GUI and command line application to burn ISO images to CDs/CD-RWs. Cdrecord is command line based application used to record data or audio Compact Discs on an Orange Book CD-Recorder or to write DVD media on a DVD-Recorder i.e. it can brun ISO images.

    Find out your CDR/W SCSI address/device name

    Scan all SCSI devices on all SCSI busses and print the inquiry strings with –scanbus option. This option may be used to find SCSI address of the CD/DVD-Recorder on a system:
    # cdrecord -scanbus
    Output:
    Cdrecord-Clone 2.01a34 (i686-pc-linux-gnu)
    Copyright (C) 1995-2004 Jrg Schilling
    scsidev: 'ATA:'
    devname: 'ATA'
    scsibus: -1 target: -1 lun: -1
    Warning: Using badly designed ATAPI via /dev/hd*
    interface.
    Linux sg driver version: 3.5.27
    Using libscg version 'schily-0.8'.
    scsibus1:
    1,0,0 100) 'SONY' 'CD-Writer' '1.0g'
    1,1,0 101) *
    1,2,0 102) *
    1,3,0 103) *
    1,4,0 104) *
    1,5,0 105) *
    1,6,0 106) *
    1.7.0 107) *
    In above example, my device name is 1,0,0. Now again use the cdrecord command to burn ISO image:
    # cdrecord -v -dao dev=1,0,0 file.iso
    You can also specify burning speed:
    # cdrecord -v -dao dev=1,0,0 speed=8 file.iso

    See also:

    2010年8月18日 星期三

    cbrowser

     

    Cbrowser is a graphical C/C++ source code searching and browsing tool, and a hierarchical function call viewer.
    Cbrowser is a front end to the popular source code indexing and querying program cscope. It is also designed to work with the free alternative to cscope called cs. This can be obtained at ftp://cantor.informatik.rwth-aachen.de/pub/unix/.
    Both of these tools have text based user interfaces, and have limited file viewing capabilities. Cbrowser provides a full featured file browser with syntax highlighing and full text searching.
    Cbrowser helps manage the recursive process of searching through source code for usages by providing a history mechanism. Every query is recorded and can be recalled at any time, without the need of re-querying the database.
    Cbrowser allows you to build and use multiple source code databases for individual software projects. Switching databases is as simple as selecting the file, and a history of all databases used is kept at all times.
    Best of all, cbrowser provides a hierarchical function viewer. Functions may be expanded and contracted to show or hide the functions they call. The function's code itself is shown in an adjoining viewer. This feature is implemented using the megawidget Library by Jeff Hobbs which luckily for me comes with an unrestricted license.


    http://sourceforge.net/projects/cbrowser/

    2010年8月17日 星期二

    vim 的取代置換功能「s」

    vim-logo.gif在 前面我們所談的那些可以說是比較基本的東西,但是對於一份文件來說,光有前面所介紹的游標移動、刪除等等功能是不足夠的。面對一份文件我們通常會因為某些 緣故而使得我們必須去修改當中固定出現的字串樣式(pattern)成我們想要的樣子。最常遇到的就像中文文件的標點符號問題,或是 un*ix 和 DOS 文件格式之間轉換常會有個 ^M 結尾會讓人覺得很討厭,又或是我們想要把一份 HTML 格式的文件去除掉它的 HTML tag。
    對於這些事情來說,拿中文標點符號置換這個很多編輯器都做得到,簡單地說如果想更動的 pattern 是一個固定的字串,那對於一般編輯器來說都不會太困難,但是對於具有固定格式,但字串內容卻不一定的該怎麼辦?就像要去掉 HTML 格式中的所有 HTML tag?這就是 vim 開始大顯身手的地方了。

    今天我們不談別的其他指令,就光談在 vim 中的「 :s 」指令。小寫 :s 表示置換(substitute)的意思,不過通常你用 vim 下 :h :s 指令的時候會看到這樣的畫面:
    vim help for :s substitute
    其實這一串東西就是在說 :s 這個指令的格式要怎麼下。
    Range:
    一般對於整份文件都要作置換的話,我都會下像這樣的指令:
    :%s/, /,/g
    最前面的「%」就是表示全域,也就是現在編輯的這一份文件都要作後面取代的工作。那這個指令就是說要把半形的逗點「,」變成全形「,」。那後面 「g」又代表什麼意思呢?在 g 這個欄位上的東西是用來表示對目前這個指令所做的額外的選項。就拿 g 來說, g 代表在文件中每一個出現的半形逗點都要置換成全形。或許你會問剛剛不是已經用「%」表示全域了嗎,怎麼又要用 g 呢?我應該這樣說,「%」用來表示從文件的第一行到最後一行。但是在比對(match)的時候,如果不加「g」這個額外選項的話, vim 只會把每一行比對到的第一個作取代,同行其他也 match 到的就不管了。所以用「g」表示每一行中每一個比對到的都要置換。
    所以同理,如果你要把那些因為 un*ix 和 DOS 之間格式不合所造成的^M消掉的話,也只需要下成這樣就可以了:
    :%s/^M//g
    可是有時候你想要作置換的只是文件中的某一部份的話怎麼辦?不要緊,還記得選取模式嗎?在你想置換部分的開頭按下大寫「V」然後用移動游標(我們之前講的 vim 移動游標的方法在選取模式下都可以用)到你想要的位置之後按「:」就會跳到輸入指令的狀態,如下圖最下面那行看到的一樣:
    vim selection for substitute
    當然你很確定行數,你也可以這樣下:
    :1,300s/vim/VIM/g
    或者是如果你很確定要從現在游標所在行之後的所有行都置換,可以下成:
    :.,$s/vim/VIM/g
    冒號一開頭的那一小點「 . 」就代表游標現在所在行,「$」則用來表示最後一行。
    或許聰明的你已經想到怎麼樣可以從現在所在行之前的都要置換了,
    :.,1s/vim/VIM/g
    不過當你這樣打的時候, vim 會跳出來一個訊息:
    Backwards range given, OK to swap (y/n)?
    這就是說你給了一個起始行數比結束行數還要大的範圍。這是因為 vim 所定的範圍都是從小到大,如果你要從大到小不是不行,只是多個訊息確認你沒有打錯罷了。
    Pattern:
    像前面說,固定字串像把半形逗點換成全形逗點這都還容易,如果只是格式固定,但是字串內容會變動怎麼辦?就像去 HTML tag 的時候就很麻煩。
    還記得我們在淺談vim那時候提過的指令嗎?
    • :%s/\n/^V/g
    • :%s/《[^<》]*>//g
    • :%s/^V/\n/g
    在中間的那一些 [^<>]*看起來像外星文字的,就是 pattern 比對的主力。事實上關於這些東西,我們在談 vim 的 search 搜尋功能的時候也有提到過一些。所以我們今天就來補一些上次沒有講到的東西。
    假如我現在有一筆人名、電話的資料,由於是隨手記的,上面自然就是沒有排序過。那沒排序過對於想要在上面找資料的人就很麻煩。萬一人名記不太清楚, 電話號碼也記得七七八八,雖然說有 vim 方便的 search 功能,但總是感覺不足。(當然這只是假設情況,因為實際上可能大家都已經建立某種方便搜尋的資料庫了)
    我們先假設人名、電話的對應長成這樣:
    趙大明  1235478982
    錢小名  1223450012
    王孫李  5938123812
    周渚衛  1384914191
    沈以情  2345934981
    那我可不可以讓它變成這樣子?
    1235478982   趙大明
    1223450012   錢小名
    5938123812   王孫李
    1384914191   周渚衛
    2345934981   沈以情
    我可以下這樣的指令完成這個工作:
    :%s/\([^0-9]\{1,}\)\([0-9]\{1,}\)/\2 \1/g
    前面橘色的部分 \([^0-9]\{1,}\) 用 \( \) 括起來的,表示這是一個的單元,之後就可以依照它出現的順序而使用 \1 \2,… ,來代表它。所以我們可以看到 [^0-9] 就表示非數字的部分,後面的\{1,} 如果你還記得的話,就是代表出現至少一次。不過這個時候DK長輩會跟你說用 vim 要文明一點,要用「\+」來代表至少出現一次。看個人喜好了,如果你願意多記一些代替的符號就多記一點,你可以用 :h /multi 看到更多這些替代符號。
    所以把 pattern 用 \( \) 分開之後,我們就可以用 \1,\2 來把他們交換位置。
    不過你可能會說這樣還沒排序啊。我們可以用選取模式把整份文件選起來,或是你懶得用上下左右改變,你可以用 ggVG (gg 跳到第一行之後,用大寫V進入選擇模式,以大寫G跳到最後一行)把整份文件選起來之後按 :!sort,這時候在你 vim 視窗的最底下就會變成這樣:
    :’《,’》!sort
    下去就會變成根據每一行的最前頭作排序的結果。所以結果就會變成:
    1223450012   錢小名
    1235478982   趙大明
    1384914191   周渚衛
    2345934981   沈以情
    5938123812   王孫李
    很簡單吧? :p
    如果你願意配合暫存器( registers )的話,有時候也能省點力氣。在講 vim search 的時候,我們曾經提了用 搭配數字鍵 0 來把暫存器 0 的東西叫出來。同樣的,我們不管用 / 或是 ? 等等輸入字串的時候,事實上都已經把要搜尋的字串寫入「/」的暫存器裡面,所以當我們只是想置換的字串就是搜尋的字串的話,我們可以這樣做:
    :%s//用來取代的字串/g
    表示在按 之後按下「/」這個按鍵。這樣就可以把搜尋的字串叫出來並用之於置換指令上。
    額外指令
    我們剛剛在前面談到可以作像「g」這些的額外控制。那有哪些控制可以作呢?
    比方說在我們作置換的時候,由於 vim 預設是有大小寫的差別,如果你不管大小寫都要取代的話,那可以用「i」這個額外參數來控制 vim 取代的時候就不管大小寫都會作取代的工作。
    不過有時候,我們可能不太能確定是不是整份文件中的每一個都要取代,那我們就可以加「c」 confirm 確認參數來控制,那使用上也很容易。 vim 會在比對到之後問
    (y/n/a/q/l/^E/^Y)?
    • y 是代表執行目前的取代。
    • n 是跳過。
    • a 代表 always ,就是從目前以後的取代都會執行。
    • q 則是不要作取代,並且離開詢問要不要取代的狀態,並回到指令模式或原來的模式下。
    • l 則是 last 的意思,就是目前這個取代執行後就離開詢問的取代模式,回到指令模式或原來的模式下。
    • ^E 表示往前一頁。
    • ^Y 表示往後一頁。
    對於 :s 的用法到這裡我們就已經把常用的幾個方式都說完了。礙於篇幅,我也決定先寫到這裡就好,不然寫一大篇,可能連有興趣進來瞭解 vim 的人光看到就害怕了,怎麼還有辦法體會 vim 的好呢?其實關於 :s 的用法,還有 pattern 還有很多的方式在本篇中沒有提到,你可以在 vim 中用 :h :s 看到更多詳細的資料。今天就來 vim 吧!

    from http://greenisland.csie.nctu.edu.tw/wp/2005/09/02/302/
    -----------------------------------------------------------------------------------------------------------------------------------------

    vi/vim 中可以使用 :s 命令來替換字串。該命令有很多種不同細節使用方法,可以實現複雜的功能,記錄幾種在此,方便以後查詢。

    :s/vivian/sky/ 替換當前行第一個 vivian 為 sky

    :s/vivian/sky/g 替換當前行所有 vivian 為 sky

    :n,$s/vivian/sky/ 替換第 n 行開始到最後一行中每一行的第一個 vivian 為 sky

    :n,$s/vivian/sky/g 替換第 n 行開始到最後一行中每一行所有 vivian 為 sky

    n 為數字,若 n 為 .,表示從當前行開始到最後一行

    :%s/vivian/sky/(等同於 :g/vivian/s//sky/) 替換每一行的第一個 vivian 為 sky

    :%s/vivian/sky/g(等同於 :g/vivian/s//sky/g) 替換每一行中所有 vivian 為 sky

    可以使用 # 作為分隔符號,此時中間出現的 / 不會作為分隔符號

    :s#vivian/#sky/# 替換當前行第一個 vivian/ 為 sky/

    :%s+/oradata/apras/+/user01/apras1+ (使用+ 來 替換 / ): /oradata/apras/替換成/user01/apras1/

    1.:s/vivian/sky/ 替換當前行第一個 vivian 為 sky

    :s/vivian/sky/g 替換當前行所有 vivian 為 sky

    2. :n,$s/vivian/sky/ 替換第 n 行開始到最後一行中每一行的第一個 vivian 為 sky

    :n,$s/vivian/sky/g 替換第 n 行開始到最後一行中每一行所有 vivian 為 sky

    (n 為數字,若 n 為 .,表示從當前行開始到最後一行)

    3. :%s/vivian/sky/(等同於 :g/vivian/s//sky/) 替換每一行的第一個 vivian 為 sky

    :%s/vivian/sky/g(等同於 :g/vivian/s//sky/g) 替換每一行中所有 vivian 為 sky

    4. 可以使用 # 作為分隔符號,此時中間出現的 / 不會作為分隔符號

    :s#vivian/#sky/# 替換當前行第一個 vivian/ 為 sky/

    5. 刪除文本中的^M

    問題描述:對於換行,window下用回車換行(0A0D)來表示,linux下是回車(0A)來表示。這樣,將window上的檔拷到unix上用時,總會有個^M.請寫個用在unix下的過濾windows文件的分行符號(0D)的shell或c程式。

    。 使用命令:cat filename1 | tr -d “^V^M” > newfile;

    。 使用命令:sed -e “s/^V^M//” filename > outputfilename.需要注意的是在1、2兩種方法中,^V和^M指的是Ctrl+V和Ctrl+M.你必須要手工進行輸入,而不是粘貼。

    。 在vi中處理:首先使用vi打開檔,然後按ESC鍵,接著輸入命令:%s/^V^M//.

    。 :%s/^M$//g

    如果上述方法無用,則正確的解決辦法是: [Page]

    。 tr -d \"\\r\" < src >dest

    。 tr -d \"\\015\" dest

    。 strings A>B
    6. 替換確認
    我們有很多時候會需要某個字元(串)在文章中某些位置出現時被替換,而其它位置不被替換的有選擇的操作,這就需要使用者來進行確認,vi的查找替換同樣支持
    例如
    :s/vivian/sky/g 替換當前行所有 vivian 為 sky
    在命令後面加上一個字母c就可以實現,即:s/vivian/sky/gc
    顧名思意,c是confirm的縮寫

    7. 其它

    利用 :s 命令可以實現字串的替換。具體的用法包括:

    :s/str1/str2/ 用字串 str2 替換行中首次出現的字串 str1

    :s/str1/str2/g 用字串 str2 替換行中所有出現的字串 str1

    :。,$ s/str1/str2/g 用字串 str2 替換正文當前行到末尾所有出現的字串 str1

    :1,$ s/str1/str2/g 用字串 str2 替換正文中所有出現的字串 str1

    :g/str1/s//str2/g 功能同上

    從上述替換命令可以看到:g 放在命令末尾,表示對搜索字串的每次出現進行替換;不加 g,表示只對搜索

    字串的首次出現進行替換;g 放在命令開頭,表示對正文中所有包含搜索字串的行進行替換操作

    (原文地址: http://wzgyantai.blogbus.com/logs/28117977.html)

    Windows和Linux文件共享新的途徑:Dokan

    一、Dokan Library
      如果您想在Windows系統上創建一個新的文件系統的話,例如:改進FAT或NTFS文件系統,您就需要自己開發一個文件系統驅動。 在Windows系統上開發工作在內核模式的設備驅動程序是一件極為困難的事情。 使用Dokan庫(Dokan Library),您可以非常方便地創建自己的文件系統而不需要編寫設備驅動程序。 Dokan庫類似於Linux下的FUSE用戶空間文件系統,但是它工作在Windows下。
      Dokan庫包含一個用戶模式的DLL文件(dokan.dll)以及一個內核模式文件系統驅動(dokan.sys)。 Dokan文件系統驅動一旦安裝,您就可以在Windows上創建和普通文件系統一樣的文件系統。 使用Dokan庫創建的文件系統的應用程序稱為文件系統應用程序。 來自用戶程序的文件操作請求(例如:CreateFile,ReadFile,WriteFile等)將被發送的Windows輸入/輸出子系統(運行在內核模式),請求之後將被發送到Dokan文件系統驅動程序(dokan.sys )。 通過使用Dokan用戶模式庫文件(dokan.dll)提供的函數,文件系統應用程序能夠向文件系統驅動程序註冊回調函數。 文件系統驅動程序在收到請求後調用註冊的回調函數例程來響應請求。 回調函數例程的處理結果將返回給用戶程序。 例如:當Windows資源管理器請求創建一個目錄,請求“OpenDirectory”將發送到Dokan文件系統驅動程序,然後驅動程序將調用文件系統應用程序提供的OpenDirectory回調函數例程。 函數例程的處理結果作為OpenDirectory請求的響應返回給Windows資源瀏覽器。 如此一來,Dokan文件系統驅動程序就如同一個位於用戶程序和文件系統程序之間的代理程序。 使用Dokan庫的好處是,它允許程序員開發更安全也更容易調試的用戶空間文件系統。
    二、Dokan SSHFS
      SSHFS(SSH文件系統)是一個文件系統客戶端程序,使用它可以將遠程服務器上的目錄掛載在本地直接訪問。 先前的版本用於輸出SFTP提供的目錄和文件,而當前的版本主要用於安裝有FUSE的系統上。 在用戶訪問服務器資源的過程中,數據通過SSH加密傳輸,安全而高效。
      Dokan是FUSE的Windows實現,使用Dokan SSHFS可以將Linux服務器上的目錄以網絡盤的形式掛載到本地使用,類似於Samba。 要使用Dokan SSHFS需要首先安裝Dokan Library,它們可以在Dokan官方網站下載。

    2010年8月15日 星期日

    汽車電池概述

    目前主要的汽車生產地區為北美、亞洲以及歐洲,在這三個主要地區,都自行制定了一套汽車電池的規範,將尺寸以及性能等級規格化.而這三個主要地區所生產的車輛,皆不分母廠品牌,於車型設計時以及組裝時即考慮到當地地區的制定的電池規範,選擇適用型號作為標準組車零件,例如北美生產製造的TOYOTA Camry及Corolla車型,雖母廠為日系,卻使用ACDelco美規電池為其標準組車零件。


    不論美規或日規或歐規電池,在規範上有主要是針對下列幾點做為區分:


    1.電極樁頭(正負極)方向位置及大小。

    2.尺寸(長寬高)。

    3.性能等級(RC/CCA/CA/AH….)。


    在這裏我們以美規、日規料號來讓讀者從料號就可解讀電池的規格:


    1.美規 - 在台灣經常使用的料號為24-6MF/35-6MF/58-6MF/65-6MF/75-6MF。前面二個數字為電池族類(group),後面MF前的數字為等級。每一族類都被賦予制定的長寬高尺寸,也就是說相同尺寸的電池可以有不同性能等級差異。例如35-6MF性能就要比35-5MF來得好,當然價格也就高上一些。比較特別的是75-6MF的電極樁頭位置是設計在電池側邊,配合車輛整體設計。


    2.日規 - 日規電池料號的制定上,亦有其一定的方式。以55B24L為例,"55"為電池的性能等級,"B"為制定的寬度與高度尺寸(約134mm x 225mm),"24"為電池長度(單位公分),"L"為電極樁頭正極的位置方向在右邊。因此,從55B24L這個型號即可瞭解到它的尺寸約為240mm x 134mm x 225mm(長x寬x高)、正極在右(樁頭位置朝上)。


    同時在電池正面,我門還可以看到標示出的性能等級,一般都以RC、CCA、CA、AH做為國際性的測定標準。為使讀者能更深入瞭解這些測定標準的意義,進而解讀你車上所安裝或購買的新電池上性能等級,我們也一一說明這些標準的規範。


    1.RC - Reserve Capacity儲備能量

    儲備能量單位為分鐘。當車輛在發電機失效之後,維持車輛運轉及行駛的所有用電包含冷暖氣、大燈、車窗除霧、雨刷及引擎點火系統等等都是由車上的電池來供應。在北美高緯度地區,溫度相對較台灣來得低,再加上每個城鎮之間距離遙遠,若是在人煙稀少的途中發電機失效,汽車電池又無法維持一段時間的電源供應的話,後果將可想而知。因此國際電池協會(BCI)將此一情形考量後,設計RC標準,簡單來說,若您的電池上標明RC為110MIN,表示您的電池可以在發電機失效下讓車輛繼續行駛110分鐘。


    2.CCA - Cold Cranking Ampere冷啟動電流
    冷啟動電流單位為安培。一般車輛,尤其是車齡過久的車,往往打馬達時無法順利啟動引擎,必需維持數秒以上或第二次啟動。其實在啟動引擎時是電池電量消耗最多的時後,短時間大電流輸出的瞬間,電池的電壓可以從正常的12.5V下降至10.5V甚至以下。愈大的冷啟動電流對這種啟動不順的情形會有較大的幫助。


    3.CA - Cranking Ampere啟動電流

    其主要意義與CCA類似,單位同樣為安培,唯一與CCA差異的是測定時之溫度。CCA是在攝氏零下17.8度環境下所得出的結果,CA則是在攝氏零度環境下所得出的結果。若同一個電池上同時標示CCA及CA,CCA的數值會比CA來得低,因為溫度愈低,電池的表現會愈差。


    4.AH - Ampere Hour安時

    為日本工業標準(JIS)所制定的標準。簡單的說,電池的電壓維持在10.5伏特以上且以一個固定的安培數放電能維持20小時,此一固定安培數乘以小時數即為安培小時。例如以20小時固定5安培放電,則電池的安培小時數為100。


    雖然每個測定標準都有一個數值,但電池的實際性能表現是根據實際的使用狀況及環境而有所不同。各種客觀因素如環境溫度、濕度、設計或駕駛人用車習慣都會影響。因此,這些測定結果都只是作為制定電池規範的依據及評定電池性能的等級,以及車廠設計車輛時選定規格的參考。選用正確規格的電池及正確的使用才是駕駛人應該注意的地方。


    電瓶資訊補充!!

    DIN:Deutehe fndustri Normen,在過液0℃在一定負載下速續30秒經由電壓9V或連續150秒終止電壓6V。
    BCI: Bettry Council fnternational過度0℃下或(20℃)在一負載下,速續30秒終止電壓7.2V以上。
    IEC:International Electiotechnical 在0℃下(-18℃)在一負載下建續60秒終止電壓在6V以上。
    BSR: British Stondaids Rate 在溫度0℃(-18℃)在一定負載下連續180秒,終止電壓在6V以上。

    電池的不同定義方式:電池由溫度、電壓和電流(放電)來決定。
    依照SAE(Society of Automo tive Engineeers)規定而製成並由BC2(BCI)作成RC(Resevve Capacity)CCA(Cold Cranking Amperes)來定義電池規範。

    CA: Crarkiy Amperes(BCI ratiy)充飽電池電池在過液32(℃)連續30秒在一定的負載下終止。
    RC: Reserre Capaciz,在80℉,25內負載下終止電壓在10.5V,可維持時間(以分鏡計)。
    CCA:Cold Crankiy Amperes,在0℉(-18℃)以一定負載下速供30秒經由電壓在7.2V以上所得數據。
    AH: Ampere Hour(20hr rate),以一個20hr rate 100AA的電池在負載5A可維持20小時(100AA/20 =5A),經由電壓10.5V,溫度80℉。
    MCA: Merine Crankriy Amps,在0℃(32℉)速續30秒終止電壓在10.5V以上在一定負載下

    2010年8月11日 星期三

    Concurrent Programming

    何謂 Concurrent Programming ??

    所謂的 Concurrent Programming 簡單的講就是一個多工的程式, 這種形式的程式設計有個好處就是當程式 Block 的時候,程式還能 繼續做其他的事,通常 Block 的情況最常發生於網路程式或是一些和 I/O 做處理的程式,一般 Concurrent Programming 最常用的方法就是 用 fork() 還有 thread 這兩種功能,下面將討論這兩種方法。

    關於 UNIX 下的 fork()

    在 UNIX 中有所謂的 fork() 功能,這個功能主要目的是產生兩個 一模一樣的 process 在電腦中同時執行,藉由這種方法可以做出 Concurrent Programming 的效果,這種方法在 UNIX 一直都被廣泛的應用在各種不 同的應用程式上。
    
    #include &ltstdio.h>
    
    void main(void)
    {
      int pid,i;
    
      pid = fork();
      if (pid == 0) {
         for (i=0;i<44;i++) {
           printf(" I am a child process I say %d\n",i);
           sleep(1);
         }
         exit(1);
       }
      else if (pid > 0) {
         for (i=0;i<40;i++) {
           printf(" I am a parent process I say %d\n",i);
           sleep(1);
         }
      }
      else if (pid < 0)
     printf(" Sorry .....I can't fork my self\n");
    }
    上面就即是一個簡單的 fork() 用法,執行上面的程式後, 可以藉由印出的字串看到多工的效果,fork() 還可配合 exec() dup() pipe() 做出和外部程式結合使用的效果。再來就解釋一下 fork() 是怎麼動作的:
    原來的 process
       +---------+
       |  Data   |
       +---------+
       |  Code   |---> PC
       +---------+
    
      執行 fork() 之後
    
      原來的 process                    fork 出來的 process
       +----------+  複製 Data Code 到     +----------+
       |  Data    | ===================>  |   Data   |
       +----------+                       +----------+
       |  Code    |---> CP = CP+1;        |   Code   |----> CP = CP+1
       +----------+                       +----------+
    由上圖可以看出原來的 process 和 fork 出來的 process 不論是變數、程式 碼都是一模一樣的,唯一不同的是 fork() 的返回值,parent process 的返回值 是 child process 的 PID ,而 child process 的返回值是 0 ,因此在程式實 作上就以 fork() 的返回值來判斷那一個是 parent 那一個是 child 。

    關於 thread

    thread 是最近較為流行的一種趨勢,thread 可分為兩種:user-level 和 kernel-level,這兩種方法各有其優缺點,以下是他們的比較:
    
    The advantages of kernel-level threads over user-level threads are:
    
    - supports multiprocessors;
    
    - possibly smoother scheduling, since the same scheduler (the kernel's)
      handles both threads and other Unix processes;
    
    - no special action needed to make blocking system call suspend only
      the calling thread, not all threads of the process (user-level
      threads usually rely on a combination of select() and jacketing of
      C library functions for system calls);
    
    - as a consequence of the above, more efficient I/O and
      timer-based operations (no need for extra select() and gettimeofday()).
    
    The disadvantages are:
    
    - more expensive context switches between threads, at least when blocking
      on conditions and mutexes;
    
    - thread creation is more expensive.
    
                                                            --- 引自 LinuxThreads --
    由上面的比較可以清楚的發現 kernel-level 是一個比較好的選擇, 也算是發展的趨勢吧,下面舉個在 Solaris 下的 thread 範例:
    
    #define _REENTRANT
    #include &ltthread.h>
    #include &ltstdio.h>
    #include &ltstdlib.h>
    
    #define         NUM_THREADS     10
    #define         SLEEP_TIME      10
    
    void    *sleeping(char *);
    int     i;
    thread_t        tid[NUM_THREADS];
    
    void main(int argc,char *argv[])
    {
            for (i=0;i&ltNUM_THREADS;i++)
                    thr_create(NULL,0,sleeping,"4",0,&tid[i]);
            while (thr_join(NULL,NULL,NULL) == 0)
                    ;
            printf("main() reporting that all %d threads have terminated\n",i);
    }
    
    void *sleeping(char *sleep_time )
    {
            printf(" thread %d sleeping %d seconds\n",thr_self(),atoi(sleep_time));
            sleep(atoi(sleep_time));
            printf("\n thread %d awakening\n",thr_self());
    }
    compile 的時候記得要加 -lthread 以這個程式和上面 fork 中所舉的例子來做 比較可明顯的發現 thread 所佔用的 Memory 較少,另外需要注意的一點是,thread 和 fork 是可以結合使用的,結合使用時可分為兩種:一種是 fork 的時候將 parent process 全部複製;另一種是只有複製 parent process 中呼叫 fork() 的 thread。

    2010年8月9日 星期一

    Microsoft® Windows® 惡意軟體移除工具

    一般如果你有安裝正版的Vista 或是XP , 而且有開啟自動更新功能時,你會發現他會自動下載一個叫做Microsoft® Windows® 惡意軟體移除工具的軟體! 當他安裝好之後你卻不曾看過他執行!

    要如何使用微軟提供的這的工具呢?

    很簡單,你只要到 開始->執行 ,然後鍵入"MRT"後按下確定,那麼這個工具就會被你叫出來執行了!

    from http://biosengineer.blogspot.com/2008/12/mrt-vs-microsoft-windows.html

    2010年8月4日 星期三

    用 Serial Console 管理 Linux主機

    要使主機就像一般網路設備一樣,可以在不接螢幕,鍵盤及滑鼠之下,直接透過 serial console 的連接方式來管理內部系統。當然囉!! 若你和我一樣使用超小型主機來安裝,這技巧更是不可或缺。
    首先看一下,這個超小型主機。要充分發揮它的迷你的特性,當然是不能接上螢幕/鍵盤/滑鼠,不然就遜掉。那系統管理該如何作呢?
    作過網管的人都知道,一般網路設備都只是透過一條 serial console line 連接筆記型電腦和網路設備,以終端機軟體來管理內部的系統。此篇將告訴你如何在系統上實現,而且步驟實在很簡單。
    要實現這樣的應用,事實上關鍵在於 Linux 作業系統。

    步驟一:編輯 /boot/grub/menu.lst
    在 title ..... 上方,加上

    ## Enable serial console
    serial --unit=0 --speed=9600 --word=8 --parity=no --stop=1
    terminal --timeout=10 serial console

    這行前面加上註解

    #splashimage=(hd0,1)/boot/grub/splash.xpm.gz

    找到實際開機所需的那一行,例如是

    title CentOS-4 i386-up (2.6.9-34.0.2.EL)
            root (hd0,1)
            kernel /boot/vmlinuz-2.6.9-34.0.2.EL ro root=LABEL=/1
            initrd /boot/initrd-2.6.9-34.0.2.EL.img

    在 kernel 後方加上 console=tty0 console=ttyS0,9600n8

    kernel /boot/vmlinuz-2.6.9-34.0.2.EL ro root=LABEL=/1 console=tty0 console=ttyS0,9600n8
    步驟二:編輯 /etc/inittab最下方加上這行

    # Enable serial console
    sc:2345:respawn:/sbin/agetty ttyS0 115200,9600 xterm

    步驟三: 系統預設是不予許 root 直接從 serial console 登入,這樣造成管理不是很方便,所以修改一下設定。
    編輯 /etc/securetty,最底下加上
    ttyS0
    步驟四:完成了,到這兒,主機已經可以用 serial console 登入管理。
    接著,準備一台筆記型電腦,還有自己習慣用的終端機軟體,如沒有,就用 Windows 內建的超級終端機也可,再一條 USB 轉 COM 的 console 線。設定終端機連接埠的參數為
    資料傳輸率:9600
    資料位元:8
    同位檢查:無
    停止位元:1
    流量控制:硬體
    以 serial console 方式的管理介面與 telnet 是一樣的,只是若使用 Windows 內建的超級終端機軟體,會有畫面被截掉情形,筆者推薦使用 Putty   這工具。

    耗電只要5W的超迷你IP PBX硬體

    這個硬體稱為 Plug Computer,基本規格簡述如下:
    • Marvell RISC Architecture ARM CPU(800MHz-1.2GHz)
    • DDR2 512MB RAM
    • NAND Flas 512MB
    • 可外接 SDHC/USB 儲存裝置
    • 1000/100 網路
    • 平均電源消耗 5W
    • 系統支援 Linux 2.6.x
    更詳細硬體資訊,請前往
    - http://www.ionics-ems.com/plugcomputer.html
    - http://www.globalscaletechnologies.com/t-sheevaplugdetails.aspx#extern

    How to repair and clone disk with ddrescue

      ddrescue  is a tool that can be used to repair and clone disks on a  Linux system . This includes hard drives, partitions, DVD discs, flas...