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 / 问题 / 749605
Accepted
Tavian Barnes
Tavian Barnes
Asked: 2023-06-23 04:56:30 +0800 CST2023-06-23 04:56:30 +0800 CST 2023-06-23 04:56:30 +0800 CST

NFS 挂载混合了 ctime 和 mtime

  • 772

我有一个从 Linux 服务器到 FreeBSD 客户端的 NFS 挂载。如果我用来touch在 FreeBSD 客户端上设置文件的 atime 和 mtime,

tavianator@muon $ touch -at "199112140000" ./foo
tavianator@muon $ touch -mt "199112150000" ./foo

然后打印统计时间,

tavianator@muon $ stat -f $'Access: %Sa\nModify: %Sm\nChange: %Sc\n Birth: %SB' ./foo
Access: Dec 14 00:00:00 1991
Modify: Jun 22 16:44:08 2023
Change: Dec 15 00:00:00 1991
 Birth: Jun 22 16:45:56 2023

ctime 和 mtime 交换了!然而,从Linux服务器上的观点是正确的:

tavianator@tachyon $ stat /srv/nfs/freebsd/usr/home/tavianator/foo
  File: /srv/nfs/freebsd/usr/home/tavianator/foo
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 0,33    Inode: 54691999    Links: 1
Access: (0640/-rw-r-----)  Uid: ( 1000/tavianator)   Gid: ( 1000/tavianator)
Access: 1991-12-14 00:00:00.000000000 -0500
Modify: 1991-12-15 00:00:00.000000000 -0500
Change: 2023-06-22 16:45:56.731038486 -0400
 Birth: 2023-06-22 16:44:08.075496568 -0400

知道什么可能导致此问题,或者如何解决它?更多可能有用的信息:

root@tachyon ~ # uname -a
Linux tachyon 6.3.8-arch1-1 #1 SMP PREEMPT_DYNAMIC Wed, 14 Jun 2023 20:10:31 +0000 x86_64 GNU/Linux
root@tachyon ~ # findmnt -T /srv/nfs/freebsd/usr/home/tavianator 
TARGET
  SOURCE                      FSTYPE OPTIONS
/ /dev/mapper/cryptslash1[/@] btrfs  rw,relatime,ssd,discard=async,space_cache=v2,subvolid=261,subvol=/@
root@tachyon ~ # exportfs -v
/srv/nfs        100.101.179.2/32(sync,wdelay,hide,no_subtree_check,fsid=0,sec=sys,rw,secure,no_root_squash,no_all_squash)
/srv/nfs        100.114.24.115/32(sync,wdelay,hide,no_subtree_check,fsid=0,sec=sys,rw,secure,no_root_squash,no_all_squash)
/srv/nfs/freebsd
                100.101.179.2/32(sync,wdelay,nohide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
/srv/nfs/freebsd
                100.114.24.115/32(sync,wdelay,nohide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
tavianator@muon $ uname -a
FreeBSD muon 13.2-RELEASE FreeBSD 13.2-RELEASE releng/13.2-n254617-525ecfdad597 GENERIC amd64
tavianator@muon $ mount | grep nfs,
100.107.249.85:/freebsd/usr/home/tavianator on /usr/home/tavianator (nfs, nfsv4acls)
linux
  • 1 1 个回答
  • 53 Views

1 个回答

  • Voted
  1. Best Answer
    Tavian Barnes
    2023-06-24T03:26:22+08:002023-06-24T03:26:22+08:00

    从 Wireshark 中的数据包捕获来看,这似乎是 Linux 服务器中的错误,而不是 FreeBSD 客户端中的错误。

    我相信这是 Linux 内核提交e377a3e698fb中的一个错误,首次包含在版本 5.18 中。该承诺增加了对报告TIME_CREATE(即出生时间)的支持。提交后,写出文件时间戳的代码如下所示:

        if (bmval1 & FATTR4_WORD1_TIME_ACCESS) {
            p = xdr_reserve_space(xdr, 12);
            if (!p)
                goto out_resource;
            p = xdr_encode_hyper(p, (s64)stat.atime.tv_sec);
            *p++ = cpu_to_be32(stat.atime.tv_nsec);
        }
        if (bmval1 & FATTR4_WORD1_TIME_DELTA) {
            ...
        }
        if (bmval1 & FATTR4_WORD1_TIME_METADATA) {
            ...
        }
        if (bmval1 & FATTR4_WORD1_TIME_MODIFY) {
            ...
        }
        if (bmval1 & FATTR4_WORD1_TIME_CREATE) {
            ...
        }
    

    我相信协议的工作方式是按照与位掩码匹配的顺序写入时间bmval1。在这种情况下,顺序将是[ACCESS, METADATA, MODIFY, CREATE]。然而,让我们看看实际的位标志值:

    #define FATTR4_WORD1_TIME_ACCESS        (1UL << 15)
    #define FATTR4_WORD1_TIME_ACCESS_SET    (1UL << 16)
    #define FATTR4_WORD1_TIME_BACKUP        (1UL << 17)
    #define FATTR4_WORD1_TIME_CREATE        (1UL << 18)
    #define FATTR4_WORD1_TIME_DELTA         (1UL << 19)
    #define FATTR4_WORD1_TIME_METADATA      (1UL << 20)
    #define FATTR4_WORD1_TIME_MODIFY        (1UL << 21)
    #define FATTR4_WORD1_TIME_MODIFY_SET    (1UL << 22)
    

    所以它们的写入顺序应该[ACCESS, CREATE, METADATA, MODIFY]是。这与我所看到的相符:

    Linux 自由BSD
    使用权 1991-12-14 00:00:00.000000000 1991 年 12 月 14 日 00:00:00
    创造 2023-06-23 15:19:21.718006131 2023 年 6 月 23 日 15:19:24
    元数据 2023-06-23 15:19:24.718067075 1991 年 12 月 15 日 00:00:00
    调整 1991-12-15 00:00:00.000000000 2023 年 6 月 23 日 15:19:21
    • 1

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

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