1. Linux文件系统(File System)
为了彻底搞懂Docker的数据管理,我们不如多费点时间追本溯源。
先来看看Linux的文件系统,再重点理解Linux操作系统中的挂载的概念。
因为Docker数据卷的使用和Linux中对目录的挂载非常类似,所以搞懂了Linux文件系统中的挂载,对于我们深入理解Docker中的数据卷是非常有帮助的。
Windows文件系统
为了理解Linux的文件系统,我们可以对比一下我们最常用的Windows操作系统的文件系统。
在Windows操作系统中,点击我的电脑图标后,我们可以看到列出来的设备和驱动器
,也就是我们常用的C盘、D盘、E盘。
这些盘里面就是一些目录或文件。
上图可以看到C盘,代表PC中插入的一块硬盘;如果再插入一个U盘,列表上会看到一个新的盘(比如D盘)。
Linux文件系统
但是在Linux系统中,没有C盘D盘的说法,文件是以根目录(/)开始的树形结构
组织起来的。
根目录可以被认为文件系统的根,其他的分支是它的子目录,子目录下还可以嵌套子目录或文件。
相比Windows中的C盘,对应的是一块硬盘,但是在Linux中,etc、bin分别是一块硬盘吗?显然不一定是。
Linux系统使用的目录树形架构,但是我们的文件数据其实是放在磁盘分区槽中的。
那么目录树结构和磁盘内的数据是如何结合的呢?这就需要说到另一个话题——挂载(mount)。
Linux的文件挂载(mount)
挂载,顾名思义,就是把一个东西A挂到另一个东西B上去。
这里的A就是磁盘分区槽,我们的数据(010111二进制)真正存储的地方。
这里的B就是上图中的某个目录,也不一定只是在根目录下,设置就是根目录,可能子目录的子目录等,总之是目录或者是文件。
所以,所谓的挂载,就是把磁盘分区槽的数据放置在该目录下,这样的好处就是,进入这个目录,就可以直接读取这个分区槽的数据了!
上面的图片中,把分区1挂载到了根目录,把分区2挂载到了根目录下的home目录。
多说无益,我们找一套Linux环境一探究竟。
# df -h
/dev/sda2 95G 36G 60G 38% /
/dev/sda1 2.8G 271M 2.6G 10% /boot
138.48.48.150:/mnt/test/backup 4.9T 3.3T 1.4T 71% /data/backup
上面的结果可以看到:
- 根目录/挂载的是**/dev/sda2**分区
- /boot目录挂载的是**/dev/sda1**分区
- 至于**/data/backup**这个目录更有意思,它挂载的是另一台server的其他分区
也就是根目录/和/boot挂载的是本地分区,/data/backup挂载的是外部服务器的分区(相当于网盘)
标准的来说,/dev/sda2应该叫文件系统,/boot应该叫挂载点。我们使用df
命令查看文件系统的挂载情况。
我们的磁盘设备或者磁盘分区,都可以挂载到挂载点上。
挂载其实就是物理设备到逻辑路径的转换机制,最终的结果就是访问这个目录,就是访问这个存储设备!
Linux挂载测试
前一章讲的都是原理和结果,这一章我们通过实际运行命令,来0距离体验一下挂载mount的魅力。
查看已有分区
我们先用ll
命令看看我们系统中的磁盘分区:
# ll /dev/sda*
brw-rw----. 1 root disk 8, 0 Feb 15 19:45 /dev/sda
brw-rw----. 1 root disk 8, 1 Feb 15 19:45 /dev/sda1
brw-rw----. 1 root disk 8, 2 Feb 15 19:45 /dev/sda2
brw-rw----. 1 root disk 8, 3 Feb 15 19:45 /dev/sda3
可以看到,开头的字母b,它不是d表示它不是目录,也不是f表示它不是普通文件,而是b表示它block块设备文件!
# cd /dev/sda1
-bash: cd: /dev/sda1: Not a directory
# vi /dev/sda1
"/dev/sda1" is not a file
Linux中万物皆文件,所以存储块设备文件,也算是一种特别的文件。
其实用fdisk
命令看更精准
如下所示,我们设置可以看到每个分区开始和结束的位置,块大小
# fdisk -l
Disk /dev/sda: 107.4 GB, 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 label type: dos
Disk identifier: 0x000cc7a8
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 5861375 2929664 83 Linux
/dev/sda2 5861376 205090815 99614720 83 Linux
/dev/sda3 205090816 209287167 2098176 82 Linux swap / Solaris
挂载情况
结合用df
命令查看分区挂载情况:
# df -h
/dev/sda2 95G 36G 60G 38% /
/dev/sda1 2.8G 271M 2.6G 10% /boot
138.48.48.150:/mnt/test/backup 4.9T 3.3T 1.4T 71% /data/backup
因为/boot挂载了/dev/sda1这个分区,所以我们可以用cd
命令进入到这个分区,查看及操作分区存储的数据文件:
# cd /boot/
# ll
total 174656
drwx------. 5 root root 132 Feb 12 2019 grub2
-rw-r--r--. 1 root root 611327 Apr 22 2018 initrd-plymouth.img
# touch Hello_mount
# ll
total 174656
drwx------. 5 root root 132 Feb 12 2019 grub2
-rw-r--r--. 1 root root 611327 Apr 22 2018 initrd-plymouth.img
-rw-r--r--. 1 root root 0 Feb 16 08:46 Hello_mount
umount卸载挂载
用umount命令卸载挂载
# umount -v /boot
umount: /boot (/dev/sda1) unmounted
再查看一下系统的挂载情况,发现已经找不到之前的/dev/sda1挂载到/boot目录了
# df -h
/dev/sda2 95G 36G 60G 38% /
138.48.48.150:/mnt/test/backup 4.9T 3.3T 1.4T 71% /data/backup
再进入之前的挂载目录/boot,发现里面啥也没有
# ll /boot/
total 0
mount挂载
然后我们再用mount命令挂载回来
# mount /dev/sda1 /tmp/test
我们再看一下挂载情况,我们可以看到这个分区已经成功挂到了/tmp/test目录
# df -h
/dev/sda2 95G 36G 60G 38% /
/dev/sda1 2.8G 271M 2.6G 10% /tmp/test
再用ls命令查看这个目录的文件,发现和之前的/boot内容一模一样!
# ll
total 174656
drwx------. 5 root root 132 Feb 12 2019 grub2
-rw-r--r--. 1 root root 611327 Apr 22 2018 initrd-plymouth.img
-rw-r--r--. 1 root root 0 Feb 16 08:46 Hello_mount
这里挂载只是为了测试,所以最好还是把/dev/sda1挂载回/boot目录。另外使用手动挂载,系统重启后会失效,如果要一直生效,需要修改/etc/fstab
总结
通过挂载,我们可以将任意的存储设备(磁盘设备或分区)挂载到Linux的树形文件体系下的任意目录中,然后我们可以进入该目录,查看操作该设备或分区中存储的文件!