首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何确定文件系统的冻结/解冻状态?

如何确定文件系统的冻结/解冻状态?
EN

Unix & Linux用户
提问于 2018-12-07 00:25:46
回答 2查看 4.6K关注 0票数 4

我使用xfs_freeze冻结和解冻我的xfs文件系统:

代码语言:javascript
运行
复制
xfs_freeze -f /blahblah

xfs_freeze -u /blahblah

在运行取消冻结命令之后,我希望确保文件系统没有被冻结。此命令不返回任何值或消息。

我知道我可以尝试重新安装文件系统,但是这个文件系统并不是完全的。

另外,如果我在未冻结的文件系统上再次运行解冻结命令,我将得到如下所示:

代码语言:javascript
运行
复制
xfs_freeze: cannot unfreeze filesystem mounted at /blahblah: Invalid
argument

由于消息不准确,此方法也不可靠。

我是否可以使用一个命令来告诉我文件系统的冻结状态,或者是否有一种可以用来确定这一点的防伪方法?

有什么暗示吗?

EN

回答 2

Unix & Linux用户

发布于 2018-12-07 17:40:42

TL;DR:

虽然没有直接的方法来查询文件系统是否被冻结,但您可以滥用嵌套冻结尝试不起作用的事实。例如,我在/xfs_test上安装了一个XFS文件系统:

代码语言:javascript
运行
复制
[root@testvm1 ~]# mount | grep xfs_test
/dev/sdb1 on /xfs_test type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

[root@testvm1 ~]# xfs_freeze -f /xfs_test/      # Initial freeze
[root@testvm1 ~]# echo $?
0

[root@testvm1 ~]# xfs_freeze -f /xfs_test/      # Subsequent freeze attempt
xfs_freeze: cannot freeze filesystem at /xfs_test/: Device or resource busy
[root@testvm1 ~]# echo $?
1

同样的类推适用于解冻或解冻文件系统:

代码语言:javascript
运行
复制
[root@testvm1 ~]# xfs_freeze -u /xfs_test/      # Same filesystem, currently frozen
[root@testvm1 ~]# echo $?
0

[root@testvm1 ~]# xfs_freeze -u /xfs_test/      # Thawed filesystem
xfs_freeze: cannot unfreeze filesystem mounted at /xfs_test/: Invalid argument
[root@testvm1 ~]# echo $?
1

我不得不做一些调查,以确定冻结/解冻状态查询是否可行。虽然技术细节超出了我的理解,但这就是我所做的。

冻结和解冻文件系统是最初为XFS构建的特性。它最终被引入到Linux内核中,允许该功能也适用于其他文件系统。正如这篇LWN文章所解释的:

Takashi Sato建议采用XFS特有的特性,并将其移动到文件系统代码中。该修补程序将提供一个ioctl(),用于暂停对文件系统的写访问,冻结,以及一个恢复写入的解冻选项。..。实际上,修补程序只是通过刷新超级块并同步设备,在用户可访问的freeze_bdev()中导出way.freeze_bdev()内核函数,从而将文件系统锁定为一致状态。修补程序还将对冻结状态的跟踪添加到struct block_device状态字段中。

在这一点上,嵌套冻结和解冻是可能的。据我所知,代码中有一个计数器变量跟踪嵌套的冻结和解冻尝试。该变量在冻结时增加,在解冻时减少。只有当计数器为0时,文件系统才会真正解冻。

之后,我发现了2016年的补丁讨论,它是关于添加一个新的ioctl调用来查询文件系统的状态:fs:添加FIGETFROZEN ioctl调用。据我所知,这个补丁还没有被合并到内核中。

补丁讨论提供了几个要点:

此外,从用户空间中轮询冻结性本质上是不正确的--当syscall返回时,信息可能是不正确的,因此您不能在用户空间中依赖它来进行决策。

然后:

我快速挖掘显示,嵌套是在5年多前在btrfs上使冻结ioctl工作时故意破坏的。

这让我找到了上面所示的解决方案。

还有一种可能性是在这是StackOverflow的答案中涵盖的。如果您试图重新装入已冻结的文件系统,则如果出现“设备繁忙”错误,该尝试将失败。安装也可能因为许多其他原因而繁忙,因此这个解决方案是不可否认的。

票数 3
EN

Unix & Linux用户

发布于 2018-12-07 04:23:06

我认为你必须写你自己的命令来检查。

代码语言:javascript
运行
复制
#!/bin/bash

function touchFs() {
    echo "mp: $1";
    touch "$1/frzn-5tst";
    if [ -f "$1/frzn-5tst" ]; then
            rm "$1/frzn-5tst" &> /dev/null;
    fi
}

function usage() {
    echo "$0 ";
    exit 1;
}

if [ -z $1 ]; then
   usage;
fi

touchFs $1&
ppid=$!;
state=`ps -o s= -p $ppid`;

if [ -z "$state" ]; then
    echo "device is unfrozen";
elif [ "$state" == "S" ]; then
    echo "device is frozen";
fi
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/486484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档