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
및/snapshot
btrfs 하위 볼륨인 것 같습니다.
답변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