挂载是 linux 非常重要的一个操作。
挂载介绍
Linux
系统中“一切皆文件”,所有文件都放置在以根目录为树根的树形目录结构中。在 Linux
看来,任何硬件设备也都是文件,它们各有自己的一套文件系统(文件目录结构)。
因此产生的问题是,当在 Linux
系统中使用这些硬件设备时,只有将Linux本身的文件目录与硬件设备的文件目录合二为一,硬件设备才能为我们所用。合二为一的过程称为“挂载”。
如果不挂载,通过
Linux
系统中的图形界面系统可以查看找到硬件设备,但命令行方式无法找到。
挂载,指的就是将设备文件中的顶级目录连接到 Linux
根目录下的某一目录(最好是空目录),访问此目录就等同于访问设备文件。
纠正一个误区,并不是根目录下任何一个目录都可以作为挂载点,由于挂载操作会使得原有目录中文件被隐藏,因此根目录以及系统原有目录都不要作为挂载点,会造成系统异常甚至崩溃,挂载点最好是新建的空目录。
举个例子,我们想通过命令行访问某个 U 盘中的数据,下图所示为 U 盘
文件目录结构和 Linux
系统中的文件目录结构。
上图中可以看到,目前 U 盘
和 Linux
系统文件分属两个文件系统,还无法使用命令行找到 U 盘
文件,需要将两个文件系统进行挂载。
接下来,我们在根目录下新建一个目录 /sdb-u
,通过挂载命令将 U 盘
文件系统挂载到此目录,挂载效果下图所示。
可以看到,U 盘
文件系统已经成为 Linux
文件系统目录的一部分,此时访问 /sdb-u/
就等同于访问 U 盘
。
前面讲过,根目录下的 /dev/
目录文件负责所有的硬件设备文件,事实上,当 U 盘
插入 Linux
后,系统也确实会给 U 盘
分配一个目录文件(比如 sdb1
),就位于 /dev/
目录下(/dev/sdb1
),但无法通过 /dev/sdb1/
直接访问 U 盘
数据,访问此目录只会提供给你此设备的一些基本信息(比如容量)。
总之,Linux
系统使用任何硬件设备,都必须将设备文件与已有目录文件进行挂载。
我们用
df -h
来查看挂载的情况
下面这一幅图是我电脑上的机器图
我们可以看到,这台机器的 /
挂载在 /dev/sda4
上,只有 202 G
,而其中 /data
挂载在 /dev/sdb1/
上有3.6T
,所以,我们的文件或者数据可以放在/data
中,代码放在 /home
下
我们使用
sudo du -sh /home/*
来查看各个 user 的使用情况。
挂载命令
将 /dev/hda1 挂在 /mnt 之下。
mount /dev/hda1 /mnt
将 /dev/hda1 用唯读模式挂在 /mnt 之下。
mount -o ro /dev/hda1 /mnt
挂载外接硬盘
ubuntu
首先,我们先决定挂在哪个硬盘,比如说我想把 /dev/sda5
挂载到 /data
上。
如果,在命令行中,执行
mount /dev/sda5 /data
确实可以,但,这个只是临时挂载,重启后就没了,想要永久挂载就需要修改 /etc/fstab
首先,我们要获得那个硬盘的 UUID
sudo blkid /dev/sda5
我的出现
/dev/sda5: LABEL="linuxd" UUID="807E27A67E279446" TYPE="ntfs" PARTUUID="5392f597-05"
然后我们修改 /etc/fstab
参数意义
/dev/device | mountpoint | type | rules | dump | order |
---|---|---|---|---|---|
设备名称 | 挂载点 | 分区类型 | 挂载选项 | dump选项 | fsck选项 |
设备名称可以通过
sudo blkid
可以查看自己的UUID
挂载点可以通过
df -h
可以查看当前的情况,但是你自己想挂载的位置要自己创建好。分区类型指的是你这个磁盘的文件系统
defaults
的意义是在于按照大多数文件系统的缺省值设置挂载定义,即系统的默认定义(对于大多数文件系统的处理方式),其 实除了defaults
还有auto
就是开机自动挂载,noauto
就是开机不自动挂载,nouser
就是只有超级用户才挂载,user
,所有用户都挂载dump
就是从不备份fsck
的检查顺序,0
为不检查,分区为1
,其他分区从2
开始,这里指的是检查的优先级
我填加的为
UUID=807E27A67E279446 /data ntfs defaults 0 0
centos
以下操作是 centos
。
MBR
支持的磁盘最大容量为2 TB
,GPT
最大支持的磁盘容量为18 EB
,因此当您初始化容量大于2 TB
的磁盘时,分区形式请采用GPT
。
首先看一下电脑的硬盘的分布情况
fdisk -l
输出为
Disk /dev/vda: 40 GiB, 42949672960 bytes, 83886080 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xd8a1407d
Device Boot Start End Sectors Size Id Type
/dev/vda1 * 2048 83884031 83881984 40G 83 Linux
Disk /dev/vdb: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
这里面有两个硬盘
Disk /dev/vda: 40 GiB, 42949672960 bytes, 83886080 sectors
Disk /dev/vdb: 100 GiB, 107374182400 bytes, 209715200 sectors
一般来说,系统盘是 vda
,所有的 linux
系统服务器 vda
一定是系统盘,除非人为更换,然后 默认增加硬盘就是 vdb
再加一块 vdc
,以此类推。
这里面我们可以看到已经将系统盘 vda
进行了分区,分成了一个区 vda1
。只有分好区之后才能挂载,如果没有分好区,挂载是不成功的,比如,上面的 vdb 是没有分区的,如果
mount /dev/vdb /mnt
出现
mount: /mnt: wrong fs type, bad option, bad superblock on /dev/vdb, missing codepage or helper program, or other error.
所以,要进行分区。
使用 fdisk 新增数据盘
,进入 fdisk
分区工具,开始对新增数据盘执行分区操作。
fdisk /dev/vdb
出现
Welcome to fdisk (util-linux 2.31.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x5f473133.
Command (m for help):
输入 n
,按 Enter
,开始新建分区。
回显类似如下信息:
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
表示磁盘有两种分区类型:
p
表示主分区。e
表示扩展分区。
磁盘使用
MBR
分区形式,最多可以创建4
个主分区,或者3个主分区加1
个扩展分区,扩展分区不可以直接使用,需要划分成若干个逻辑分区才可以使用。
磁盘使用GPT分区
形式时,没有主分区、扩展分区以及逻辑分区之分。
以创建一个主要分区为例,输入p
,按Enter
,开始创建一个主分区。
回显类似如下信息:
Select (default p): p
Partition number (1-4, default 1):
Partition number
表示主分区编号,可以选择1-4
。
以分区编号选择1
为例,输入主分区编号1
,按Enter
。
回显类似如下信息:
Partition number (1-4, default 1): 1
First sector (2048-209715199, default 2048):
First sector
表示起始磁柱值,可以选择2048-209715199
,默认为2048
。
以选择默认起始磁柱值2048
为例,按Enter
。
系统会自动提示分区可用空间的起始磁柱值和截止磁柱值,可以在该区间内自定义,或者使用默认值。起始磁柱值必须小于分区的截止磁柱值。
回显类似如下信息:
Last sector, +sectors or +size{K,M,G,T,P} (2048-209715199, default 209715199):
以选择默认截止磁柱值209715199
为例,按 Enter
。
系统会自动提示分区可用空间的起始磁柱值和截止磁柱值,可以在该区间内自定义,或者使用默认值。起始磁柱值必须小于分区的截止磁柱值。
出现
Created a new partition 1 of type 'Linux' and of size 100 GiB.
输入p
,按Enter
,查看新建分区的详细信息。
回显类似如下信息:
Disk /dev/vdb: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x5f473133
Device Boot Start End Sectors Size Id Type
/dev/vdb1 2048 209715199 209713152 100G 83 Linux
表示新建分区 /dev/vdb1
的详细信息。
输入 w
,按 Enter
,将分区结果写入分区表中。
回显类似如下信息:
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
表示分区创建完成。
说明:
如果之前分区操作有误,请输入q
,则会退出fdisk
分区工具,之前的分区结果将不会被保留。
这是如果执行
fdisk -l
出现
Disk /dev/vda: 40 GiB, 42949672960 bytes, 83886080 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xd8a1407d
Device Boot Start End Sectors Size Id Type
/dev/vda1 * 2048 83884031 83881984 40G 83 Linux
Disk /dev/vdb: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x5f473133
Device Boot Start End Sectors Size Id Type
/dev/vdb1 2048 209715199 209713152 100G 83 Linux
可以看到 vdb
也被分出一个区了。
执行以下命令,将新的分区表变更同步至操作系统。
partprobe
执行以下命令,将新建分区文件系统设为系统所需格式。
mkfs -t 文件系统格式 /dev/vdb1
以设置文件系统为 ext4
为例:
mkfs -t ext4 /dev/vdb1
回显类似如下信息:
mke2fs 1.44.1 (24-Mar-2018)
Creating filesystem with 26214144 4k blocks and 6553600 inodes
Filesystem UUID: e6306768-9228-4ba2-8b78-5bd5fe99b408
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872
Allocating group tables: done
Writing inode tables: done
Creating journal (131072 blocks): done
Writing superblocks and filesystem accounting information: done
格式化需要等待一段时间,请观察系统运行状态,不要退出。
执行以下命令,新建挂载目录。
mkdir 挂载目录
以新建挂载目录 /mnt
为例:
mkdir /mnt
挂载命令
mount 磁盘分区 挂载目录
以挂载新建分区 /dev/vdb1
至 /mnt
为例:
mount /dev/vdb1 /mnt
执行以下命令,查看挂载结果。
df -TH
输出
Filesystem Type Size Used Avail Use% Mounted on
udev devtmpfs 17G 0 17G 0% /dev
tmpfs tmpfs 3.4G 8.5M 3.4G 1% /run
/dev/vda1 ext4 43G 5.3G 35G 14% /
tmpfs tmpfs 17G 0 17G 0% /dev/shm
tmpfs tmpfs 5.3M 4.1k 5.3M 1% /run/lock
tmpfs tmpfs 17G 0 17G 0% /sys/fs/cgroup
tmpfs tmpfs 3.4G 0 3.4G 0% /run/user/0
/dev/vdb1 ext4 106G 63M 100G 1% /mnt
表示新建分区 /dev/vdb1
已挂载至/mnt
。
云服务器重启后,挂载会失效。您可以修改 /etc/fstab
文件,将新建磁盘分区设置为开机自动挂载。
设置开机自动挂载磁盘分区
设置云服务器系统启动时自动挂载磁盘分区,不能采用在
/etc/fstab
直接指定设备名(比如/dev/vdb1
)的方法,因为云中设备的顺序编码在关闭或者开启云服务器过程中可能发生改变,例如/dev/vdb1
可能会变成/dev/vdb2
。推荐使用UUID
来配置自动挂载磁盘分区。
说明:
UUID(universally unique identifier)是Linux系统为磁盘分区提供的唯一的标识字符串。
执行如下命令,查询磁盘分区的UUID
。
blkid 磁盘分区
以查询磁盘分区 /dev/vdb1
的 UUID
为例:
blkid /dev/vdb1
回显类似如下信息:
[root@ecs-test-0001 ~]# blkid /dev/vdb1
/dev/vdb1: UUID="0b3040e2-1367-4abb-841d-ddb0b92693df" TYPE="ext4"
表示 /dev/vdb1
的 UUID
。
执行以下命令,使用VI编辑器打开 fstab
文件。
vi /etc/fstab
按i
,进入编辑模式。
将光标移至文件末尾,按 Enter
,添加如下内容。
UUID=0b3040e2-1367-4abb-841d-ddb0b92693df /mnt/sdc ext4 defaults 0 2
以内容上仅为示例,具体请以实际情况为准,参数说明如下:
- 第一列为
UUID
,此处填写查询到的磁盘分区的UUID
。 - 第二列为磁盘分区的挂载目录,可以通过
df -TH
命令查询。 - 第三列为磁盘分区的文件系统格式, 可以通过
df -TH
命令查询。 - 第四列为磁盘分区的挂载选项,此处通常设置为defaults即可。
- 第五列为
Linux dump
备份选项。0
表示不使用Linux dump
备份。现在通常不使用dump
备份,此处设置为0
即可。1
表示使用Linux dump
备份。
- 第六列为
fsck
选项,即开机时是否使用fsck
检查磁盘。0
表示不检验。- 挂载点为(
/
)根目录的分区,此处必须填写1
。根分区设置为1
,其他分区只能从2
开始,系统会按照数字从小到大依次检查下去。
按 ESC
后,输入:wq
,按Enter
。
保存设置并退出编辑器。
执行以下步骤,验证自动挂载功能。
执行如下命令,卸载已挂载的分区。
umount 磁盘分区
命令示例:
umount /dev/vdb1
执行如下命令,将 /etc/fstab
文件所有内容重新加载。
mount -a
执行如下命令,查询文件系统挂载信息。
mount | grep 挂载目录
命令示例:
mount | grep /mnt/sdc
回显类似如下信息,说明自动挂载功能生效:
root@ecs-test-0001 ~]# mount | grep /mnt/sdc
/dev/vdb1 on /mnt/sdc type ext4 (rw,relatime,data=ordered)