1、inode塊,Unix文件的核心。
首先須要明白的是,在Unix操做系統中的任何資源都被看成文件來管理。如目錄、光驅、終端設備等等,都被看成是一種文件。從這方面來講,Unix操做系統中的全部的目錄、硬件設備跟普通文件同樣,具備共同的屬性。而這些屬性的話,就是保存在inode塊中。
Inode塊中保存了一個文件系統中的所有Inode節點。也就是說,當系統建立了一個文件(或者添加了一個新設備)時,系統就會從這個塊中給 這個文件分配一個Inode結點。在這個結點中存儲了這個文件的大部分屬性,如建立、修改時間等等。可是須要注意的是,有兩個屬性不包含在這個inode結點中,分別爲文件名與結點號。這主要是由於inode節點按順序排列,因此係統內核就能夠採用簡單的算法,就能夠得出inode節點號。經過系統提供的ls命令顯示文件或者目錄信息的時候,就須要用到這個結點中的信息。Ls命令爲了肯定一個文件的Inode節點須要查找它所在的目錄,而後讀取它的Inode結點,並根據inode節點獲得文件的屬性。正常狀況下,這個節點號不會出現什麼問題。可是若是因爲意外斷電或者其餘緣由的話,有可能會發生一些故障。如 可能一個inode結點在系統中已經被建立,可是其沒有被正常使用,或者可能塊號超出了範圍。這些故障會給操做系統留下安全隱患。爲此當出現意外關機或者 其餘意外事件時,最好系統工程師可以利用fsck系統命令來修復inode結點中的錯誤。
另外須要注意的是,在inode結點中還存儲着一個重要的信息,就是保存了一個包含13-15位指針元素的數組,這些指針是磁盤塊區的地址。這 些指針很是的重要。操做系統就是依靠這些指針在硬盤上定位相關的文件,並讀取它。如上所述,由於一些意外的操做也會使得這個指針地址出現錯誤。有時候這會 很是的嚴重。如一些文件沒法讀取等等。若是這些文件不幸的是系統的一些配置文件,那麼就會致使系統的崩潰。若是這些指針地址出現錯誤,則文件名仍然會顯示 在操做系統中。可是若是用戶試着去打開這些文件時,系統卻會告知沒法打開這些文件。若是遇到這種狀況該這麼辦呢?此時系統工程師就須要手工運行fsck命 令。若是這個文件損壞的不是很嚴重,那麼操做系統內內核會爲其再創建一個連接。可是若是原文件損壞的比較厲害了,沒法再從新讀取。則系統會創建用戶刪除這 個文件(從硬盤中刪除)。
因爲一些文件的屬性(如創建修改時間等等)都保存在Inode結點中,爲此一些命令在獲取這些屬性的時候,是不須要打開文件的。如如今系統工程 師在編寫一個文件備份程序,就須要用到inode節點中的修改時間截這個屬性。此時能夠利用相關的命令直接從inode結點中去獲取,而不須要打開對應的 文件去得知這個信息。爲此在Unix操做系統中文件備份程序的執行效率會比較高,實現起來也相對簡單一點。
從上面的這些分析中能夠看到,inode結點是Unix操做系統中文件的核心,也是操做系統與硬盤中存儲的數據打交道的一箇中介者。若是這個結 點信息出現錯誤的話,那麼硬盤中存儲的數據塊就好像是無主的流浪者,沒法被用戶所採用。另外咱們平時刪除文件,其實只是刪除了這個聯繫。因此經過一線恢復 工具仍然能夠恢復被刪除了的文件。若是須要真正刪除文件的話,就須要格式化硬盤(低格)或者複製大文件把其覆蓋掉。只有如此硬盤中存儲的數據塊纔會被真正 的刪除掉。最後須要說明的是,按照正常的關機程序來關閉Unix操做系統,是保護inode結點信息的最好措施。忽然斷電或者其餘意外事故,是inode結點的最大殺手。
2、超級塊,文件系統的心臟。
若是說inode塊是Unix操做系統中文件的核心,那麼超級塊就是文件系統的心臟。啓動Unix操做系統後,發現某個文件系統沒法使用,頗有 可能就是超級塊出現了問題。爲何這個超級塊有這麼大的做用呢?主要是由於在超級塊中保存了全局文件信息,如硬盤已用空間、數據塊可用空間、inode結 點信息等等。作一個形象的比喻,這個超級塊就好像是企業的資產負債表,一個文件系統中有哪些資源都記錄在這個表中。
當操做系統啓動後,系統內核會把超級塊中的內容複製到內存中,並週期性的利用內存裏的最新內容去更新硬盤上的超級塊中的內容。因爲這個更新存在 一個時間差,爲此內存中的超級塊信息與硬盤中的超級塊信息每每只有在開機與關機的某個特定時刻是同步的;而在其餘時間都是不一樣步的。假設當操做系統意外當 機或者由於斷電而形成的意外事故時,內存中的超級塊信息沒有及時保存到硬盤中,此時文件系統的完整性就會受到破壞。輕者致使剛創建的丟失,重則的話會致使 文件系統癱瘓。遇到這種狀況時,系統工程師每每須要利用系統提供的sync命令在系統出現故障的那一刻把內存裏的內容複製到磁盤上。這個過程每每操做系統 會自動完成,這也正是由於爲何Unix操做系統要比Windows操做系統穩定的一個重要緣由。當操做系統從新啓動的過程當中,系統內核會對二者進行比 較,根據他們之間的差別,給文件系統打上乾淨或者髒的標籤。這個信息也是存儲在文件系統的超級塊中。
可見超級塊若是發生損壞的話,對於文件系統的破壞性很是的大。輕者的話致使某個文件系統沒法掛載,重則的話致使整個操做系統崩潰。在Unix操 做系統中,除了能夠利用sync命令來保證硬盤上的內容決不會比內存裏的內容更新以外,還提供了一個頗有利的措施來保證其的安全性。其實,這個技術很早就 有,只是一開始並無用在超級塊的管理中。這個技術就是跟磁盤陣列相似。操做系統會將多個超級塊內容保存到硬盤中的不一樣區域。當其中一個超級塊出現問題 時,操做系統會自動採用另一個超級塊。等到系統運行正常後,系統內容就會把可用的超級塊去替換那個故障的超級塊。爲此除非全部的超級塊都損壞了,不然的 話,只要有一個超級塊是可用的,那麼文件系統與操做系統就能夠正常掛載與啓動。這種安全機制在很大程度上提升了超級塊的安全性,系統了Unix操做系統的 穩定性。如今大部分的Unix操做系統(包括Linux操做系統)已經實現了相似的安全機制。
另外系統工程師須要瞭解在超級塊中到底保存了哪些信息。這對於之後遇到問題時查找問題緣由有必定的故障。根據筆者的瞭解,在超級塊中保存了以下有用的信 息。一是保存了文件系統的大小以及所用酷塊的大小;二是保存了可用數據庫的數量和部分能夠及時分配的空閒數據塊列表;三是最近一次的更新時間與文件系統的 狀態;四是空閒Inode結點的個數和部分能夠及時使用的inode結點列表。有時候在Unix操做系統上進行應用程序開發也須要用到這些信息。node
最後筆者須要強調一點,超級塊損壞的最大殺手仍然是意外斷電或者其餘緣由的意外當機。由於此時內存中的超級塊信息沒法及時更新到硬盤中。爲此 就出現了內存與超級塊中內容不一致的地方,從而會致使系統啓動時的一系列故障。爲此在Unix服務器上部署一個UPS是很是重要的。這雖然是一個老生常談 的方法,可是卻很是有效。linux
df命令詳細用法
a:顯示所有的檔案系統和各分割區的磁盤使用情形
i:顯示i -nodes的使用量
k:大小用k來表示 (默認值)
t:顯示某一個檔案系統的全部分割區磁盤使用量
x:顯示不是某一個檔案系統的全部分割區磁盤使用量
T:顯示每一個分割區所屬的檔案系統名稱
經常使用命令:df -hi
操做詳解
引用
指令 df 能夠顯示目前全部檔案系統的最大可用空間及使用情形,請看下列這個例子:
# df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/ad0s1a 1.9G 389M 1.4G 21% /
devfs 1.0K 1.0K 0B 100% /dev
/dev/ad0s1d 989M 54K 910M 0% /tmp
/dev/ad0s1f 4.8G 3.8G 657M 86% /usr
/dev/ad0s1e 1.9G 149M 1.6G 8% /var
/dev/ad0s1g 26G 890K 24G 0% /volume2
/dev/da0s1d 325G 261G 38G 87% /volume1
咱們加了參數 -h 表示使用「Human-readable」的輸出,也就是在檔案系統大小使用 GB、MB 等易讀的格式。
上 面的指令輸出的第一個字段及最後一個字段分別是檔案系統及其掛入點。咱們能夠看到 /dev/ad0s1a 這個分割區被掛在根目錄下。咱們在上一小節提到過 ad 所表明的是 IDE 的硬盤,而 s1 表示第一個主要扇區。我另外有一個 SCSI 硬盤,它的代號是 da,它的容量很大,主要用來存放數據。devfs 是一個特別的檔案系統,該檔案系統並不是真的磁盤,而是 FreeBSD 用來管理系統硬件裝置的虛擬檔案系統。
接下來的四個字段 Size、Used、Avail、及 Capacity 分別是該分割區的容量、已使用的大小、剩下的大小、及使用的百分比。當硬盤容量已滿時,您可能會看到已使用的百分比超過 100%,由於 FreeBSD 會留一些空間給 root,讓 root 在檔案系統滿時,仍是能夠寫東西到該檔案系統中,以進行管理。
另外,咱們還可使用參數 -i 來查看目前檔案系統 inode 的使用情形。有的時候雖然檔案系統還有空間,但若沒有足夠的 inode 來存放檔案的信息,同樣會不能增長新的檔案。
# df -ih
Filesystem Size Used Avail Capacity iused ifree %iused Mounted on
/dev/ad0s1a 1.9G 389M 1.4G 21% 20495 262127 7% /
devfs 1.0K 1.0K 0B 100% 0 0 100% /dev
/dev/ad0s1d 989M 62K 910M 0% 24 141286 0% /tmp
/dev/ad0s1f 4.8G 3.8G 657M 86% 311439 348015 47% /usr
/dev/ad0s1e 1.9G 149M 1.6G 8% 1758 280864 1% /var
/dev/ad0s1g 26G 890K 24G 0% 12 3532786 0% /volume2
/dev/da0s1d 325G 261G 38G 87% 707277 43311409 2% /volume1
咱們能夠看到根目錄的已經用掉的 inode 數量爲 20495,還有 262127 的可用 inode。
小提示
還 記得什麼是 inode 嗎?所謂的 inode 是用來存放檔案及目錄的基本信息 (metadata),包含時間、檔名、使用者及羣組等。在分割扇區時,系統會先作出一堆 inode 以供之後使用,inode 的數量關係着系統中能夠創建的檔案及目錄總數。若是要存的檔案大部分都很小,則一樣大小的硬盤中會有較多的檔案,也就是說須要較多的 inode 來掛檔案及目錄。
du:查詢檔案或目錄的磁盤使用空間
a:顯示所有目錄和其次目錄下的每一個檔案所佔的磁盤空間
b:大小用bytes來表示 (默認值爲k bytes)
c:最後再加上總計 (默認值)
s:只顯示各檔案大小的總合 (summarize)
x:只計算同屬同一個檔案系統的檔案
L:計算全部的檔案大小
經常使用命令:du -a
操做詳解
引用
指令 du 能以指定的目錄下的子目錄爲單位,顯示每一個目錄內全部檔案所佔用的磁盤空間大小。例如:
# du -h /etc
104K /etc/defaults
6.0K /etc/X11
8.0K /etc/bluetooth
4.0K /etc/gnats
52K /etc/isdn
388K /etc/mail
68K /etc/mtree
2.0K /etc/ntp
38K /etc/pam.d
44K /etc/periodic/daily
6.0K /etc/periodic/monthly
42K /etc/periodic/security
16K /etc/periodic/weekly
110K /etc/periodic
6.0K /etc/ppp
318K /etc/rc.d
2.0K /etc/skel
130K /etc/ssh
10K /etc/ssl
1.7M /etc
咱們目樣使用 -h 參數來顯示 human-readable 的格式。在應用時,咱們可使用 du 這個指令來查看哪一個目錄佔用最多的空間。不過,du 的輸出結果一般很長,咱們能夠加上 -s 參數來省略指定目錄下的子目錄,而只顯示該目錄的總合便可:
# du -sh /etc
1.7M /etc
在查看目錄的使用情形時,咱們能夠將輸出結果導到 sort 指令進行排序,以瞭解哪一個檔案用了最多的空間:
# du /etc | sort -nr | more
1746 /etc
388 /etc/mail
318 /etc/rc.d
130 /etc/ssh
110 /etc/periodic
104 /etc/defaults
68 /etc/mtree
52 /etc/isdn
44 /etc/periodic/daily
42 /etc/periodic/security
38 /etc/pam.d
16 /etc/periodic/weekly
10 /etc/ssl
8 /etc/bluetooth
6 /etc/ppp
6 /etc/periodic/monthly
6 /etc/X11
4 /etc/gnats
2 /etc/skel
2 /etc/ntp
sort 的參數 -nr 表示要以數字排序法進行反向排序,由於咱們要對目錄大小作排序,因此不可使用 human-readable 的大小輸出,否則目錄大小中會有 K、M 等字樣,會形成排序不正確。
環境變量分爲系統環境變量和用戶環境變量。系統環境變量,對全部用戶起做用,而用戶環境變量只對當前用戶起做用。
系統環境變量:
/etc/profile:此文件爲系統的每一個用戶設置環境信息,當用戶第一次登陸時,該文件被執行.並從/etc/profile.d目錄的配置文件中搜集shell的設置.
/etc/bashrc:爲每個運行bash shell的用戶執行此文件.當bash shell被打開時,該文件被讀取.
當前用戶變量:
~/.bash_profile:每一個用戶均可使用該文件輸入專用於本身使用的shell信息,當用戶登陸時,該文件僅僅執行一次!默認狀況下,他設置一些環境變量,執行用戶的.bashrc文件.
~/.bashrc:該文件包含專用於你的bash shell的bash信息,當登陸時以及每次打開新的shell時,該該文件被讀取.
~/.bash_logout:當每次退出系統(退出bash shell)時,執行該文件。
1、什麼是環境變量?
Linux是一個多用戶的操做系統。多用戶意味着每一個用戶登陸系統後,都有本身專用的運行環境。而這個環境是由一組變量所定義,這組變量被稱爲環境變量。用戶能夠對本身的環境變量進行修改以達到對環境的要求。
2、定製環境變量
環境變量是和Shell緊密相關的,它是經過Shell命令來設置的。環境變量又能夠被全部當前用戶所運行的程序所使用。對於bash來講,能夠經過變量名來訪問相應的環境變量。
下面經過幾個實例來講明
1.顯示環境變量HOME
$ echo $HOME
/home/admin
2.設置一個新的環境變量NAME
$ export NAME=" RaidCheng"
$ echo $NAME
RaidCheng
3.使用env命令顯示全部的環境變量
$ env
HOSTNAME=test
TERM=vt100
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=202.xxx.xxx.xxx 53694 22
CATALINA_BASE=/usr/local/jakarta-tomcat
SSH_TTY=/dev/pts/0
ANT_HOME=/usr/local/ant
JAVA_OPTS=-server
USER=admin
...
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'
CATALINA_BASE=/usr/local/jakarta-tomcat
CATALINA_HOME=/usr/local/jakarta-tomcat
...
5.使用unset命令來清除環境變量
$ export NAME=" RaidCheng"
$ echo $NAME
RaidCheng
$ unset NAME
$ echo $NAME
6.使用readonly命令設置只讀變量
$ export NAME=" RaidCheng"
$ readonly NAME
$ unset NAME
-bash: unset: NAME: cannot unset: readonly variable
$ NAME=" New" #會發現此也變量不能被修改
-bash: TEST: readonly variable
3、常見的環境變量
PATH 決定了shell將到哪些目錄中尋找命令或程序
HOME 當前用戶主目錄
HISTSIZE 歷史記錄數
LOGNAME 當前用戶的登陸名
HOSTNAME 指主機的名稱
SHELL 前用戶Shell類型
LANGUGE 語言相關的環境變量,多語言能夠修改此環境變量
MAIL 當前用戶的郵件存放目錄
PS1 基本提示符,對於root用戶是#,對於普通用戶是$
PS2 附屬提示符,默認是「>」
Linux 是一個多用戶的操做系統。每一個用戶登陸系統 後,都會有一個專用的運行環境。一般每一個用戶默認的環境都是相同的,這個默認環境實際上就是一組環境變量的定義。用戶能夠對本身的運行環境進行定製,其方法就是修改相應的系統環境變量 。
環境變量是和 Shell 緊密相關的,用戶登陸系統 後就啓動了一個 Shell 。對於 Linux 來講通常是 bash ,但也能夠從新設定或切換到其它的 Shell 。環境變量是經過 Shell 命令來設置的,設置好 的環境變量又能夠被全部當前用戶所運行的程序所使用。對於 bash 這個 Shell 程序來講,可 以經過變量名來訪問相應 的環境變量,經過 export 來設置環境變量。
還能夠經過修改一些相關的環境定義文件來修改環境變量,好比對於 Red Hat 等 Linux 發行版本,與環境相關的文件有 /etc/profile 和 ~/.bashrc 等。修改完畢 後從新登陸一次就生效了 。
/etc/profile: 此文件爲系統的每一個用戶設置環境信息 , 當用戶第一次登陸時 , 該文件被執行 .
並從 /etc/profile.d 目錄的配置文件中搜集 shell 的設置 .
/etc/bashrc: 爲每個運行 bash shell 的用戶執行此文件 . 當 bash shell 被打開時 , 該文件被讀取 .
~/.bash_profile: 每一個用戶均可使用該文件輸入專用於本身使用的 shell 信息 , 當用戶登陸時 , 該文件僅僅執行一次 ! 默認狀況下 , 他設置一些環境變量 , 執行用戶的 .bashrc 文件 .
~/.bashrc: 該文件包含專用於你的 bash shell 的 bash 信息 , 當登陸時以及每次打開新的 shell 時 , 該
該文件被讀取 .
用 Export 命令能夠設置環境變量,可是若是每回進入系統之 後都要從新設置一遍環境變量就很煩人。 Linux 給你們提供 了自動設置環境變量的方法,那就 是更改 .bashrc 文件。 通常說來,有兩個文件能夠提供這種「進入系統時自動設置」的功能,一個是 /etc/bashrc ,另外一個是 ~/.bashrc 。其中 /etc/bashrc 是被每一個用戶執行的,而 ~/.bashrc 只被當前用戶執行。因此 /etc/bashrc 只有 root 用 戶能更改,而 ~/.bashrc 是各個用戶私有的文件。 "~" 指的是用戶的 home 目錄。
export 只是將新加 的環境變量臨時存在內存中,重啓或打開新的 shell 會話之 後就不存在瞭解決方法:
1. 修改 /etc/profile
重啓以後,環境變量仍是在的。可是不推薦這麼作,由於這樣的設置將對全部用戶的 shell 都生效,對系統安全會產生影響。
2. 修改 ~/.bashrc 文件算法