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

2010-07-07

讓ubuntu開機後自動執行特定的script

  在Linux平台中若要開機/關機執行某些script,只要將script加入/etc/init.d目錄中,再依照執行的runlevel將/etc/rcX.d對/etc/init.d目錄中的script作softlink即可,雖然只是幾個步驟不過還是滿雜的,在ubuntu系統中可以藉由update-rc.d命令輕鬆完成後續的工作。

1)首先將開機要執行的動作寫在一個script中,在此以acos.sh命名作為範例,此檔案內容為

#! /bin/sh

mount -t vboxsf DATA /mnt
2)將此檔案移至/etc/init.d目錄下
3)執行sudo update-rc.d default 99 1

完成上述動作後即完成設定。
default => 不指定要設定第幾runlevel,則rc0.d~rc6.d都會加入softlink
99 => 表示開機執行的順序,越小越早執行
1 => 表示關機執行的順序,越小越早執行
開機與關機執行順序數值應屆於00~99之間,通常會建議讓兩數值相加為100,如此開機過程中越早開啟的程序在關機時將越晚關閉。

2010-02-22

【Linux筆記】關於/proc/stat與CPU使用率的計算

下達指令:

$ cat /proc/stat
會得到類似以下的顯示結果
cpu  480 0 708 4305468 1901 27 53 0 0
cpu0 264 0 503 2143900 1730 27 53 0 0
cpu1 215 0 204 2161567 170 0 0 0 0
intr 1587075 115 8 0 2 3 0 5 0 1 0 0 0 119 0 24081 0 1306153 3575
0 685 0 0 0 0 0 0 0 68461 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 499671
btime 1266751940
processes 1984
procs_running 2
procs_blocked 0
softirq 1574719 0 142505 4290 68517 7047 1306131 25188 7 21034

詳細的說明可以參考man 5 proc手冊,下面簡單記錄各欄位意義
  1. 第一列的cpu表示所有cpu0~cpuN(此範例可看出該系統具備雙核心)的加總,接續後面的七組數字代表CPU花了多少"力氣"在不同的工作上,而這"力氣"的單位是Jiffies,cpu各欄位資訊的意義
    user: 一般跑在user mode下的processes
    nice: 跑在user mode下的nice processes(叫nice processes的理由是因為此類processes太nice了,讓出自己的優先權讓別人有更多機會搶先執行)
    system: 執行在kernel mode下的processes
    idle: cpu閒閒沒事的累計數量
    iowait: 等待I/O完成的時間
    irq: 執行中斷服務的時間
    softirq: 執行軟體中斷服務的時間
    stead: Since Linux 2.6.11, there is an eighth column, steal - stolen time, which is the time spent in other operating systems when running in a virtualized environment
    guest: Since Linux 2.6.24, there is a ninth column, guest, which is the time spent running a virtual CPU for guest operating systems under the control of the Linux kernel
  2. intr後面接續著很多行數字(包括很多的0),其計算從開機(boot time)以來每一種中斷的服務次數,其中第一欄數字是所有中斷的總合
  3. ctxt累計所有cpus的context switches次數
  4. btime紀錄系統開機時距離Unix epoch多少時間(也就是記錄開機的時間點),單位為秒。
  5. processes紀錄有多少processes與threads被建立
  6. procs_running紀錄cpu正執行多少個processes
  7. procs_blocked記錄當下有多少process被block住等待I/O服務完成

參考下面程式碼計算cpu的"當前"使用率(usage rate)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/poll.h>
#include <sys/time.h>

#define TRIMz(x) ((tz = (unsigned long long)(x)) < 0 ? 0 : tz)

void stat() {

FILE *fp_stat ;
char buff[128+1] ;
static unsigned long long u, u_sav, u_frme, s, s_sav, s_frme,
n, n_sav, n_frme, i, i_sav, i_frme,
w, w_sav, w_frme, x, x_sav, x_frme,
y, y_sav, y_frme, z, z_sav, z_frme,
tot_frme, tz ;
float scale ;
fp_stat = fopen("/proc/stat","r") ;
while( fgets(buff, 128, fp_stat) ) {
if( strstr(buff, "cpu") ) {
sscanf(buff, "cpu %Lu %Lu %Lu %Lu %Lu %Lu %Lu %Lu",
&u, &n, &s, &i, &w, &x, &y, &z) ;
break ;
}
}
fclose(fp_stat) ;
u_frme = u - u_sav ;
s_frme = s - s_sav ;
n_frme = n - n_sav ;
i_frme = TRIMz(i - i_sav) ;
w_frme = w - w_sav ;
x_frme = x - x_sav ;
y_frme = y - y_sav ;
z_frme = z - z_sav ;
tot_frme = u_frme + s_frme + n_frme + i_frme + w_frme + x_frme + y_frme + z_frme ;
if (tot_frme < 1)
tot_frme = 1 ;
scale = 100.0 / (float)tot_frme ;
printf("%5.1f%%us,%5.1f%%sy,%5.1f%%ni,%5.1f%%id,%5.1f%%wa,%5.1f%%hi,%5.1f%%si,%5.1f%%st\n",
u_frme * scale, s_frme * scale, n_frme * scale,
i_frme * scale, w_frme * scale, x_frme * scale, y_frme * scale, z_frme * scale) ;
u_sav = u;
s_sav = s;
n_sav = n;
i_sav = i;
w_sav = w;
x_sav = x;
y_sav = y;
z_sav = z;
}

int main() {
int i, j ;
struct itimerval tick ;
int res ;

/**
*
* Timer interrupt handler
*
*/
signal(SIGALRM, stat) ; /* SIGALRM handeler */
/* setting first time interval */
tick.it_value.tv_sec = 0 ; // sec
tick.it_value.tv_usec = 500000 ; // usec
/* setting next time interval */
tick.it_interval.tv_sec = 0 ; // sec
tick.it_interval.tv_usec = 500000 ; // usec
res = setitimer(ITIMER_REAL, &tick, NULL);
if(res)
fprintf(stderr, "Error: timer setting faul.\n") ;
else
printf("Timer start...\n") ;
/*
* END
*/

getchar() ;

return 0 ;
}

此程式會印出cpu當前在各種不同工作下的使用比率,仿top指令中的效果,每隔0.5秒印出cpu總使用率。
【程式簡述說明】
設定timer每隔0.5秒發出SIGALRM訊號,接收SIGALRM訊號後將執行stat副程式,此副程式會讀取/proc/stat資訊,相減計算前後兩次間隔中總共耗費多少cpu的力氣

u_frme = u - u_sav ;
s_frme = s - s_sav ;
n_frme = n - n_sav ;
i_frme = TRIMz(i - i_sav) ;
w_frme = w - w_sav ;
x_frme = x - x_sav ;
y_frme = y - y_sav ;
z_frme = z - z_sav ;
tot_frme = u_frme + s_frme + n_frme + i_frme + w_frme + x_frme + y_frme + z_frme ;

藉由個別工作所耗費的力氣除以總耗費力氣即可求得即時的cpu使用率
scale = 100.0 / (float)tot_frme ;
計算scale的100,只是為了表示百分比加上去的,與其在計算個別工作使用率時先各自除以總耗費力氣後再乘上100,不如先乘好這100!

2010-02-13

在ubuntu上安裝完整的man pages

  難得三更半夜有動力coding一下,熊熊要查一system call卻沒書可翻用到的函數網路資料又少...,最後向man求援居然沒資料,原來ubuntu的man pages有給它偷工減料(畢竟人家使用者是針對普羅大眾...就不跟他計較了XD)。

  如果要安裝完整system call的man pages可以:
sudo apt-get install manpages-dev

2010-02-07

測試哪套Linux Distribution比較適合你

  目前以Linux為核心的Distribution已經多到則以讓新手眼花撩亂了,究竟哪套Distribution適合自己呢?或許可以參考一下Linux Distribution Chooser網站,做幾個選擇測驗找出可能適合自己的Distribution吧!

2010-02-03

【Linux筆記】Chapter7. The /proc File System(一)

Textbook: Advanced Linux Programming

  在Linux檔案系統下有一目錄/proc裏頭檔案紀錄著一些存取參數、資料結構以及一些與kernel相關的資訊,在書本中直接說明該目錄是kernel的對外視窗,特別的是目錄下的檔案都是在讀取當下即時產生。
$ ls -l /proc/version
-r--r--r-- 1 root root 0 2010-02-03 10:36 /proc/version
  上面指令使用ls觀察/proc/version檔案,可以看到兩個特點:其一,檔案大小為0,亦即不占據任何空間;其二,檔案的修改時間為下指令時的時間。
$ cat /proc/version
Linux version 2.6.31-14-generic (buildd@rothera) (gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu8) ) #48-Ubuntu SMP Fri Oct 16 14:04:26 UTC 2009
  使用cat指令觀看該檔案內容則可以看到得知該檔案紀錄著Linux Kernel的相關資訊,在上述訊息中可以得知目前使用的核心版本是2.6.31,使用gcc-4.4.1版本的編譯器編譯而成等訊息。

$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 15
model name : Intel(R) Core(TM)2 CPU 6320 @ 1.86GHz
stepping : 6
cpu MHz : 1866.837
cache size : 0 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 constant_tsc up pni monitor
bogomips : 3733.67
clflush size : 64
  上面範例可以知道/proc/cpuinfo檔案儲存著關於系統處理器的相關資訊,若處理器具備多顆核心則會有多組訊息。底下程式示範如何運用/proc下的檔案內容擷取CPU的工作時脈:
#include <stdio.h>
#include <string.h>

float get_cpu_clock_speed() {
FILE *fp ;
char buffer[2048] ;
size_t bytes_read ;
char *match ;
float clock_speed ;

fp = fopen("/proc/cpuinfo", "r") ;
bytes_read = fread(buffer, 1, sizeof(buffer), fp) ;
fclose(fp) ;
/* Bail if read failed or if buffer isn't big enough */
if(bytes_read == 0 || bytes_read == sizeof(buffer))
return 0 ;
/* NUL-terminate the text */
buffer[bytes_read] = '\0' ;
/* Locate the line that starts with "cpu MHz" */
match = strstr(buffer, "cpu MHz") ;
if(match == NULL)
return 0 ;
/* Parse the line to extract the clock speed */

sscanf(match, "cpu MHz : %f", &clock_speed) ;
return clock_speed ;
}

int main() {
printf("CPU clock speed: %4.2f Mhz\n", get_cpu_clock_speed()) ;
return 0 ;
}

2009-11-24

Ubuntu下的Flash中文亂碼解決方法

修改/etc/fonts/conf.d/49-sansserif.conf內容
→把所有sans-serif都改成sansserif即可。

sudo vi /etc/fonts/conf.d/49-sansserif.conf

2009-07-25

Simplescalar/ARM模擬器安裝與測試

裝這模擬器純粹是老闆要我安裝給他跑而已...
本人對這模擬器沒說很瞭
有任何問題請留言討論,但別期待能幫上什麼忙...

  1. 下載Simplescalar/ARM
    網址: http://www.simplescalar.com/v4test.html
    直接下載網址: http://www.eecs.umich.edu/~taustin/code/arm/simplesim-arm-0.2.tar.gz
  2. 下載Mibench ARM
    網址: http://www.eecs.umich.edu/mibench/
    直接下載網址: http://www.eecs.umich.edu/%7Ejringenb/mibench/mibench_arm_binaries.tar.gz
  3. 解壓縮simplesim-arm-0.2.tar.gz
    $ tar zxvf simplesim-arm-0.2.tar.gz
  4. 進入解壓縮後的目錄
    $ cd simplesim-arm

    PS. 官網上的安裝使用說明文件: http://www.eecs.umich.edu/~taustin/code/arm/ANNOUNCE.ARM

  5. 照上面的說明文件只要兩步驟,一個是設定環境、另一個是make
    $ make config-arm
    $ make
  6. 沒意外的話應該會發生點錯誤,不然也不用寫這篇文章了...
    在最後面應該會看到提示字元 => make: *** [sim-safe.o] Error 1
    往前捲動一下會看到真正錯誤的來源 => machine.h:349: 錯誤: 陣列元素的類型不完全
    其他的錯誤都只是一些副效應 => machine.h:349: 錯誤: 陣列元素的類型不完全
    觀察一下349行附近的敘述
    $ gedit machine.h &
    發現敘述內容為 => extern enum md_opcode md_mask2op[];
    往下面幾行會看到上面用到的列舉型別md_opcode,宣告在354-363行間,敘述如下
    /* global opcode names, these are returned by the decoder (MD_OP_ENUM()) */
    enum md_opcode {
    OP_NA = 0, /* NA */
    #define DEFINST(OP,MSK,NAME,OPFORM,RES,FLAGS,O1,O2,O3,I1,I2,I3,I4) OP,
    #define DEFUOP(OP,NAME,OPFORM,RES,FLAGS,O1,O2,O3,I1,I2,I3,I4) OP,
    #define DEFLINK(OP,MSK,NAME,MASK,SHIFT) OP,
    #define CONNECT(OP)
    #include "machine.def"
    OP_MAX /* number of opcodes + NA */
    };
    把354-363敘述搬到列舉宣告前就可以了,修改完後存檔在重新make一次。
    $ make
  7. 過一會肯定又是眉頭一皺,事情果然並不單純...出現以下錯誤
    /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference in eval.o
    /lib/libc.so.6: could not read symbols: Bad value
    collect2: ld 回傳 1
    make: *** [sim-safe] Error 1

    查看eval.c檔案
    $ gedit eval.c &
    發現83-85行的敘述
    #if defined(__CYGWIN32__)
    #include
    #endif
    但仔細查看Makefile或其他*.h檔案中都沒定義這巨集變數__CYGWIN32__,自然errno.h會被忽略,但程式碼中用到錯誤常數需要此標頭檔定義,所以把83跟85刪掉即可。
    再重新編譯
    $ make
  8. 肯定想飆髒話了,出現以下錯誤
    /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference in range.o
    /lib/libc.so.6: could not read symbols: Bad value
    collect2: ld 回傳 1
    make: *** [sim-safe] Error 1

    此時請查看range.c檔案
    $ gedit range.c &
    找到81-83行的敘述,跟前一個eval.c的問題一樣,把兩行假指令刪掉即可
  9. 在重新編譯
    $ make
    這次可跑比較久了,心中肯定暗爽結束了結束了,就快要編好了,結果伸個懶腰回神一看,下面訊息...
    make: *** [sim-outorder.o] Error 1
    心中肯定充滿無限#@^%&(*&^%#
    想捶牆壁又怕手會痛,實在很無力...
  10. 其實就剩下gcc版本問題了
    查看一下自身gcc版本會發現是4.X
    $ gcc -v
    裝一個3.X版的gcc就可以了
    $ sudo apt-get install gcc-3.4
    如果上述指令安裝失敗請先安裝
    $ sudo apt-get install gcc-3.4-base
  11. 安裝完畢後修改Makefile,設定CC使用gcc-3.4即可
    $ gedit Makefile &
    應該在177行敘述為CC = gcc
    改成CC = gcc-3.4即可
    這次應該就OK了,下make去編譯吧
    $ make
  12. 編完後測試一下,先回到上層目錄
    $ cd ..
    解壓縮mibench_arm_binaries.tar.gz檔案
    $ tar zxvf mibench_arm_binaries.tar.gz
  13. 先把剛剛編譯完的模擬器(這裡示範用sim-outorder,每個模擬器之間的不同請參考官網上的說明)複製到mibench目錄下
    $ cp simplesim-arm/sim-outorder mibench_arm_binaries
  14. 進到mibench的目錄下進行模擬測試
    $ cd mibench_arm_binaries/
    $ ./sim-outorder bitcount/bitcnts.arm 150000
  15. 應該會看到類似下面訊息
    sim: ** simulation statistics **
    sim_num_insn 99409825 # total number of instructions committed
    sim_num_uops 149104246 # total number of UOPs executed
    sim_avg_flowlen 1.4999 # uops per instruction
    sim_num_refs 24470769 # total number of loads and stores committed
    sim_num_loads 14563043 # total number of loads committed
    sim_num_stores 9907726.0000 # total number of stores committed
    這些就是模擬的數據結果,再依據所需觀察各個數值吧

2008-09-03

【LP】程式讀取參數列

  在Linux下寫程式要讀取參數列的參數(值),最直覺的作法莫過於直接使用main()中的argc與argv變數,不過要自己在程式中處理參數列並且想要提供使用者靈活的參數組合,恐怕會是一個叫人頭痛的"超級任務"。
  以ls程式為例,其參數項目就已經玲瑯滿目(如:-l、-a...等),參數項豐富頂多就是在程式中的switch...case敘述多寫一點,但是再加上沒有參數值的參數項可以合併在一個破折號後面(如:-la),這就很麻煩了。
  在Linux下可使用getopt()函數來幫我們處理參數列的問題,其prototype如下:

int getopt(int argc, char *argv[], const char * optstring) ;
extern char *optarg ;
extern int optind, opterr, optopt ;
  使用上很簡單,getopt函數前兩個參數就將main函數宣告的參數項(argc與argv)填入就是了,重點在於optstring,直接用例子來說明:
#include <stdio.h>
#include
<unistd.h>

int main(int argc, char *argv[]) {
int opt ;


while( (opt=getopt(argc, argv, "x:yz")) != -1 ) {
switch(opt) {
case 'x':
printf("option: %c argument: %s\n", opt, optarg) ;
break ;
case 'y':
case 'z':
printf("option: %c\n", opt) ;
break ;
case '?':
printf("unknow option\n") ;
}
}


return 0 ;
}
  將此範例存檔為lab_arg.c並編譯成lab_arg:gcc -o lab_arg lab_arg.c
  此程式可接受參數x、y、z,並且參數x其後會接著一個參數值,可以先執行看看其效果。在optstring部分範例中用了"x:yz",其表示此程式接受參數有x、y、z,而在x後面加一個冒號(:)說明x參數將會帶一個參數值。
  getopt會依序解析使用者傳入的參數項,若符合optstring規則的參數會回傳對應的參數字元,當getopt函數解析完餐數個數後,會傳回-1表示結束,因此使用一個while迴圈將之包附並檢查傳回值是否為-1。
  使用getopt()我們僅需關注程式中對於各個參數項的對應行為即可,而不需費盡心思自己在程式中解析複雜的參數組合可能。
  更詳細的getopt()函數說明請參閱:http://fair.athost.net/main/linux_c/function/16.html#linuxc293

2008-05-24

【SDL】在Linux下設置SDL開發環境

  SDL(Simple DirectMedia Layer)是一個跨平台的多媒體Library,用來存取音效、鍵盤、滑鼠、3D與2D等多媒體裝,支援的平台也十分廣泛,有Linux, Windows, Windows CE, BeOS, MacOS, Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX, and QNX。
  SDL Library是用C語言寫成的,因此C與C++都能很直接的進行函數存取,其他語言也可以透過binding來使用SDL的Library,最重要的授權則是採用GNU LGPL version 2授權!(寫到這忍不住又要高呼:自由萬歲)

#========== 打屁結束 ==========#

把官方網站的介紹文簡單翻譯後,接下來就進入正題:在Linux下設置SDL開發環境。
  1. 到官方網站(http://www.libsdl.org)下載最新版本的Source Code,撰寫此份文件版本為SDL-1.2.13.tar.gz(在Download區下的SDL1.2連結頁面下)。
  2. 下載完,解壓縮套件並且進行編譯與安裝($表示一般使用者身分;#表示root身分)
    $ tar zxvf SDL-1.2.13.tar.gz
    $ cd SDL-1.2.13
    $ ./configure ; make
    # make install
  3. 設置完成後就可以刪除下載的檔案與剛才解開的資料
    $ cd ..
    $ rm SDL-1.2.13*
  4. 到步驟3結束,就完成環境的設置了!接下來測試一下是否能夠正常運作吧
    編寫程式碼(Ex1.1 Initializing.c)如下:
    #include "SDL.h"/*  所有的SDL程式都需要引入此標頭檔 */

    #include
    <stdio.h>

    int main() {
    printf("Initializing SDL.\n") ;
    /* 初始化Video與Audio */
    if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO)==-1) {
    printf("Could not initialize SDL: %s.\n", SDL_GetError()) ;
    exit(-1) ;
    }

    printf("SDL initialized.\n") ;

    printf("Quiting SDL.\n") ;

    SDL_Quit() ;

    printf("Quiting...\n") ;

    exit(0) ;
    }
  5. 編譯程式
    $ gcc initializing.c -I /usr/local/include/SDL -lSDL -o initializing
  6. 正確執行應該會出現下列訊息:
    Initializing SDL.
    SDL initialized.
    Quiting SDL.
    Quiting...
    否則會出現下面訊息:
    Initializing SDL.
    Could not initialize SDL: No available video device.

2008-05-09

把man page 輸出成PS(PostScript)格式的檔案

  眾所周知的man page是初學者必讀的聖經文件也是高手查閱指令的精華文章,不過密密麻麻的文字印出來看可能會舒服一點,除了用重新導向輸出成純文字後印出,如果希望格式、縮排美美的話就必須輸出成postscript或是html格式的檔案囉!

  • 將man page輸出成ps格式指令如下
    man -t make > filename.ps
    make => 欲查詢的指令名稱
    filename.ps => 預輸出的文件名稱,副檔名請用.ps

2008-05-01

【轉貼】讓女友試用Ubuntu

原始文章請參考:
http://contentconsumer.wordpress.com/2008/04/27/is-ubuntu-useable-enough-for-my-girlfriend/

大陸翻譯的簡體版本:
http://forum.ubuntu.org.cn/viewtopic.php?t=119305&sid=e65b07666781757a4fb33e9f6e3fee0b

這篇文章點出了人機介面設計的重要性:好的軟體如果無法提供友善的使用介面,功能在強大也都將只是僅止於觀賞的藝術品,是吧?!

2008-04-06

【Ubuntu】使用tightvncserver開啟多人遠端桌面

  1. 安裝tightvncserver套件
    sudo apt-get install tightvncserver
  2. 安裝完畢後初次使用會要求設定密碼,此密碼可以跟帳號的密碼不同
    vncserver :1
    PS. 後面的:1表示開啟桌號的編號,如果不指定系統會依序累加!
  3. 設定完密碼後,先將剛剛開啟的虛擬桌面關閉,進行一些細部設定
    vncserver -kill :1
    PS. :1對應步驟2的數值
  4. 修改~/.vnc/xstartup設定檔
    vi ~/.vnc/xstartup
    將所有的設定值都註解掉(你要刪掉也可以),然後加上下面那段設定
    exec gnome-session
    PS. 如果你桌面是用KDE那上面敘述請改成exec startkde
  5. 設定完成後即可使用遠端虛擬桌面
    vncserver
    PS. 可以使用-geometry參數設定桌面大小,如vncserver -geometry 1024x768,如此會產生一個1024 x 768的遠端桌面
  6. 遠端連線方法:開啟vnc client軟體,在server欄位填入IP:n,例如我的IP是192.168.0.10而產生的桌面編號是3,那麼就輸入192.168.0.10:3即可連線
  7. 如果沒有意外的話,你連線後要從鍵盤輸入訊息時應該會到意外(好饒舌XD),目前版本似乎會在鍵盤對應上產生問題,解決方法如下:
    先在本機開啟指令視窗輸入
    gconf-editor
    會跳出設定視窗
    依序選擇
    Desktop -> Gnome -> Peripherals -> Keyboard -> KBD,將layout參數值改成abfh,重新啟動vncserver就可以解決,不過本機登入後就會出現設定值錯誤的警告訊息>"<

2008-03-15

跨平台的MSN軟體

從Windows轉換到Linux作業系統下最常發生兩種適應不良的狀況:MSN與Office的毒癮難戒。

現在在Linux下除了行之有年的屁精可以使用外,還出現了Mercury可以使用!而且使用上跟Windows上的MSN很相似,具有來電振動、圖像顯示、動畫...等,該軟體是用Java寫成的,因此具備良好的跨平台性。

官方網站:http://www.mercury.im/

2008-02-26

Linux Device Driver 3rd 電子書

Linux Device Driver 3rd(LDD)電子書檔案下載:
  →http://lwn.net/Kernel/LDD3/

註:

  1. 3rd版本以kernel 2.6為主題
  2. 可參考Jollen的「有效學習 Linux Device Driver (驅動程式)」文章。

2008-02-16

【CentOS】安裝Nvidia Geforce8500GT驅動程式

  1. 到Nvidia官網下載驅動程式,網址:http://www.nvidia.com.tw/Download/index.aspx?lang=tw
    依照自己的系統版本與顯示卡型號下載對應的驅動程式
  2. 接著修改開機模式惟純文字模式
    # vi /etc/inittab
    將id:5:initdefault:這行敘述改成id:3:initdefault:
    # reboot
    重新開機後會停在在文字模式
  3. 修改步驟1下載的驅動程式型態為可執行
    # chmod +x NVIDIA-Linux-x86-169.09.pkg1.run
    註:紅色部分會因系統而異
  4. 查詢kernel版本
    # uname -r
    會跑出2.6.9-55.ELsmp類似的敘述
  5. 安裝顯示卡驅動程式
    # ./NVIDIA-Linux-x86-169.09.pkg1.run --kernel-name='2.6.9-55.ELsmp'
    照著步驟即可完成安裝,最後會選擇是否由程式幫你修改/etc/X11/xorg.conf設定檔,請選擇yes。
  6. 驅動程式安裝完成後,把步驟2修改的開機模式改回原本的5,並且重新開機即可!
  7. 重新開機進入xwindow後,應該會在應用程式選單的系統工具中找到NVIDIA X Server Setting選項,就可以進去調整解析度等設定。
備註:
  1. 以上操作在CentOS 4.5 i386版本上可以正常運作。
  2. CentOS 4.5、4.6與5.2 的x86_64版本上會有不穩的現象,像是設定值會被改回初始設定等問題。

2008-02-14

【CentOS】VNC多位使用者同時遠端登入

【Server端設定】

  1. 開啟VNC Server,第一次使用會要求輸入一組密碼供日後遠端登入使用,該組密碼不必與系統帳號的密碼相同。
    # vncserver
  2. 接著先關掉VNC服務
    # vncserver -kill :1
  3. 修改家目錄下的設定檔
    # vi /home/acos/.vnc/xstartup
    註:acos請改成自己的使用者名稱
    僅留下兩行設定,其他敘述註解起來即可,參考如下:
    #!/bin/sh

    # Uncomment the following two lines for normal desktop:

    unset SESSION_MANAGER

    exec /etc/X11/xinit/xinitrc

    #[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup

    #[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources

    #xsetroot -solid grey

    #vncconfig -iconic &

    #xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &

    #twm &
  4. 修改防火牆設定
    # setup
    選單依序選擇:防火牆設定 => 自訂 => 其他連接埠,填入5901:tcp
【Client端】
  1. 先使用SSH遠端登入電腦(推薦使用PieTTY),開啟VNC服務
    vncserver -geometry 1024x768
    註:第二個參數是解析度設定,可依需求自行調整。
  2. 輸入上面指令會有類似下面這段的訊息:
    New 'xxx:n (user)' desktop is xxx:n
    xxx:依系統的網域名稱不同而變化
    n:開啟的桌面編號,從1開始遞增。
  3. 使用VNC Viewer軟體開啟遠端桌面連線,於Server欄位填入IP:n,點選OK會詢問密碼,填入一開始設定的密碼即可開啟遠端桌面連線。
    如果沒有VNC Viewer軟體可用瀏覽器開啟連線服務,於網址列輸入http://IP:580n亦可。
  4. 使用完畢後,遠端桌面直接按右上角的'X'關閉即可,回到SSH連線視窗關閉開啟的VNC服務
    # vncserver -kill :n

2007-12-30

【CentOS】讓帳號ssh登入後可以su到root

修改設定檔
# vi /etc/ssh/sshd_config

在最後面加入設定值
AllowUsers acos

修改完後記得重新啟動sshd服務
# /etc/rc.d/init.d/sshd restart

註:acos→請填入自己的帳號,如果有多個帳號用空格格開就可以

2007-10-09

【Ubuntu】7.10光碟開始提供索取申請

  這幾天讓人很興奮的是Ubuntu 7.10終於要釋出了!今天已經進入倒數九天了,從倒數十一天起就一直跑去Ubuntu官網晃,關注了兩天終於開放申請索取7.10的光碟,身為Ubuntu的忠實愛好者,當然也要趕緊來參一腳。這次申請選項少了一點,預設的光碟索取組合變得比較『不浪費』,這次預設選項最多2張光碟片,可以選擇兩張PC版的或是選擇PC、64bit版各一張。
  有興趣的使用者也可已到https://shipit.ubuntu.com/申請,如果需要地址翻譯的話可以參考台灣郵政網頁提供的轉換服務

2007-08-26

【Ubuntu】安裝Adobe Reader(64-bit與32-bit皆適用)

step1) 加入金鑰
$ wget -q http://medibuntu.sos-sts.com/repo/medibuntu-key.gpg -O- | sudo apt-key add -

step2) 編輯套件來源
$ sudo gedit /etc/apt/sources.list
加入以下內容
## Medibuntu - Ubuntu 7.04 "feisty fawn"
## Please report any bug on https://launchpad.net/products/medibuntu/+bugs
deb http://medibuntu.sos-sts.com/repo/ feisty free non-free
deb-src http://medibuntu.sos-sts.com/repo/ feisty free non-free

step3) 更新套件列表,安裝Adobe Reader
$ sudo apt-get update && sudo apt-get install acroread

step4.1) 下載繁體中文字型
到http://www.adobe.com/products/acrobat/acrrasianfontpack.html下載
頁面選項版本請選擇Adobe Reader 7、Chinese Traditional、Linux如下圖所示

step4.2) 安裝中文字型
下載後解壓縮,進入解壓縮得到的資料夾,進行安裝
$ sudo ./INSTALL

會問你確定安裝?按y,按Enter鍵
會問接受授權?輸入accept,按Enter鍵
接下來問安裝路徑,複製貼上/usr/lib/Adobe/Acrobat7.0 ,按Enter鍵

PS. Ubuntu預設的文件檢視器本身就可以瀏覽PDF的檔案,不過對於有中文內容的文件就會發生字體被分解、支離破碎的問題。

2007-08-25

【Ubuntu】(for 64位元版本)讓ubuntu可以觀看wmv, mpg, rm, asx...等格式的影片

step1) 安裝gstreamer的解碼器
$ sudo apt-get install gstreamer0.10-ffmpeg gstreamer0.10-plugins-bad gstreamer0.10-plugins-bad-multiverse gstreamer0.10-plugins-ugly gstreamer0.10-plugins-ugly-multiverse

step2) 安裝xine及解碼器
$ sudo apt-get install libxine-extracodecs totem-xine ffmpeg lame faad sox mjpegtools libxine-main1

step3) 安裝w32codecs
先把這一個伺服器位址http://packages.medibuntu.org/ feisty 加入sources.list清單,並且更新
$ echo "deb http://packages.medibuntu.org/ feisty free non-free" | sudo tee -a /etc/apt/sources.list
$ wget -q http://packages.medibuntu.org/medibuntu-key.gpg -O- | sudo apt-key add - && sudo apt-get update
接著就可以用apt-get輕鬆安裝了!
$ sudo apt-get install w64codecs

step4) 其他請參考【Ubuntu】讓ubuntu可以觀看wmv, mpg, rm, asx...等格式的影片

PS. 這在Ubuntu 7.04 64-bit上安裝成功,之前從64bit換回32bit就是w32decodecs搞不定,後來在網路上看到有阿肚仔說這解碼器for 64bit版本的套件名稱叫做w64decodecs,找了一下才發現Medibuntu已經提供Packages...,之前搞了好久的東西想不到只要幾個指令就簡單完成安裝了>"<