深入linux下磁盘Disk,分区Partition,挂载Mount
0x01 Linux 分區簡介
掛載的本質就是針對某一設備, 分析出其文件系統結構, 并根據其文件系統類型調用 linux 中相應的驅動, 處理其的元數據, 將這些信息附加到 linux 的目錄樹上呈現出來.
原文:Mountingis the attaching of an additionalfilesystemto thecurrently accessible filesystemof a computer.
當要使用某個設備時,例如要讀取硬盤中的一個格式化好的分區、光盤或軟件等設備時,必須先把這些設備對應到某個目錄(這個目錄可以不為空,但掛載后這個目錄下以前的內容將不可用),而這個目錄就稱為“掛載點(mount point)”,這樣才可以讀取這些設備,而這些對應的動作就是“掛載”。
主分區 vs 擴展分區
硬盤分區表中最多能存儲四個分區,但我們實際使用時一般只分為兩個分區,一個是主分區(Primary Partion)一個是擴展分區(extended partition),主分區可以馬上被使用但不能再分區,擴展分區必須再進行分區后才能使用,也就是說它必須還要進行二次分區, 一般留作未來擴展用的。那么由擴展分區再分下去的是什么呢?它就是邏輯分區(Logical Partion),邏輯分區沒有數量上限制, 相當于不同目錄取不同名字作"邏輯"上的區分。
驅動器標示的含義
對Linux用戶來說無論有幾個分區,都得分給目錄使用,它歸根結底就只有一個根目錄,一個獨立且唯一的文件結構。Linux中每個分區都是用來組成整個文件系統的一部分,因為它采用了一種叫“掛載點”的處理方法,它的整個文件系統中包含了一整套的文件和目錄,且將一個分區和一個目錄聯系起來。這時要載入的一個分區就在linux的存儲空間的某個目錄下獲得。
對于IDE硬盤,驅動器標識符為“hdx1”,其中“hd”表明分區所在設備的類型,這里是指IDE硬盤了。“x”為盤號(a為基本盤,b為基本從屬盤,c為輔助主盤,d為輔助從屬盤),“1”代表分區,前四個分區用數字1到4表示,它們是主分區或擴展分區,從5開始就是邏輯分區。例,hda3表示為第一個IDE硬盤上的第三個主分區或擴展分區,hdb2表示為第二個IDE硬盤上的第二個主分區或擴展分區。對于SCSI硬盤則標識為“sdx1”,SCSI硬盤是用“sd”來表示分區所在設備的類型的,其余則和IDE硬盤的表示方法一樣。
上面可以看到,Linux的分區是不同于其它操作系統分區的,它的分區格式常用的有Ext3和Swap兩種,Ext3用于存放系統文件,Swap則作為Linux的交換分區(相當于windows中的虛擬內存文件)。那么現在我們就可以知道Linux至少需要兩個專門的分區(Linux Native(本地)和Linux Swap(交換))。由于不能將Linux安裝在Dos/Windows分區。一般來說我們將Linux安裝一個或多個類型為“Linux Native”的硬盤分區,但是在Linux的每一個分區都必須要指定一個“Mount Point”(掛載點),告訴Linux在啟動時,這個目錄要給哪個分區使用。對“Swap”分區來說, 一般也定義一個,且它不必要定義載入點。
下面我們先對“Linux Native”和“Linux Swap”有個初步的了解。
SWAP分區是LINUX暫時存儲數據的交換分區,它主要是把主內存上暫時不用得數據存起來,在需要的時候再調進內存內,且作為SWAP使用的分區不用指定“Mout Point”(載入點),既然它作為交換分區,我們理所當然應給它指定大小,它至少要等于系統上實際內存的量,一般來說它的大小是內存的一至兩倍。另外你也可以創建和使用一個以上的交換分區,最多16個。
Linux Native是存放系統文件的地方,一般用ext3/ext4的分區類型,對Linux來說,有了較大的選擇余地,可以把系統文件分幾個區來裝(必須要說明掛載點),也可以就裝在同一個分區中(掛載點是“/”)。
為什么要自定義多個分區
a. 在不損失數據的情況下重裝系統,比如獨立設置/home掛載點,重裝系統的時候直接標記回/home,數據不會有任何損失。
b. 針對不同掛載點的特性分配合適的文件系統以合理發揮性能,比如對/var使用reiserfs,對/home使用xfs,對/使用ext4。
c. 針對不同的掛載點開啟不同的掛載選項,如是否需要即時同步,是否開啟日志,是否啟用壓縮。
d. 大硬盤搜索范圍大,效率低
e. 磁盤配額只能對分區做設定
f. /home、/var、/usr/local 經常是單獨分區,因為經常會操作,容易產生碎片
0x02 掛載點目錄簡介
常見的掛載目錄結構
以上是目錄結構
以下是文件存儲結構
在linux正統的文件系統(eg:ext2、ext3)中,一個文件由以下三個部分組成:
1. 目錄項:包括文件名和inode節點號。
2. Inode::又稱文件索引節點,記錄文件的屬性,一個文件占用一個inode,同時記錄此文件的數據所在的block號碼。
3. data block:實際記錄文件的內容,若文件太大時,會占用多個block。
常見的掛載目錄說明
/ 根目錄,存放系統命令和用戶數據等(如果下面掛載點沒有單獨的分區,它們都將在根目錄的分區中)
/boot boot loader 的靜態鏈接文件,存放與Linux啟動相關的程序
/home 用戶目錄,存放普通用戶的數據
/tmp 臨時文件
/usr 是Linux系統存放軟件的地方,如有可能應將最大空間分給它
/usr/local 自已安裝程序安裝在此
/var 不斷變化的數據,服務器的一些服務、日志放在下面
/opt (Option可選的)附加的應用程序軟件包
/bin 基本命令執行文
/dev 設備文件
/etc 主機特定的系統配置
/lib 基本共享庫以及內核模塊
/media 用于移動介質的掛載點
/mnt 用于臨時掛載文件系統或者別的硬件設備(如光驅、軟驅)
/proc 系統信息的虛擬目錄(2.4 和 2.6 內核),這些信息是在內存中,由系統自己產生的
/root root 用戶的目錄
/sbin 基本系統命令執行文件
/sys 系統信息的虛擬目錄(2.6 內核)
/srv 系統提供的用于 service 的數據
/usr/X1186 X-Windows目錄,存放一些X-Windows的配置文件
/usr/include 系統頭文件,存儲一些C語言的頭文件
/usr/src Linux內核源代碼,Linux系統所安裝的內核源代碼都保存在此
/usr/bin 對/bin目錄的一些補充
/usr/sbin 對/sbin目錄的一些補充
/lost+found 這個目錄在大多數情況下都是空的。但是如果你正在工作突然停電,或是沒有用正常方式關機,在你重新啟動機器的時候,有些文件就會找不到應該存放的地方,對于這些文件,系統將他們放在這個目錄下
為什么 linux 的分區需要有掛載這個動作呢
因為linux 下一切皆文件!換句說法就是linux操作系統將系統中的一切都作為文件來管理。在windows中我們常見的硬件設備(打印機、網卡、聲卡...)、磁盤分區等,在linux中統統都被視作文件,對設備、分區的訪問就是讀寫對應的文件。
0x03 實戰分區掛載
臨時掛載
$ mount /dev/sda3 /data ##sda3分區掛載在data目錄下
$ umount /data ##卸載data目錄下分區
永久掛載:開機自動掛載
需要修改/etc/fstab
LABEL=/data /data ext3 defaults 1 2
修改為:
/dev/sda3 /data ext3 defaults 1 2
PS:fstab 是文件系統分配表的配置文件,該文件有著嚴格的語法格式限制,類似 crontab 一樣,保存時也會對你的輸入格式進行校驗,請慎重使用,否則會有意想不到的問題發生。其一共有 6 個字段,空格分隔。
添加硬盤&分區&掛載
參考之前寫的文摘《Centos下磁盤分區及掛載》
loop device 回環設備
明白 loop mount 之前, 最好先清除什么是 loop device, 有耐心的話可以參見維基百科中的條目, 比較長, 沒耐心的話可以直接看我下面的描述, 簡潔些.
簡單來說, loop device 能夠提供將一個檔案掛載到某一目錄的功能. 這和 bind mount (下文會介紹) 有些類似, 但并不相同. 原始的 mount 只是為了將正常的設備掛載, bind mount 使得可以掛載目錄, 而 loop device 使得可以掛載檔案.
在 linux 中, loop device 就是指 /dev/loop0, /dev/loop1, /dev/loop2 … 這些設備, 它們是虛假的設備(pseudo device), 不像 /dev/sda 在你的主機里物理存在. loop device 需要你在編譯內核的時候將其靜態編譯或者編譯為動態模塊, 然后需要使用modprobe加載其模塊(這個模塊包含了 loop device 的驅動程序以及 losetup 這種提供給用戶來操作 loop device 的程序), 這時其驅動程序就回創建 /dev/loop0, /dev/loop1 … 這幾個設備文件.
注意, 我在說檔案的時候, 指的是英文中的 archive, 它和文件 file 是不同的東西, 檔案 archive 是一個打包的文件集, 里面一般包含許多文件, 比如 tar, jar, iso 就是常見的檔案格式.
用過 dd 的人應該知道, 這個強大的命令可以將整個磁盤或者磁盤分區克隆下來, 放到一個文件里, 一般, 這樣的文件我們都以 .img 后綴為其命名并稱這樣的文件為鏡像文件. 我所說的檔案也包含這類情況.
5.loop mount
ok, 明白了什么是 loop device, 也明白了檔案是什么, 那么到底如何把一個檔案掛載到某個目錄下呢?
實際上 loop mount 采取了一個瞞天過海的方式, 它先將這個檔案映射到某個 loop device 上, 像這樣:
# losetup /dev/loop0 xxxx.iso
通過這種方式來欺騙mount命令, 讓mount命令以為 /dev/loop0 上面真的有設備. 這時運行mount就行了:
# mount -t iso9660 /dev/loop0 /path/to/mount/point
這么看起來, 當你想掛載某一個檔案的時候(比如某個 iso), 你首先得把這個檔案和某一個 loop device 關聯起來, 使用 losetup 命令. 然后使用 mount 命令將這個 loop device 設備掛載到某個目錄上. 實際上不必這樣,mount命令自身其實就有一個能把這兩步合并的功能, 那就是這樣:
# mount -t iso9660 -o loop /dev/loop0 /path/to/mount/point
最后我們再來想一想, 是不是所有的檔案都可以用這種方式掛載? 顯然不是的, 根據mount命令有個 -t 參數來看, 在掛載的時候是需要指定文件系統的類型的(不指定的話mount命令會自動識別), 還記得上面說的掛載的本質嗎?
"掛載操作, 實際上是把設備 _device_ 中的**文件系統**附加到 _dir_ 上,".
不被識別的文件系統是不能被掛載的, 如果你沒有加載 ReiserFS 模塊, 那么掛載具有 ReiserFS 文件系統的設備時就會報 “unknown file system” 錯誤. 像上面說的 tar, jar, zip 這樣的檔案, 它們只是一種打包/壓縮格式, 本身就不是一種文件系統格式, 當然是不能被 linux 識別的. 它們雖然可以映射到某一個 loop device, 但并不能被掛載.
但是像 .iso 文件, 它一般包含 iso 9660 文件系統, 都知道這是一種 CD 上采用的文件系統. 還有就是你可以使用 dd, mkfs 命令來創建一個 ext2, ext3 等文件系統的檔案. 這樣的檔案才是可以被掛載的.
loop mount 一直以來是 Unix-like 系統下很有用的特性, 能幫助你當你拿到一個 iso 文件后, 不必將其刻錄到 CD/DVD 里就能查看里面的內容. windows 下直到 windows 7 才支持這一特性, 在此之前都需要借助第三方軟件如 Daemon Tools 來實現虛擬光驅的功能.
6.綁定式掛載 (bind mount)
上面所說的 “掛載” 都是指讓你將某個設備掛載到某一目錄, 不管這個設備是真實的物理設備, 還是假的 loop 設備, 它都是設備. 而 “綁定式掛載” 能夠允許你將已經的存在目錄掛載到另一目錄. 比如:
# mount --bind / /home/username/mnt-point
這樣, 你的 mnt-point 目錄下也會有 etc, opt, usr 等目錄, 這一過程我們稱作 “將根目錄綁定到 /home/username/mnt-point 上”, 所以, 你在一處改變目錄下的內容的話, 在另一處也能夠看到改變.
需要注意的一點是如果根目錄樹下有某個目錄是掛載到另一個磁盤分區的話, 那么它可能不會被綁定到新的目錄下. 比如說如果 /usr 和 / 處于不同的磁盤分區(/ 在 sda1, /usr 在 sda2), 那么你可能會發現 /home/username/mnt-point/usr 是空的, 那么這時可以額外掛載一次來使得 /usr 也出現在 /home/username/mnt-point/usr:
# mount --bind /usr /home/username/mnt-point/usr
不過你也可以在一開始就執行:
# mount --rbind / /home/username/mnt-point
關于綁定式掛載,man 2 mount中的描述是 “使一個文件, 或者一個目錄樹在另一個目錄上可見”. 這地方不太理解, 就我所知, 只能將目錄綁定到目錄, 不能將文件綁定到目錄的. 我嘗試過將一個普通的文件綁定到目錄, 但報錯了. 不知道 man 手冊里這個說法是什么意思. 我只能這么理解: 目錄也是文件, 所以這種說法沒錯吧….
7.重新掛載 (remount)
借助于綁定式掛載, 可以實現有趣的效果, 比如說, 你可以將 / 綁定到 /, 將 /tmp/test/ 綁定到 /tmp/test/ (運行 mount 命令就能看到效果). 不過… 這么干有個鳥用啊!! 誰這么無聊會去這么干啊!!
這就是 remount 存在的原因, 我們雖然可以通過綁定式掛載耍點小聰明, 將自己綁定到自己上, 但這與沒綁定沒有任何區別啊; 然而借助 remount, 我們就可以在重新掛載的時候修改掛載的參數.
remount 最常用的情況就是將一個文件系統由只讀重新掛載為讀寫, 或者相反. 比如:
# mount -o remount,rw /
關于 remount 的詳情, 可以看一下 man 手冊, 這里就不多介紹了.
0x04 通過 fstab 設置開機掛載的問題
Linux 在啟動的時候通過 fstab 中的信息掛載各個分區,一個典型的分區條目就像這樣:
/dev/sda3 /data ext3 defaults 1 2
/dev/sda3 為需要掛載的分區,sda3是 Linux 檢測硬盤時按順序給分區的命名,一般來講,這個名稱并不會變化,但是如果你有多塊硬盤,硬盤在電腦中的順序變化的時候,相同的名稱可能代表著不同的硬盤分區。這樣的話上面設置的開機自動掛載就會出現找不到分區上面的文件情況
這個時候 UUID 就派上用場了,UUID 全稱是 Universally Unique Identifier,也就是說,每個分區有一個唯一的 UUID 值,這樣就不會發生分區識別混亂的問題了。
在 fstab 中用 UUID 掛載分區格式如下:
UUID=7cc82613-5be2-4e58-b359-0920613f9509 /data ext3 defaults 1 2
可以通過下面命令得到分區的UUID
$ ls -l /dev/disk/by-uuid/
0x05 FAQ
a. 掛載點不一定是一個目錄, 可以是文件
b. 一個分區掛載在一個已存在的目錄上,這個目錄可以不為空,但掛載后這個目錄下以前的內容將不可用。對于其他操作系統建立的文件系統的掛載也是這樣,卸載后,目錄以前的文件都還在,不會有任何丟失
c. 目錄只占磁盤里的一個inode,存放文件屬性等信息
d. 任何一個分區都必須掛載到某個目錄上
e. 目錄是邏輯上的。分區是物理上的.
f. 磁盤Linux分區都必須掛載到目錄樹中的某個具體的目錄上才能進行讀寫操作
g. 根目錄是所有Linux的文件和目錄所在的地方,需要掛載上一個磁盤分區
h. 一個分區可以掛在多個目錄,但反過來一個目錄只能是一個分區的掛載點
參考:
http://cn.linux.vbird.org/linux_basic/0230filesystem_6.php
總結
以上是生活随笔為你收集整理的深入linux下磁盘Disk,分区Partition,挂载Mount的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [UE4]GameMode
- 下一篇: [转]css讲解 font-weight