1. 程式人生 > >熟悉Linux基本操作

熟悉Linux基本操作

計算機硬體基本知識

CPU內部已經含有一些小的指令集,我們所使用的軟體都要經過CPU內部的微指令集來達成。因此CPU可分為RISC(精簡指令集)和CISC(複雜指令集)兩種,前者有sun公司的SPARC,IBM的PowerPC系列及ARM系列等。後者有Intel、AMD等x86架構處理器,廣泛用於個人計算機上。

CPU與其他裝置整合到一塊主機板上協調工作,對於Intel處理器,主機板設計成南北橋結構,南橋溝通CPU及周邊運算速率較快的裝置,北橋連線其他速率較慢的外圍裝置。

由於CPU和外部元件執行速率不同,所以我們稱CPU內部執行速率為主頻與外部元件資料傳輸時的統一速度為外頻主頻/外頻=倍頻

,一般倍頻由廠商設定好,如果玩家想提高CPU效能,可人為提高主機板上外頻,此即超頻。

系統匯流排是主存與CPU資料傳輸的通道,分32/64位;I/O匯流排主要連線硬碟、USB、網絡卡等裝置。注意區分匯流排寬度和CPU字組大小,通常所說的32/64位CPU指CPU字組大小,即CPU每次能處理的資料量。32位CPU最多支援4GB記憶體。(2^32=4G,32位最多定址4G個地址,每個記憶體地址對應一個Byte資料)。

主存是動態隨機儲存記憶體(DRAM),通電時記錄和使用,掉電後資料消失。適配主存的外頻最好與CPU外頻相同,如DDR2-800的記憶體條,其外頻為400MHZ。
為提升資料傳輸速率,可採用雙通道設計,2^n個記憶體並行傳輸,若每個64位,則匯流排寬度擴充套件

為64×2^n位。為了提高資料傳輸速率,CPU內部嵌入了基於SRAM(靜態隨機儲存記憶體)的L2 cache快取記憶體,其頻率與CPU主頻相同。主機板上都有一塊固定的ROM(只讀儲存器),內部資料永久儲存,一般用於記錄BIOS資訊。

顯示介面卡(VGA:Video Graphic Array)用於計算機資料視覺化顯示。每個畫素的顯示需要佔用記憶體,因此顯示介面卡上會有一個記憶體容量。另外,顯示3D圖形的相關運算早期由CPU完成,如今為減輕CPU負擔,顯示卡也承擔此部分運算任務,即所謂GPU。

前面提到:CPU具有微指令集,它實際上是一系列二進位制數(機器語言),告知CPU執行特定的操作。程式語言通過編譯程式轉化為機器語言,實現操控計算機硬體的目的。但為了避免考慮整體硬體系統來設計程式,人類使用作業系統核心

(operation system kernel)來管理計算機硬體活動及驅動系統中所有硬體。作業系統核心本質上也是一組程式。

電腦科學發展史上的部分重要人物

Ken Thompson:1969年用匯編語言寫成Unix原型
Bill Joy:1977年伯克利大學的Bill Joy在取得Unix原始碼後,修改成適合自己機器的版本,命名為BSD,後創立sun公司。
Richard Mathew Stallman:1984年發起GNU計劃,併成立FSF(Free Software Foundation)。後開發了一些重要軟體GCC、Bash Shell、glibc等,引發了開源軟體風潮。
Linus Torvolds:1991年以bash、gcc等工具撰寫了linux核心。

Linux版本

注意區分Linux核心版本和distribution版本。Linux核心版本編號格式為類似:2.6.18-92.el5。2是主版本,6是次版本,偶數是穩定版,奇數是測試版。
Linux的distribution眾多,由套件管理的方式可分為RedHat系統的RPM方式及Debian系統的dpkg方式。Ubuntu使用dpkg方式。

Linux系統目錄結構

ubuntu 下載的軟體包一般放在/var/cache/apt/archives裡,以.deb為字尾名,
欲安裝該包,執行dpkg -i ×××.deb
dpkg -L libmysqlclient //檢視libmysqlclient各個檔案的安裝位置
ubuntu shell綠色字型代表可執行檔案,紅色代表壓縮檔案(通常是安裝包),藍色代表目錄

Linux常用命令大全

sudo 後續命令 //以根許可權操作,主要用於修改檔案,sudo是ubuntu自己的指令碼語言
sudo su //切換為根使用者
cd /home //cd用於開啟home目錄
cp /etc/group . //拷貝etc目錄下group檔案到當前目錄
rm group //刪除當前目錄下group檔案
ls -l //列出當前目錄下所有檔案的詳細資訊(-a:列出當前目錄所有檔案包括以 . 開頭的專案;-i:列出當前目錄下所有檔案的索引號inode)
如該檔案資訊開頭為drwxr-xr-x ,d表示是目錄,後面9項表示owner、group、world三類使用者的使用許可權,r讀、w修改、x執行、-無此許可權。
注:Linux共四種使用者,除以上三種還有root使用者。
查詢命令:
find /usr/lib -name interfaces //查詢該目錄中所有名為interfaces的檔案,此方法較慢
locate interfaces //對/var/lib/locatedb檢索(包含本機所有檔案資訊的資料庫),找出所有名為interface的檔案,較快
whereis grep //搜尋linux上二進位制檔案grep的位置,只能搜尋可執行檔案/二進位制檔案
type grep //檢視命令是否為系統命令
file /bin/bash //檢視bash的檔案型別和格式,此處bash是elf型別的可執行檔案格式,elf型別包括共享目標檔案(.so),可執行檔案(linux中一般不加字尾名),可重定位檔案(.a,.o),核心轉儲檔案等。

ln passwd passwd.2 //對已存在的passwd建立硬連線passwd.2 passwd.2與passwd共享同一個索引號
ln -s passwd passwd.2 //對已存在的passwd建立軟連線,passwd.2 是passwd的符號連線:passwd -> passwd.2
注:連線是指檔名與索引號的對應
mv passwd.2 godown.b //移動passwd.2為同一目錄下並更名為godown.b,實際上是原地搬移,實現了更名,索引號不變。
man ls //查閱手冊,瞭解ls命令的用法
ls --help // 獲取ls的幫助文件
mount /dev/cdrom /mnt/cdrom //將cdrom的檔案掛到mnt/cdrom目錄下,預設mnt為接受外掛檔案系統的目錄
mkdir test //在當前目錄下建立新目錄test
touch a.txt //在當前目錄下建立新檔案a.txt
cat -n /etc/passwd //檢視passwd檔案並以行編號輸出,passwd記錄使用者帳號資訊,賬號資訊中UID若為0,則為root使用者,享有最高許可權。
chown root /home/zhengfeng/Music
chgrp root /home/zhengfeng/Music //更改檔案的所有者及所有組
chmod +x install.sh //更改install.sh的訪問許可權為允許所有人執行,+x增加執行許可權
echo $PATH //顯示當前搜尋路徑,若$PATH 加單引號,則顯示該字串,若$前加轉義字元\則同樣顯示該字串,若$PATH加雙引號則顯示當前搜尋路徑,即保留$的特殊用義。$用來標誌系統環境變數。
echo $BASH_VERSION //顯示當前bash版本,bash是一種shell,作為命令語言直譯器。
ls -l /dev/hd* &<result.txt //將dev目錄下hd開頭的檔案資訊逐個列出儲存到新建檔案result.txt裡,若檔案不存在,則輸出錯誤資訊同樣儲存在rsult.txt裡。這是一個輸出重定向的例子。Linux預設標準輸入0鍵盤,標準輸出1螢幕,標準錯誤2也是螢幕,若需更改則使用> >> < <<符。
ls -l /dev/hd* <result.txt 2<error.txt //更一般的用法
cp /dev/stdin a.txt //將鍵盤輸入內容儲存在a.txt內,鍵入時按CTRL+D結束。
cp a.txt /dev/stdout //將a.txt內容輸出到螢幕,與cat等價
ls -l /dev|more //將dev目錄下檔案資訊分頁顯示 |是管道操作符,表示前後命令並列執行。
history //列出本次登入後所有操作歷史,並編號;!12 將第12條歷史命令重新執行一次;!! 將最近的命令重複執行一次。
dir() { ls -ld $*;} //建立一個shell函式dir(),功能是花括號內命令,$*用於提取引數 因此dir /home 即顯示hom目錄資訊,注意左花括號後有一空格,如多個命令則依次寫在花括號內,以分號分隔。
alias lm = ‘ls -al’ //令lm為別名

Linux在命令列輸入時也有命令補全功能,例如在輸入一個檔名到一半時,按下tab鍵,系統會自動補全名字,若存在相似檔名,則需要繼續輸入。

ps //process situation 顯示當前程序狀態
kill -9 1841 //向程序發值為9的訊號,終止PID為1841的程序,訊號是一種機制,程序通過訊號瞭解系統中發生的事件。
top //實時監視系統執行狀況,按q退出監視返回shell
ping IP或網站名 //檢查與目標主機或網站的連線是否連通,但不能作為評判標準

遠端登入與NFS

Telnet是Internet提供的一項基本服務,用來將本地計算機作為遠端計算機的終端機使用。
telnet 主機名或IP地址
exit或logout命令退出
telnet以明文傳輸不安全,因此禁止root身份登入
SSH 主機名或IP地址 //作為telnet的替代,以公開金鑰演算法加密資料,允許root登入

scp 本地檔案路徑 遠端使用者名稱@主機:檔案路徑 //用於本地與遠端計算機之間安全拷貝檔案 如:
scp [email protected]:a.txt

sftp 遠端使用者名稱@主機 //以安全模式進入ftp狀態,此時可執行該狀態下的命令:
get 遠端路徑 本地路徑 //下載
put 本地路徑 遠端路徑 //上傳
quit 退出
? //列出該狀態可使用的命令清單,其中不少同Linux Bash命令如mkdir、cd、ls等,都是針對被登入機操作,若對本地機操作,則在命令前加字母l,如lmkdir、lls等

NFS(Network File System):通過網路將遠端主機的檔案系統掛載到本地主機目錄下,以便於使用,它基於客戶機/伺服器模式,建立在TCP/IP協議的表示層協議與會話層協議機制之上。

vim程式編輯器

vim是vi文字編輯器的進階版,在所有linux系統上均可使用,被稱為“編輯器之神”。
vi分為三種模式:一般模式,編輯模式和指令列命令模式
vi hello.c //進入hello.c檔案,此時為一般模式,若hello.c不存在則自動新建
一般模式下執行vi定義的鍵盤上轉義字元操作,del為刪除游標上字元,dd為刪除一整列,退格鍵及上下左右鍵移動游標,i進入插入游標前編輯模式,a進入插入游標後編輯模式,r進入改寫編輯模式;
編輯模式下鍵盤上所有按鍵除ESC外都可輸入字元,如上下左右鍵分別代表ABCD大寫字母,按ESC退出編輯;
在一般模式下按:進入指令列模式,最下面一行為指令列,wq儲存並退出。

gcc程式設計

gcc中庫的連結順序是從右往左進行,所以要把最基礎實現的庫放在最後,這樣左邊的lib就可以呼叫右邊的lib中的程式碼。同時,當一個函式的實現程式碼在多個lib都存在時,最左邊的lib程式碼最後link,所以也將最終儲存下來。

objdump -T libmysqlclient.so //開啟當前目錄下的動態連結庫libmysqlclient.so檢視其中的API。objdump命令用來檢視各種目標檔案(elf檔案)內部的結構
obidump -h hello.o //引數-h把hello.o各個段的基本資訊打印出來,elf檔案是分段的,通常分為Header、.data(資料段包括區域性靜態變數和全域性變數)、.text(程式碼段)、.rodata、.bss、.comment等
readelf -s hello.o //檢視詳盡段資訊
gcc錯誤:undefined reference to function 該函式具體實現沒有找到
info gcc //顯示gcc的所有資訊

mysql操作

SQL:Structured Query Language
netstat -tap|grep mysql //檢查系統有沒有已安裝mysql,若socket顯示listen則表示就緒。
mysql中unique key(唯一鍵)指除主鍵外確保某一列唯一性的約束,該列可包含NULL(空值);primary key為主鍵
apt-get install mysql-server //安裝mysql
mysql -u root -p //以root使用者登入mysql server,之後需輸入密碼
show databases; show tables; //檢視資料庫和資料表單,注意在mysql server中輸入指令以;結尾。
use mysql; //使用資料庫mysql也可以在登入時輸入指令:
mysql -D mysql -u root -p
quit; //退出
insert into students(id,name,sex) value(1,zhengfeng,man); //向students表中插入zhengfeng的資訊
select * from students //輸出students的所有資訊,*是萬用字元,可指定為列名稱

create table students(
id int(8) not null auto_increment,
name  varchar(255) not null,
sex char(4) not null,
tel char(13) not null default “-”, 
primary key(id),
unique key unique_name(name)
);    
   //建立表

describe students //輸出表結構資訊
mysql_config --libs //使用mysql_config工具確定MySql程式的連結引數,同理,若需確定編譯引數,使用mysql_config –include

redis操作

注:redis是一個高效能的key-value資料庫,由ANSI C編寫,支援網路,它支援的value型別包括string、list(字串連結串列)、set(字串集合)、zset(字串有序集合)、hash(字串雜湊型別)。
競態條件和原子操作的概念:原子操作指該命令在執行過程中不會被其他插入命令打斷,是“一氣呵成”的;
競態條件:指一個系統或程序的輸出,依賴於不受控制事件出現的順序或時機,若多個客戶端連線到redis,同時執行多項命令時有可能出現競態條件,關於此問題的深入討論在《連結、裝載和庫》中詳細提及。

apt-get install redis-server //安裝redis
netstat -nlt grep|6379 //檢視系統中redis執行狀態,listen為就緒
redis-cli //進入redis命令列客戶端,cli:command line interface 此為進入互動模式,可自由輸入命令。
select 1 //選擇1號資料庫,redis例項預設自帶16個數據庫,以數字編號,可通過配置檔案更改。