Linux mount 命令


mount 命令用來掛載文件系統。其基本命令格式為:
mount -t type [-o options] device dir
device:指定要掛載的設備,比如磁盤、光驅等。
dir:指定把文件系統掛載到哪個目錄。
type:指定掛載的文件系統類型,一般不用指定,mount 命令能夠自行判斷。
options:指定掛載參數,比如 ro 表示以只讀方式掛載文件系統。

Help

可以通過 man page 和 -h 選項來獲得最直接的幫助文檔:

$ man mount
$ mount -h

文件系統的類型

雖然多數情況下我們不用指定 -t 參數顯式地說明文件系統的類型,但文件系統的類型對 mount 命令來說確實是非常重要的。原因是假如你要掛載一個當前系統不支持的文件系統,它是沒辦法工作的。當前系統支持的文件系統類型是由內核來決定的,比如 ext2、ext3、ext4、sysfs 和 proc 等常見的文件系統默認都是被支持的。我們可以通過查看 /proc/filesystems 文件來觀察當前系統具體都支持哪些文件系統:

$ cat /proc/filesystems

第一列說明文件系統是否需要掛載在一個塊設備上, nodev 表明后面的文件系統不需要掛接在塊設備上。 第二列是內核支持的文件系統。

看懂輸出的文件系統信息

通過 mount 命令查看已掛載的文件系統,會輸出豐富的信息,如下圖所示:

讓我們先來解釋一下輸出信息的格式和含義。輸出中的每行代表掛載的一個文件系統,其格式為:
fs_spec on fs_file type fs_vfstype (fs_mntopts)
fs_spec:掛載的塊設備或遠程文件系統
fs_file:文件系統的掛載點
fs_vfstype:文件系統的類型
fs_mntopts:與文件系統相關的更多選項,不同的文件系統其選項也不太一樣
比如上圖中的第一行含義為:掛載的設備為 sysfs,掛載點為 /sys,文件系統的類型為 sysfs。括號中的 rw 表示以可讀寫的方式掛載文件系統,noexec 表示不能在該文件系統上直接運行程序。

與 mount 命令相關的文件

/etc/fstab
/etc/mtab
/proc/mounts

mount -a 會將 /etc/fstab 中定義的所有掛載點都掛上(一般是在系統啟動時的腳本中調用,自己最好別用!)。

mount 和 umount 命令會在 /etc/mtab 文件中維護當前掛載的文件系統的列表,這個文件在目前的系統中還是被支持的。但是更好的方式是用鏈接文件 /proc/mounts 代替 /etc/mtab 文件。這是因為在用戶空間中維護的普通文件 /etc/mtab 很難穩定可靠的與 namespaces、containers 等 Linux 的高級功能協作。在 ubuntu 16.04 上, /etc/mtab 和  /proc/mounts 一樣,都是指向 /proc/self/mounts 的鏈接文件。

下面我們介紹一些 mount 命令的常見用例。

查看掛載的文件系統

輸出系統掛載的所有文件系統
如果執行 mount 命令時不加任何參數,就會輸出系統掛載的所有文件系統:

$ mount

輸出指定類型的文件系統
通過 -t 參數可以只輸出指定類型的文件系統,比如下面的命令只會輸出 tmpfs 類型的文件系統:

$ mount -t tmpfs

格式化並掛載磁盤

對於一個磁盤分區,我們可以使用 mkfs 命令把磁盤分區格式化為指定的文件系統,比如 ext4:

$ sudo mkfs -t ext4 /dev/sdb1

然后把該分區掛載到 /mnt 目錄:

$ sudo mount /dev/sdb1 /mnt

掛載光驅

現在偶爾還還需要使用一下光驅,掛載光驅的命令如下:

$ sudo mount /dev/cdrom /mnt

該命令把設備 /dev/cdrom 掛載在 /mnt 目錄中,然后我們就可以在 /mnt 目錄下訪問光驅中的內容了。

以只讀的方式掛載

可以把文件系統掛載為只讀模式,從而保護數據。比如將 /dev/sdb1 用只讀模式掛在 /mnt 目錄:

$ sudo mount -o ro /dev/sdb1 /mnt

這樣 /mnt 目錄下的文件都是只讀的。

把只讀的掛載重新掛載為讀寫模式

當系統出現故障進入單用戶模式時,通常 / 根目錄會以只讀方式掛載,這時如果想要修改文件,會發現所有文件都是只讀狀態,無法修改。好在 Linux 下的 mount 命令支持一個remount 選項,只需要執行如下命令:

$ mount / -o rw,remount

就可以將根分區重新掛載為讀寫狀態。

除了根目錄,重新掛載其它掛載點也是一樣的,比如我們把前面掛載的 sdb1 分區重新掛載為讀寫模式:

$ sudo mount /mnt -o rw,remount

掛載 windows 共享文件

局域網中一般都是 windows 系統和 Linux 系統共存的,如果能輕松的從 Linux 系統中訪問 windows 的文件共享將是一件很開心的事情。其實這也很簡單,在 windows 上共享文件時指定一個本機的用戶,然后在 mount 命令中指定這個用戶及其密碼就可以了:

$ sudo mount -t cifs -o username=nick,password=Test123456 //10.32.2.30/doc /mnt

注意,-t cifs 是可以省略的,mount 命令能夠自動識別。一定要使用 IP 代替 windows 主機的名稱。

掛載虛擬文件系統

proc、tmpfs、sysfs、devpts 等都是 Linux 內核映射到用戶空間的虛擬文件系統,它們不和具體的物理設備關聯,但它們具有普通文件系統的特征,應用層程序可以像訪問普通文件系統一樣來訪問他們。
比如內核的 proc 文件系統默認被掛載到了 /proc 目錄,當然我們也可以再把它掛載到其它的目錄,比如 /mnt 目錄下:

$ sudo mount -t proc none /mnt

由於 proc 是內核虛擬的一個文件系統,並沒有對應的設備,所以這里的 -t 參數不能省略。由於沒有對應的源設備,這里的 none 可以是任意字符串,取個有意義的名字就可以了,因為用 mount 命令查看掛載點信息時第一列顯示的就是這個字符串。

在 Linux 上我們還可以通過 tmpfs 文件系統輕松地構建出內存磁盤來。比如在內存中創建一個 512M 的 tmpfs 文件系統,並掛載到 /mnt 下,這樣所有寫到 /mnt 目錄下的文件都存儲在內存中,速度非常快,不過要注意,由於數據存儲在內存中,所以斷電后數據會丟失掉:

$ sudo mount -t tmpfs -o size=512m tmpfs /mnt

掛載 loop 設備

在 Linux中,硬盤、光盤、軟盤等都是常見的塊設備,他們在 Linux 下的目錄一般是 /dev/sda1、/dev/cdrom、 /dev/fd0 這樣的。而 loop device 是虛擬的塊設備,主要目的是讓用戶可以像訪問上述塊設備那樣訪問一個文件。 loop device 設備的路徑一般是 /dev/loop0、dev/loop1 等,具體的個數跟內核的配置有關。

掛載 ISO 文件
需要用到 loop device 的最常見的場景是掛載一個 ISO 文件。比如將 /tmp/test.iso 這個光盤鏡像文件使用 loop 模式掛載到 /mnt 下,這樣就不需要把 ISO 文件刻錄到光盤上了,當然也不需要光驅了。
下面的命令把 projects 目錄下的內容打包到 test.iso 文件中:

$ mkisofs -o test.iso projects/

然后把這個 ISO 文件掛載到 /mnt 目錄下:

$ sudo mount test.iso /mnt

掛載 test.iso 文件使用了虛擬設備 /dev/loop0,並且是只讀的模式。

虛擬硬盤
loop 設備另一種常見的用法是虛擬一個硬盤,比如我想玩兒一下 btrfs 這個文件系統,但系統中目前的所有分區都已經用了,里面都是有用的數據,不想格式化他們,這時虛擬硬盤就有用武之地了。

我們先通過 dd 命令創建一個 512M 的文件:

$ dd if=/dev/zero bs=1M count=512 of=./vdisk.img

然后在這個文件里面創建 btrfs 文件系統:

$ sudo apt install btrfs-progs
$ mkfs.btrfs vdisk.img

最后把它掛載到 /mnt :

$ sudo mount vdisk.img /mnt

把多個設備掛載到同一個目錄

在 Linux 中可以把多個設備掛載到同一個目錄。默認后面掛載的內容會讓前面掛載的內容隱藏掉,只有 unmount 了后面掛載的內容,才會顯示原來的內容。

掛載一個設備到多個目錄

我們也可以把同一個設備掛載到不同的目錄,這樣在不同的目錄中看到的是同樣的內容。還可以在不同的目錄中控制掛載的權限,比如以只讀方式掛載:

$ sudo mount -o ro vdisk.img ./testdir

這樣從不同的目錄訪問相同的文件系統時就具有了不同的訪問權限。

總結

mount 是 Linux 系統中非常重要的一個命令,因為離開 mount 掛載的文件系統我們幾乎什么也干不了。本文介紹了一些 mount 命令的基礎用法 ,日常使用應該是夠了。mount 命令還有一些相關的復雜概念和用法,比如 bind mount 和 shared subtree 等,筆者會在今后寫專門的文章進行介紹。

參考:
Man page
Linux mount (第一部分)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM