玩轉 Linux 之:磁盤分區、掛載知多少?

上週在作日誌機擴容的時候,發現運維同窗將一塊硬盤的掛載點沒有同之前的日誌機保持一致,考慮到這會給往後的維護帶來麻煩,因而嘗試着手修改,在修改的同時,review 了下以前日誌機的掛載配置,發現竟然存在隨時掉坑的可能。。。至於什麼坑,我會在文末說明。 php

so,感受這事兒雖然簡單,也許一條命令就搞定的事情,可是,不少童鞋可能不明就裏,純複製粘貼網上的命令,這很容易給人挖坑埋雷,今天就來聊聊 linux 下磁盤分區、掛載的問題,篇幅所限,不會聊的太底層,純當科普吧~ node

一、Linux 分區簡介

1.1 主分區 vs 擴展分區

硬盤分區表中最多能存儲四個分區,但咱們實際使用時通常只分爲兩個分區,一個是主分區(Primary Partion)一個是擴展分區(extended partition),主分區能夠立刻被使用但不能再分區,擴展分區必須再進行分區後才能使用,也就是說它必須還要進行二次分區。那麼由擴展分區再分下去的是什麼呢?它就是邏輯分區(Logical Partion),邏輯分區沒有數量上限制。  linux

1.2 驅動器標示的含義

對習慣於使用Dos或Windows的同窗來講,有幾個分區就有幾個驅動器,而且每一個分區都會得到一個字母標識符,而後就能夠選用這個字母來指定在這個分區上的文件和目錄,它們的文件結構都是獨立的,很是好理解。然而對Red Hat Linux新手來講,可就有點惱人了。由於對Linux用戶來講不管有幾個分區,都得分給目錄使用,它歸根結底就只有一個根目錄,一個獨立且惟一的文件結構。Red Hat Linux中每一個分區都是用來組成整個文件系統的一部分,由於它採用了一種叫「掛載點」的處理方法,它的整個文件系統中包含了一整套的文件和目錄,且將一個分區和一個目錄聯繫起來。這時要載入的一個分區就在linux的存儲空間的某個目錄下得到。
下面咱們先來看看Red Hat Linux的驅動器是如何標識的。 對於IDE硬盤,驅動器標識符爲「hdx1」,其中「hd」代表分區所在設備的類型,這裏是指IDE硬盤了。「x」爲盤號(a爲基本盤,b爲基本從屬盤,c爲輔助主盤,d爲輔助從屬盤),「1」表明分區,前四個分區用數字1到4表示,它們是主分區或擴展分區,從5開始就是邏輯分區。例,hda3表示爲第一個IDE硬盤上的第三個主分區或擴展分區,hdb2表示爲第二個IDE硬盤上的第二個主分區或擴展分區。對於SCSI硬盤則標識爲「sdx1」,SCSI硬盤是用「sd」來表示分區所在設備的類型的,其他則和IDE硬盤的表示方法同樣,再也不贅述。
咱們從上面能夠看到,Red Hat Linux的分區是不一樣於其它操做系統分區的,它的分區格式經常使用的有Ext3和Swap兩種,Ext3用於存放系統文件,Swap則做爲Red Hat Linux的交換分區(至關於windows中的虛擬內存文件)。那麼如今咱們就能夠知道Red Hat Linux至少須要兩個專門的分區(Linux Native(本地)和Linux Swap(交換))。因爲不能將Red Hat Linux安裝在Dos/Windows分區。通常來講咱們將Red Hat Linux安裝一個或多個類型爲「Linux Native」的硬盤分區,可是在Red Hat Linux的每個分區都必需要指定一個「Mount Point」(掛載點),告訴Red Hat Linux在啓動時,這個目錄要給哪一個分區使用。對「Swap」分區來講, 通常也定義一個,且它沒必要要定義載入點。
下面咱們先對「Linux Native」和「Linux Swap」有個初步的瞭解。
nginx

  • SWAP分區是LINUX暫時存儲數據的交換分區,它主要是把主內存上暫時不用得數據存起來,在須要的時候再調進內存內,且做爲SWAP使用的分區不用指定「Mout Point」(載入點),既然它做爲交換分區,咱們理所固然應給它指定大小,它至少要等於系統上實際內存的量,通常來講它的大小是內存的一至兩倍。另外你也能夠建立和使用一個以上的交換分區,最多16個。
  • Linux Native是存放系統文件的地方,通常用EXT3的分區類型,對Red Hat Linux來講,有了較大的選擇餘地,能夠把系統文件分幾個區來裝(必需要說明掛載點),也能夠就裝在同一個分區中(掛載點是「/」)。

1.3 爲何要自定義多個分區?

分多個區有如下幾個目的:
shell

  • 在不損失數據的狀況下重裝系統,好比獨立設置/home掛載點,重裝系統的時候直接標記回/home,數據不會有任何損失。
  • 針對不一樣掛載點的特性分配合適的文件系統以合理發揮性能,好比對/var使用reiserfs,對/home使用xfs,對/使用ext4。
  • 針對不一樣的掛載點開啓不一樣的掛載選項,如是否須要即時同步,是否開啓日誌,是否啓用壓縮。
  • 大硬盤搜索範圍大,效率低
  • 磁盤配額只能對分區作設定
  • /home、/var、/usr/local 常常是單獨分區,由於常常會操做,容易產生碎片

二、掛載點目錄簡介

2.1 常見的掛載目錄結構

每塊硬盤都分爲若干個分區,每一個分區都有本身的文件系統。Windows爲這些文件系統各自指定了一個字母。不過 GNU/Linux 使用惟一的樹形結構來管理文件,而每一個文件系統都掛載於樹形結構的某個位置。
正如 Windows 須要有 C: 驅動器同樣,GNU/Linux 必須可以將根文件系統掛載於文件樹的根(/)上。當根掛載完成以後,您就能夠將其它文件系統掛載於樹形結構各類掛載點上。根結構下的任何目錄均可以做爲掛載點,而您也能夠將同一文件系統同時掛載於不一樣的掛載點上。
掛載點實際上就是linux中的磁盤文件系統的入口目錄
Linux文件系統結構.jpg
數據庫

2.2 常見的掛載目錄說明

目錄    內容  windows

/   根目錄,存放系統命令和用戶數據等(若是下面掛載點沒有單獨的分區,它們都將在根目錄的分區中)  
/boot    boot loader 的靜態連接文件,存放與Linux啓動相關的程序
/home    用戶目錄,存放普通用戶的數據
/tmp    臨時文件
/usr    是Red Hat 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 這個目錄在大多數狀況下都是空的。可是若是你正在工做忽然停電,或是沒有用正常方式關機,在你從新啓動機器的時候,有些文件就會找不到應該存放的地方,對於這些文件,系統將他們放在這個目錄下。
/boot: 必須老是物理地包含 /etc、/bin、/sbin、/lib 和 /dev,不然您將不能啓動系統。
/home:每一個用戶將放置他的私有數據到這個目錄的子目錄下。
/tmp: 程序建立的臨時數據大都存到這個目錄。
/usr:包含全部的用戶程序(/usr/bin),庫文件(/usr/lib),文檔(/usr/share/doc),等等。
/var:全部的可變數據,如新聞組文章、電子郵件、網站、數據庫、軟件包系統的緩存等等,將被放入這個目錄。這個目錄的大小取決於您計算機的用途,可是對大多數人來講,將主要用於軟件包系統的管理工具。若是作服務器的話空間應儘可能大。個人服務器的實際分法及實際使用的大小,尚未實際投入使用。因此/var目錄沒有用那麼多。通常WEB存放網頁的目錄是/var/www,postfix郵件的存放郵件的目錄是:/var/mail,var/log,是系統日誌記錄分區, /var/spool:存放一些郵件、新聞、打印隊列等。
/opt:存放可選的安裝的軟件。
緩存

上面介紹了幾個掛載點,通常來講咱們最少須要兩個分區(固然只要一個 / 分區也能夠),須要一個SWAP分區,和一個「/」分區,但把一些經常使用、重要的掛載點分到其它分區,這樣便於管理。通常一個/分區,一個/usr分區,一個/home 分區,一個/var/log分區。固然這沒有什麼規定,徹底是依照須要來定的。咱們可使用Red Hat Linux提供的硬盤管理工具Disk Druid來完成分區和掛載點設置。 服務器

對照上圖和目錄簡介,能夠把Linux系統的掛載點想象成一棵大樹
/ 爲大樹的樹根
/ 衍生的其餘掛載點爲這顆大樹的樹枝
掛載點下的文件爲樹葉
運維

2.3 爲何 linux 的分區須要有掛載這個動做呢?

若是你看過我以前寫的 Linux 系列文章,那麼應該記得我曾經標紅過一句話:linux 下一切皆文件!換言之就是linux操做系統將系統中的一切都做爲文件來管理。在windows中咱們常見的硬件設備(打印機、網卡、聲卡...)、磁盤分區等,在linux中通通都被視做文件,對設備、分區的訪問就是讀寫對應的文件。

三、實戰分區掛載

3.1 臨時掛載

舉個栗子,原來分區狀況以下:

[root@sg-sl-data]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2              20G  5.6G   13G  31% /
/dev/sda6             996M   35M  910M   4% /data
/dev/sda5             426G  199M  404G   1% /disk1
/dev/sda1             996M   46M  899M   5% /boot
tmpfs                 7.9G     0  7.9G   0% /dev/shm

3.1.1 先卸載分區:

umount /disk1
umount /data

3.1.2 再從新掛起來:

mount /dev/sda5 /data
mount /dev/sda6 /disk1
注意:如前所述,不能2個分區同時掛載到/data

3.2 永久掛載:開機自動掛載

上面步驟中的方法只是臨時工乾的活兒,開機後磁盤分區會不可見或者仍是掛載以前的模樣,要想永久生效,還須要修改/etc/fstab,

LABEL=/data             /data                   ext3    defaults        1 2
LABEL=/disk1            /disk1                  ext3    defaults        1 2
修改成:
/dev/sda5             /data                   ext3    defaults        1 2
/dev/sda6            /disk1                  ext3    defaults        1 2

說明:fstab 是文件系統分配表的配置文件,該文件有着嚴格的語法格式限制,相似 crontab 同樣,保存時也會對你的輸入格式進行校驗,請慎重使用,不然會有意想不到的問題發生。其一共有 6 個字段,空格分隔,具體每一個字段的含義請參考這裏,再也不贅述:http://diamonder.blog.51cto.com/159220/282542

3.3 如下是添加硬盤&分區&掛載(高危操做,新手慎用!)

友情提示:分區操做是高危操做,尤爲是新手同窗請勿在生產環境隨意嘗試,不然後果自負! 

更爲詳細的分區教程請參見:

linux磁盤分區fdisk命令詳解  http://linux008.blog.51cto.com/2837805/548711

fdisk /dev/sdb
 
輸入m---n---p---1--回車---回車---p---w
 
mkfs.ext3 /dev/sdb1
 
mkdir /disk2
 
mount /dev/sdb1 /disk2/
 
在/etc/fstab中添加:
/dev/sdb1            /disk2                  ext3    defaults        1 2

四、經過 fstab 設置開機掛載的坑

fstab 文件你們都很熟悉,Linux 在啓動的時候經過 fstab 中的信息掛載各個分區,一個典型的分區條目就像這樣:

/dev/sdb4 /mnt/usb vfat utf8,umask=0 0 0

/dev/sda4 爲須要掛載的分區,sda4 是 Linux 檢測硬盤時按順序給分區的命名,通常來說,這個名稱並不會變化,可是若是你有多塊硬盤,硬盤在電腦中的順序變化的時候,相同的名稱可能表明着不一樣的硬盤分區,若是你是從 USB 設備啓動,與其餘 USB 設備的插入順序也會致使分區識別的困難。

所以上面 3.2 小節中的配置直接寫 /dev/sda6 是有很大的隱患的,重啓後硬盤的順序可能發生變化,好比 你把 nginx 的用戶日誌放在一個單獨的分區上,那麼重啓後雖然設置了 fstab,可是因爲順序變了相同的分區號可能表明不一樣的硬盤分區了,這樣就會致使某些分區上的數據服務不可用了。

(PS:文章開頭說過在 review 之前同窗的掛載配置的時候發現了埋下的一個雷,正是上面的問題。)

這個時候 UUID 就派上用場了,UUID 全稱是 Universally Unique Identifier,也就是說,每一個分區有一個惟一的 UUID 值,這樣就不會發生分區識別混亂的問題了。

在 fstab 中用 UUID 掛載分區,看起來向這樣:
UUID=1234-5678 /mnt/usb vfat utf8,umask=0 0 0
在 UUID= 後面填入分區相應的 UUID 值,就能夠正確掛載分區了。
那麼,咱們如何知道一個分區的 UUID 呢?
有 3 種方法:

4.1 經過瀏覽 /dev/disk/by-uuid/ 下的設備文件信息

# ls -l /dev/disk/by-uuid/
------
lrwxrwxrwx 1 root root 10 10-13 09:14 0909-090B -> ../../sdb5
lrwxrwxrwx 1 root root 10 10-13 09:13 7c627a81-7a6b-4806-987b-b5a8a0a93645 -> ../../sda4
..... 

4.2 經過 vol_id 命令

# vol_id /dev/sdb5
ID_FS_USAGE=filesystem
ID_FS_TYPE=vfat
ID_FS_VERSION=FAT32
ID_FS_UUID=0909-090B
ID_FS_UUID_ENC=0909-090B
ID_FS_LABEL=SWAP
ID_FS_LABEL_ENC=SWAP
ID_FS_LABEL_SAFE=SWAP

4.3 經過 blkid 命令

# blkid /dev/sdb5
/dev/sdb5: LABEL="SWAP" UUID="0909-090B" TYPE="vfat"
經過這三種方法均可以得到分區的 UUID,UUID 依據分區不一樣,長度和格式都不相同。

好比我最後把 /dev/sdb 掛載在了 /data1 目錄下(不放心的話重啓或者生成文件測試下,看掛載分區的空間被佔用沒):

文件系統       類型   容量  已用  可用 已用% 掛載點
/dev/sda3      ext4   518G  2.7G  489G    1% /
tmpfs          tmpfs   16G     0   16G    0% /dev/shm
/dev/sda1      ext4  1008M   61M  896M    7% /boot
/dev/sdb       ext4   1.8T  1.1G  1.7T    1% /data1

grep -v '#' /etc/fstab |column -t
UUID=0c685e8b-dbb3-4a1c-a106-3f1716ab34dd  /         ext4    defaults,noatime              1  1
UUID=2d7f1bcf-06d1-486e-87df-404ba670fcd9  /boot     ext4    defaults,noatime              1  2
UUID=248e7a99-b459-4800-bbd3-354047e49a2f  swap      swap    defaults,noatime              0  0
tmpfs                                      /dev/shm  tmpfs   defaults,nosuid,noexec,nodev  0  0
devpts                                     /dev/pts  devpts  gid=5,mode=620                0  0
sysfs                                      /sys      sysfs   defaults                      0  0
proc                                       /proc     proc    defaults                      0  0
UUID=870ebaf6-727f-48d3-b60c-f203339d94ac  /data1    ext4    defaults,noatime              0  0

五、FAQ:

  • 掛載點必須是一個目錄。
  • 一個分區掛載在一個已存在的目錄上,這個目錄能夠不爲空,但掛載後這個目錄下之前的內容將不可用。對於其餘操做系統創建的文件系統的掛載也是這樣,卸載後,目錄之前的文件都還在,不會有任何丟失。
  • 目錄只佔磁盤裏的一個inode,存放文件屬性等信息。
  • 任何一個分區都必須掛載到某個目錄上。
  • 目錄是邏輯上的區分。分區是物理上的區分。
  • 磁盤Linux分區都必須掛載到目錄樹中的某個具體的目錄上才能進行讀寫操做。
  • 根目錄是全部Linux的文件和目錄所在的地方,須要掛載上一個磁盤分區。
  • 一個分區能夠掛在多個目錄,但反過來一個目錄只能是一個分區的掛載點。

六、refer:

[1] Linux入門筆記之一:系統分區及掛載點  http://newthink.blog.51cto.com/872263/223795/

[2] 掛載點  http://wiki.linuxdeepin.com/index.php?title=%E6%8C%82%E8%BD%BD%E7%82%B9

[3] 什麼叫「掛載」,「掛載點」?linux文件系統中的概念  http://bbs.csdn.net/topics/380197703

[4] Linux文件系統簡介  http://alicsd.iteye.com/blog/816268

[5] 第八章、Linux 磁盤與文件系統管理  http://vbird.dic.ksu.edu.tw/linux_basic/0230filesystem.php

[6] /etc/fstab 詳解  http://diamonder.blog.51cto.com/159220/282542         http://dikar.iteye.com/blog/361659

[7] 如何在CentOS下使用fdisk添加新硬盤  http://343308530.blog.51cto.com/7202597/1251558

[8] 多硬盤分區管理fdisk  http://blog.fens.me/linux-fdisk/

相關文章
相關標籤/搜索