Fedora 12 大邁進

  趁著換新電腦,直接把系統換成Fedora 12,發現有很多東西已經簡化了好多,更容易處理了。接下來又要開始更新筆記了。


[FC12]NVIDIA顯示卡的驅動

參考資料來源: http://forums.fedoraforum.org/showthread.php?t=204752
    以下資料來自 Fedora 官網論壇的強者legih123linux, 我覺得很受用,在此在大意轉述成中文,希望和我一樣身受驅動不起來的痛苦者可以解脫. 以下的做法是針對 Fedora 12。
    Fedora 9、10、11可以參考http://forums.fedoraforum.org/showthread.php?t=204752 , 這裡面有列出使用方法。

不支援以下清單
RIVA TNT
RIVA TNT2/TNT2 Pro
RIVA TNT2 Ultra
Vanta/Vanta LT
RIVA TNT2 Model 64/Model 64 Pro
Aladdin TNT2
GeForce 256
GeForce DDR
Quadro
GeForce2 GTS/GeForce2 Pro
GeForce2 Ti
GeForce2 Ultra
Quadro2 Pro

支援的型號請參考這裡
http://us.download.nvidia.com/XFree86/Linux-x86_64/190.42/README/appendix-a.html



1. 首先要把rpmfusion的檔案倉庫加入到系統的檔案倉庫清單.
若是GeForce 6, 7, 8, 9 & 200 系統顯示卡的驅動方式
指令如下


# su rpm -Uvhhttp://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpmhttp://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm


如果電腦的RAM是4GB以上(含4G),請跟著PAE的部份做


# yum install kmod-nvidia xorg-x11-drv-nvidia-libs.i686


如果使用的是PAE Kernel的話


# yum install kmod-nvidia-PAE


若是GeForce FX 的顯示卡則使用以下的指令


# su rpm -Uvhhttp://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpmhttp://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm
# yum install kmod-nvidia-173xx xorg-x11-drv-nvidia-173xx-libs.i686


PAE Kernel的部份需用


# su rpm -Uvhhttp://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpmhttp://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm
# yum install kmod-nvidia-173xx-PAE


GeForce 4以下的顯示卡如下


# su rpm -Uvhhttp://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpmhttp://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm
# yum install kmod-nvidia-96xx xorg-x11-drv-nvidia-96xx-libs.i686


PAE Kernel


# su rpm -Uvhhttp://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpmhttp://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm
# yum install kmod-nvidia-96xx-PAE



2. 編輯grub.conf
    在開機指令的後面再加上 rdblacklist=nouveau ,可以直接執行以下指令,由指令來加入。


# su -
# sed -i '/root=/s|$| rdblacklist=nouveau|' /boot/grub/grub.conf
# mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname-r)-nouveau.img
# dracut /boot/initramfs-$(uname -r).img $(uname -r)


如果使用PAE Kernel再加一個 add vmalloc=256m比較好,可以用以下指令添加vmalloc=256m到/boot/grub/grub.conf裡


# su -
# sed -i '/root=/s|$| vmalloc=256m|' /boot/grub/grub.conf


3. 避免SElinux不讓driver載入所以要執行以下指令。(或者是SElinux關閉)


# su
# setsebool -P allow_execstack on


4. 重新開機


 


 


PS.我的顯示卡是 NVIDIA GT9500EN


 


如果有朋友使用的筆記電腦是Sony品牌的話,請參考一下Spark網友的寶貴資料
http://spark-tux.blogspot.com/2010/02/sony-cw16.html


[FC 11]NVIDIA的Linux Driver,開啟硬體加速

  在我的PC裝上Fedora 11後,一直被一個問題困擾著。就是顯示卡的效能很差,彷彿沒有作用似的全用軟體在模擬著3D畫面。就連撥放個800X600的影片也很容易出現lag,而且cpu的使用率超高。如果想知道你的Linux是不是有開啟3D硬體加速,可以參考“今天的 Tetralet 又在唧唧喳喳了 - Linux 的模擬世界 (三) - 3D 硬體加速”這篇(如果系統裡找得到Xorg.conf的系統適用)。


  可是在Fedora 11下有另一個問題,就是在預設安裝下是沒有/etc/X11/Xorg.conf這個檔案的。原本以為是我裝錯了,在Fedora Forums爬了文才發現原來Fedora 11真的沒Xorg.conf,所以我也搞不清楚到底我的硬體加速有沒有開起來。


  所以我朝向另一個方向思考,把Fedora 11的Driver換掉,改用NVIDIA官版的驅動程式,以下的動作可能有無法啟動或是顯示卡無法正常運作的風險,要使用前最好能備份系統和做好心理準備。


NVIDIA驅動程式下載參考網址


請依各系統的顯示卡分別下載所需要的驅動程式,我的顯卡是GeForece 3 Ti-200,所以我就是下載“Legacy releases for GeForce 2 through GeForce 4 series GPUs”這一個,x86版本x86_64版本。這裡有一份各驅動程式有支援的清單


下載後會有一個名稱為“NVIDIA-Linux-x86-96.43.14-pkg1.run”的檔案,執請先讓檔案擁有執行的權限。使用以下指令


# chmod 755 NVIDIA-Linux-x86-96.43.14-pkg1.run


  到這一步後先別急著執行他,因為在X Server還在運作時是無法執行的。需要先將系統的Run Level設成3後,重新開機。這個動作會使得X Window完全沒有啟動,也就是進入完全的指令模式,看不到任何的視窗界面。所以如果是新手的話,最好能先有心裡準備。


  要將系統Run Level設定改變的話,需要變更“/etc/inittab”這個檔案,使用你熟悉的文字編輯器開啟“/etc/inittab”。尋找類似以下的內容:


# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon


這段的意義是指定開機時的Run Level為5,只要將內容的5改為3,如下:


# Run xdm in runlevel 5

x:3:respawn:/etc/X11/prefdm -nodaemon


存檔後重新開機就可以了。這裡千萬要注意別改成0或是6,若是改成0就會開不了機,因為Run Level 0是指關閉系統,而6是指重新開機,若錯改成6就會不停的重新開機。


  感謝SFC網友的提醒,這個部份是有比較簡單的方法,使用root權限直接執行


# init 3


接下來系統就會切換到runlevel 3


自動重新開機後,就會看到指令模式的登入畫面。將執行目錄切換到檔案“NVIDIA-Linux-x86-96.43.14-pkg1.run”存在的目錄,使用root權限執行“NVIDIA-Linux-x86-96.43.14-pkg1.run”。


# sudo ./NVIDIA-Linux-x86-96.43.14-pkg1.run


接下來安裝程式會自己搞定一切,包括設定出一個新的Xorg.conf,完成後再將“/etc/inittab”改回原來的 5 。再重新開機,應該就可以看到一個流暢的X window。記得一定要記得改回 5 哦!!!這樣才能回到X window的操作模式下。 接下來就可以下reboot重新開機或是執行 init 5 回到X Window下就完成了。




pidgin中文出現亂碼

pidgin一般使用時都還蠻正常的, 可是在某些情況下會出現對方傳來的訊息變成亂碼, 可是有些朋友的訊息卻不會. 這似乎是由於msn訊息的格式所造成的. 可以依以下的步驟處理.


到【模組】中,勾選「交談視窗用色」這個模組,然後到右下角進行模組細節設定,在對話盒中勾選「忽略收到訊息中的自訂格式」即可。


gmail出現system encountered a problem #500 的問題

    這陣子firefox在使用gmail時很容易出現system encountered a problem #500的問題,但是剛好firefox一連升級了幾次,所以有點摸不著頭緒是那裡出了問題,但是很明顯的並不是網路造成的。因為其他的連線都很正常,所以一直懷疑是不是升級失敗了。後來想想最近只有新裝了一個套件(cookiepie),就是可以進行多重登錄email信箱的套件。試著把他關掉後發現,這個錯誤就沒有了,google了一下才發現,原來受害者還不只有我而已。哈...遇到同樣問題的朋友也把cookiepie disable一下看看,等確定要用時再enable,不然就要等看看新版會不會把這個bug


Bash Shell下String變數的Substring

在Shell下如果要取字串中的一部份字串可用以下的寫法,
假設一字串為
kk1=abcde
如果要將bcd取出, 從a開始為第0個, b為第1個, 取三位.

echo ${kk1:1:3}

畫面就會出現
bcd


Linux C的localtime函式問題

  
剛好前陣子工作時遇到一個讓我找了一整天的BUG,在這裡跟大家分享一下,免得以後還有其他受到這個問題的殘害。在C語言的library中,在 linux 下的時區的設定是利用TZ這個環境變數來指定,如果TZ環境變數沒有設定,則會以/etc/localtime為主。
/etc/localtime檔案可能是個符號連結到一個時區設定檔,或是一個真實檔案。大部份linux系統會將環境變數指向
/etc/localtime,“TZ=/etc/localtime”,再藉由/etc/localtime來指向時區檔案。在C語言中,如果時區發現變化,會使用 tzset() 涵數讓系統重新讀取到新的時間,但這個動作並無法發揮作用,導致/etc/localtime產生變化後,而 localtime() 仍然會使用舊的時區來讀取時間。tzset() 會 reset 三個C的內部變數,分別為 tzname丶timezone丶daylight。在此提供一個方法避開這個問題,因為tzset()無法成功的 reset 這三個變數,使得 localtime() 察覺不到時區的變化。
範例如下:
    時間12:00
    環境變數:
    TZ=”/etc/localtime”
    時區檔案:
    /etc/localtime -> /mnt/html/zoneinfo/GMT+08:00
    透過date指令得到的時間為12:00
    透過localtime()涵數讀取到的時間為12:00

    現將/etc/localtime指向新的時區檔案:
    /etc/localtime -> /mnt/html/zoneinfo/GMT+06:00
    透過date指令得到的時間為10:00
    透過localtime()涵數讀取到的時間仍然為12:00
因為導致使用 localtime() 涵數的功能發生時間上的錯誤。解決方法如下:
 
 可以透過TZ環境變數的強制改變,來使 tzname丶timezone丶daylight 這三個內部變數更新到新的時區。 
 在/etc/localtime指到新的時區之後,先將TZ環境變數設為NULL。讓 localtime() 先讀取一次時間,此時會因為TZ設定
NULL而使得 localtime() 以UTC時區讀取時間,接著再一次將TZ環境變數指回 /etc/localtime,再一次使用 localtime() 涵數便可以得到正確的時間。範例如下:
    時間12:00
    環境變數:
    TZ=”/etc/localtime”
    時區檔案:
    /etc/localtime -> /mnt/html/zoneinfo/GMT+08:00
    透過date指令得到的時間為12:00
    透過localtime()涵數讀取到的時間為12:00

    時間12:00
    環境變數將TZ改為NULL:
    TZ=”NULL”
    時區檔案:
    /etc/localtime -> /mnt/html/zoneinfo/GMT+08:00
    透過date指令得到的時間為4:00
    透過localtime()涵數讀取到的時間為4:00

    再一步將環境變數將TZ改回/etc/localtime:
TZ=”/etc/localtime”
    透過date指令得到的時間為12:00
    透過localtime()涵數讀取到的時間為12:00

備註:
發生環境:Ubuntu丶Fedora
gcc version: 4.1.3
glibc: 2.3.6


Docker SIGILL: illegal instruction 問題除錯記錄

Docker SIGILL: illegal instruction 問題除錯記錄 最近在一台平常執行得好好的伺服器上,遇到一個讓人頭痛的 Docker 問題。 原本 Portainer 和其他容器都可以正常運行,但在系統突然當機後,所有容器在啟動時都出現以下錯誤訊息: d...