Linux系統以文件形式對計算機中的數據和硬件資源進行管理,也就是徹底的一切皆文件,反映在Linux的文件類型上就是:普通文件、目錄文件(文件夾)、設備文件、鏈接文件、管道文件、套接字文件(數據通信接口)等等。而這些種類繁多的文件被Linux使用目錄樹進行管理,所謂的目錄樹就是以根目錄(/)為主,向下呈現分枝狀的一種文件結構。不同於純粹的ext2之類的文件系統,可以稱之為文件體系,一切皆文件和文件目錄樹的資源管理方式一起構成了Linux的文件系統,讓Linux操作系統可以方便使用系統資源。
一、文件系統概述
1、Linux文件系統模型
由上而下主要分為用戶層、VFS層、文件系統層、緩沖層、塊設備層、磁盤驅動層、磁盤物理層。
2、文件I/O與標准I/O
文件I/O又被稱為不帶緩沖的I/O,“不帶緩沖”是指每個讀寫操作都調用系統內核的一個系統調用。文件I/O和標准I/O的區別在於:
標准I/O采用緩沖機制,打開文件的同時,在內存中建立一個緩沖區;而文件I/O一般不會建立緩沖區,需要手動創建;
標准I/O針對的是控制台、打印輸出到屏幕等;文件I/O主要是對文件操作、讀寫硬盤等;
標准I/O是跨平台的,而文件I/O只適用於Uinx/Linux平台。
3、文件描述符
對內核而言,所打開的文件都是通過文件描述符引用的,當打開一個現有文件或者創建一個新文件時,內核向進程返回一個文件描述符,該文件描述符對文件進行讀寫操作。
通過將文件描述符0與標准輸入相關聯,將文件描述符1與標准輸出相關聯,將文件描述符2與標准錯誤相關聯(STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO)。
4、緩沖機制
基於流的操作最終都會一系統調用的形式進行I/O操作,,為了通過程序的運行效率,針對流通常會提供緩沖區,以減少系統調用的次數。
全緩沖:直到緩沖區被填滿,才調用系統IO函數;
行緩沖:直到遇到轉義字符-換行符“\n”,才會調用系統IO函數;
無緩沖:沒有緩沖區,數據立即讀入或者輸出到外存文件或設備上。
二、文件類型
Linux系統的大多數文件時普通文件或者目錄,也包括另外一些文件類型。文件類型包括如下幾種:
1、普通文件(-)
從linux 的角度來說,類似mp4、pdf、HTML這樣應用層面上的文件類型都屬於普通文件;
Linux用戶可以根據訪問權限對普通文件進行查看,更改和刪除。
2、目錄文件(d,ditectory file)
目錄文件對於用慣Windows的用戶來說不太容易理解,目錄也是文件的一種;
目錄文件包括了各自目錄下的文件名和指向這些文件的指針,打開目錄事實上就是打開目錄文件,只要有訪問權限,你就可以隨意訪問這些目錄下的文件(普通文件的執行權限就是目錄文件的訪問權限),但是只有一內核的進程可以修改它們。
雖然不能修改,但是我們可以通過vi/vim目錄文件的內容。
3、塊設備文件(b,block)和字符設備文件(c,char)
這些文件一般隱藏在/dev目錄下,在進行設備讀取和外設交互時會被使用到;
比如磁盤光驅就是塊設備文件,串口設備則屬於字符設備文件;
系統中的所有設備要么是塊設備文件,要么是字符設備文件,無一例外。
4、符號鏈接(l,symbolic link)
這種類型的文件類型類似Windows中的快捷方式,是指向另一個文件的間接指針,也就是我們常說的軟連接。
5、FIFO(p,pipe)
管道文件主要用於進程間通信。比如使用mkfifo命令可以創建一個FIFO文件,啟動一個進程A從FIFO文件里讀數據、啟動進程B往FIFO里寫數據,先進先出,隨寫隨讀。
6、套接字(s,socket)
用於進程間的網絡通信,也可以用於本機之間的非網絡通信;
這些文件一般隱藏在/var/run目錄下,證明着相關進程的存在。
三、目錄結構
/(root文件系統):root文件系統是文件系統的頂級目錄(根目錄)。它必須包含在掛載其他文件系統前需要用來啟動Linux系統的全部文件。它必須包含需要用來啟動剩余文件系統的全部可執行文件和庫。文件系統啟動以后,所有的文件系統作為root文件系統的子目錄掛載到標准的、預定義好的掛載點。一般根目錄只存放目錄,不存放文件。
/bin: /usr/bin: 存放可執行文件,如常用的命令ls,tar,mv,cat等。
/boot:放置Linux系統啟動時用到的一些文件。/boot/vmlinuz為Linux的內核文件,以及/boot/gurb 。
/dev: 存放Liunx系統下的設備文件,訪問該目錄下某個文件,相當於訪問某個設備,常用的掛載光驅mount /dev/cdrom /mnt/ .
/etc: 系統配置文件存放的目錄,不建議在此目錄下存放可執行文件,重要的配置文件有/etc/initab , /etc/init.d , /etc/X11 , /etc/sysconfig , /etc/xinetd.d 修改配置文件之前記得備份。注:/etc/X11 存放與 X、Windows有關的配置。
/etc/rc or /etc/rc.d or /etc/rc*.d
啟動、或改變運行級時運行的scripts或scripts的目錄.
/etc/passwd
用戶數據庫,其中的域給出了用戶名、真實姓名、家目錄、加密的口令和用戶的其他信息.
/etc/fstab
啟動時mount -a命令(在/etc/rc 或等效的啟動文件中)自動mount的文件系統列表. Linux下,也包括用swapon -a啟用的swap區的信息.
/etc/group
類似/etc/passwd ,但說明的不是用戶而是組.
/etc/inittab
init 的配置文件.
/etc/issue
getty 在登錄提示符前的輸出信息.通常包括系統的一段短說明或歡迎信息.內容由系統管理員確定.
/etc/motd
Message Of The Day,成功登錄后自動輸出.內容由系統管理員確定.經常用於通告信息,如計划關機時間的警告.
/etc/mtab
當前安裝的文件系統列表.由scripts初始化,並由mount 命令自動更新.需要一個當前安裝的文件系統的列表時使用,例如df 命令.
/etc/shadow
在安裝了影子口令軟件的系統上的影子口令文件.影子口令文件將/etc/passwd 文件中的加密口令移動到/etc/shadow 中,而后者只對root可讀.這使破譯口令更困難.
/etc/login.defs
login 命令的配置文件.
/etc/printcap
類似/etc/termcap ,但針對打印機.語法不同.
/etc/profile , /etc/csh.login , /etc/csh.cshrc
錄或啟動時Bourne或C shells執行的文件.這允許系統管理員為所有用戶建立全局缺省環境.
/etc/securetty
確認安全終端,即哪個終端允許root登錄.一般只列出虛擬控制台,這樣就不可能(至少很困難)通過modem或網絡闖入系統並得到超級用戶特權.
/etc/shells
列出可信任的shell.chsh 命令允許用戶在本文件指定范圍內改變登錄shell.提供一台機器FTP服務的服務進程ftpd 檢查用戶shell是否列在 /etc/shells 文件中,如果不是將不允許該用戶登錄.
/etc/sysconfig
網絡配置相關目錄
/home: 系統默認的用戶家目錄,新增用戶賬號時,用戶的家目錄都存在此目錄下,~表示當前用戶的家目錄,~test表示用戶test的家目錄。建議單獨分區,並設置較大的磁盤空間,方便用戶存放數據。
/lib:/usr/lib:/usr/local/lib:系統使用的函數庫目錄,程序在執行過程中,需要調用一些額外的參數時需要函數庫的協助,比較重要的是/lib/modules 。
/lost+found: 系統異常產生錯誤時,會將一些遺失的片段放置於此目錄下,如加載disk中,此目錄下就會自動產生目錄 /disk/lost+found 。
/mnt:/media: 光盤默認掛載點,通常掛盤掛載於/mnt/cdrom下,也不一定,可以選擇任意位置進行掛載。
/opt; 給主機額外安裝軟件所存放的目錄。
/proc: 此目錄的數據都在內存中,如系統核心,外部設備、網絡狀態,由於數據都存在內存中,所以不占用磁盤,比較重要的目錄。
/root :系統管理員root的家目錄,系統第一個啟動的分區 / ,所以最好將/root和 / 放在一個分區下。
/sbin: /usr/sbin/: /usr/local/sbin : 放置系統管理員使用的可執行命令,如disk,shutdown,mount.與/bin 不同的是,這里面存放的命令是給系統管理員root使用的命令,一般用戶只能使用和設置。
/tmp :一般用戶或正在執行的程序臨時存放文件的目錄,任何人都可以訪問,重要數據不可放置在此目錄下。
/srv: 服務啟動之后需要訪問的數據目錄,如www服務器需要訪問的網頁數據存放在/srv/www內。
/usr: 應用程序存放目錄。/usr/bin 存放應用程序;/usr/share 存放共享數據;/usr/lib存放不能直接運行的,卻是許多程序運行所必需的一些函數庫文件;/usr/local存放軟件升級包;/usr/share/doc系統說明文件存放目錄;/usr/share/man程序說明文件存放目錄。
/var: 放置系統執行過程中經常變化的文件,如隨時更改的日志文件/var/log,/var/log/message所有登陸文件存放目錄,var/spool/mail郵件存放目錄,/var/run程序或者服務啟動。
/var/catman
當要求格式化時的man頁的cache.man頁的源文件一般存在/usr/man/man* 中;有些man頁可能有預格式化的版本,存在/usr/man/cat* 中.而其他的man頁在第一次看時需要格式化,格式化完的版本存在/var/man 中,這樣其他人再看相同的頁時就無須等待格式化了. (/var/catman 經常被清除,就象清除臨時目錄一樣.)
/var/lib
系統正常運行時要改變的文件.
/var/local
/usr/local 中安裝的程序的可變數據(即系統管理員安裝的程序).注意,如果必要,即使本地安裝的程序也會使用其他/var 目錄,例如/var/lock .
/var/lock
鎖定文件.許多程序遵循在/var/lock 中產生一個鎖定文件的約定,以支持他們正在使用某個特定的設備或文件.其他程序注意到這個鎖定文件,將不試圖使用這個設備或文件.
/var/log
各種程序的Log文件,特別是login (/var/log/wtmp log所有到系統的登錄和注銷) 和syslog (/var/log/messages 里存儲所有核心和系統程序信息. /var/log 里的文件經常不確定地增長,應該定期清除.
/var/run
保存到下次引導前有效的關於系統的信息文件.例如, /var/run/utmp 包含當前登錄的用戶的信息.
/var/spool
mail, news, 打印隊列和其他隊列工作的目錄.每個不同的spool在/var/spool 下有自己的子目錄,例如,用戶的郵箱在/var/spool/mail 中.
/var/tmp
比/tmp 允許的大或需要存在較長時間的臨時文件. (雖然系統管理員可能不允許/var/tmp 有很舊的文件.)