说明:
本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
QQ 群 号:513683159 【相互学习】
内容来源:
CSDN-Linux AUFS 文件系统、Linux文件系统的的挂载与卸载(mount、umount)
Linux文件系统之aufs
上一篇:文件系统篇——篇一:文件系统与虚拟文件系统概念简介
下一篇:文件系统篇——篇三:文件系统结构体与函数详解注释
目录:
一、aufs简介:
aufs = Advanced Multi-layered unification filesytem = 高级多层统一文件系统.
1.主要功能:
把多个目录结合成一个目录,对外使用。
2.把多个目录 mount 成一个,读写操作步骤如下:(具体验证可参照:【三、实际操作】)
1.默认情况下,最上层的目录为读写层,只能有一个,下面可以有一个或者多个只读层读文件
2.读文件,从最上面一个开始往下逐层去找,打开第一个找到的文件,读取其中的内容
3.写文件,如果在最上层找到了该文件,直接打开,否则,从上往下开始查找,找到文件后,把文件复制到最上层,然后再打开这个 copy
4.删除文件:在最上层创建一个 whiteout文件,.wh.<origin_file_name>,就是在原来的文件名字前面加上 .wh.
二、操作环境:
内容来源:CSDN-Linux查看系统与内核信息(lsb_release、uname、file)
lsb_release -a命令:查询当前 Linux 系统的发行版本
uname命令:查看系统与内核的相关信息。
file 命令:可以通过来判断系统文件(主要是系统命令)的位数,进而推断系统的位数。
三、实际操作:
内容来源:博客园-Linux模块的加载和卸载、xxxx
①查看是否支持aufs:/proc/filesystems
输入指令:cat /proc/filesystems | grep aufs
,是否有输出nodev aufs
,若有则表示支持,无则表示不支持。
/proc/filesystems
里存放着本台机器linux系统支持的文件挂载系统.
②查看是否已加载的模块:lsmod
输入指令:lsmod | grep aufs
,是否有输出信息,若有则表示已加载aufs
,若无则表示未加载。
lsmod
命令就是通过查看/proc/modules
的内容来显示模块信息。
③若未加载则加载模块:insmod 模块路径
输入指令:sudo insmod /lib/modules/4.15.0-142-generic/kernel/fs/aufs/aufs.ko
,再利用②查看是否加载成功。
④显示模块信息:modinfo 模块名
输入指令:modinfo aufs
,可查询aufs模块的详细信息,文件名包含路径:可看到里面有好多文件系统。
⑤创建aufs文件系统的测试环境:
xsndz@Linux:~$ mkdir aufs
xsndz@Linux:~$ mkdir aufs/mnt
xsndz@Linux:~$ mkdir aufs/container-layer
xsndz@Linux:~$ echo "I am container layer" > aufs/container-layer/container-layer.txt
xsndz@Linux:~$ mkdir aufs/{image-layer1,image-layer2,image-layer3}
xsndz@Linux:~$ echo "I am image layer 1" > aufs/image-layer1/image-layer1.txt
xsndz@Linux:~$ echo "I am image layer 2" > aufs/image-layer2/image-layer2.txt
xsndz@Linux:~$ echo "I am image layer 3" > aufs/image-layer3/image-layer3.txt
xsndz@Linux:~$ tree ./aufs/
./aufs/
├── container-layer
│ └── container-layer.txt
├── image-layer1
│ └── image-layer1.txt
├── image-layer2
│ └── image-layer2.txt
├── image-layer3
│ └── image-layer3.txt
└── mnt
5 directories, 4 files
1.创建一个名称为 aufs 的文件夹用作实验目录:
mkdir aufs
2.在 aufs 中创建名称为 mnt 的目录作为文件系统的 挂载点:
mkdir aufs/mnt
3.在 aufs 目录下创建 container-layer 文件夹(模拟容器的读写层):
mkdir aufs/container-layer
4.在 container-layer文件夹中创建文件container-layer.txt,文件的内容初始化为 “I am container layer”:
echo "I am container layer" > aufs/container-layer/container-layer.txt
5.在 aufs 目录下创建三个文件夹 image-layer1、image-layer2、image-layer3(用它们来 模拟容器的镜像层):
mkdir aufs/{image-layer1,image-layer2,image-layer3}
6.在这三个文件夹中分别创建文件,并初始化为对应的内容:
echo "I am image layer 1" > aufs/image-layer1/image-layer1.txt
echo "I am image layer 2" > aufs/image-layer2/image-layer2.txt
echo "I am image layer 3" > aufs/image-layer3/image-layer3.txt
7.查看目录和文件结构:
tree ./aufs/
⑥挂载aufs文件系统:mount
详细步骤:
xsndz@Linux:~$ cd ./aufs
xsndz@Linux:~/aufs$ sudo mount -t aufs -o dirs=./container-layer:./image-layer1:./image-layer2:./image-layer3 none ./mnt
[sudo] password for xsndz:
xsndz@Linux:~/aufs$ tree mnt/
mnt/
├── container-layer.txt
├── image-layer1.txt
├── image-layer2.txt
└── image-layer3.txt
0 directories, 4 files
xsndz@Linux:~/aufs$ cat /sys/fs/aufs/si_dda20820420b44c8/*
/home/xsndz/aufs/container-layer=rw
/home/xsndz/aufs/image-layer1=ro
/home/xsndz/aufs/image-layer2=ro
/home/xsndz/aufs/image-layer3=ro
64
65
66
67
/home/xsndz/aufs/container-layer/.aufs.xino
1.mount命令创建aufs文件系统,并将:container-layer、image-layer1、image-layer2、image-layer3四个文件夹挂载到mnt目录下
cd aufs
sudo mount -t aufs -o dirs=./container-layer:./image-layer1:./image-layer2:./image-layer3 none ./mnt
2.查看挂载完成的mnt目录:
tree mnt/
3.查看文件权限:
cat /sys/fs/aufs/si_dda20820420b44c8/*
在mount命令中并未指定文件夹权限,其默认行为:第一个目录为读写,后续目录为只读,其中,si_dda20820420b44c8
目录为系统为mnt
挂载点创建的
挂载命令:mount
功能:将一个设备(通常是存储设备,可以挂载光盘、硬盘、磁带、光盘镜像文件等)挂接到一个已存在的目录上(这个目录可以不为空,但挂载后这个目录下以前的内容将不可用
1️⃣注意:
①单一文件系统不应该被重复挂载在不同的挂载点(目录)中
②单一目录不应该重复挂载多个文件系统
③重点:要作为挂载点的目录,理论上应该都是空目录才行
④重点:系统自动挂载的信息记录在/etc/fstab文件中,只有记录到这个文件中的磁盘在系统启动时才会自动挂载。不在这个文件中记录的磁盘挂载了关机后就自动卸载,开机后又需要自己手动挂载。
2️⃣为什么③要求是空目录?
若挂载点不为空则挂载文件系统后,挂载点目录原先所有文件/目录都会被隐藏。(卸载后又会重新出现)
3️⃣参数选项:
①-a
:依照配置文件/etc/fstab的数据将文件内未挂载的磁盘都挂载上来
②-l
:单纯的输入mount会显示目前挂载的信息,加上-l之后可增列Label名称
③-t
:可以加上文件系统的种类名来指定预挂载的类型。
mount [-t 文件系统] LABEL=’ ’ 挂载点 ===>使用磁盘的Label name来挂载磁盘
mount [-t 文件系统] UUID=’ ’ 挂载点 ===>使用磁盘的UUID来挂载磁盘
mount [-t 文件系统] 设备文件名 挂载点 ===>使用磁盘的设备文件名来挂载磁盘
④-n
:在默认的情况下,系统会将实际挂载的情况即时写入/etc/mtab中,以利于其他程序的运行。但是在某些情况下(例如单人维护模式),为了避免问题会刻意不写入,此时就需要加上-n选项
⑤-o
:后面可以接一些挂载时额外加上的参数。比如:账号、密码、读写权限等,参数查看:Linux文件系统的的挂载与卸载(mount、umount)
loop:用来把一个文件当成硬盘分区挂接上系统
ro:采用只读方式挂接设备
rw:采用读写方式挂接设备
⑦验证写时复制:
详细步骤:
xsndz@Linux:~/aufs$ ls container-layer/
container-layer.txt
xsndz@Linux:~/aufs$ echo "I changed mnt/image-layer2.txt" >> mnt/image-layer2.txt
xsndz@Linux:~/aufs$ cat ./mnt/image-layer2.txt
I am image layer 2
I changed mnt/image-layer2.txt
xsndz@Linux:~/aufs$ cat ./image-layer2/image-layer2.txt
I am image layer 2
xsndz@Linux:~/aufs$ ls container-layer/
container-layer.txt image-layer2.txt
xsndz@Linux:~/aufs$ cat ./container-layer/image-layer2.txt
I am image layer 2
I changed mnt/image-layer2.txt
xsndz@Linux:~/aufs$ tree
.
├── container-layer
│ ├── container-layer.txt
│ └── image-layer2.txt
├── image-layer1
│ └── image-layer1.txt
├── image-layer2
│ └── image-layer2.txt
├── image-layer3
│ └── image-layer3.txt
└── mnt
├── container-layer.txt
├── image-layer1.txt
├── image-layer2.txt
└── image-layer3.txt
5 directories, 9 files
1.查看container-layer
目录下文件:
ls container-layer/
,发现里面有之前创建的一个文件。
2.向mnt/image-layer2.txt
文件写入数据:
echo "I changed mnt/image-layer2.txt" >> mnt/image-layer2.txt
3.查看./mnt/image-layer2.txt
文件内容:
cat ./mnt/image-layer2.txt
,已发生改变。
4.查看./image-layer2/image-layer2.txt
文件内容:
cat ./image-layer2/image-layer2.txt
,没有发生变化
5.查看container-layer
目录下文件:
ls container-layer/
,发现里面多了文件image-layer2.txt
。
6.查看./container-layer/image-layer2.txt
文件内容:
与mnt/image-layer2.txt
中文件内容一致。
7.查看文件树结构:
tree
:整体上去查看文件树的结构。
8.总结:
原来,当尝试向 mnt/image-layer2.txt
中写入文件时,系统首先在 mnt
目录下查找名为image-layer2.txt
的文件,将其拷贝到read-write
层的 container-layer
目录中,接着对container-layer
目录中的 image-layer2.txt
的文件进行写操作。
但并不会影响到原先目录下的文件内容:./image-layer2/image-layer2.txt
。
这个过程也就是 aufs 的实际工作原理。
⑧卸载aufs文件系统:umount
xsndz@Linux:~/aufs$ sudo umount ./mnt
[sudo] password for xsndz:
xsndz@Linux:~/aufs$ tree
.
├── container-layer
│ ├── container-layer.txt
│ └── image-layer2.txt
├── image-layer1
│ └── image-layer1.txt
├── image-layer2
│ └── image-layer2.txt
├── image-layer3
│ └── image-layer3.txt
└── mnt
5 directories, 5 files
1.卸载挂载点上的aufs文件系统:
sudo umount ./mnt
2.查看文件树结构:
tree
:整体上去查看文件树的结构。
卸载命令:umount
1️⃣注意:
①文件系统卸载的方式,最后可以是设备文件名也可以是挂载点(建议)。但是如果你的挂载点被另一个挂载点所挂载,则必须使用挂载点卸载
②如果你当前的路径在你的挂载点内,则你需要退出到当前挂载点路径外才可以卸载
2️⃣参数:
①-f
:强制卸载,可用在类似网络文件系统(NFS)无法读取的情况下
②-l
:立刻卸载文件系统,比-f还强
③-n
:不更新/etc/mtab情况下卸载
⑨卸载模块:rmmod
xsndz@Linux:~/aufs$ sudo rmmod aufs
[sudo] password for xsndz:
xsndz@Linux:~/aufs$ lsmod |grep aufs
1.卸载模块aufs
sudo rmmod aufs
2.查看模块aufs是否卸载成功
lsmod |grep aufs