星期一, 4月 30, 2007

如何讓一般使用者也可以利用fuse掛載檔案系統

由於有越來越多的file system是以fuse來完成,
以root的權限,完成下列幾個步驟:
  1. chmod 4755 /usr/bin/fusermount
  2. /sbin/modprobe fuse
  3. chmod o+rw /dev/fuse
如此一來,不具root權限的user也可以利用fuse,自行mount檔案系統了。

如果user要umount檔案系統,因為其不具有root的權限,所以無法執行umount,同樣需利用fuse所提供的fusermount這個utility來執行卸載的動作。也就是執行

/usr/bin/fusermount -u mount_point

星期二, 4月 24, 2007

max file size == 2GB

一般來說,在Linux系統上,當我們要建立一個大型檔案時,檔案最大可以等於2的31次方-1,也就是大約等於2GB這麼大。會是這個size原因是因為當你在操作檔案時,系統用來管理目前檔案存取位置的off_t是一個32位元的整數。

如果要打破file size最大2GB的限制,那就要在open file時,加上O_LARGEFILE的flag,並且改用off64_t表示資料在檔案中的位移值。另外,在compile時加上-D _GNU_SOURCE,這樣就可以建造出超過2GB的檔案了。

附上一個簡單的範例供大家參考一下。此範例的目的主是要建立一個檔案大小大約3GB的檔案。


#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>

int main()
{
int fd;
off64_t file_size;

fd=open("test.dd",O_LARGEFILE|O_CREAT|O_RDWR,0666);
if(fd==-1)
{
perror("open");
exit(1);
}
file_size=1024;
file_size*=1024*1024*3;
if(lseek64(fd,file_size-1,SEEK_SET)==-1)
{
perror("lseek");
close(fd);
}
write(fd," ",1);
close(fd);

return 0;
}

星期五, 4月 20, 2007

APR == Apache Portable Runtime 簡介

APR 是Apache Portable Runtime的縮寫。APR本來主要目的在於將Apache系統中與作業系統相關的實作部分獨立出來,另外提供一與OS無關的應用程式介面(API,Application Programming Interface)供程式設計者使用,也就是模擬出一個虛擬的OS介面,其主要針對Thread、Process、Directories等功能進行虛擬化。如此一來,可以在不需大量變動原始程式碼即可輕易達到將Apache軟體移植至其他的作業系統上。如果要將所開發的程式移植到新的作業系統上,程式設計者只要在新的作業系統上實作APR所提供的的介面,就可以達到將開發的程式輕易地移植到其他 作業系統 上。

由APR的全名就可以知道,APR原本是屬於Apache的一部份,但是自從Apache 1.3版之後已經被獨立成為一個單獨的project,當然除了Apache之外,也有許多軟體是以APR為基礎或是使用APR進行開發,達到 platform independent。著名的軟體專案包括:Subversion等等。

APR大致上可以分了兩個部分,分別為APR Core與APR Util。APR Core包含了最基本的portable functions,Apr Util則包含其他不屬於Core但也必須是portable的functions。以下針對APR Core與APR Util分別描述所提供的功能。

APR Core提供了以下功能:
  • Reading and writing files
  • Character set conversion
  • Network communications with sockets
  • Time management used for Internet type conversions
  • String manipulation like C++ including neural order management
  • UNIX password management routines
  • Table management routines
  • UUID Internet generation
  • Filename canonicalization
  • Random data generation
  • Global lock management
  • Threads and process management
  • Dynamic library loading routines
  • Memory mapped and shared memory

APR Util提供了以下的功能:

參考資料

簡介 pkg-config 的功能與用法

我們在開發 c 程式時常常會用到許多系統已安裝 library 所提供的 function,加速程式的開發。而我們必須針對所使用到的 function 進行 prototype 宣告,因此,我們必須在程式中將含有這些 library 所提供的 function 的 prototype 宣告的 header file 加到程式中,並且在編譯程式時加上額外的設定告訴編譯器該去系統中的何處找尋所要使用的 header file 以及所使用的 library file被安裝在何處。而這往往也是一開始讓程式設計者最頭痛的地方。還好,在 linux 系統上有一個非常好用的工具 pkg-config 可以讓我們查詢 library 的 header file 以及 library 本身所在位置,以及在編譯程式時該使用的編譯參數為何。

pkg-config 命令是可以用來讀取安裝在 linux 系統上的 library 相關資訊。這個程式主要讀取系統中位於 /usr/lib/pkgconfig 目錄或是環境變數 PKG_CONFIG_PATH 所設定的路徑中的負檔名為 .pc 的檔案,這些檔案包含系統安裝的 library 的相關資訊,包括:安裝的目錄、程式編譯的參數等等。

使用方法很簡單
  • pkg-config --cflags library-name-with-version 就可以得到編譯程式時,pre-processing 動作必須加上的參數設定。例如:我在自己的電腦上下pkg-config --cflags glib-2.0,其結果為-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include。
  • pkg-config --libs library-name-with-version就可以得到 linking 時所必須傳給編譯器的參數。執行 pkg-config --libs glib-2.0 得到-L/lib -lglib-2.0。
另外,我們還可以利用 pkg-config 來簡化 Makefile 的撰寫。在Makefile中,原來寫在編譯器之後的參數,改成 pkg-config --cflags --libs library-name-with-version 即可。例如:
將Makefile中的這一行
gcc -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -L/lib -lglib-2.0 program.c
替換成
gcc pkg-config --cflags --libs glib-2.0 program.c