顯示具有 Linux 標籤的文章。 顯示所有文章
顯示具有 Linux 標籤的文章。 顯示所有文章

2008-12-12

[Debian] DHCP server

1. apt-get install dhcp3-server

2. Use ifconfig to check ethernet interface (ex. eth0)

3. edit /etc/dhcpd.conf

    subnet 192.168.0.0 mask 255.255.255.0 {

        range 192.168.0.100 192.168.0.200;   

    }

4. edit /etc/default/dhcp

    INTERFACE="eth0"

5. /etc/init.d/dhcp restart

 

p.s. Note that eth0's ip address must in the same subnet with the range wrote in dhcpd.conf

2008-08-12

[Network] Jumbo Frame 2

reference : Linux Configure Jumbo Frames to Boost Network Performance / Throughput

 

上一篇提到 Jumbo Frame 在 windows 上的設定,那在 Linux 上要怎麼設定呢?

 

1. 確定你的 driver 是否支援 MTU 的設定

2. 要有 Giga 網卡

3. 輸入以下指令來改變 MTU (Jumbo Frame)

# ifconfig eth0 mtu 9000

這是直接改掉的方法,如果想要永久改變的話,有幾個方法:

1. (CentOS / RHEL / Fedora Linux) 編輯 /etc/sysconfig/network-script/ifcfg-eth0

# vi /etc/sysconfig/network-script/ifcfg-eth0

新增一行 : MTU 9000

2. Debian/Ubuntu Linux 使用者在 /etc/network/interfaces 加入 MTU=9000

 

將檔案存檔並重啟網路介面:

# /etc/init.d/networking restart

要確認 MTU 是否有被成功改變,可以使用 ip 這個指令:

# ip route get {IP-address}
# ip route get 192.168.1.1

你會看到 console 輸出:

192.168.1.1 dev eth0  src 192.168.1.100
cache mtu 9000 advmss 1460 hoplimit 64



 



然而假如你想要提升應用程式的網路速度(如 NFS 或 SMB),則必須針對它們做 Jumbo Frame 的設定,否則他們依舊會以正常大小傳送封包。



 


2008-06-09

Linux Kernel Error Message

開機時看到

jffs2: Too few erase blocks (4)

表示 jffs2 的部份allocate 太少 sector (這邊是assign 4個),因為 jffs2 要留一部份自己做類似 garbage collection (GC) 的動作,故不能 assign 太小。 目前看起來至少要給 6 個 sector

pthread

 

https://computing.llnl.gov/tutorials/pthreads/

Routines:

      pthread_mutex_init (mutex,attr)

      pthread_mutex_destroy (mutex)

      pthread_mutexattr_init (attr)

      pthread_mutexattr_destroy (attr)

Usage :

Mutex variables must be declared with type pthread_mutex_t, and must be initialized before they can be used. There are two ways to initialize a mutex variable:

   1. Statically, when it is declared. For example:
      pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;

   2. Dynamically, with the pthread_mutex_init() routine. This method permits setting mutex object attributes, attr.

The mutex is initially unlocked.

# The attr object is used to establish properties for the mutex object, and must be of type pthread_mutexattr_t if used (may be specified as NULL to accept defaults). The Pthreads standard defines three optional mutex
attributes:

    * Protocol: Specifies the protocol used to prevent priority inversions for a mutex.
    * Prioceiling: Specifies the priority ceiling of a mutex.
    * Process-shared: Specifies the process sharing of a mutex.

 

Note that not all implementations may provide the three optional mutex attributes.

# The pthread_mutexattr_init() and pthread_mutexattr_destroy() routines are used to create and destroy mutex attribute objects respectively.

# pthread_mutex_destroy() should be used to free a mutex object which is no longer needed.

 

Locking and Unlocking Mutexes

Routines:

      pthread_mutex_lock (mutex)

      pthread_mutex_trylock (mutex)

      pthread_mutex_unlock (mutex)

 

Usage:

    * The pthread_mutex_lock() routine is used by a thread to acquire a lock on the specified mutex variable. If the mutex is already locked by another thread, this call will block the calling thread until the mutex is unlocked.

    * pthread_mutex_trylock() will attempt to lock a mutex. However, if the mutex is already locked, the routine will return immediately with a "busy" error code. This routine may be useful in preventing deadlock conditions, as
in a priority-inversion situation.

    * pthread_mutex_unlock() will unlock a mutex if called by the owning thread. Calling this routine is required after a thread has completed its use of protected data if other threads are to acquire the mutex for their work
with the protected data. An error will be returned if:
          o If the mutex was already unlocked
          o If the mutex is owned by another thread

Question: When more than one thread is waiting for a locked mutex, which thread will be granted the lock first after it is released?

 

Answer : Unless thread priority scheduling(not covered) is used, the assignment will be left to the native system scheduler and appear to be more or less random.

 

Proftpd

 

http://www.chinaunix.net/jh/15/247811.html

http://www.castaglia.org/proftpd/

http://www.proftpd.org/

為了讓使用者可以有多一點選擇,除了 Samba 之外,也提供了 FTP server。Proftp 也是很難 build,在 porting 上遇到不少問題。

但 ftp 跟 nfs不一樣的地方是它受到了大家的重視,也就受到較嚴格的測試。其中有幾個值得提的地方:

1. 使用者上傳檔案權限問題

描述:對於 anonymous 上傳的檔案會以 nobody 做為其 user:group,而其他人也就不會有讀寫權限的問題。但若某個user登入了自己的帳號,上傳的檔案就會以他的user:group為主,如此一來可能會造成其他人沒有讀取權限的問題。本來是用scheduling定期去將所有的檔案及資料夾的權限改為 777(-rwxrwxrwx),讓所有人

      都可以使用,但這樣一來如果檔案數量過多,會造成系統inode cache吃光所有的 memory,造成系統不穩定。

解法:
    在 proftpd.conf 中可以設定 Umask,他會在 ftp 將檔案上傳至 server時,利用此設定去計算出該檔案應有的權限設定。當設定為 Umask  0 時,所有的檔案及資料夾權限皆會是 777 (-rwxrwxrwx)。

2. 語系問題

描述:
    FTP的語系跟使用的 client有密切的關係。假使client是使用 Big5,那其他語系在顯示方面就會有問題。在NAS上預設使用的語系是 UTF-8,所以在不支援UTF-8的 client上,會有顯示及存取的問題。較新版的 proftpd有內建language module(mod_lang),他是搭配著系統的 locale 做設定,可惜在NAS上的locale尚未完成,為了先給客戶交代,只好用別的方法。

解法:
    網路上有人release一份patch,是將proftpd加上iconv去做語系方面的轉換,patch完後只需在config中設定local與remote的charset,他就會完成轉換。iconv是一套語系轉換的library,只需要幾個function就能轉換。

3. 頻寬限制

描述:
    為了讓user可以做bandwidth control,必須要提供頻寬的設定。

解法:
    在不同版本的 proftpd 中似乎必須要有不同的設定。在proftpd-1.3.1rc2中,可以利用以下的方法來設定:

http://www.proftpd.org/docs/directives/linked/config_ref_TransferRate.html

TransferRate RETR 1024  //表示下載為1024KB
TransferRate STOR 1024  //表示上傳為1024KB

4. configure reload

描述:
    當 FTP 的config有所改變時,例如新增刪除 user、改語系設定等,為了要讓 FTP server可以即時修改,就必需要重開daemon。但如此一來所有的連線都會被切斷。

解法:

當 proftpd 收到 SIGHUP 時會去 reload 他的 config。其實不只 proftpd 是這樣做的,很多 server 的程式都支援這種作法(如,samba)。因此只要在啟動的 script 中增加一項 reload 即可,內容如下:

killall -1 proftpd

2008-06-06

Bookmarks

Linux :

Linux Command Line Tips

Linux and USB 2.0

The Linux USB sub-system

Basic Linux kernel documentation

Linux 檔案刪除的回覆救援

Locale support in libc 5.4.x and higher

Linux Kernel v2.6

LinuxInsight

Linux defragmenting?  Yes , No

永遠的UNIX

Floppy Linux

Samba media

Linux-NTFS

BusyBox: The Swiss Army Knife of Embedded Linux

 

Network:

Beej's Guide to Network Programming

Windows Sockets

Study-Area

Java Script

 

Services:

GNU Wget

GMediaServer

iSCSI target

boa+auth+ssl 

超全的NFS文檔(FOR LINUX)

 

System:

USB tools

libiconv

uClibc

U-Boot

smartmontools Home Page

RAID-1, Part 1
RAID-1, Part 2

CUPS + SAMBA

20071111_象山行 200

http://www.cups.org/index.php

CUPS ( Common UNIX Printing System ),是在 linux上的列印工具。為了讓 user 可以把 NAS當 printer server,所以需要跟 samba 一起 build,讓 user 可以透過 samba 直接列印。下面列出幾點 CUPS 的需求:

1. driver 安裝

描述:
    driver 在client端安裝就好。

解法:
    在 samba config中加入 use client driver = yes 這一行。以下列出 samba 中所有 跟 cups 相關的設定:

        printcap name = cups
        load printers = yes

        printing = cups
        use client driver = yes
[ printers]
        comment = All Printers
        printable = yes
        browsable = yes
        public = yes
        path = /home/service/cups/log
        guest = yes

2. 權限問題

描述:
    在列印東西時,會跳出 "未發送 StartDocPrinter 呼叫" 的視窗。

解法:
    似乎是 samba config 中寫的 path 權限沒開,把所有CUPS folder 的權限都改成 777 (-rwxrwxrwx),就可以印了。

3. root 列印權限

描述:

    換成新版 CUPS 後無法列印,後來發現是 CUPS 中有以下這段:

if (!getuid())
{
     /*
      * Change to an unpriviledged user...
      */

      setgid(fileinfo.st_gid);
      setuid(fileinfo.st_uid);
}

    造成無法找到 usb  printer。

解法:
    把這段 mark 掉就好了。

4. Printer information

描述:
    希望在 smaba 中可以看到 printer 的廠牌型號等資訊。

解法:
    CUPS 在 build 的時候,在 $CUPS$/lib/cups/backend/ 會有一支usb 的程式,可以掃出插在 usb port 上 printer 的資訊。利用這資訊去 create cups printer,在samba 上就可以正確顯示。

5. Samba show

描述:
    希望可以插上 printer時才出現,沒插就不顯示。

解法:
    在 scheduling 中利用 usb 去檢查是否有 usb printer,若有插則加入 printer,沒插就把 printer 刪掉。注意要紀錄現在 printer的狀態,不然只要插著就會一直加入 printer。還有當列印的工作在進行中時,usb是無法偵測的,有可能是因為 device busy,所以在檢查是否有插 printer時也要檢查是否有列印的 process在運作中。

6. Spindown

描述:
    1. 雖然用 usb 可以得到 usb printer的 information,但它卻會使用到好幾支 lib,這些 lib 存在於硬碟中,每次呼叫都造成硬碟的讀取。也就使得 spindown 無法運作。

    2. CUPS 為了安全性問題,會每隔一段時間就產生新的認證檔,但因為認證檔會記錄於硬碟上,所以也會造成 spindown 失效。

解法:
    1. 每次開機都把usb 跟 lib copy 到 ramdisk 下,讓它不會直接用到硬碟。用到的 lib 有以下三隻:

        libcrypto.so.0.9.7
        libcups.so.2
        libssl.so.0.9.7

    2. 在 cups.conf 中設定為0,表示只有開啟的時候才做一次。

        RootCertDuration 0

7. CUPS spool

描述:
    在列印的時候,Windows會先把檔案傳送到 NAS,而 CUPS會將他存在 spool中,等檔案傳送完成再傳送給指定的 device。但當檔案過大,有可能會造成 spool所在的partiotion空間不足。

解法:
    原本spool是在 system partition中,所以當檔案稍大就會空間不足,在 cups.conf 中指定 spool 的位置到 user partition,就比較不會有 size 的問題。寫法如下:

    RequestRoot /config/Disk/Disk1/cups-spool

8. DNS issue

描述:
    如果指定的 DNS 是連不到的,在啟動cups跟 smaba時會等到 timeout 才繼續啟動,造成開關的動作非常廢時。

解法:
    在 /etc/hosts 中記錄 localhost,如下:

    127.0.0.1       NAS NAS.WORKGROUP localhost

iTunes Server

http://www.mobile01.com/topicdetail.php?f=300&t=147903&cache=0

http://www.fireflymediaserver.org/

mt-daapd (firefly)是個不錯且知名的iTunes server。只要指定 share folder 就可以直接利用 iTunes 聽歌了。加上他有一些簡單的設定,還蠻好用的。下面列出一些遇到的問題:

1. scan interval

描述:
    希望可以隔一段時間就自動重新掃描歌單。

解法:
    在 mt-daapd.conf 加入 rescan_interval 即可。

2. default share folder

描述:
    如果server沒有指定到正確的 folder,就會無法開啟。

解法:
    default 設成 share,如果原本的 folder被刪除,則自動指向 disk1 的 share。

3. ID3 語系

描述:
    因為 ID3 有不同的語系,所以在 iTunes client上看起來會有亂碼。 iTunes client固定使用UTF-8編碼,因此當分享出來的ID3 tag編碼不正確則會出現亂碼。

解法:

1. 讓user自己去將編碼做轉換的動作,只要利用iTumes將歌曲的ID3 tag version轉換掉,再轉回來,就會是UTF-8的編碼了。

2. 將 iconv整合進 mt-daapd中,並在config中多一項設定指定 character set,所有的ID3 tag 將會從指定的charset 轉換成 UTF-8。

UPnP

http://www.intel.com/cd/ids/developer/asmo-na/eng/downloads/upnp/overview/index.htm

http://ushare.geexbox.org/

在我們的 NAS 中UPnP server是用 Microsoft 開發的 ushare。ushare 是針對 xbox所開發的 UPnP server。最新版的還支援了 PS3,是套免費且堪用的server。ushare在porting方面的問題不大,反而是在跟不同的 UPnP client溝通時會有問題。在製作時遇到以下問題:

1. Windows Authorization

描述:
    UPnP在溝通時是利用 http在傳輸資料,而使用 xml 來定義他的各種行為。而ushare在建立聯結的過程中,有去跟 client做驗證,因為當初他的設計是為了搭配 xbox,所以也要求要通過 Windows的認證。由於一開始驗證都是以WinDVD 8為 client,OS 使用的是 Windows XP,所以 Windows 驗證方面也沒有問題。直到拿來跟別台 DMA做測試時才發現不能撥放,因為一般的 DMA並沒有包含 Windows的認證,那連線也就建不起來了。

解法:
    ushare 所送出的 xml是 hard code的。所以找到他定義各項 service的部份,並將其中微軟驗證的部份拿掉,如此一來即可不需驗證。可以參考GeeXboX uShare

 

2. XBox 360 & PS3

描述:
    照第一項的作法在這兩台機器上無法正常使用。

解法:
    最新版的 ushare有支援,因此抓下來重 build即可。唯一的問題是如果不照第一項的方式修改,其他各家的 DMA 可能無法使用,但若照其方法修改 XBOX則無法使用,可能是他要求要驗證的關係吧。最後是因為說 XBOX 比較多人用,所以不去更改。

在解第一項問題時,花了一些時間去抓封包,比較封包差異,研究無法撥放的原因。在做NAS時,很常感覺到一有問題就說要抓封包,有的情況下確實很有用,抓到封包比對後可以看出 code哪裡可能會有問題,但也常常不知道抓來要做啥,這之間的矛盾很難取捨。

Firmware Upgrade

在開發 embedded system 產品時,幾乎是一定會需要 firmware upgrade,NAS當然也不例外。
NAS的 upgrade 包含了幾個部份:
1. bootcode
2. kernel
3. root filesystem
4. config
5. remote package (services)

由於 embedded system 上的資料主要是以 flash 來儲存,在開機時,MTD driver 會將flash 上的位置 mapping 到 MTD device,這樣接下來要讀寫 flash 就可以直接透過 MTDdevice。下面是 mapping 的訊息:

Creating 4 MTD partitions on "phys_mapped_flash":
0x00000000-0x00180000 : "kernel"
0x00180000-0x00320000 : "squashfs"
0x00320000-0x00380000 : "jffs2"
0x00380000-0x00400000 : "boot"

有一點要注意的是,要把資料寫入 flash前,一定要先用 flash erase 將其清空,否則會無法寫入。而寫入的方法可以像操作一般檔案一樣,直接用 open/fopen 開啟後操作。

GeeXboX uShare

A free UPnP A/V & DLNA Media Server for Linux
這是 Microsoft 為了 xbox 所開發的 upnp A/V server
在他的 description 中做了三件事:
1. msr
2. cds
3. cms
裡面只有 2 跟 3 是必須的,1 是微軟要做一些驗證,如果是對一般的 DMA (八成是用linux)就會失敗,原因不名,是抓封包的結果,也懶的去找了。要讓其他 client 都可以用,只要把他的 description xml  中 msr 那個 service 整段拿掉就可以了。

但如此一來,就無法跟XBox系列產品做溝通,修改之前還是要依個人需求而訂。

Building and Porting Code

Building code

x86 :
    # ./configure
    # make
    # make install

arm :
    # ./configure --prefix=/path/to/service/home/ --host=armeb-linux \
                  --target=armeb-linux
    # make
    # make install

 

Porting code

      一般來說,porting code 要利用 cross-compiler 的技術,但並非所有的 source 都支援 cross-compiler ,這一點要注意。

    在 building/porting code 時,最重要的大概就是 configure file 及 Makefile file,現在大部份的程式都是利用軟體去產生的,詳情請看: Makefile介紹

    有了 configure and Makefile 就可以來 porting 了。

    首先,可以用 ./configure --help 檢視有哪些選項可供使用。在 cross-compiler 時,--host、--target 是必須的,而 prefix 則是告訴 configure 要把 service 的 root 設定在哪裡。用 --help 檢視到的,是這個 service 本身所提供的 option,可能某些 option 會需要配合某些 library,那就要去 download 這些 library 來 build,或是看 tool-chain中有沒有提供這個 library 可以使用。

    如果是比較小的程式,可能只要指定好 --host and --target 就可以了。但通常是不會那麼順利的 Orz。先試過用上面的方面 build 過,如果不行,就要看錯誤是出在哪裡。下面列出已經有遇過的問題,提供參考:

1. cross compiler 沒有指定好:

    目前我使用的是 armeb-linux-gcc,所以必需要先把他加入環境中,否則找不到對的compiler 一定是 build 不起來的。

2. 沒指定正確的 build tool:

    例如 ar, strip 都是常使用到的 tool,如果沒指定對的,就會有問題。指定的方法可以在 ./configure 前面先設定。如下:

    CC=armeb-linux-gcc AR=armeb-linux-ar STRIP=armeb-linux-strip ./configure

當然,這些 tool 都要在環境中先設定完成才可以用。

3. cannot check SOMETHING when cross compiling:

    這就比較麻煩,因為當 configure 發現是 cross compiler 時就不給做下去了。這時先看看 ./configure --help 中有沒有可以讓他跳過不要 check 的選項,如果發現這個選項是一定要的,那就只能去改 configure 了:

    # vi ./configure

找到那一行,應該可以發現他如果無法檢查就會跑 { (exit 1); exit 1; }; }。把他全都拿掉,並把它檢查的值設定好:

// mark these to allow cross compiling
- line 31537:
{ { echo "$as_me:$LINENO: error: cannot check SOMETHING when cross compiling" >&5

- line 31538:

     echo "$as_me: error: cannot check SOMETHING when cross compiling" >&2;}

- line 31539:   { (exit 1); exit 1; }; }

+ line 31540:   ac_cv_func_SOMETHING_void=no

關於最後一個 ac_cv_func_SOMETHING_void 要設成 yes 或 no 是不一定的,要看前後文來決定,不過如果真的不知道,就先設成 no 吧(看看會不會有問題再說)。其實也可以在configure之前先 export 就好了:

# export ac_cv_func_SOMETHING_void=no
# ./configure

4. 缺 library:

    這是很常見卻又很麻煩的問題。首先當然是看看 tool clain 中有沒有提供缺少的 library,如果有就簡單了,只要把它選起來 re-build 就可以了。

# cd /path/to/tool-chain/build-root/
# make menuconfig

 

The Difference between squashfs and jffs2

根據 Roger 的說法
------------------

squashfs : 存在 flash 上,當要使用到某部份時,再將"那部份"解到 ram 上

jffs2 : 存在 flash 上,開機時將所有東西解到 ram  上

Linux Driver

 

result=register_chrdev(iGpio_Major, DEVICE_NAME, &gpio_fops);

iGpio_Major : major number of device node

DEVICE_NAME : device name (/dev/DEVICE_NAME)

gpio_fops : address of structure of driver functions

ex.

static struct file_operations gpio_fops =
{
    .owner      = THIS_MODULE,
    .read       =   gpio_read,
    .write      =   gpio_write,
    .open       =   gpio_open,
    .release    =   gpio_release,
};

addr=ioremap(GPP_DATA_OUT_REG,4);

ioremap : mapping device to virtual memory for read/write

GPP_DATA_OUT_REG : physical address of device

addr : virtual memory address of device

result = unregister_chrdev(iGpio_Major, DEVICE_NAME);

2008-06-05

SAMBA DNS Error

samba是linux上用來跟windows做分享的一種protocol(CIFS),詳情見samba網站

Please pay attention to the error messages you receive. If any error message reports that your server is being unfriendly, you should first check that your IP name resolution is correctly set up. Make sure your /etc/resolv.conf file points to name servers that really do exist.

Also, if you do not have DNS server access for name resolution, please check that the settings for your smb.conf file results in dns proxy = no. The best way to check this is with testparm smb.conf.

--
samba 開啟太慢 -- Make sure /etc/resolv.conf correct!!

★★★★★★ 傑森系列 ★★★★★★