linux文件系統的實現
linux有一個樹狀結構來組織文件,數的頂端為根目錄/,節點為目錄,而末節點為所包含的數據文件。我們可以對文件進行多種操作,比如打開和讀寫。
存儲設備分區
文件系統的最終目的是把大量數據有組織地放入持久性的存儲設備中,比如硬盤和磁盤。這些存儲設備和內存不同,它們的存儲能力具備持久性,不會因為斷電而消失,存儲量大,但讀取速度慢。
數據被存入某個分區中,一個典型的Linux分區(partition)包含有下面各個部分:
分區的第一個部分是啟動區(Boot block),它主要是為計算機開機服務的。linux開機啟動後後,會首先載入MBR,隨後MBR從某個硬盤的啟動區加載程序。該程序負責進一步的操作系統的加載和啟動。為了方便管理,即使某個分區中沒有安裝操作系統,Linux也會在該分區預留啟動區。
啟動區之後的是超級區(Super block)。它存儲有文件系統的相關信息,包括文件系統的類型,inode的數目,數據塊的數目。
隨後是多個inodes,它們是實現文件存儲的關鍵。在Linux系統中,一個文件可以分成幾個數據塊存儲每個文件對應一個inode。這個inode中包含多個指針,指向屬於該文件各個數據塊。當操作系統需要讀取文件時,只需要對應inode的"地圖",收集起分散的數據塊,就可以收獲我們的文件了。
最後一部分是真正存儲數據的數據塊data blocks。
當Linux想要打開一個文件時,只需要找到文件對應的inode,然後沿著指針,將所有的數據塊收集起來,就可以在內存中組成一個文件的數據了。復雜的方式可以使用鏈表,每個數據快都有一個指針,指向屬於同一個文件的下一個數據塊,這樣的好處是可以利用零散的空余空間,壞處是文件操作必須按照線性方式進行,如果想隨機存取,那麼必須遍歷鏈表,指導目標位置。
列出文件夾內詳細文件信息
ls是list的意思,重點在顯示文件的文件名與相關屬性。而選項『-al』則表示列出所有的文件詳細的權限與屬性 。
floralin@ubuntu:~$ ls -al
1)第一欄代表這個文件的類型與權限(permission):
第一個字符d則是目錄,當為-則是文件,若是[ l ]則表示為連結檔(link file),是b則表示為裝置文件裡面的可供儲存的接口設備(可隨機存取裝置),若是c則表示為裝置文件裡面的串行端口設備,例如鍵盤、鼠標(一次性讀取裝置)。
接下來的字符中,以三個為一組,均為rwx三個參數組合,[ r ]代表可讀(read)、[ w ]代表可寫(write)、[ x ]代表可執行(execute)。第一組為文件擁有者的權限,第二組為同群組的權限,第三組為其他非本群組的權限。
2)第二欄表示多少個檔名連結到此節點
3)第三欄表示文件的擁有帳號
4)第四欄表示這個文件所屬群組
5)第五欄表示這個文件的容量大小,默認單位為bytes
6) 第六欄表示這個文件的建檔日期或是最近的修改日期
創建文件夾
floralin@ubuntu:~/Desktop/linux_study$ mkdir test
floralin@ubuntu:~/Desktop/linux_study$ ls
test
刪除空文件夾
floralin@ubuntu:~/Desktop/linux_study$ rm test
rm: cannot remove ‘test’: Is a directory
floralin@ubuntu:~/Desktop/linux_study$ rmdir test
floralin@ubuntu:~/Desktop/linux_study$ ls
改變文件屬性與權限
chgrp :改變文件所屬群組
chown :改變文件擁有者
chmod :改變文件的權限, SUID, SGID, SBIT等等的特性
改變文件所屬群組
floralin@ubuntu:~/Desktop/linux_study$ sudo chgrp users linux_study
改變文件擁有者
floralin@ubuntu:~/Desktop/linux_study$ sudo chown root linux_study
改變文件權限
floralin@ubuntu:~/Desktop/linux_study$ sudo chmod 755 linux_study
更改文件的權限為755: owner r+w+x, group: r+x, others: r+x
文件顯示
$cat filename : 顯示文件
$cat file1 file2 : 連接顯示file1和file2
$head -1 filename :顯示文件第一行
$tail -5 filename : 顯示文件倒數第五行
$diff file1 file2 :顯示file1和file2的差別
統計文件中行數、詞和字符數目
floralin@ubuntu:~/Desktop/linux_study$ wc test2
6 15 71 test2
顯示日期
$date +"%Y-%m-%d_%T"
以YYYY-MM-DD_HH:MM:SS的格式顯示日期時間 (格式可參考$man date)
$date --date="1999-01-03 05:30:00"
顯示從1900-01-03 05:30:00具體信息
網絡
顯示網絡借口以及相應的IP地址。ifconfig可用於設置網絡接口:
floralin@ubuntu:~/Desktop/linux_study$ ifconfig
運行eth0接口
floralin@ubuntu:~/Desktop/linux_study$ sudo ifup eth0
關閉eth0接口
floralin@ubuntu:~/Desktop/linux_study$ sudo ifdown eth0
顯示無線網絡接口
floralin@ubuntu:~/Desktop/linux_study$ iwconfig
顯示路由表。route可用於修改路由表
floralin@ubuntu:~/Desktop/linux_study$ iwconfig
當前網絡連接狀態
floralin@ubuntu:~/Desktop/linux_study$ netstat
發送ping包到地址IP
floralin@ubuntu:~/Desktop/linux_study$ ping 10.21.171.15
向DHCP主機發送DHCP請求,以獲得IP地址以及其他設置信息
floralin@ubuntu:~/Desktop/linux_study$ sudo dhclient
使用wget 下載url指向的資源
floralin@ubuntu:~/Desktop/linux_study$ sudo dhclient
DNS查詢,尋找域名domain對應的ip
floralin@ubuntu:~/Desktop/linux_study$ sudo dhclient
打包和壓縮
比較大型的文件透過所謂的文件壓縮技術之後,可以將他的磁碟使用量降低, 可以達到減低文件容量的效果。
linux 支持的壓縮命令非常多,且不同的命令所用的壓縮技術並不相同,當然彼此之間可能就無法互通壓縮/解壓縮文件,區分不同的壓縮文件通常通過後綴的擴展名。
gzip或bzip2壓縮test
floralin@ubuntu:~/Desktop/linux_study$ gzip test
解壓test
floralin@ubuntu:~/Desktop/linux_study$ gzip -d test
打包命令: tar
[root@linux ~]# tar -cvf /tmp/etc.tar /etc <==僅打包,不壓縮!
[root@linux ~]# tar -zcvf /tmp/etc.tar.gz /etc <==打包後,以 gzip 壓縮
[root@linux ~]# tar -jcvf /tmp/etc.tar.bz2 /etc <==打包後,以 bzip2 壓縮
將 /tmp/etc.tar.gz 文件解壓縮在 /usr/local/src 底下
[root@linux ~]# cd /usr/local/src
[root@linux src]# tar -zxvf /tmp/etc.tar.gz
linux進程基礎
計算機實際上可以做的事情實質非常簡單,比如會所兩數求和,查找內存中的地址等等。這些基礎的計算機動作被稱為“指令”。所謂的程序就是這一系列指令的集合。通過程序,我們可以讓計算機完成復雜的操作。
程序大多數會被存儲為可執行的文件。
進程和程序的區別
進程是程序的一種具體實現。進程是執行程序的過程。查詢正在運行的進程:
floralin@ubuntu:~$ ps -eo pid,comm,cmd
-e代表列出全部進程,-o pid,comm,cmd代表我們需要pid,comm和cmd信息。
每一行代表一個進程,三列的信息分別代表,每一行進程的唯一PID表示、COMMAND是進程的簡稱、CMD是進程所對應的程序以及運行時所帶的參數(對於使用使用[ ]的,是kernel的一部分功能,被打扮成進程的樣子,方便操作系統管理)。
如何創建進程
實際上計算機在開機的時候,內核kernel只建立了一個init進程,linux kernel是並不直接建立新進程的系統調用。所有的進程是通過fork機制建立的。(fork,新的進程需要通過的的進程復制自身得到)。當進程fork的時候,linux在內存中開辟出一片新的內存空間給新的進程,並將老的進程空間中的內容復制到新的空間中,從此兩個進程同時運行。可以通過pstree命令來顯示整個進程樹:
子進程的終結
當子進程終結時,會通知父進程清空自己所占據的內存,並在kernel中留下自己退出信息。
父進程在得知子進程終結時,會對該子進程使用wait系統調用。這個wait函數能從kernel中取出子進程的退出信息,並清空該信息在kernel中所占據的空間。
但是,如果父進程早於子進程終結,子進程就會成為一個孤兒(orphand)進程。孤兒進程會被過繼給init進程,init進程也就成了該進程的父進程。init進程負責該子進程終結時調用wait函數。
linux信號程基礎
kernel內有若干個進程,每個進程不允許該進程之外的人進入,這樣對於每個進程來說是一個保護機制 ,但是有時候需要打破封閉的保護,以便和進程交流信息。
這樣就需要一種通信方式。傳遞的信號比較粗糙 ,只能是一個整數,但正是因為傳遞的信息量很少,信號才便於管理和使用。
信號被經常用於系統管理相關的任務,比如通知進程終結、中止或者恢復等等,由內核管理,也可以由內核產生。
通過ping來查詢進程的PID,然後可以通過kill命令來向某個進程發出信號:
$kill -SIGCONT 9575
傳遞SIGCONT信號給ping進程。
信號處理
所有的信號都采用了對應信號的默認操作,但並不絕對,當進程決定執行信號的時候,有集幾種可能:
1)無視。信號被清除,進程本身補采取任何特殊的操作。
2)默認。每個信號對應一定的默認操作,比如上面所提及的SIGCONT用於繼續進程。
3)自定義操作。也叫做獲取信號,執行進程中預設的對應於該信號的操作。