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

掛載

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

Linux 系統中“一切皆文件”,所有文件都放置在以根目錄爲樹根的樹形目錄結構中。在 inux 看來,任何硬件設備也都是文件,它們各有自己的一套文件系統(文件目錄結構)。

因此產生的問題是,當在 Linux 系統中使用這些硬件設備時,只有將Linux本身的文件目錄與硬件設備的文件目錄合二爲一,硬件設備才能爲我們所用。合二爲一的過程稱爲“掛載”。

如果不掛載,通過Linux系統中的圖形界面系統可以查看找到硬件設備,但命令行方式無法找到。

並不是根目錄下任何一個目錄都可以作爲掛載點,由於掛載操作會使得原有目錄中文件被隱藏,因此根目錄以及系統原有目錄都不要作爲掛載點,會造成系統異常甚至崩潰,掛載點最好是新建的空目錄

例如:

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

可以看到,目前 U 盤和 Linux 系統文件分屬兩個文件系統,還無法使用命令行找到 U 盤文件,需要將兩個文件系統進行掛載。

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

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

2、實現命令

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

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

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


Linux命令擴展

1、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。

2、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 常見的支持類型有 EXT2、EXT3、EXT4、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 來查看目標設備是否還掛載在系統中。

記一次微服務耗時毛刺排查

谷歌開源內部代碼評審規範

UML (統一建模語言) 各種圖總結

真實項目案例實戰—【狀態設計模式】使用場景

歡迎分享轉發,有幫助的話點個“在看”

點我查看原文

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