Linux AuFS 示例:另一个联合文件系统教程
AuFS 代表另一个联合文件系统。
AuFS 最初是作为 UnionFS 联合文件系统的实现。
联合文件系统采用现有文件系统并将其透明地覆盖在较新的文件系统上。它允许不同文件系统的文件和目录在一个屋檐下共存。AuFS 可以合并多个目录并提供它的单一合并视图。
AuFS 用于许多开源项目,如 Slax、Knoppix 和许多其他 live CD 和 live USB 发行版。
在基于 Debian 的系统上,例如在 Ubuntu 上,执行以下操作来安装 aufs。
# apt-get install aufs-tools
示例 1 – 了解 AuFS 的工作原理
这个例子展示了如何挂载同一个文件系统的两个目录。
# mkdir /tmp/dir1
# mkdir /tmp/aufs-root
# mount -t aufs -o br=/tmp/dir1:/home/lakshmanan none /tmp/aufs-root/
前两个命令创建了 2 个新目录。mount.aufs 是将文件系统挂载为联合挂载的命令。
mount 命令指定它将在“/tmp/aufs-root”下联合挂载“/tmp/dir1”和/home/lakshmanan。目录“/tmp/aufs-root”将包含“/tmp/dir1”和“/home/lakshmanan”的内容。
上面的mount 命令示例中使用了以下选项:
- -o - 指定要传递给文件系统的选项
- br – 指定一个分支,其中每个分支用冒号 (:) 分隔。分支只不过是系统上的一个目录。
- none – 指定我们没有与之关联的任何设备,因为我们要挂载两个目录
从下面的 ls -l 命令输出中可以看出,aufs 正在合并 2 个单独目录的内容,并带来统一的视图。
# ls -l /tmp/dir1/
-rw-r--r-- 1 root root 23 Mar 25 14:21 file_in_tmp_dir1
# ls -l /home/lakshmanan
-rw-r--r-- 1 root root 26 Mar 25 14:20 file_in_home_dir
# ls -l /tmp/aufs-root/
-rw-r--r-- 1 root root 26 Mar 25 14:20 file_in_home_dir
-rw-r--r-- 1 root root 23 Mar 25 14:21 file_in_tmp_dir1
默认情况下,如果没有指定权限,第一个分支将被挂载为可写,其余的分支将被挂载为只读。
因此,当您在 '/tmp/aufs-root/' 中创建任何文件时,实际上它将在“/tmp/dir1”下创建,因为它是唯一可写的分支。
示例 2 – 主目录的统一视图
有时,系统管理员最终拥有多个磁盘分区,其中包含多个用户的主目录。我们将看到一个示例,说明如何将其作为统一视图并简化管理流程。
在这个例子中:
- /home -> 是 /dev/sda2 的挂载点,拥有“lakshmanan”和“sysadmin”用户
- /home1 -> 是具有“test”用户的 /dev/sdb2 的挂载点。
# mount -t aufs -o br=/home=rw:/home1=rw -o udba=reval none /common/
# ls -l /common/
drwxr-xr-x 39 lakshmanan lakshmanan 4096 Mar 25 15:52 lakshmanan
drwxr-xr-x 26 sysadmin sysadmin 4096 Mar 25 15:51 sysadmin
drwxr-xr-x 2 root root 4096 Mar 25 16:36 test
上面的 mount 命令有一个额外的选项叫做“udba”,它指的是“用户的直接分支访问”。如果用户直接访问分支并创建/更新文件而不通过 AuFS,此选项说明要做什么。
以下是 udba 的可能值:
- udba=none – 使用此选项,AuFS 会更快,但如果用户在未通过 AuFS 的情况下创建任何文件/目录,则可能会显示不正确的数据。
- udba=reval – 使用此选项,AuFS 将重新查找分支并更新它。因此,对分支内任何目录所做的任何更改都将反映在“/common”中。
- udba=notify – 使用此选项,AuFS 将为分支中的所有目录注册inotify。这会影响 AuFS 的性能。
# touch /home/lakshmanan/TGS
# ls -l /common/lakshmanan/
.
.
-rw-r--r-- 1 root root 0 Mar 25 17:17 TGS
touch 命令在“lakshmanan”的主目录中创建了一个名为“TGS”的文件,而无需通过 AuFS。由于我们使用“udba=retval”挂载,所以当我们执行 ls 时,AuFS 会重新查找并显示创建的新文件。
另请注意,在前面的 mount 命令中,我们将每个分支的权限指定为读写。所以当在/common/test/下创建一个文件时,它会在物理上创建在“/home1/test/”,也就是实际的物理位置。同样适用于其他目录。
# touch /common/test/Testing
# ls -l /home1/test/
-rw-r--r-- 1 root root 0 Mar 25 18:26 Testing
示例 3 – 以只读权限挂载分支
您还可以通过为每个分支设置权限来安装。
# mount -t aufs -o br=/tmp/dir1=rw:/home/lakshmanan=ro -o udba=reval none /tmp/aufs-root/
上述命令将挂载 /tmp/aufs-root,将“/tmp/dir1”设为可写,将“/home/lakshmanan”设为只读。您在 /tmp/aufs-root 中所做的任何更改都将仅保存在“/tmp/dir1”下,因为这是唯一可写的目录。
以下命令序列可用于验证上述内容。
# cat > /home/lakshmanan/1.txt
This is a new file
# cat /tmp/aufs-root/1.txt
This is a new file
# cat >> /tmp/aufs-root/1.txt
This is updated on AuFS space
# cat /home/lakshmanan/1.txt
This is a new file
# cat /tmp/dir1/1.txt
This is a new file
This is updated on AuFS space
在上述命令序列中,我们执行了以下操作:
- 我们正在“/home/lakshmanan”下创建一个名为 1.txt 的文件。
- 这个文件反映在联合挂载目录中,因为我们上面解释的 udba=retval 选项
- 更新联合挂载目录中存在的文件
- 即使文件存在于 /home/lakshmanan 中,由于它是以只读方式安装的,AuFS 会获取文件的副本并将其放在“/tmp/dir1”中。
- 在该副本之上,它附加内容并保存文件
- 在 /home/lakshmanan/1.txt 中,没有反映更改
- 在“/tmp/dir1”下创建一个名为“1.txt”的新文件,其中包含更新的内容
示例 4 – 应用循环策略在 AuFS 下创建文件
当我们有两个以上的可写分支时,我们可以选择任何一个预定义的策略,这样创建的文件将根据选择的策略进行存储。
# mount -t aufs -o br=/tmp/dir1=rw:/home/lakshmanan=rw -o udba=reval -o create=rr none /tmp/aufs-root/
选项“create=rr”指定必须为此联合挂载应用轮询策略。在循环策略中,如果我们创建 4 个文件,则 2 个文件将在“/tmp/dir1”中,2 个文件将在“/home/lakshmanan”中。
# touch /tmp/aufs/first-round-robin
# touch /tmp/aufs/second-round-robin
# ls -l /tmp/dir1/first-round-robin
-rw-r--r-- 1 root root 0 Mar 25 21:53 /tmp/dir1/first-round-robin
# ls -l /home/lakshmanan/second-round-robin
-rw-r--r-- 1 root root 0 Mar 25 21:54 /home/lakshmanan/second-round-robin
- 点赞
- 收藏
- 关注作者
评论(0)