AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 792290
Accepted
GraemeV
GraemeV
Asked: 2025-03-11 21:40:28 +0800 CST2025-03-11 21:40:28 +0800 CST 2025-03-11 21:40:28 +0800 CST

mv 受到绑定挂载的影响(感觉像是一个错误)

  • 772

最初,mv(1)这是一项重命名操作;它更新文件系统中的名称,但不复制文件。最近,添加了一项便利功能,即如果源和目标位于不同的文件系统上,它将复制并删除文件。又称为“设备间移动”。

现在我正试图整理我的备份。我想移动.../rest2/Public/Backups到.../rest2/Backup/(Backups),所以:

root@ts412:/QNAP/mounts/rest2# mv Public/Backups Backup/  

在哪里:

root@ts412:/QNAP/mounts/rest2# df -h /QNAP/mounts/rest2/Public/                                                                                                                                                                          
Filesystem      Size  Used Avail Use% Mounted on                                                                                                                                                                                         
/dev/sdb10      831G  715G   75G  91% /QNAP/mounts/rest2                                                                                                                                                                                 
root@ts412:/QNAP/mounts/rest2# df -h /QNAP/mounts/rest2/Backup/                                                                                                                                                                          
Filesystem      Size  Used Avail Use% Mounted on                                                                                                                                                                                         
/dev/sdb10      831G  715G   75G  91% /QNAP/mounts/rest2

因此相同的文件系统:

(仅供参考,rest2是“剩余的空间disk2”)

但是移动开始表现得像“设备间移动”(高 CPU、磁盘繁忙、有关非空目录的各种错误等),所以我终止了它。

以稍微不同的方式检查(注意.):

root@ts412:/QNAP/mounts/rest2# df -h Backup/.                                                                                                                                                                                            
Filesystem      Size  Used Avail Use% Mounted on                                                                                                                                                                                         
/dev/sdb10      831G  715G   75G  91% /QNAP/mounts/rest2                                                                                                                                                                                 
root@ts412:/QNAP/mounts/rest2# df -h Public/Backups/.                                                                                                                                                                                    
Filesystem      Size  Used Avail Use% Mounted on                                                                                                                                                                                         
/dev/sdb10      831G  715G   75G  91% /QNAP/mounts/rest2/Public  

然后我记得我还有一个绑定挂载(它使通过 NFS 共享的名称更加友好)。所以我卸载了额外的绑定挂载:

root@ts412:/QNAP/mounts/rest2# umount /QNAP/mounts/rest2/Public                                                                                                                                                                          
root@ts412:/QNAP/mounts/rest2# df -h Public/Backups/.                                                                                                                                                                                    
Filesystem      Size  Used Avail Use% Mounted on                                                                                                                                                                                         
/dev/sdb10      831G  715G   75G  91% /QNAP/mounts/rest2                                                                                                                                                                                 
root@ts412:/QNAP/mounts/rest2# mv Public/Backups Backup/   

mv(1)正如我所料,它是立即发生的。

因此,尽管有额外的mount(8)s, 但源和目标始终位于同一文件系统中,这mount -o bind /QNAP/mounts/rest2/Backups /Backups不会影响这一点。所以我想知道,如果mv(1)返回/QNAP/mounts/rest2 一个的挂载点和/QNAP/mounts/rest2/Public另一个的挂载点,它会错误地确定这两个文件位于不同的文件系统上吗?

mount
  • 2 2 个回答
  • 84 Views

2 个回答

  • Voted
  1. Best Answer
    Stephen Kitt
    2025-03-11T22:19:55+08:002025-03-11T22:19:55+08:00

    严格来说,并不是它mv决定了这两个文件位于不同的文件系统,而是内核。mv应该盲目地尝试一个基本rename操作;只有当操作失败EXDEV(表明两个操作数位于不同的文件系统上)时,它才会继续手动复制和删除文件。

    然而在 Linux 上,rename它只关心挂载点,而不考虑底层文件系统:

    (Linux 允许在多个点上挂载文件系统,但rename()不能跨不同的挂载点工作,即使在两个挂载点上都挂载了同一个文件系统。)

    mv可以使用 Linux 特定的功能来检测这一点,并且已经向 coreutils 开发人员提出了建议(带有概念验证),但当时被认为过于复杂。

    另请参阅在同一个文件系统中 Mount--bind 移动文件就像在同一个文件系统中一样。

    • 6
  2. GraemeV
    2025-03-19T04:34:49+08:002025-03-19T04:34:49+08:00

    我需要添加更多信息,因为我认为我的表述有些模棱两可,并且被一个相关(且非常有趣)的问题绊倒了。

    真正的坐骑是:

    /QNAP/mounts/rest2/
    

    我有2个重要的绑定挂载:

      mount -o bind  /QNAP/mounts/rest2/Public  /Public
      mount -o bind  /QNAP/mounts/rest2/Backup  /Backup
    

    (仅供参考,我只能这样做:exportfs -o rw *:/Public,否则我不会使用/Public 等)

    如果我做了:

    mv /Public/Backups /Backups/
    

    然后我发现我会遇到评论中讨论的设备间移动问题。

    但是,如果我将示例从相对路径名转换为完整路径名,则尝试执行的操作是:

     mv /QNAP/mounts/rest2/Public/Backups to /QNAP/mounts/rest2/Backup/
    

    它的行为就像是跨设备移动,直到我这样做:

      umount /QNAP/mounts/rest2/Public
    

    (这是上面绑定挂载中使用的名称)

    然后:

     mv /QNAP/mounts/rest2/Public/Backups to /QNAP/mounts/rest2/Backup/
    

    即时(无需跨设备移动)

    现在我开始怀疑我的记忆了,所以我回去做了:

    mv /QNAP/mounts/rest2/Backup/Backups /QNAP/mounts/rest2/Public/  
    

    (即将其移回)

    并且它再次表现得像一个设备间移动!

    然而经过检查,我发现

    root@ts412:/QNAP/mounts/rest2# mount | grep Public
    /dev/sdb10 on /Public 类型 ext4 (rw,relatime)
    /dev/sdb10 on /Public 类型 ext4 (rw,relatime)
    /dev/sdb10 on /Public 类型 ext4 (rw,relatime)
    /dev/sdb10 on /QNAP/mounts/rest2/Public 类型 ext4 (rw,relatime)

    root@ts412:/QNAP/mounts/rest2# mount | grep Backup
    /dev/sdb10 on /Backup 类型 ext4 (rw,relatime)

    “/Backup” 的值是我期望/想要的,而 /Public 的多个条目完全不是我期望的。

    /QNAP/mounts/rest2/Public 不应该在那里......而且由于它的路径与上面的 mv(1) 匹配,这就是为什么它似乎是跨设备的(以Stephen Kitt的解释为准)

    ...那么它是如何到达那里的呢?根源是一个脚本(片段):

    function do_nonraid() {                                                                                                                                              
        mount=$1; shift                                                                                                                                                  
                                                                                                                                                                         
        mkdir -p                           /QNAP/mounts/${mount}                                                                                                         
        umount                             /QNAP/mounts/${mount} 2> /dev/null                                                                                            
        mount /dev/disk/by-label/${mount}  /QNAP/mounts/${mount}                                                                                                         
                                                                                                                                                                         
        for d in $@                                                                                                                                                      
        do                                                                                                                                                               
            mkdir -p       /QNAP/mounts/${mount}/${d}  /${d}                                                                                                             
                                                                                                                                                                         
            # Strangely enough unmounting /foo TWICE removes any number of leftover bind mounts ?                                                                         
            umount   /${d} 2> /dev/null                                                                                                                                  
            umount   /${d} 2> /dev/null                                                                                                                                  
                                                                                                                                                                         
            mount -o bind  /QNAP/mounts/${mount}/${d}  /${d}                                                                                                             
            ln -fs -T      /QNAP/mounts/${mount}/${d}  /share/${d}                                                                                                       
            exportfs      ${options}  "${export_flags}:/${d}"                                                                                                            
        done                                                                                                                                                             
        }                                                                                                                                                                
         
    
                                                                                                                                                                
    

    在这个例子中,它可能被称为

    do_nonraid rest2 Public Backup Somethingelse
    

    这应该会导致:

    /dev/disk/by-label/rest2 挂载到 /QNAP/mounts/rest2 然后: /share/Backup 到 (sym) 链接到 /QNAP/mounts/rest2/Backup /share/Public 到 (sym) 链接到 /QNAP/mounts/rest2/Public ... 还有 /Public /Backup 的 NFS 导出...

    然而代码中原本缺少注释“奇怪的是...”下的那两行。

    该函数最终由 udev 调用(例如,当插入磁盘时),因此可能会运行多次。

    我开始对此失去兴趣,但我认为重复发出的绑定挂载导致了虚假的额外挂载存在[堆叠?],从而导致了最初的问题!......唷。

    所以我最初感到惊讶的是,尽管我没有使用绑定挂载,但它的存在导致原本常规的 mv(1) “混乱”......但事实证明我确实使用了绑定挂载,但没有意识到这一点。

    • 0

相关问题

  • 使用 LVM 永久挂载目录

  • 阻止损坏的 NFS 挂载锁定 solaris 11.3 中的目录?

  • 如何在 solaris 11.3 中挂载 zfs 驱动器分区

  • 阻止挂载系统调用

  • 将局域网硬盘挂载到 linux fedora

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve