파일 시스템이 참조 링크 복사본을 지원하는지 확인하는 방법은 무엇입니까?

파일 시스템이 참조 링크 복사본을 지원하는지 확인하는 방법은 무엇입니까?

reflink디렉터리의 스냅샷 복사본을 반복적으로 생성하려고 시도했지만 파일 시스템(사용자 정의 shfs)이 복사본을 지원하지 않으면 각 파일에 대해 오류가 반환됩니다.

# cp -a --reflink=always /mnt/user/libvirt /mnt/user/libvirt_copy
cp: failed to clone '/mnt/user/libvirt_copy/libvirt/libvirt.img' from '/mnt/user/libvirt/libvirt.img': Operation not supported
cp: failed to clone '/mnt/user/libvirt_copy/libvirt/test.txt' from '/mnt/user/libvirt/test.txt': Operation not supported
...

잠재적으로 수천 개의 파일에 대한 쓸모없는 루프를 의미하는 첫 번째 오류(?)에서 중지하는 것은 불가능해 보이기 때문에 cp파일 시스템이 링크 참조를 지원하는지 미리 확인하는 것을 좋아합니다.

한 가지 아이디어는 단일 파일을 검색하고 테스트 복사본을 만드는 것입니다.

if ! find /mnt/user/libvirt -type f -print -quit | xargs -I {} sh -c 'dst_path=$(dirname $(echo {} | sed "s#^/mnt/user/libvirt#/mnt/user/libvirt_copy#")); mkdir -vp $dst_path && cp -a --reflink=always {} "$dst_path"'; then
    echo "Error: Filesystem does not support reflink"
    exit
fi

그러나 이렇게 하면 나중에 정리해야 하는 디렉터리와 빈 파일이 남게 됩니다.

# find /mnt/user/libvirt_copy/
/mnt/user/libvirt_copy/
/mnt/user/libvirt_copy/libvirt.img
# ls -lah /mnt/user/libvirt_copy/libvirt.img
-rw------- 1 root root 0 Nov  1 08:58 /mnt/user/libvirt_copy/libvirt.img

더 좋은 방법은 없을까요? 아니면 cp첫 번째 오류가 발생하면 중지 할 수 있는 솔루션이 있을까요 ?

답변1

당신이 언급한 "사용자 정의 shfs" 파일 시스템이 사용되는지는 잘 모르겠지만 디스크의 일반 파일 시스템의 경우 이에 대한 정보를 얻기 위해 실행할 수 있는 파일 시스템별 명령이 있어야 합니다. 예를 들어 XFS 파일 시스템의 경우 sh 스크립트는 다음과 같이 참조 연결 기능을 지원하는지 여부를 테스트할 수 있습니다.

if xfs_info /yourXfsMount | grep reflink=1; then
   echo "Filesystem supports reflink"
else
   echo>&2 "ERROR: Filesystem does not support reflink"
   exit 1
fi

답변2

특정 파일 시스템에 의존하지 않는 일반적인 답변이 필요하다면 단순히 테스트 복사본을 만들어 보는 것이 아마도 최선의 방법일 것입니다. 이 테스트에서는 기존 데이터를 사용할 필요가 없으며, 다시 연결하려는 파일 시스템만 알면 됩니다. 가장 쉬운 방법은 고유한 이름을 가진 빈 파일을 만들고 복사한 다음 테스트에 실제 데이터를 포함하지 않고 정리하는 것입니다. 어쩌면 다음과 같은 것일 수도 있습니다.

filesystem=/yourFilesystem
filename=${filesystem}/reflinktest-$(uuid)
filename2=${filename}-copy
touch ${filename}
cp --reflink=always ${filename} ${filename2}
result=$?
rm -f ${filename} ${filename2}
if [ ${result} -ne 0 ]; then
  echo "ERROR: Filesystem ${filesystem} does not support reflink."
  exit 1
fi
echo "Reflink supported"
# Proceed with your reflink copying...

관련 정보