標籤:
Linux問題集
1 linux設定環境變數及儲存地點
1. 顯示環境變數HOME
$ echo $HOME
/home/terry
2. 設定一個新的環境變數WELCOME
$ exportWELCOME="Hello!"
$ echo$WELCOME
Hello!
3. 使用env命令顯示全部的環境變數
$ env
HOSTNAME=terry.mykms.org
PVM_RSH=/usr/bin/rsh
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
...
4. 使用set命令顯示全部本地定義的Shell變數
$ set
BASH=/bin/bash
BASH_VERSINFO=([0]="2"[1]="05b"[2]="0"[3]="1"[4]="release"[5]="i386-redhat-linux-gnu")
BASH_VERSION=‘2.05b.0(1)-release‘
COLORS=/etc/DIR_COLORS.xterm
COLUMNS=80
DIRSTACK=()
DISPLAY=:0.0
...
5. 使用unset命令來清除環境變數
set能夠設定某個環境變數的值。清除環境變數的值用unset命令。
假設未指定值,則該變數值將被設為NULL。示比例如以下:
$ exportTEST="Test..." #添加一個環境變數TEST
$ env|grepTEST #此命令有輸入,證明環境變數TEST已經存在了
TEST=Test...
$ unset $TEST#刪除環境變數TEST
$ env|grepTEST #此命令沒有輸出,證明環境變數TEST已經存在了
6. 使用readonly命令設定僅僅讀變數
假設使用了readonly命令的話。變數就不能夠被改動或清除了。
示比例如以下:
$ exportTEST="Test..." #添加一個環境變數TEST
$ readonlyTEST #將環境變數TEST設為僅僅讀
$ unset TEST#會發現此變數不能被刪除
-bash: unset:TEST: cannot unset: readonly variable
$TEST="New" #會發現此也變數不能被改動
-bash: TEST:readonly variable
環境變數的全域設定位於/etc/profile檔案,假設須要添加新的環境變數能夠加入下屬行
exportPATH=$PATH:/path1:/path2:/pahtN
2 ubuntu下安裝刪除命令
apt表示是advancedpacakge Tool.
apt-cachesearch package 搜尋包
apt-cacheshow packagename 擷取包的資訊如版本號碼和大小。
apt-getinstall packagename 安裝包。
apt-getinstall pacekage --reinstall 又一次安裝
apt-get -finstall packagename 強行安裝
apt-getremove packagename 刪除某個程式
apt-getremove packagename --pure 乾淨的卸掉
apt-getautoremove 自己主動刪除不要的包
apt-getupdate
apt-getupgrade 更新已經安裝的包
apt-getdist-upgrade 升級系統。沒用過
apt-cachedepends pacakgename 瞭解使用的依賴,非常少用
apt-cacherdepends packagename 瞭解詳細的依賴。
apt-getbuild-dep packagename 安裝相關的編譯環境。
這個有時須要用。
apt-getsource package 下載安裝該包的原始碼,編程時有時須要看
apt-get clean
apt-getautoclean 清理下載檔案存檔。
apt-getcheck 檢查是否有損壞的依賴,非常少用。
能夠通過man apt獲得更為具體的解釋。
3怎樣讓linux在啟動時自己主動載入指令碼
1 先編寫指令碼。比方名字為a.sh
2 儲存路徑為:/etc/rc.d/a.sh
3 改動/etc/rc.d/rc.local
在該檔案末尾增加a.sh指令碼的存放路徑:/etc/rc.d/a.sh
儲存,退出 ,就OK了。
4 mount和 umount 命令
mount文法:
mount [選項]<-t 類型> [-o 掛載選項] <裝置> <掛載點>
-t 選項用於指定分區上檔案系統的類型。
您最常遇到的檔案系統應該是ext2FS(GNU/Linux 檔案系統)或 ext3FS(改進了日誌效能的 ext2FS),VFAT(適用於全部 DOS/Windows? 分區:FAT12, 16 or 32)以及 ISO9660(CD-ROM 檔案系統)。假設您不指定不論什麼類型,mount 將會試著讀取分區中的超塊來推測檔案系統。
-o 選項用於指定一個或多個掛載選項。可供選擇的選項視檔案系統類型不同而有所不同。請參看 mount(8) 手冊頁中的細節。通常將分區掛載在 /mnt 或其他掛載點(掛載點必須已經存在)。
舉例:
$ mount -text3 /dev/hdb1 /mnt
要卸下分區。可使用umount 命令。文法:
umount <掛載點|裝置>
舉例:
$ umount /mnt 或者:
$ umount/dev/hdb1
提示:有些時候,可能某些裝置(一般是 CD-ROM)正忙或無法響應。此時,大多數使用者的解決的方法是又一次啟動電腦。
我們大可不必這麼做。比如,假設umount /dev/hdc 失敗的話。您能夠試試“lazy” umount。文法十分簡單:
umount -l<掛載點|裝置>
此命令將會斷開裝置並關閉開啟該裝置的所有控制代碼。通常,您能夠使用 eject <掛載點|裝置>命令彈出碟片。所以,假設eject 命令失效而您又不想又一次啟動。請使用 lazy umount。
假設我們想讓系統在啟動的時候自己主動掛載某些分區,則應該編輯/etc/fstab 檔案。該檔案的每一行相應一組掛載關係,包含檔案系統、掛載點以及其他選項。這裡是該檔案的一個範例:
/dev/hda1 / ext2 defaults 1 1
/dev/hda5 /home ext2 defaults 1 2
/dev/hda6 swap swap defaults 0 0
none /mnt/cdrom supermount dev=/dev/scd0,fs=udf:iso9660,ro,--0 0
none /mnt/floppy supermountdev=/dev/fd0,fs=ext2:vfat,--,sync,umask=0 0 0
none /proc proc defaults 0 0
none /dev/pts devpts mode=0622 0 0
每行都由下面內容組成:
檔案系統所在的裝置;
掛載點;
檔案系統類型;
掛載選項;
dump 工具備份標誌;
fsck(檔案系統檢查(FileSystem ChecK))的檢查順序。
總是有一行說明了根檔案系統。swap 分區是一種特殊的分區,由於您無法在樹形結構中找到其相應位置,並且這些分區的掛載點域僅僅寫著swap keyword。至於 /proc 檔案系統。我們會在第 10 章 /proc 檔案系統中有更具體的描寫敘述。第二種特殊的檔案系統是/dev/pts。
舉例個範例。假設想把/dev/hdb1自己主動掛載到/usr ,就得在 /etc/fstab 檔案裡加入以下一行:
/dev/hdb1 /usr ext2 defaults 1 2
這樣,分區將會在每次啟動時自己主動掛載。而且必要時檢查錯誤。
如今我們來介紹兩個特殊選項:noauto 和 user。noauto 選項指定了檔案系統不應該在啟動時掛載。而僅僅應該在您想要掛載的時候才掛載。
而user 選項指定了不論什麼使用者都能夠掛載或卸下檔案系統。這兩個選項通經常使用於 CD-ROM 和軟碟機。有關 /etc/fstab 中其他選項的詳情。請您查看 fstab(5) 手冊頁。
使用 /etc/fstab 的優點在於。它將極大簡化 mount 命令的文法。要掛載檔案裡描寫敘述的檔案系統。您僅僅須要引用掛載點或裝置。
要掛載磁碟片,您能夠僅僅輸入:
$ mount/mnt/floppy
或:
$ mount/dev/fd0
5 檔案的加鎖問題
問:用fcntl給檔案加鎖,在一個進程中加給一個檔案多次加同一類型的鎖。不會報錯嗎?
答:假設一個進程對一個檔案區間已經有一把鎖,後來該進程又企圖在同一檔案區間再加一把鎖,那麼新鎖將替換老鎖。
6 framebuffer簡單介紹
FrameBuffer 是出如今 2.2.xx 核心其中的一種驅動程式介面。這樣的介面將顯示裝置抽象為框架緩衝區。
使用者能夠將它看成是顯示記憶體的一個映像,將其映射到進程地址空間之後。就能夠直接進行讀寫操作,而寫操作能夠馬上反應在螢幕上。該驅動程式的裝置檔案通常是/dev/fb0、/dev/fb1 等等。
比方,如果如今的顯示模式是 1024x768-8 位色,則能夠通過例如以下的命令清空螢幕:
$ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768
在應用程式中。一般通過將 FrameBuffer 裝置映射到進程地址空間的方式使用,比方以下的程式就開啟 /dev/fb0 裝置,並通過mmap 系統調用進行地址映射,隨後用 memset 將螢幕清空(這裡如果顯示模式是 1024x768-8 位色模式,線性記憶體模式):
int fb;
unsigned char* fb_mem;
fb = open ("/dev/fb0",O_RDWR);
fb_mem = mmap (NULL, 1024*768,PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);
memset (fb_mem, 0, 1024*768);
FrameBuffer 裝置還提供了若干 ioctl 命令,通過這些命令,能夠獲得顯示裝置的一些固定資訊(比方顯示記憶體大小)、與顯示模式相關的可變資訊(比方解析度、象素結構、每掃描線的位元組寬度),以及偽彩色模式下的調色盤資訊等等。
通過 FrameBuffer 裝置,還能夠獲得當前核心所支援的加速顯示卡的類型(通過固定資訊得到)。這樣的類型通常是和特定顯示晶片相關的。比方眼下最新的核心(2.4.9)中,就包括有對S3、Matrox、nVidia、3Dfx 等等流行顯示晶片的加速支援。在獲得了加速晶片類型之後,應用程式就能夠將 PCI 裝置的記憶體I/O(memio)映射到進程的地址空間。
這些memio 通常是用來控制顯示卡的寄存器,通過對這些寄存器的操作,應用程式就能夠控制特定顯卡的加速功能。
PCI 裝置能夠將自己的控制寄存器映射到實體記憶體空間,而後,對這些控制寄存器的訪問,給變成了對實體記憶體的訪問。因此。這些寄存器又被稱為"memio"。一旦被映射到實體記憶體。Linux的普通進程就能夠通過 mmap 將這些記憶體 I/O 映射到進程地址空間,這樣就能夠直接訪問這些寄存器了。
當然,由於不同的顯示晶片具有不同的加速能力。對memio 的使用和定義也各自不同,這時,就須要針對加速晶片的不同類型來編寫實現不同的加速功能。比方大多數晶片都提供了對矩形填充的硬體加速支援,但不同的晶片實現方式不同。這時,就須要針對不同的晶片類型編寫不同的用來完畢填充矩形的函數。
講到這裡,讀者可能已經意識到 FrameBuffer 僅僅是一個提供顯示記憶體和顯示晶片寄存器從實體記憶體映射到進程地址空間中的裝置。所以,對於應用程式而言,假設希望在FrameBuffer 之上進行圖形編程。還須要完畢其它很多工作。舉個範例來講。FrameBuffer 就像一張畫布,使用什麼樣子的畫筆,怎樣畫畫。還須要你自己動手完畢。
7 strings命令的作用
一些二進位格式的檔案。
你想知道裡面有哪些常量字串。
就很實用。比方你產生這樣一個程式,a.c:
int main(void)
{
return printf ("hello world\n");
}
#cc -o a.outa.c
#strings./a.out
/lib64/ld-linux-x86-64.so.2
_Jv_RegisterClasses_
_gmon_start_
_
libc.so.6
printf
__libc_start_main
GLIBC_2.2.5
hello world
8 什麼是tty?
終端裝置是一種字元型裝置。它有多種類型,通常使用tty來統稱。tty是Teletype的縮寫。Teletype是最早出現的一種終端裝置,非常象電傳打字機(或者說就是?
)。是由Teletype公司生產的。在Linux系統的裝置特殊檔案檔案夾/dev/下。終端裝置檔案一般有下面幾種:
1.串端終端(/dev/ttySn)
串列port終端(Serial Port Terminal)是使用電腦串列port串連的終端裝置。電腦把每一個串列port都看作是一個字元裝置。有段時間這些串列port裝置通常被稱為終端裝置,由於那時它的最大用途就是用來串連終端。這些串列port所相應的裝置名稱是/dev/tts/0(或/dev/ttyS0)、/dev/tts/1(或/dev/ttyS1)等,裝置號各自是(4,0)、(4,1)等,分別相應於DOS系統下的COM1、COM2等。若要向一個port發送資料,能夠在命令列上把標準輸出重新導向到這些特殊檔案名稱上就可以。比如,在命令列提示符下鍵入:echotest > /dev/ttyS1會把單詞”test”發送到串連在ttyS1(COM2)port的裝置上。
2.偽終端(/dev/pty/)
偽終端(Pseudo Terminal)是成對的邏輯終端裝置。比如/dev/ptyp3和/dev/ttyp3(或著在裝置檔案系統中各自是/dev/pty/m3和/dev/pty/s3)。它們與實際物理裝置並不直接相關。假設一個程式把ttyp3看作是一個串列port裝置,則它對該port的讀/寫操作會反映在該邏輯終端裝置對的還有一個上面(ptyp3)。而ptyp3則是還有一個程式用於讀寫操作的邏輯裝置。
這樣,兩個程式就能夠通過這樣的邏輯裝置進行互相交流。而當中一個使用ttyp3的程式則覺得自己正在與一個串列port進行通訊。這非常象是邏輯裝置對之間的管道操作。
對於ttyp3(s3),不論什麼設計成使用一個串列port裝置的程式都能夠使用該邏輯裝置。但對於使用ptyp3的程式,則須要專門設計來使用ptyp3(m3)邏輯裝置。
比如,假設某人在網上使用telnet程式串連到你的電腦上,則telnet程式就可能會開始串連到裝置ptyp2(m2)上(一個偽終端port上)。
此時一個getty程式就應該執行在相應的ttyp2(s2)port上。
當telnet從遠端擷取了一個字元時。該字元就會通過m2、s2傳遞給getty程式,而getty程式就會通過s2、m2和telnet程式往網路上返回”login:”字串資訊。這樣,登入程式與telnet程式就通過“偽終端”進行通訊。通過使用適當的軟體,就能夠把兩個甚至多個偽終端裝置串連到同一個物理串列port上。
在使用裝置檔案系統(device filesystem)之前,為了得到大量的偽終端裝置特殊檔案,使用了比較複雜的檔案名稱命名方式。由於僅僅存在16個ttyp(ttyp0—ttypf)的裝置檔案,為了得到很多其它的邏輯裝置對,就使用了象q、r、s等字元來取代p。比如。ttys8和ptys8就是一個偽終端裝置對。
只是這樣的命名方式眼下仍然在於RedHat等Linux系統中使用著。
但Linux系統上的Unix98並不使用上述方法。而使用了”pty master”方式,比如/dev/ptm3。它的相應端則會被自己主動地建立成/dev/pts/3。這樣就能夠在須要時提供一個pty偽終端。檔案夾/dev/pts是一個類型為devpts的檔案系統。而且能夠在被載入檔案系統列表中看到。
儘管“檔案”/dev/pts/3看上去是裝置檔案系統中的一項,但事實上它全然是一種不同的檔案系統。
3.控制終端(/dev/tty)
假設當前進程有控制終端(Controlling Terminal)的話。那麼/dev/tty就是當前進程式控制制終端的裝置特殊檔案。
能夠使用命令”ps–ax”來查看進程與哪個控制終端相連。
對於你登入的shell,/dev/tty就是你使用的終端,裝置號是(5,0)。使用命令”tty”能夠查看它詳細相應哪個實際終端裝置。/dev/tty有些類似於到實際所使用終端裝置的一個聯結或別名。
4.控制台(/dev/ttyn,/dev/console)
在Linux系統中。電腦顯示器通常被稱為控制台終端或控制台(Console)。
它模擬了類型為Linux的一種終端(TERM=Linux)。而且有一些裝置特殊檔案與之相關聯:tty0、tty1、tty2等。當你在控制台上登入時,使用的是tty1。
使用Alt+[F1—F6]按鍵組合時。我們就能夠切換到tty2、tty3等上面去。tty1–tty6等稱為虛擬終端,而tty0則是當前所使用虛擬終端的一個別名,Linux系統所產生的資訊都會發送到該終端上。
因此無論當前我們正在使用哪個虛擬終端,系統資訊都會發送到我們的螢幕上。C}$k]\
你能夠登入到不同的虛擬終端上去,因而能夠讓系統同一時候有幾個不同的會話存在。但僅僅有系統或超級使用者root能夠向/dev/tty0進行寫操作,並且有時/dev/console會串連至/dev/tty0或/dev/tty1上。
5.其他類型
Linux系統中還針對非常多不同的字元裝置建有非常多其他種類的終端裝置特殊檔案。
比如針對ISDN裝置的/dev/ttyIn終端裝置等。這裡不再贅述。
9 nm 命令和strip 命令
nm 命令顯示對象檔案、可運行檔案以及對象檔案庫裡的符號資訊。
strip 命令降低XCOFF 對象檔案的大小。strip 命令從 XCOFF 對象檔案裡有選擇地除去行號資訊、重定位資訊、調試段、typchk 段、凝視段、檔案頭以及全部或部分符號表。
一旦您使用該命令,則非常難調試檔案的符號。因此,通常應該僅僅在已經調試和測試過的產生模組上使用 strip 命令。使用 strip 命令降低對象檔案所需的儲存量開銷。
嵌入式Linux常見問題