mount --bind和硬连接的区别

本文介绍了如何使用mount --bind 命令连接两个目录,并解释了它与硬链接的区别。通过此命令,可以实现在不同目录间的数据共享,尤其是在硬链接无法使用的场景下。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家知道,hard link无法连接目录,而symbolic link虽然可以连接目录,但在有些程序里对符号连接的支持并不好,这个时候我们可以通过mount --bind命令来将两个目录连接起来

如题

如上图,新建两个目录   /test1    /test2    ,可以发现两个目录的inode号不同

如题

将两个目录bind起来  ,会发现inode号全部变成 之前  /test1 的inode号了,所以

mount --bind命令是将前一个目录挂载到后一个目录上,所有对后一个目录的访问其实都是对前一个目录的访问


看起来,mount --bind命令和硬连接很像,都是连接到同一个inode上面,只不过hard link无法连接目录,而mount --bind命令弥补了这个缺陷,所以很多人将这个命令理解为针对目录的硬连接

但这种想法是错的!

因为这两者的系统执行原理是不一样的。

当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 目录下的文件

由上述过程可知,mount --bind 和硬连接的重要区别有:

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

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


具体关于mount  --bind命令的执行流程,数据结构请参考以下文章

点击打开链接

感谢瑞风轻拂大大的精彩分享!



ISPSRV (UOS) mount /dev/sr0 /mnt vim /etc/apt/sources.list [trusted=yes] file:///mnt fou main apt update nmtui hostname -f vim /etc/hosts apt install -y isc-dhcp-server bind9 vim /etc/default/isc-dhcp-server INERFACEv4="ens33" vim /etc/dhcp/dhcpd.conf subnet 81.6.63.0 netmask 255.255.255.0{ range 81.6.63.110 81.6.63.190; option domain-name-servers 81.6.63.100; option domain -name "chinaskills.cn"; option routers 81.6.63.254; } systemctl restart isc-dhcp-server.service systemctl status isc-dhcp-server.service cd /etc/bind/ ls cp -ap db.local db.root vim named.conf zone"."{ type master; file "/etc/bind/db.root"; }; zone "chinaskills.cn" { type slave; masters { 81.6.63.254; }; file "/etc/bind/db.chinaskills.cn"; }; ls vim named.conf.optins dnssec-validation no; dnssec-enable no; systemctl restart bind9 systemctl status bind9 chmod 777 -R /etc/bind ls vim db.root @ IN MS localhost * IN A 81.6.63.100 systemctl restart bind9 systemctl status bind9 vim /etc/default/isc-dhcp-server AppSrv(Centos) mount /dev/sr0 /mnt rm -rf /etc/yum.repos.d/* cat <<EOF > /etc/yum.repos.d/1.repo [1] name=1 baseurl=file:///mnt enabled=1 gpgcheck=0 EOF systemctl disable firewalld systemctl stop firewalld nmtui yum install -y vim bath-completion yum install -y dhcp bind vim /etc/dhcp/dhcp.conf cp -ap /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf y vim /etc/dhcp/dhcpd.conf v G I # default-lease-time 600; max-lease-time 7200; ddns-update-style none; subnet 192.168.0.0 netmask 255.255.255.0{ range 192.168.0.110 192.168.0.190; option domian-name-servers 192.168.100.100; option domain-name "chinaskills.cn"; interface ens33; option routers 192.168.0.254; } host insidecli{ hardware ethernet 00:0c:29:ce:e8:45; fixed-addrewss 192.168.0.190; } ip ad systemctl restart dhcpd nmtui systemctl status dhcpd systemctl restart dhcpd vim /etc/dhcp/dhcp.conf listen-on port 53 { any; }; allow-query { any; }; forward first; forwarders { 81.6.63.100; }; dnssec-enable on; dnssec-validation on; #zone vim /etc/named.rfc1912.zones viem in{ mathch-clients { 192.168.100.0/24;192.168.0.0/24;127.0.0.1/32;}; zone "chinaskills.cn"{ type master; file "in.chinaskills.cn"; }; }; viem out { match-client { any; }; zone "chinaskills.cn"{ type master; file "out.chinaskills.cn"; allow-transfer { 81.6.63.100; }; }; }; cd /var/named/ ll cp -ad named.localhost in.chinaskills.cn vim in.chinaskills.cn A 192.168.100.100 @ IN MAX 10 mail.chinaskills.cn www IN A 192.168.100.100 download IN a 192.168.100.100 mail IN A 192.168.100.100 ispweb IN A 81.6.63.100 cp -ad in.chinaskills.cn out.chinaskills.cn vim out.chinaskills.cn :%s/192.168.100.100/81.6.63.254 systemctl restart named systemctl status named vim /etc/name.rfc1912.zones systemctl restart named systemctl status named nslookup yum install bind-utils y nslookup www.chinaskills.cn download.chinaskillscn ispweb.chinaskills.cn yum install -y nfs-utils mkdir /webdata echo 192.168.100.200:/webdata /webdate nfs defaults 0 0 >> /etc/fstab mount -a ^c ll STORAGERV(Centos) mount /dev/sr0 /mnt rm -rf /etc/yum.repos.d/* cat <<EOF >etc/yum.repos.d/1.repo [1] name=1 baseurl=file:///mnt enabled=1 gpgcheck=0 EOF systemctl disable firewalld systemctl stop firewalld setemforce 0 nmtui yum install -y vim bath-completion lsblk echo "- - -" >> /sys/class/scsi_host/host echo "- - -" >> /sys/class/scsi_host/host0/scan echo "- - -" >> /sys/class/scsi_host/host1/scan echo "- - -" >> /sys/class/scsi_host/host2/scan yum install -y mdadm lvm2 mdadm -C /dev/md0 -1 5 -n 3 -x 1 /dev/sd[b-e] pvcreate /dev/md0 Vgcreate Vg01 /dev/md0 lvcreate -L 5G -n lv01 vg01 mkfs.ext4 -K /dev/vg01/lv01 mkdir /webdate echo /dev/vg01/lv01 /webdate ext4 0 0 >> /etc/fstab mount -a df -Th cd /webdate/ touth disk.txt cd yum install -y nfs-utils vim /etc/exports /webdata 192.168.100.100(rw,sync,no_root_squash,no_subtree_check) exportfs -av systemctl restart nfs-server ll cd yum install -y samba mkdir -p /data/{share,public} chmod o*rw /data/{share1,public} vim /etc/samba/sma.conf map to guest = bad user [share1] path= /data/share1 write list = zsuser valid users =zsuer,lsusr,wuusr [public] path = /date/public writeble = yes public = yes guest ok = yes systemctl restart smb systemctl status smb useradd -m zsuser useradd -m lsusr useradd -m wuusr pdbedit -a zsuser 1234 pdbedit -a lsusr 1234 pdbedit -a wuusr 1234 systemctl restart smb systemctl status smb cd /data/share1/ ll ROUTESRV(Centos) mount /dev/sr0 /mnt rm -rf /etc/yum.repos.d/* cat <<EOF > /etc/yum.repos.d/1.repo [1] name=1 baseurl=file:///mnt enabled=1 gpgcheck=0 EOF systemctl disable firewalld systemctl stop firewalld setenforce 0 nmtui yum install -y dhcp dhcrelay 192.168.100.100 echo net.ipv4.ip_forward=1 >> /etc/systcl.conf sysctl -p chcrelay 192.168.100.100 dhclient -r dhclient -v INSIDECLI(Centos) mount /dev/sr0 /mnt rm -rf /etc/yum.repos.d/* cat <<EOF > /etc/yum.repos.d/1.repo [1] name=1 baseurl=file:///mnt enabled=1 gpgcheck=0 EOF systemctl disable firewalld ststemctl stop firewalld setenforce 0 nmtui ip ad dhclient -r dhclient -v yum install -y sambd-client sabclient //192.168.100.200/share1 -U zsuser 1234 ls ^c touch 1 touch 2 ls ^c touch 1 touch 2 ls put 1 e^c sabclient //192.168.100.200/share1 -U zsuser 1234 ls put 2 ls q sabclient //192.168.100.200/public 1234 ls put 2 exit OUTSIDE(UOS) mount /dev/sr0 /mnt vim /etc/apt/sources.list [trusted=yes] file:///mnt fou main apt update nmtui dhclient -r dhclient -v ip ad ip route cat /etc/resolv.conf nslookup 将以上linux代码分析并讲述操作思路
06-16
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值