디렉토리와 하위 볼륨을 구별하는 방법은 무엇입니까?

디렉토리와 하위 볼륨을 구별하는 방법은 무엇입니까?

GNU/리눅스에서디렉토리와 btrfs 하위 볼륨을 구별하는 가장 좋은 방법은 무엇입니까?

나는 그들이 똑같이 보여야 한다는 것을 안다. 그것은 멋지다. 그러나 유지 관리 목적으로 디렉토리를 볼 때 그것이 단순한 디렉토리인지 아니면 하위 볼륨인지 알고 싶습니다. (그렇다면 설치되어 있는지, 설치되어 있다면 어떻게, 어디서 설치되었는지 아는 것이 좋습니다.)

목적:예를 들어 제안된 대로 하위 볼륨의 구조를 수정하고 싶습니다.여기. 내가 무엇을 하고 있는지 확인할 수 있는 방법이 필요합니다. 감사해요. :-)


내가 본 것:

산출ls -d또는tree -d폴더를 표시하지만 구분하지 않음목차그리고Btrfs 하위 볼륨. 그것들을 사용하면 ls -l실제로는 똑같아 보입니다.

심지어ls --classify그리고ls --file-type이 구별은 명확하지 않은 것 같습니다.


가능한 해결책:

폴더의 inode 번호를 확인할 수 있다는 것을 알았습니다.256이는 하위 볼륨임을 의미합니다. (참고자료1,2,)


그렇다면 inode=256을 사용하는 것이 디렉토리와 하위 볼륨을 구별하는 데 가장 좋은 경험적 방법입니까? (일부 기본 파일 시스템에서는 inode=256에 대한 또 다른 이유가 있을 수 있다고 가정합니다. 따라서 확실히 확인하려면 문제의 디렉터리가 btrfs 파일 시스템의 일부인지 확인해야 합니다.)

또 다른 방법아마도 명령을 전달한 btrfs subversion list .다음 출력을 구문 분석하는 것일 수 있습니다. mount | grep /\btrfs 디스크, 디스크, 파티션의 루트 마운트(적절한 경우)를 처리하려면 이 항목이나 이와 유사한 항목을 추가해야 합니다 .


미래: 새로운 옵션이 있으면 좋을 것 같아요ls이는 소프트 링크가 나타나는 방식과 유사한 형식으로 하위 볼륨 및 마운트 지점에 대한 정보를 제공합니다.

$ ls --show-mounts
/ <-- mounted from /dev/sdc
.snapshots <-- subvolume of /
shapshot <-- subvolume of .snapshots mounted to it's folder /2

배경:

  • 디렉토리와 하위 볼륨은 매우 다르게 관리됩니다.

  • rmdir하위 볼륨은 사용 하거나 삭제할 수 없습니다 rm -rf. 반드시 사용해야 합니다 btrfs subvolume delete.

  • 특정 하위 볼륨에 있지 않으면 디렉터리나 파일을 하드 링크할 수 없습니다.

  • 하위 볼륨은 자동으로 마운트된 것으로 나타나지만 다른 마운트 지점에 수동으로 마운트할 수도 있습니다.

  • 당신이 사용하는 경우도미또는 실제로 하위 볼륨이거나 최소한 특수한 유형의 하위 볼륨인 스냅샷을 찍습니다.

    예를 들어,루트 트리는 다음과 같습니다.

    /  
    /.snapshots  
    /.snapshots/1  
    /.snapshots/1/snapshot  
    /.snapshots/2  
    /.snapshots/2/snapshot  
    ...
    

    여기에만 /1/2일반 디렉토리가 있고, /, /.snapshots/snapshotbtrfs 하위 볼륨인 것 같습니다.

답변1

btrfs subvolume show /directory/in/question

sudo하위 볼륨인 경우 명령이 성공하고 그렇지 않으면 실패합니다 . 출력을 종료 상태로 리디렉션 /dev/null하고 종료 상태에만 의존할 수 있습니다.

그러면 디렉터리 트리에서 사용 가능한 모든 디렉터리가 테스트됩니다.

sudo find / -type d -exec sh -c '
   for d do
      btrfs subvolume show "$d" >/dev/null 2>&1 && printf "%s\n" "$d"
   done' find-sh {} +

의심할 수 없는 경로를 제외할 수도 있습니다. 다음 코드는 /proc, /sys/dev:을 제외합니다.

sudo find / -type d \( \
     \( -path /proc -prune \) -o \
     \( -path /sys -prune \) -o \
     \( -path /dev -prune \) -o \
     \( -exec sh -c '
        for d do
           btrfs subvolume show "$d" >/dev/null 2>&1 && printf "%s\n" "$d"
        done
     ' find-sh {} + \) \)

관련된:디렉터리/파일이 있는 하위 볼륨을 확인하는 방법은 무엇입니까?

답변2

st_dev반환된 필드( stat(2)파일을 포함하는 장치의 ID라고 함)는 BTRFS 하위 볼륨과 파일 시스템 간에 다릅니다. 명령줄을 사용하세요.

if [ btrfs != "$(findmnt -noFSTYPE --target=.)" ]
then
    echo "not btrfs"
elif findmnt . >/dev/null
then
    echo "btrfs mountpoint"
elif [ "$(stat -c%d .)" -ne "$(stat -c%d ..)" ]
then
    echo "btrfs subvolume"
else
    echo "btrfs directory"
fi

관련 정보