2010年11月7日 星期日

解決Linux下 Grub 開機的問題

(1)問題描述:
    最近,在一台已經裝有Ubuntu 的機器上,由於測試的需求要再安裝另一個作業系統
    CentOS。在CentOS安裝完畢之後,重新開機,進入CentOS的開機選單,選擇要進入
    Ubuntu時卻出現錯誤 訊息進不去,但相反的卻可以進去到CentOS。


(2)Try and Error:
    
    此時選擇進入CentOS,在命令列模式下執行以下指令: 
   (一):
   
 [root@CentOS5 /]# sudo  grub
 

  (二):此指令會在各個分割區去尋找是否有 kernel  為 2.6.28-19-generic 的檔案,也就是
           Ubuntu的Kernel
    
[root@CentOS5 /]#find /boot/vmlinuz-2.6.28-19-generic


(三):執行 find 命令的結果卻是:
[root@CentOS5 /]#Error 15: File not found

說明:
由於在CentOS上找不到 vmlinuz-2.6.28-19-generic 這個檔案,所 以,也就無法透過menu.lst 去 增加Ubunutu 的開機 選項。因為就算添加,在CentOS的開機選單上仍然是無法正常執行

(3)問題發生原因:
原因在於一CentOS 和 Ubuntu的 檔案系統的 Inodes 大小是不同的
CentOS檔案系統的Inodes是128KB,而Ubuntu是256k,所以CentOS
的Grub 辨識不了 Ubutu。但是相反的,Ubuntu的 Grub 卻能辨識CentOS

祥細的討論可參考以下這一篇文章:
Grub開機問題

(4)解決方法:
 即然CentOS的Grub辨識不了 Ubutu,那麼我們只好使用Ubuntu的Grub了。
而這也是不更改現在分割區的indoes大小的唯一辦法了。
使用 Ubuntu 的 live cd 去更改 Grub,把Grub設成是Ubuntu。
祥細可以參考以下這一篇文章:
Ubuntu設定Grub

步驟如下:

(一)
使用 live cd 進入 ubuntu,並開啟命令列模式

(二)
sudo  grup

(三) :此步驟必須明確知道Ubuntu是裝在那顆硬碟的那個分割區。本例是第1顆硬碟的第1個分割區。
root (hd0,0)

(四)
setup (hd0)

(五)
exit

以上步驟完成之後,grub就由原本的centos改成是ubuntu了。開機即可進入ubuntu。在進入ubuntu後,開啟命令列模式,進行以下操作:


(一)
sudo grub

(二)
find  /boot/vmlinuz-2.6.18-194.el5PAE (查centos 的 kernel 檔案)

(三)
執行結果如下:
(hd0,2)
發現找到了,沒有出現錯誤訊息出來。 此時,我們可以把centos的選項 增加到 ubuntu 的 menu.list 內。

(四)
sudo vim /boot/grub/menu.lst

(五)
title CentOS 5 (2.6.18-194.el5PAE)
root (hd0,2)
kernel /boot/vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/ rhgb quiet
initrd /boot/initrd-2.6.18-194.el5PAE.img

(六)
存檔重新開機


  
  
 

2010年6月22日 星期二

在 Deabin/Ubuntu Server 下 架設 APT Server

問題描述:

如何在Deabin/Ubuntu Server 下 架設 一台 APT Server  好讓 end user使呢?!



解決方法:

     安裝文件已寫成pdf檔,下載網址如下:       
           

注章事項:
  • 1 當您解開懶人包時,會出現一個 pkgs 空的目錄。此即是放deb套件的目錄
  • 2 pkgs 是空目錄時,請不要執行 update 的 script 程式 否則會產生錯誤訊息
  • 3 承2 此時 請下載一個deb 包放到此pkgs目錄下做測式:skype (點我)

                

2010年3月24日 星期三

Ubuntu 9.04 下解決 抓不到 Attansic AR81系列 網卡問題

問題描述:
在Ubuntu 9.04下 抓不到 Attansic AR81系列 的網路卡 ,原因在於9.04 的 kernel 不支援
該系列的網卡


解決方法:

(方法一) kernel 升級或重新安裝Ubuntu 9.10。

(方法二) 官網下載Source code重新編譯安裝。
  1. 下載 drive source code: 點我
  2. 選擇 AR81Family Linux Driver
  3. tar -xzvf AR813X-linux-v1.0.0.9.tar.gz
  4. cd src
  5. sudo make
  6. sudo maike install
  7. sudo insmod atl1e.ko


Q:支援那些Attansic AR81系列的網路卡呢 ?

A:支援如下的網卡




說明:        
                每個PCI 的硬體裝罝 都會有一對的vendor id 與 device id 。其中
                vendor id 代表的是硬體廠商的編號;而device id 表示產品編號。
                因此,只要知道網路卡的 vendor_id 與 device_id,再對照此表 
                就能知道該驅動程式是否支援這一塊網路卡了






Q:要如何知道網卡的 vendor_id  與 device_id ?!

A:方法如下

  1.  在命令列模式下指令:

    james@james-desktop:~$ lspci -nn   

  2. 出現如下結果(只截選網卡資訊):
james@james-desktop:~$ 03:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+[10ec:8139]

    3. 其中:10ec:8139 就是vendor_id與device_id

2010年3月19日 星期五

解決 mount: cannot mount block device read-only 問題

說明:
在 Ubuntu Server 上要 mount nas上的資料匣到本地端,卻出現如下的錯誤訊息:

root@james-desktop:/home/james# mount -t cifs -o username="james" -o iocharset=utf8 //192.168.1.242/images db/
mount: block device //192.168.1.242/images is write-protected, mounting read-only
mount: cannot mount block device //192.168.1.242/images read-only


解決方法:
安裝smbfs套件即可解決
james@james-desktop:~$ apt-get install smbfs

2010年3月16日 星期二

openfire 整合 微軟的AD網域

說明:
因台北移民署專案的需求,openfire需整合微軟AD 帳號進來,其目的是要
讓clinet 端的 Pidgin 能用 AD上 的帳號就能登入,無需額外再openfire上
用人力的方式再建立一份跟AD上一模一樣的帳號。


實作方法如下:

1 openfire 安裝完之後,進入到web的初始設定畫面

2 進行到 profile settings 選項,選擇:(LDAP)

  



3 把ad的帳號匯入openfire,基本設定如下:

  • server type選擇:Active Directory
  •  Host 填入 微軟 AD 的 網域名稱(Domain name) 或 ip
  •  填入Base DN:指填入AD的網域名稱,但必須符合格式,以本例的網域名稱 是:immigration.gov.tw 為例,則要設定為:dc="immigration",dc="gov",dc="tw
  •  填入Administrator DN: 主要是告訴openfire AD網域上的那一個帳號是具有管理者的權限。以本例來說,網域上的administrator是具有管理者權限。那麼在 Administrator DN 這個欄位上就要做如此的設定:cn="Administrator",cn="Users",dc="immigration",dc="gov",dc="tw"。這個設定很明確的告訴了openfire 在 AD網域(immigration.gov.tw) 上的 Users 目錄裡的Administrator這個帳號具有管理者權限 。這個步驟完畢之後,即可按Continue鈕







4 這一頁使用預設值即可,無需改寫。按 Continue鈕




5 同樣使用預設值就可以了,按 Continue鈕



6 新增ad 網域上的 administrator 為 openfire 的管理者

 



7  重新登出再登入。即完成 openfire 整合 微軟 ad





使用Pidgin 驗證 整合成功:

1 開啟Pidgin 
2 帳號-->管理帳號-->新增





3   設置新增帳號:
  • 通訊協定:選擇XMPP
  • 使用者:填入AD上的帳號
  • 域名:填入Openfire 的 ip 或 網域名稱(Domain name)
  • 填入完畢之後,按加入鈕






4  紅色框框所圍的圖示是彩色的表示已經上線了;若是灰白表示未上線。




2010年3月15日 星期一

sed、awk 二三事

(一)
說明:
在外交部的案子中,因應專案的需求要做一個雙系統的備份/還原程式。
簡單的說,就是程式要能備份整台電腦的雙OS系統,並且能指定要還原
系統中的那一個OS。

與同事討論後認為:Clonezilla + Perl 是最好的組合與實作。

實作上,要把 Clonezilla 安裝在本機機器上,再搭配寫好的 Perl 程式
自動去把 Clonezilla 的 開機 與 復原 的參數 寫到 linux grub 的 menu.list 檔裡面。
使用者只要利用 Clonezilla 把 os 的 image 檔存在指定的分割區中,那麼,一但系統
當掉要再 回復的作業,只要開機進入menu選單 ,選擇要復原的 作業系統,Clonezilla
即會自動做回復的動作。

該支perl 程式 有用到 awk 命令 ,就把實務上常用的命令記下來吧!

(二):
awk 實例:

以冒號區分欄位,並印出第一筆記錄的第四個欄位值
awk 'BEGIN{FS=":"} NR==1 {print $4} ' config `


網路上有很多awk 的資源,推好文如下:
awk 單行腳本

2010年3月4日 星期四

Postgresql DB 備份與還原

說明:
 使用Postgresql DB 要做資料的備份與還原時,可以用以下的二個指令:

  • pg_dump :資料庫備份的指令
  • pg_restore :資料庫回復(Recover)的指令

實驗環境:

  • Ubuntu 9.04
  • Postgresql DB 8.3

    pg_dump 常用指令參數:
    •  -f  file
       --file=file
       輸出到指定的文件


    • -F format
      --format=format
      輸出的格式可以是下列之一

      p  輸出成一個sql 腳本

      t   輸出成一個 tar 檔

      c  輸出成一個壓縮格式的文件

       
    • -v
      --verbose
      備份時在瑩幕上顯示出祥細的訊息(如備份進度等)


    • -Z 0..9
      --compress=0..9
      此選項要配合輸出格式參數為 'c'   一起配合使用。數字
      0到9表示壓縮的級別


    • -h  host
      --host=host
      連線的主機名稱(也可以是ip)


    • -p  port
      --port=port
      資料庫的連結埠


    • -U username
      登入資料庫的帳號





    使用 pg_dump 做資料庫備份:

    (1)把名稱為xdna_kiosk_client 的資料庫備份
    到james家目錄的db資料匣中,且備份的檔名為 kiosk_client.bak
    pg_dump -h 127.0.0.1 -p 5432 -U postgres -F c -b -v -f "/home/james/db/xdna_kiosk_client.bak" xdna_kiosk_client  
    


    使用 pg_restore做備份還原:

    (1)
    新建一個空白的資料庫,該資料庫名稱為mydb:
    psql -U postgres -h 127.0.0.1 -c "create database mydb"
    

    (2)
    把james家目錄的db資料匣中備份檔 Recover 到 mydb
    pg_restore -h 127.0.0.1 -p 5432 -U postgres -F c -b -v -f "/home/james/db/xdna_kiosk_client.bak" mydb 
    

    2010年2月21日 星期日

    免費防毒軟體avast

    說明: avast! Antivirus 是一套功能強大的防毒軟體。有分為商業版與家用版。
                 家用版是完全免費的而且功能不輸給任何一套付費的軟體。下載家用版
                 的軟體之後,還要到官網去注冊取得合法的序號就可以使用一年。而且
                 最重要的是:合法序號可重覆申請,如此期限到期就可以再使用 


    下載軟體:
                      點我下載


    安裝:
    1. 請選擇:Chinese[traditional] 即繁體中文 並按下一步




               
    2.  使用預設選項按下一步





    3.  可視需求安裝。本例是不安裝。按下一步





    4.  軟體安裝中……



       
      


    啟動avast並輸入合法序號:
    1. 啟動軟體:程式集 --> avast ! Free Antivirus --> avast ! Free Antivirus





    2. 點選:註冊 --> 輸入合法序號





    3. 輸入合法序號後,系統出現:已註冊的狀態。




       
     說明:
              合法的序號只要到官網注冊就可以取得。
            

     

    2010年2月18日 星期四

    Perl Telnet 範例

    (一)使用情形:
    使用Perl 提供的 telnet 模組自動登入到網路上的某台主機,執行命令後把結果給傳回。

    (二)使用環境:
    client:ubuntu9.04
    server:centos5.4

    (三)注意事項:

    1 server端必須裝有telnet server
    2 server端必須開啟防火牆的23 port


    (四)Server端的配置:

    1啟動telnet服務:
    (i) 將“disable = yes” 改為“disable = no"
    [root@CentOS5 /]#vi /etc/xinetd.d/telnet 

    (ii) 重新啟動服務
    [root@CentOS5 /]#service xinetd restart 

    2 開啟防火牆23 port:

    (i) 編輯檔案

    [root@CentOS5 /]#vi /etc/sysconfig/iptables  
    

    (ii) 加入以下的規則(注意:不能加到最底下)
    -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 23
    -j ACCEPT 

    (iii)重新啟動iptable

    [root@CentOS5 /]#service iptables restart 


    (五)client code:


    1. #!/usr/bin/perl
    2. use Net::Telnet();
    3. my $t = new Net::Telnet(Timeout => 10 , Prompt => '/[\$#>]/');
    4. $t->open("192.168.2.104");
    5. $t->login('root', 'n123815798');
    6. @lines = $t->cmd("ifconfig");
    7. print @lines;

    2010年1月2日 星期六

    解決 /usr/bin/ld: cannot find -lxxx 問題

    問題:
    在linux環境編譯應用程式或lib的source code時常常會出現如下的錯誤訊息:
    • /usr/bin/ld: cannot find -lxxx

    這些訊息會隨著編譯不同類型的source code 而有不同的結果出來如:
    • /usr/bin/ld: cannot find -lc
    • /usr/bin/ld: cannot find -lltdl
    • /usr/bin/ld: cannot find -lXtst

    其中xxx即表示函式庫文件名稱,如上例的:libc.so、libltdl.so、libXtst.so。
    其命名規則是:lib+庫名(即xxx)+.so。


    會發生這樣的原因有以下三種情形:
    1 系統沒有安裝相對應的lib
    2 相對應的lib版本不對
    3 lib(.so檔)的symbolic link 不正確,沒有連結到正確的函式庫文件(.so)

    對於上述三種原因有一篇文章寫的很棒可參考這一篇文章的第4點:
    gcc命令祥解


    解決方法:
    (1)先判斷在/usr/lib 下的相對應的函式庫文件(.so) 的 symbolic link 是否正確
    若不正確改成正確的連結目標即可解決問題。

    (2)若不是 symbolic link 的問題引起,而是系統缺少相對應的lib安裝lib即可解決。

    (3)如何安裝缺少的lib:
    以上面三個錯誤訊息為例:
    錯誤1缺少libc的LIB
    錯誤2缺少libltdl的LIB
    錯誤3缺少libXtst的LIB
     

      以Ubuntu為例:
      先搜尋相對應的LIB再進行安裝的作業如:
      apt-cache search libc-dev
    apt-cache search libltdl-dev
    apt-cache search libXtst-dev

    實例:
    在進行輸入法gcin的 Source Code的編譯時出現以下的錯誤訊息:
    /usr/bin/ld: cannot find -lXtst

    經檢查後發現是:
    lib(.so檔)的symbolic link 不正確

    解決方法如下:
    cd /usr/lib
    ln -s libXtst.so.6 libXtst.so

    如果在/usr/lib的目錄下找不到 libXtst.so 檔,那麼就表示系統沒有安裝libXtst的函式庫。
    解法如下:
    apt-get install libxtst-dev

    2010年1月1日 星期五

    在Ubunut 9.04 安裝 Epson-ALCX11 印表機

    問題:
    Epson官網不提供 型號AlCX11 印表機的linux Drive。
    因此,若想在linux安裝此印表機,必須有第三方提供該印
    表機的drive。

    解決方法:
    下載第三方drive:
    載點


    安裝:

    • change to root
    • apt-get install libcupsys2-dev
    • apt-get install libstdc++5
    • tar -zxvf Epson-ALCX11-filter-1.1.tar.gz
    • cd Epson-ALCX11-filter-1.1
    • ./configure --prefix=/usr/
    • make install
    • aa-complain cupsd