Linux下多挂载点mount实验

Posted 白-胖-子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux下多挂载点mount实验相关的知识,希望对你有一定的参考价值。

mount挂载实验

今天研发的同学打来电话问了一个奇葩的问题:同一个文件夹是否可以挂载多个nas?
我的第一反应就是不可以,但又没细想为什么。

现在我们就来做一个实验验证一下:

  1. 同一个目录是否可以同时挂载多个分区/硬盘/逻辑卷/nas
  2. 同一个分区/硬盘/逻辑卷/nas是否可以挂载到多个目录

环境准备

  • 实验基线
    操作系统:CentOS Linux release 8.4.2105
  • 虚拟机创建3个新硬盘做为实验挂载用
  • 查看硬盘
[root@C8-196 ~]# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    0  200G  0 disk 
├─sda1        8:1    0    1G  0 part /boot
└─sda2        8:2    0  199G  0 part 
  ├─cl-root 253:0    0   70G  0 lvm  /
  ├─cl-swap 253:1    0    2G  0 lvm  [SWAP]
  └─cl-home 253:2    0  127G  0 lvm  /home
sdb           8:16   0    5G  0 disk 
sdc           8:32   0    5G  0 disk 
sdd           8:48   0    5G  0 disk 

  • 使用逻辑卷分区
[root@C8-196 ~]# pvcreate /dev/sdb /dev/sdc /dev/sdd
  Physical volume "/dev/sdb" successfully created.
  Physical volume "/dev/sdc" successfully created.
  Physical volume "/dev/sdd" successfully created.
[root@C8-196 ~]# vgcreate mt /dev/sdb /dev/sdc /dev/sdd
  Volume group "mt" successfully created
[root@C8-196 ~]# lvcreate -L +5G mt1_lv mt
  Volume group "mt1_lv" not found
  Cannot process volume group mt1_lv
[root@C8-196 ~]# lvcreate -L +5G -n mt1_lv mt
  Logical volume "mt1_lv" created.
[root@C8-196 ~]# lvcreate -L +5G -n mt2_lv mt
  Logical volume "mt2_lv" created.
[root@C8-196 ~]# lvcreate -L +5G -n mt3_lv mt
  Volume group "mt" has insufficient free space (1277 extents): 1280 required.
[root@C8-196 ~]# lvcreate -L +4 -n mt3_lv mt
  Logical volume "mt3_lv" created.
[root@C8-196 ~]# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    0  200G  0 disk 
├─sda1        8:1    0    1G  0 part /boot
└─sda2        8:2    0  199G  0 part 
  ├─cl-root 253:0    0   70G  0 lvm  /
  ├─cl-swap 253:1    0    2G  0 lvm  [SWAP]
  └─cl-home 253:2    0  127G  0 lvm  /home
sdb           8:16   0    5G  0 disk 
└─mt-mt1_lv 253:3    0    5G  0 lvm  
sdc           8:32   0    5G  0 disk 
├─mt-mt1_lv 253:3    0    5G  0 lvm  
├─mt-mt2_lv 253:4    0    5G  0 lvm  
└─mt-mt3_lv 253:5    0    4M  0 lvm  
sdd           8:48   0    5G  0 disk 
└─mt-mt2_lv 253:4    0    5G  0 lvm  
[root@C8-196 ~]# lvs
  LV     VG Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home   cl -wi-ao---- 126.96g                                                    
  root   cl -wi-ao----  70.00g                                                    
  swap   cl -wi-ao----   2.03g                                                    
  mt1_lv mt -wi-a-----   5.00g                                                    
  mt2_lv mt -wi-a-----   5.00g                                                    
  mt3_lv mt -wi-a-----   4.00m       
  • 在三个新建逻辑卷分区上创建文件系统
 mkfs.xfs /dev/mapper/mt-mt1_lv
 mkfs.xfs /dev/mapper/mt-mt2_lv
 mkfs.ext4 /dev/mapper/mt-mt3_lv
  • 查看分区情况
[root@C8-196 ~]# lsblk -f
NAME        FSTYPE      LABEL UUID                                   MOUNTPOINT
sda                                                                  
├─sda1      xfs               c17463f3-cf5c-4d9e-b7f8-34e1f09de31c   /boot
└─sda2      LVM2_member       5fOYEk-G1PN-Yilu-3PZD-dV92-kCgM-4NQTC4 
  ├─cl-root xfs               e88eb208-9984-4cbe-867b-8a0fee022dec   /
  ├─cl-swap swap              ad9f0577-fb9a-4e61-99d2-b42473a0e815   [SWAP]
  └─cl-home xfs               19122a86-a5b9-43c8-bdb3-6ae3a94702bb   /home
sdb         LVM2_member       vv0NK7-BQXM-Z2dp-QSnp-W3Ff-qdfz-qDkM2K 
└─mt-mt1_lv xfs               540120f8-557d-4a7b-95a0-8f3965e212a5   
sdc         LVM2_member       FQRPl7-L1K5-z6PK-o3wR-rTz9-0tGj-hCMB8s 
├─mt-mt1_lv xfs               540120f8-557d-4a7b-95a0-8f3965e212a5   
├─mt-mt2_lv xfs               01a90cf9-4049-45f3-95c3-acb6f879cba0   
└─mt-mt3_lv ext4              597e10e6-e1ad-4d04-ac95-304b0a61de58   
sdd         LVM2_member       7hKy5j-Yik1-mpdE-NXir-J84W-a4c7-JmTZLE 
└─mt-mt2_lv xfs               01a90cf9-4049-45f3-95c3-acb6f879cba0   
  • 创建3个挂载点
[root@C8-196 ~]# mkdir -pv /data/mt1..3
mkdir: created directory '/data/mt1'
mkdir: created directory '/data/mt2'
mkdir: created directory '/data/mt3'
[root@C8-196 ~]# ll /data
total 0
drwxr-xr-x 2 root root 6 Mar 10 21:05 mt1
drwxr-xr-x 2 root root 6 Mar 10 21:05 mt2
drwxr-xr-x 2 root root 6 Mar 10 21:05 mt3
drwxr-xr-x 2 root root 6 Dec 17 21:43 spugdata

测试1:同一挂载点(目录)挂载多个分区

  • 挂载点/data/mt1分别挂载3个分区
[root@C8-196 ~]# mount /dev/mapper/mt-mt1_lv /data/mt1
[root@C8-196 ~]# df -Th
Filesystem            Type      Size  Used Avail Use% Mounted on
devtmpfs              devtmpfs  876M     0  876M   0% /dev
tmpfs                 tmpfs     896M     0  896M   0% /dev/shm
tmpfs                 tmpfs     896M   17M  879M   2% /run
tmpfs                 tmpfs     896M     0  896M   0% /sys/fs/cgroup
/dev/mapper/cl-root   xfs        70G  3.6G   67G   6% /
/dev/mapper/cl-home   xfs       127G  2.5G  125G   2% /home
/dev/sda1             xfs      1014M  197M  818M  20% /boot
overlay               overlay    70G  3.6G   67G   6% /var/lib/docker/overlay2/dff1098e902038f4105591060554c84a668a85b076f0596f8b144e77ca7a8633/merged
tmpfs                 tmpfs     180M     0  180M   0% /run/user/0
/dev/mapper/mt-mt1_lv xfs       5.0G   68M  5.0G   2% /data/mt1
[root@C8-196 ~]# mount /dev/mapper/mt-mt2_lv /data/mt1
[root@C8-196 ~]# df -Th
Filesystem            Type      Size  Used Avail Use% Mounted on
##上边的省略
/dev/mapper/mt-mt2_lv xfs       5.0G   68M  5.0G   2% /data/mt1
[root@C8-196 ~]# mount /dev/mapper/mt-mt3_lv /data/mt1
[root@C8-196 ~]# df -Th
Filesystem            Type      Size  Used Avail Use% Mounted on
##上边的省略
/dev/mapper/mt-mt3_lv ext4      2.9M   45K  2.6M   2% /data/mt1
  • 很显然,不可能同时挂载,
  • 挂载第二分区的时候第一个分区就掉了
  • 挂载第三个分区的时候第二个分区就掉了
  • 可是当我umount的时候奇异的事情发生了
[root@C8-196 ~]# umount /data/mt1
[root@C8-196 ~]# df -Th
Filesystem            Type      Size  Used Avail Use% Mounted on
##上边的省略
/dev/mapper/mt-mt2_lv xfs       5.0G   68M  5.0G   2% /data/mt1
  • 看没看到,umount以后并不是退回到未挂载状态,而是退回到上一个挂载点的状态

看一下分区情况

  • 真相了,同一个目录是可以挂载多个分区的
[root@C8-196 ~]# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    0  200G  0 disk 
├─sda1        8:1    0    1G  0 part /boot
└─sda2        8:2    0  199G  0 part 
  ├─cl-root 253:0    0   70G  0 lvm  /
  ├─cl-swap 253:1    0    2G  0 lvm  [SWAP]
  └─cl-home 253:2    0  127G  0 lvm  /home
sdb           8:16   0    5G  0 disk 
└─mt-mt1_lv 253:3    0    5G  0 lvm  /data/mt1
sdc           8:32   0    5G  0 disk 
├─mt-mt1_lv 253:3    0    5G  0 lvm  /data/mt1
├─mt-mt2_lv 253:4    0    5G  0 lvm  /data/mt1
└─mt-mt3_lv 253:5    0    4M  0 lvm  
sdd           8:48   0    5G  0 disk 
└─mt-mt2_lv 253:4    0    5G  0 lvm  /data/mt1
  • 我们再把mt-mt3挂载上/data/mt1
  • 很显然同一挂载点是可以同时挂载多个分区的
  • 很显然多个分区可以同时挂载到同一挂载点上

读写测试

  • 既然都挂在上了,我们往这个挂载点上写数据就应该同时写道所有分区上
  • 我们现在往/data/mt1这个文件夹里写入数据
[root@C8-196 ~]# touch /data/mt1/mt1..10.log 
[root@C8-196 ~]# ll /data/mt1
total 12
drwx------ 2 root root 12288 Mar 10 21:02 lost+found
-rw-r--r-- 1 root root     0 Mar 10 21:20 mt10.log
-rw-r--r-- 1 root root     0 Mar 10 21:20 mt1.log
-rw-r--r-- 1 root root     0 Mar 10 21:20 mt2.log
-rw-r--r-- 1 root root     0 Mar 10 21:20 mt3.log
-rw-r--r-- 1 root root     0 Mar 10 21:20 mt4.log
-rw-r--r-- 1 root root     0 Mar 10 21:20 mt5.log
-rw-r--r-- 1 root root     0 Mar 10 21:20 mt6.log
-rw-r--r-- 1 root root     0 Mar 10 21:20 mt7.log
-rw-r--r-- 1 root root     0 Mar 10 21:20 mt8.log
-rw-r--r-- 1 root root     0 Mar 10 21:20 mt9.log
[root@C8-196 ~]# ll /data/mt2
total 0
[root@C8-196 ~]# ll /data/mt3
total 0
  • 同时可见/data/mt2和、/data/mt3都是空的
  • 此时三个分区都是挂载到/data/mt1上面的,也就是说三个盘里都应该有同样的内容
  • 我们把两个分区拆出去分别挂载
[root@C8-196 ~]# mount /dev/mapper/mt-mt2_lv /data/mt2
[root@C8-196 ~]# mount /dev/mapper/mt-mt3_lv /data/mt3
  • 奇怪的事情又发生了,这时候只有mt1和mt3中有数据,mt2中却没有数据
  • 这时候的挂载情况是这个样子滴
  • 这时候的分区情况是这样的
  • 既然出现了灵异事件,我们就都摘掉,重新挂载
  • 这回世界清净了
  • 重新分别挂载到对应的目录看数据
[root@C8-196 ~]# mount /dev/mapper/mt-mt1_lv /data/mt1
[root@C8-196 ~]# mount /dev/mapper/mt-mt2_lv /data/mt2
[root@C8-196 ~]# mount /dev/mapper/mt-mt3_lv /data/mt3

  • 结果只有mt3上有数据
  • 也就说明了数据都写在了/dev/mapper/mt-mt3_lv这一个分区上
  • 也就是说/dev/mapper/mt-mt3_lv这个最后挂载的盘才真正写入了数据
  • 也就是说不能实现一个挂载点同时挂载多个分区

测试2: 同一分区挂载到多个挂载点(目录)

  • 初始化所有挂载点和分区
  • 将mt-mt1_lv分别挂载到/data/mt1 /data/mt2 /data/mt3
  • 我们先后将同一个分区在不umount的情况下依次挂载了3个目录,
  • 但df显示的却是同一个目录,没有变化
  • 可是在lsblk的时候却看到分区已经挂载到mt3
    • 我们知道数据真实存在于分区上,那我们来看看目前目录中是否有内容
  • 当前看所有的目录都是空的
  • 那我们来写入数据看看
  1. 在目录mt1中写入123
    touch /data/mt1/mt1..3.log
  2. 在目录mt2中写入456
    touch /data/mt3/mt4..6.log
  • 接下来见证奇迹的时刻到了,我们看mt2

  • 虽然df和lsblk都没显示/data/mt2的挂载情况,
  • 但我们看到了,原来是空的目录mt2中写入了我们分别写道mt1和mt3中的内容
  • 那我们可以肯定,现在mt1和mt3中有着和mt2同样的数据

  • 我的眼睛就是尺,不用看回放了!!!

总结

  1. 同一个目录不能同时挂载多个分区
    就算lsblk上看起来是挂载上了,但只有最后挂载的那一个才会生效

  2. 多个分区不能同时挂载同一个目录上
    就算能挂上也不会写入同样的数据

  3. 同一个分区可以同时挂载到多个目录上
    就算df和lsblk看起了不同,但只要是没有umount过都算挂在上了

  4. 多个目录可以同时挂载同一个分区
    写入任何一个目录的数据其实都写到了同一个分区上面

    这就是同一个分区同一份数据 !

做一个比喻,

  • 分区或者磁盘或者nfs啥的可以想象成房子
  • 目录即挂载点可以相像成门
  1. 一个房间可以有多个门,进出哪个门都到这一个房子。
  2. 一个门只能装在一个房子上,不能装在两个房子上,通过一个门只能进入一个房间而不能通过一个门进入多个房间。

以上是关于Linux下多挂载点mount实验的主要内容,如果未能解决你的问题,请参考以下文章

Oracle数据库中Linux下多路径使用及大容量硬盘挂载

Linux挂载点是否可以是软链接测试实验

Linux挂载点是否可以是软链接测试实验

Linux挂载点是否可以是软链接测试实验

Linux挂载点是否可以是软链接测试实验

Linux系统安装与使用基础之第四篇掌握Linux下存储设备的挂载与卸载的方法