1. 程式人生 > 其它 >Linux之27——mount 命令

Linux之27——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 (第一部分)