mount --bind使用方法

我们可以通过mount --bind命令来将两个目录连接起来,mount --bind命令是将前一个目录挂载到后一个目录上,所有对后一个目录的访问其实都是对前一个目录的访问,如下所示:

## test1 test2为两个不同的目录
linux-UMLhEm:/home/test/linux # ls test1
11.test  1.test
linux-UMLhEm:/home/test/linux # ls test2
22.test  2.test
linux-UMLhEm:/home/test/linux # ls -lid test1
drwx------ 2 root root 4096 Feb 13 09:50 test1
linux-UMLhEm:/home/test/linux # ls -lid test2
drwx------ 2 root root 4096 Feb 13 09:51 test2

## 执行mount --bind 将test1挂载到test2上,inode号都变为test1的inode
linux-UMLhEm:/home/test/linux # mount --bind test1 test2
linux-UMLhEm:/home/test/linux # ls -lid test1
drwx------ 2 root root 4096 Feb 13 09:50 test1
linux-UMLhEm:/home/test/linux # ls -lid test2
drwx------ 2 root root 4096 Feb 13 09:50 test2
linux-UMLhEm:/home/test/linux # ls test2
11.test  1.test

## 对test2的访问或修改实际上是改动test1目录
linux-UMLhEm:/home/test/linux # cd test2
linux-UMLhEm:/home/test/linux/test2 # touch 3.test
linux-UMLhEm:/home/test/linux/test2 # ls
11.test  1.test  3.test
linux-UMLhEm:/home/test/linux/test2 # cd ..
linux-UMLhEm:/home/test/linux # ls test1
11.test  1.test  3.test

## 解挂载后,test1目录保持修改,test2保持不变
linux-UMLhEm:/home/test/linux # umount test2
linux-UMLhEm:/home/test/linux # ls test1
11.test  1.test  3.test
linux-UMLhEm:/home/test/linux # ls test2
22.test  2.test

## 将test2挂载到test1上
linux-UMLhEm:/home/test/linux # ls -lid test2
drwx------ 2 root root 4096 Feb 13 09:51 test2
linux-UMLhEm:/home/test/linux # mount --bind test2 test1
linux-UMLhEm:/home/test/linux # ls -lid test1
drwx------ 2 root root 4096 Feb 13 09:51 test1
linux-UMLhEm:/home/test/linux # ls -lid test2
drwx------ 2 root root 4096 Feb 13 09:51 test2
linux-UMLhEm:/home/test/linux # ls test1
22.test  2.test

mount --bind test1 test2为例,当mount --bind命令执行后,Linux将会把被挂载目录的目录项(也就是该目录文件的block,记录了下级目录的信息)屏蔽,即test2的下级路径被隐藏起来了(注意,只是隐藏不是删除,数据都没有改变,只是访问不到了)。同时,内核将挂载目录(test1)的目录项记录在内存里的一个s_root对象里,在mount命令执行时,VFS会创建一个vfsmount对象,这个对象里包含了整个文件系统所有的mount信息,其中也会包括本次mount中的信息,这个对象是一个HASH值对应表(HASH值通过对路径字符串的计算得来),表里就有 /test1 到 /test2 两个目录的HASH值对应关系。

命令执行完后,当访问 /test2下的文件时,系统会告知 /test2 的目录项被屏蔽掉了,自动转到内存里找VFS,通过vfsmount了解到 /test2 和 /test1 的对应关系,从而读取到 /test1 的inode,这样在 /test2 下读到的全是 /test1 目录下的文件。

1.mount --bind连接的两个目录的inode号码并不一样,只是被挂载目录的block被屏蔽掉,inode被重定向到挂载目录的inode(被挂载目录的inode和block依然没变)。

2.两个目录的对应关系存在于内存里,一旦重启挂载关系就不存在了。

在固件开发过程中常常遇到这样的情况:为测试某个新功能,必需修改某个系统文件。而这个文件在只读文件系统上(总不能为一个小小的测试就重刷固件吧),或者是虽然文件可写,但是自己对这个改动没有把握,不愿意直接修改。这时候mount --bind就是你的好帮手。 
假设我们要改的文件是/etc/hosts,可按下面的步骤操作: 
1. 把新的hosts文件放在/tmp下。当然也可放在硬盘或U盘上。 
2. mount --bind /tmp/hosts /etc/hosts       此时的/etc目录是可写的,所做修改不会应用到原来的/etc目录,可以放心测试。测试完成了执行 umount /etc/hosts 断开绑定。

原文地址:https://www.cnblogs.com/charon2/p/10355572.html

时间: 2024-10-13 01:09:28

mount --bind使用方法的相关文章

mount --bind 的妙用

  在固件开发过程中常常遇到这样的情况:为测试某个新功能,必需修改某个系统文件.而这个文件在只读文件系统上(总不能为一个小小的测试就重刷固件吧),或者是虽然文件可写,但是自己对这个改动没有把握,不愿意直接修改.这时候mount --bind就是你的好帮手. 假设我们要改的文件是/etc/hosts,可按下面的步骤操作: 1. 把新的hosts文件放在/tmp下.当然也可放在硬盘或U盘上. 2. mount --bind /tmp/hosts /etc/hosts 测试完成了执行 umount /

mount --bind 重启后失效的解决办法

vsftp不支持软链接,可以用mount来支持不同的目录结构 mount --bind /home/www/web/ROOT/img/upload /ftp/private/upload 重启后失效. 解决办法: 编辑fstab,重启后自动mount vi /etc/fstab /home/www/web/ROOT/img/upload /ftp/private/upload none bind 0 0

live,on,delegate,bind使用方法知识点

最近对于事件绑定处理用的比较多,进行总结一下 bind 单个元素的事件绑定 扫描文档找出所有的$(‘a')元素,并把alert函数绑定到每个元素的click事件上. $('a').bind('click',function(){alert('That tickles!');}) 备注: bind并不能对未来添加的元素绑定事件;原理和直接$("a").click是同一机制 live 作为事件冒泡的流程,默认将事件绑定到$(document)元素上,采用事件代理的模式 任何时候只要有事件冒

js apply/call/caller/callee/bind使用方法与区别分析

一.call 方法 调用一个对象的一个方法,以另一个对象替换当前对象(其实就是更改对象的内部指针,即改变对象的this指向的内容). Js代码 call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 参数 thisObj 可选项.将被用作当前对象的对象. arg1, arg2, , argN 可选项.将被传递方法参数序列. 说明 call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对

js经验点滴js apply/call/caller/callee/bind使用方法与区别分析

一.call 方法 调用一个对象的一个方法,以另一个对象替换当前对象(其实就是更改对象的内部指针,即改变对象的this指向的内容). Js代码 call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 参数 thisObj 可选项.将被用作当前对象的对象. arg1, arg2, , argN 可选项.将被传递方法参数序列. 说明 call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对

魅蓝note2在ubuntu14.04下mtp模式无法自动mount的解决方法

是因为新机型没在列表里的原因. 处理方法如下: As far as I know, MTP works fine in Trusty. You can try this: Uncomment #user_allow_other in /etc/fuse.conf. Run lsusb and see your device's vendor ID. It will be something like 1d6b:0002. (执行lsusb命令,查找机器id,我的机器id是2a45:0c02) A

Data Volume 之 bind mount - 每天5分钟玩转 Docker 容器技术(39)

storage driver 和 data volume 是容器存放数据的两种方式,上一节我们学习了 storage driver,本节开始讨论 Data Volume. Data Volume 本质上是 Docker Host 文件系统中的目录或文件,能够直接被 mount 到容器的文件系统中.Data Volume 有以下特点: Data Volume 是目录或文件,而非没有格式化的磁盘(块设备). 容器可以读写 volume 中的数据. volume 数据可以被永久的保存,即使使用它的容器

JS中的call、apply、bind方法

JS中的call.apply.bind方法 一.call()和apply()方法 1.方法定义call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象. 如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj.

Bind Mounts and File System Mount Order

     When you use the bind option of the mount command, you must be sure that the file systems are mounted in the correct order. In the following example, the /var/log directory must be mounted before executing the bind mount on the /tmp directory: #