Linux文件系統

文件結構是文件存放在磁盤等存貯設備上的組織方法。主要體現在對文件和目錄的組織上。

  目錄提供了管理文件的一個方便而有效的途徑。

  Linux使用標準的目錄結構,在安裝的時候,安裝程序就已經爲用戶創建了文件系統和完整而固定的目錄組成形式,並指定了每個目錄的作用和其中的文件類型。

                      /根目錄

                              ┃

┏━━┳━━━┳━━━┳━━━╋━━━┳━━━┳━━━┳━━━┓

┃   ┃      ┃     ┃     ┃     ┃      ┃     ┃     ┃

bin  home    dev     etc     lib     sbin    tmp      usr    var

                      ┃                               ┃

                  ┏━┻━┓     ┏━━┳━━┳━━┳━┻━┳━━┓

                  ┃      ┃    ┃   ┃    ┃    ┃     ┃    ┃

                 rc.d   cron.d X11R6  src   lib   local    man  bin

                  ┃                              

┏━━━┳━━┳━┻━┳━━━┓        

┃      ┃    ┃      ┃      ┃

init.d rc0.d  rc1.d  rc2.d …… linux bin lib src

  Linux採用的是樹型結構。最上層是根目錄,其他的所有目錄都是從根目錄出發而生成的。微軟的DOS和windows也是採用樹型結構,但是在DOS和 windows中這樣的樹型結構的根是磁盤分區的盤符,有幾個分區就有幾個樹型結構,他們之間的關係是並列的。但是在linux中,無論操作系統管理幾個磁盤分區,這樣的目錄樹只有一個。從結構上講,各個磁盤分區上的樹型目錄不一定是並列的。

  如果這樣講不好理解的話,我來舉個例子:

  有一塊硬盤,分成了4個分區,分別是/;/boot;/usr和windows下的fat

  對於/和/boot或者/和/usr,它們是從屬關係;對於/boot和/usr,它們是並列關係。

  如果我把windows下的fat分區掛載到/mnt/winc下,(掛載??哦,別急,呵呵,一會就講,一會就講。)那麼對於/mnt/winc和/usr或/mnt/winc和/boot來說,它們是從屬於目錄樹上沒有任何關係的兩個分支。

  因爲linux是一個多用戶系統,制定一個固定的目錄規劃有助於對系統文件和不同的用戶文件進行統一管理。但就是這一點讓很多從windows轉到linux的初學者感到頭疼。下面列出了linux下一些主要目錄的功用。

根文件系統

/boot 系統啓動相關的文件

/dev 設備文件

塊設備:隨機訪問,按照數據塊進行訪問

字符設備線性訪問 ,按字符爲單位

特殊文件沒有大小,只有元數據,所以ls顯示出來信息沒有大小,只有主設備號major次設備號(minor

/home 用戶的家目錄

/root root用戶的家目錄

/lib 庫文件

靜態庫 *.a 靜態庫直接鏈接到程序的地址空間,作爲程序的一部分

動態庫 .so 

/lib/modules 內核模塊文件

/media/mnt 掛載點目錄

/opt 可選目錄

/proc 僞文件系統空目錄顯示的文件內核的映射文件

/sys 僞文件系統,跟硬件設備相關的屬性映射文件

/tmp 臨時文件,/var/tmp

/var 可變化文件

/bin 可執行文件,用戶命令

/sbin 管理命令,

/usr 全局共享只讀文件


詳細說明

    /boot 是Linux系統在本地啓動時一個非常重要的目錄,其中的文件有:

(1)config 系統Kernel的配置文件

(2)initrd*.img文件是Linux在啓動過程中內核使用的臨時文件系統。該文件系統爲掛載真正的文件系統做準備。可以通過一下方式解壓出來:

# mkdir ~/initrd
# cp /boot/initrd ~/initrd
# cd ~/initrd
# mv initrd initrd.gz
# gunzip initrd.gz
# cpio -idmv < initrd

spacer.gif

Linux內核可以將設備驅動以模塊形式加載,但是模塊本身可能存儲在SCSI或者RADI上,要想訪問這些設備又需要先加載驅動,這就出現了“雞和蛋”問題。當然不用模塊,全部編譯進內核,就像早期Linux那樣,就不會出現這個問題了。initrd的引入可以使我們既得到模塊帶來的好處又解決上述問題。initrd在grub引導時通過BIOS載入內存。initrd除了內核模塊外,還有引導系統的bash腳本。

/sbin/installkernel中有這麼幾行,在編譯完內核後重新制作initrd。其實編譯完內核後不更新initrd也是可以的。要想知道怎麼製作的initrd,可以看看bash腳本/sbin/mkinitrd。如果沒有這兩個命令,確認是否安裝了mkinitrd軟件包。

(3)vmlinuz是可引導的、壓縮的內核。“vm”代表“Virtual Memory”。Linux 支持虛擬內存,不像老的操作系統比如DOS有640KB內存的限制。Linux能夠使用硬盤空間作爲虛擬內存,因此得名“vm”。vmlinuz是可執行 的Linux內核,它位於/boot/vmlinuz

(4)initramfs*.img是initrd的進化版本

(5)system.map sysmbols的索引。什麼是Symbol?其實就是kernel中的變量(Variable Name)或函數名稱(Function Name),這樣可以方便程序員在寫程序時可以直接參照這一份Symbol的索引文件,找到所需要的kernel信息,這一份Symbol的索引文件又稱爲kernel symbol table。編譯內核時,

System.map文件用於存放內核符號表信息。符號表是所有內核符號及其對應地址的一個列表,隨着每次內核的編譯,就會產生一個新的對應System.map文件,當內核運行出錯時,通過System.map中的符號表解析,就可以查到一個地址值對應的變量名,或反之。利用System.map,在內核或相關程序出錯時,就可以獲得我們比較容易識別的信息。System.map位於使用它的軟件(例如內核日誌記錄後臺程序klogd)能夠找到的地方。在系統啓動時,如果沒有以一個參數的形式爲klogd給出System.map的位置,則klogd會在三個地方尋找System.map: 

/boot/System.map

/System.map

/usr/src/linux/System.map

儘管內核本身實際上不使用System.map,但其它程序,像klogd、lsof、ps以及其它像dosemu等許多軟件都需要有一個正確的System.map文件。利用該文件,這些程序就可以根據已知的內存地址查找出對應的內核變量名稱,便於對內核的調試工作。

(6)symvers.gz  保存着內核中所有符號的crc值

(7)grub目錄  系統引導啓動目錄


/dev是設備目錄,存放的不是驅動程序,而是Linux中設備文件的訪問接口。分爲字符設備和塊設備,有以下設備:

       /dev/hd[a-t]:IDE設備

  /dev/sd[a-z]:SCSI設備

  /dev/fd[0-7]:標準軟驅

  /dev/md[0-31]:軟raid設備

  /dev/loop[0-7]:本地迴環設備

  /dev/ram[0-15]:內存

  /dev/null:無限數據接收設備,相當於黑洞

  /dev/zero:無限零資源

  /dev/tty[0-63]:虛擬終端

  /dev/ttyS[0-3]:串口

  /dev/lp[0-3]:並口

  /dev/console:控制檯

  /dev/fb[0-31]:framebuffer

  /dev/cdrom => /dev/hdc

  /dev/modem => /dev/ttyS[0-9]

  /dev/pilot => /dev/ttyS[0-9]

  /dev/random:隨機數設備

  /dev/urandom:隨機數設備






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章