파일 시스템의 동결/해제 상태를 확인하는 방법은 무엇입니까?

파일 시스템의 동결/해제 상태를 확인하는 방법은 무엇입니까?

xfs_freezexfs 파일 시스템을 고정하거나 고정 해제하는 데 사용하는 것 :

xfs_freeze -f /blahblah

xfs_freeze -u /blahblah

unfreeze 명령을 실행한 후 파일 시스템이 고정되지 않았는지 확인하고 싶습니다. 이 명령은 값이나 메시지를 반환하지 않습니다.

파일 시스템을 다시 마운트해 볼 수는 있지만 완전히 신뢰할 수는 없습니다.

또한 고정되지 않은 파일 시스템에서 unfreeze 명령을 다시 실행하면 다음과 같은 결과가 나타납니다.

xfs_freeze: cannot unfreeze filesystem mounted at /blahblah: Invalid
argument

이 방법 역시 정보가 정확하지 않기 때문에 완벽하지는 않습니다.

파일 시스템의 고정 상태를 알려주는 명령이 있습니까? 아니면 이를 확인하는 데 사용할 수 있는 확실한 방법이 있습니까?

어떤 팁이 있나요?

답변1

간단히 말해서:

파일 시스템이 고정되었는지 여부를 직접 쿼리할 수 있는 방법은 없지만 중첩된 고정 시도가 작동하지 않는다는 사실을 악용할 수 있습니다. 예를 들어 /xfs_test에 XFS 파일 시스템을 마운트했습니다.

[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

파일 시스템을 해제하거나 해제하는 경우에도 동일한 비유가 적용됩니다.

[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() 커널 함수를 내보냅니다. Freeze_bdev()는 슈퍼블록을 플러시하고 장치를 동기화하여 파일 시스템을 일관된 상태로 잠급니다. 패치는 또한 struct block_device 상태 필드에 고정 상태 추적을 추가합니다.

이 시점에서 중첩된 동결 및 해동이 가능합니다. 내가 이해한 바에 따르면 코드의 카운터 변수는 중첩된 고정 및 고정 해제 시도를 추적합니다. 이 변수는 냉동 시 증가하고 해동 시 감소합니다. 카운터가 0에 도달한 경우에만 파일 시스템이 실제로 고정 해제됩니다.

나중에 파일 시스템 상태를 쿼리하기 위해 새로운 ioctl 호출을 추가하는 것에 관한 2016년 패치 토론을 발견했습니다.fs: FIGETFROZEN ioctl 호출 추가. 내가 아는 한, 이 패치는 아직 커널에 병합되지 않았습니다.

패치 토론은 몇 가지 핵심 사항을 제공합니다.

또한 사용자 공간에서 고정 상태를 폴링하는 것은 본질적으로 위험합니다. 시스템 호출이 반환되면 정보가 올바르지 않을 수 있으므로 사용자 공간에서 결정을 내릴 때 이에 의존할 수 없습니다.

그런 다음:

내 [sic] 빠른 조사에 따르면 5년 전 btrfs에서 ioctl 동결을 작동시키기 위해 의도적으로 중첩이 깨졌습니다.

이로 인해 위에 표시된 솔루션이 생겼습니다.


또 다른 가능성이 담겨있습니다이 답변은 StackOverflow에 있습니다.. 고정된 파일 시스템을 다시 마운트하려고 하면 "장치가 사용 중입니다" 오류와 함께 시도가 실패합니다. 마운트는 다른 여러 가지 이유로 인해 사용량이 많을 수 있으므로 이 솔루션이 완벽할 수는 없습니다.

답변2

확인을 수행하려면 자신만의 명령을 작성해야 한다고 생각합니다.

#!/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 <mountpoint>";
    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

관련 정보