什麼是掛載,Linux掛載如何實現詳解

掛載

指的就是將設備文件中的頂級目錄鏈接到 Linux 根目錄下的某一目錄(最好是空目錄),訪問此目錄就等同於訪問設備文件。node

Linux 系統中「一切皆文件」,全部文件都放置在以根目錄爲樹根的樹形目錄結構中。在 inux 看來,任何硬件設備也都是文件,它們各有本身的一套文件系統(文件目錄結構)。shell

所以產生的問題是,當在 Linux 系統中使用這些硬件設備時,只有將Linux自己的文件目錄與硬件設備的文件目錄合二爲一,硬件設備才能爲咱們所用。合二爲一的過程稱爲「掛載」。安全

若是不掛載,經過Linux系統中的圖形界面系統能夠查看找到硬件設備,但命令行方式沒法找到。bash

並非根目錄下任何一個目錄均可以做爲掛載點,因爲掛載操做會使得原有目錄中文件被隱藏,所以根目錄以及系統原有目錄都不要做爲掛載點,會形成系統異常甚至崩潰,掛載點最好是新建的空目錄。服務器

例如:網絡

咱們想經過命令行訪問某個 U 盤中的數據,圖 1 所示爲 U 盤文件目錄結構和 Linux 系統中的文件目錄結構。異步

什麼是掛載,Linux掛載如何實現詳解

 

能夠看到,目前 U 盤和 Linux 系統文件分屬兩個文件系統,還沒法使用命令行找到 U 盤文件,須要將兩個文件系統進行掛載。async

如何把U盤文件掛載到系統文件中?ui

一、咱們在文件根目錄下新建一個目錄 /sdb-u,經過掛載命令將 U 盤文件系統掛載到此目錄,掛載效果如圖 2 所示。spa

什麼是掛載,Linux掛載如何實現詳解

 

二、實現命令

三、能夠看到,U 盤文件系統已經成爲 Linux 文件系統目錄的一部分,此時訪問 /sdb-u/ 就等同於訪問 U 盤

根目錄下的 /dev/ 目錄文件負責全部的硬件設備文件,事實上,當 U 盤插入 Linux 後,系統也確實會給 U 盤分配一個目錄文件(好比 sdb1),就位於 /dev/ 目錄下(/dev/sdb1),但沒法經過 /dev/sdb1/ 直接訪問 U 盤數據,訪問此目錄只會提供給你此設備的一些基本信息(好比容量)。

總之,Linux 系統使用任何硬件設備,都必須將設備文件與已有目錄文件進行掛載。

Linux命令擴展:

一、df 命令

用於顯示 Linux 系統中各文件系統的硬盤使用狀況,包括文件系統所在硬盤分區的總容量、已使用的容量、剩餘容量等。

df 命令的基本格式爲:

[root@localhost ~]# df [選項] [目錄或文件名]

df命令經常使用選項及做用

-a: 顯示全部文件系統信息,包括系統特有的 /proc、/sysfs 等文件系統;

-m: 以 MB 爲單位顯示容量;

-k: 以 KB 爲單位顯示容量,默認以 KB 爲單位;

-h: 使用人們習慣的 KB、MB 或 GB 等單位自行顯示容量;

-T: 顯示該分區的文件系統名稱;

-i: 不用硬盤容量顯示,而是以含有 inode 的數量來顯示。

【例 1】

[root@localhost ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hdc2 9920624 3823112 5585444 41% /
/dev/hdc3 4956316 141376 4559108 4% /home
/dev/hdc1 101086 11126 84741 12% /boot
tmpfs 371332 0 371332 0% /dev/shm

不使用任何選項的 df 命令,默認會將系統內全部的文件系統信息,以 KB 爲單位顯示出來。本例中,由 df 命令顯示出的各列信息的含義分別是:

  • Filesystem:表示該文件系統位於哪一個分區,所以該列顯示的是設備名稱;
  • 1K-blocks:此列表示文件系統的總大小,默認以 KB 爲單位;
  • Used:表示用掉的硬盤空間大小;
  • Available:表示剩餘的硬盤空間大小;
  • Use%:硬盤空間使用率。若是使用率高達 90% 以上,就須要額外注意,由於容量不足,會嚴重影響系統的正常運行;
  • Mounted on:文件系統的掛載點,也就是硬盤掛載的目錄位置。

【例 2】

[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hdc2 9.5G 3.7G 5.4G 41% /
/dev/hdc3 4.8G 139M 4.4G 4% /home
/dev/hdc1 99M 11M 83M 12% /boot
tmpfs 363M 0 363M 0% /dev/shm

這裏使用了 -h 選項,所以文件系統的各類容量數據,會以人們習慣的單位(一般使用 GB 或 MB)顯示出來。

【例 3】

[root@localhost ~]# df -h /etc
Filesystem Size Used Avail Use% Mounted on
/dev/hdc2 9.5G 3.7G 5.4G 41% /

這裏在 df 命令後添加了目錄名,在這種狀況下,df 命令會自動分析該目錄所在的分區,並將所在分區的有關信息顯示出來。由此,咱們就能夠知道,該目錄下還可使用多少容量。

【例 4】

[root@localhost ~]# df -aT
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/hdc2 ext3 9920624 3823112 5585444 41% /
proc proc 0 0 0 - /proc
sysfs sysfs 0 0 0 - /sys
devpts devpts 0 0 0 - /dev/pts
/dev/hdc3 ext3 4956316 141376 4559108 4% /home
/dev/hdc1 ext3 101086 11126 84741 12% /boot
tmpfs tmpfs 371332 0 371332 0% /dev/shm
none binfmt_misc 0 0 0 - /proc/sys/fs/binfmt_misc
sunrpc rpc_pipefs 0 0 0 - /var/lib/nfs/rpc_pipefs

使用 -a 選項,會將不少特殊的文件系統顯示出來,這些文件系統包含的大可能是系統數據,存在於內存中,不會佔用硬盤空間,所以你會看到,它們所佔據的硬盤總容量爲 0。

二、du 命令

是統計目錄或文件所佔磁盤空間大小的命令。

須要注意的是,使用"ls -r"命令是能夠看到文件的大小的。可是你們會發現,在使用"ls -r"命令査看目錄大小時,目錄的大小多數是 4KB,這是由於目錄下的子目錄名和子文件名是保存到父目錄的 block(默認大小爲 4KB)中的,若是父目錄下的子目錄和子文件並很少,一個 block 就能放下,那麼這個父目錄就只佔用了一個 block 大小。

在統計目錄時,不是想看父目錄下的子目錄名和子文件名到底佔用了多少空間,而是想看父目錄下的子目錄和子文件的總磁盤佔用量大小,這時就須要使用 du 命令才能統計目錄的真正磁盤佔用量大小。

du 命令的格式以下:

[root@localhost ~]# du [選項] [目錄或文件名]

選項:

  • -a:顯示每一個子文件的磁盤佔用量。默認只統計子目錄的磁盤佔用量
  • -h:使用習慣單位顯示磁盤佔用量,如 KB、MB 或 GB 等;
  • -s:統計總磁盤佔用量,而不列出子目錄和子文件的磁盤佔用量

【例 1】

[root@localhost ~]# du
#統計當前目錄的總磁盤佔用量大小,同時會統計當前目錄下全部子目錄的磁盤佔用量大小,不統計子文件
#磁盤佔用量的大小。默認單位爲KB
20 ./.gnupg
#統計每一個子目錄的大小
24 ./yum.bak
8 ./dtest
28 ./sh
188
#統計當前目錄總大小

【例 2】

[root@localhost ~]# du -a
#統計當前目錄的總大小,同時會統計當前目錄下全部子文件和子目錄磁盤佔用量的大小。默認單位爲 KB
4 ./.bashjogout
36 ./install.log
4 ./.bash_profile
4 ./.cshrc
…省略部分輸出…
188

【例 3】

[root@localhost ~]# du -sh
#只統計磁盤佔用量總的大小,同時使用習慣單位顯示
188K .

du命令和df命令的區別

有時咱們會發現,使用 du 命令和 df 命令去統計分區的使用狀況時,獲得的數據是不同的。那是由於df命令是從文件系統的角度考慮的,經過文件系統中未分配的空間來肯定文件系統中已經分配的空間大小。也就是說,在使用 df 命令統計分區時,不只要考慮文件佔用的空間,還要統計被命令或程序佔用的空間(最多見的就是文件已經刪除,可是程序並無釋放空間)。

而 du 命令是面向文件的,只會計算文件或目錄佔用的磁盤空間。也就是說,df 命令統計的分區更準確,是真正的空閒空間。

三、mount命令

文件系統掛載

硬件設備必須掛載以後才能使用,只不過,有些硬件設備(好比硬盤分區)在每次系統啓動時會自動掛載,而有些(好比 U 盤、光盤)則須要手動進行掛載。

掛載指的是將硬件設備的文件系統和 Linux 系統中的文件系統,經過指定目錄(做爲掛載點)進行關聯。而要將文件系統掛載到 Linux 系統上,就須要使用 mount 掛載命令。

mount 命令的經常使用格式有如下幾種:

[root@localhost ~]# mount [-l]

單純使用 mount 命令,會顯示出系統中已掛載的設備信息,使用 -l 選項,會額外顯示出卷標名稱(讀者可自行運行,查看輸出結果);

[root@localhost ~]# mount -a

-a 選項的含義是自動檢查 /etc/fstab 文件中有無疏漏被掛載的設備文件,若是有,則進行自動掛載操做。這裏簡單介紹一下 /etc/fstab 文件,此文件是自動掛載文件,系統開機時會主動讀取 /etc/fstab 這個文件中的內容,根據該文件的配置,系統會自動掛載指定設備。

[root@localhost ~]# mount [-t 系統類型] [-L 卷標名] [-o 特殊選項] [-n] 設備文件名 掛載點

各選項的含義分別是:

  • -t 系統類型:指定欲掛載的文件系統類型。Linux 常見的支持類型有 EXT二、EXT三、EXT四、iso9660(光盤格式)、vfat、reiserfs 等。若是不指定具體類型,掛載時 Linux 會自動檢測。
  • -L 卷標名:除了使用設備文件名(例如 /dev/hdc6)以外,還能夠利用文件系統的卷標名稱進行掛載。
  • -n:在默認狀況下,系統會將實際掛載的狀況實時寫入 /etc/mtab 文件中,但在某些場景下(例如單人維護模式),爲了不出現問題,會刻意不寫入,此時就須要使用這個選項;
  • -o 特殊選項:能夠指定掛載的額外選項,好比讀寫權限、同步/異步等,若是不指定,則使用默認值(defaults)。具體的特殊選項參見表 1;

mount 命令選項及功能

rw/ro :是否對掛載的文件系統擁有讀寫權限,rw 爲默認值,表示擁有讀寫權限;ro 表示只讀權限。

async/sync : 此文件系統是否使用同步寫入(sync)或異步(async)的內存機制,默認爲異步 async。

dev/nodev :是否容許從該文件系統的 block 文件中提取數據,爲了保證數據安裝,默認是 nodev。

auto/noauto :是否容許此文件系統被以 mount -a 的方式進行自動掛載,默認是 auto。

suid/nosuid :設定文件系統是否擁有 SetUID 和 SetGID 權限,默認是擁有。

exec/noexec :設定在文件系統中是否容許執行可執行文件,默認是容許。

user/nouser :設定此文件系統是否容許讓普通用戶使用 mount 執行實現掛載,默認是不容許(nouser),僅有 root 能夠。

defaults :定義默認值,至關於 rw、suid、dev、exec、auto、nouser、async 這 7 個選項。

remount從新掛載已掛載的文件系統,通常用於指定修改特殊權限。

【例 1】

[root@localhost ~]# mount
#查看系統中已經掛載的文件系統,注意有虛擬文件系統
/dev/sda3 on / type ext4 (rw) <--含義是,將 /dev/sda3 分區掛載到了 / 目錄上,文件系統是 ext4,具備讀寫權限
proc on /proc type proc (rw)
sysfe on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw, gid=5, mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fe/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfe/rpc_pipefs type rpc_pipefs (rw)

【例 2】

修改特殊權限。/boot 分區已經被掛載了,並且採用的是 defaults 選項。這裏咱們從新掛載分區,並採用 noexec 權限禁止執行文件執行,看看會出現什麼狀況(注意不要用 / 分區作實驗,不然系統命令也就不能執行了。

[root@localhost ~]# mount -o remount noexec /boot
#從新掛載 /boot 分區,並使用 noexec 權限
[root@localhost sh]# cd /boot
#寫一個 shell 腳本,看是否會運行
[root@localhost boot]#vi hello.sh
#!/bin/bash
echo "hello!!"
[root@localhost boot]# chmod 755 hello.sh
[root@localhost boot]# ./hello.sh
-bash:./hello.sh:權限不夠
#雖然賦予了hello.sh執行權限,可是仍然沒法執行
[root@localhost boot]# mount -o remount exec /boot
#記得改回來,不然會影響系統啓動

【例 3】掛載分區

[root@localhost ~]# mkdir /mnt/disk1
#創建掛載點目錄
[root@localhost ~]# mount /dev/sdb1 /mnt/disk1
#掛載分區

硬盤分區(設備)掛載和卸載(使用 umount 命令)的概念源自 UNIX,UNIX 系統通常是做爲服務器使用的,系統安全很是重要,特別是在網絡上,最簡單有效的方法就是「不使用的硬盤分區(設備)不掛載」,由於沒有掛載的硬盤分區是沒法訪問的,這樣系統也就更安全了。

另外,這樣也能夠減小掛載的硬盤分區數量,相應地,也就能夠減小系統維護文件的規模,固然也就減小了系統的開銷,即提升了系統的效率。

四、umount 命令

命令的基本格式以下:

[root@localhost ~]# umount 設備文件名或掛載點

注意,卸載命令後面既能夠加設備文件名,也能夠加掛載點,不過只能二選一,好比:

[root@localhost ~]# umount /mnt/usb
#卸載U盤
[root@localhost ~]# umount /mnt/cdrom
#卸載光盤
[root@localhost ~]# umount /dev/sr0
#命令加設備文件名一樣是能夠卸載的

若是加了兩個(以下所示),從理論上分析,會對光驅卸載兩次,固然,卸載第二次的時候就會報錯。

[root@localhost ~]# mount /dev/sr0 /mnt/cdrom/

卸載掛載異常的狀況

[root@localhost ~]# cd /mnt/cdrom/
#進入光盤掛載點
[root@localhost cdrom]# umount /mnt/cdrom/
umount: /mnt/cdrom: device is busy.
#報錯,設備正忙

這種報錯是由於咱們已經進入了掛載點,所以,若是要卸載某硬件設備,在執行 umount 命令以前,用戶須退出掛載目錄。

卸載硬件設備成功與否,除了執行 umount 命令不報錯以外,還可使用 df 命令或 mount -l 來查看目標設備是否還掛載在系統中。

相關文章
相關標籤/搜索