디스크 블록 장치 이름과 파티션 번호만 주어진 경우 파일 시스템(Linux)에서 사용된 공간을 C 또는 C++에서 찾아야 합니다.
대부분의 파일 시스템에서 다음을 수행할 수 있습니다.
- 개발자 이름
/dev/<block><part>
이나/dev/<block>p</part>
기존 이름을 만드세요. - 장치 를 검색
/proc/mounts
하고 마운트 지점을 가져옵니다. statvfs()
이 마운트 지점에서 사용
다소 장황해 보일 수도 있지만, 이것으로 충분합니다. 그러나 다음과 같은 주의 사항이 있습니다.
내 루트 디렉터리는 /dev/root
실제 블록 장치 이름에서 마운트됩니다. 그렇지 않은 경우 /dev/root
- 노드가 존재하지 않습니다. 이제 장치 ID를 /dev/<whatever>
사용하여 주 번호/부 번호로 나눈 다음 항목 을 stat("/"...)
찾아 블록 이름으로 역참조하여 장치 ID를 얻을 수 있습니다./sys/dev/block/<maj>:<min>/uevent
DEVNAME=
완전히 일반적인 함수로 유지하면 메서드가 다음으로 확장됩니다.
- 올바른 장치 이름
/dev/<block><part>
또는/dev/<block>p<part>
존재하는 이름을 디자인하십시오. - 각 항목에 대해 다음을 수행합니다
/proc/mounts
.- 마운트 지점 추출
- 메이저/마이너 쌍 가져오기
stat()
- 상위 장치 이름 찾기
/sys/dev/block/<maj>:0/uevent
- 장치 이름을 블록 장치 이름과 비교하고 부 장치 이름을 파티션 번호와 비교합니다.
- 일치하면 사용된 공간을 가져옵니다.
statvfs()
이제 그 말은 너무 길어서 마음에 들지 않습니다. 예, 작동해야 하지만 이상적이지는 않습니다.
그렇다면 이 작업을 수행할 수 있는 더 쉬운 인터페이스가 있습니까? 커널의 마운트 테이블과 직접 상호 작용하는 방법은 무엇입니까? 마운트된 각 파일 시스템에 대해 구조의 블록 장치(기본/부)와 마운트된 경로(및 기타 정보)를 얻을 수 있는 방법이 있습니까?
기능이 있는 것으로 알고 있는데 mount()
기능 이 umount()
있나요 ?"tell me what is mounted"()
답변1
나의 첫 번째 의견은 당신이 말하는 모든 것은 당신이 관심 있는 장치의 파일 시스템이 현재 마운트되어 있는 경우에만 작동한다는 것입니다. 하지만 나는 당신이 이것을 알고 이 제한을 받아들인다고 생각합니다.
당신이 제안한 방법은 매우 철저해 보이며 모든 상황을 포착한다고 생각합니다.
IP 찾기 정보 /sys/dev/block
:
- 당신은 당신이 찾고 있다고 말하는 것을 찾고 있는 것이 아닙니다
<maj>:0
. 당신이 찾고있는<major>:<minor>
. - 찾을 수 없는 상황에 대비하세요. 일부 파일 시스템(예
/proc
: , 및 유형tmpfs
)에는nfs
연결된 장치가 없습니다. 관심 있는 블록 장치와 일치하지 않을 가능성이 높으므로 무시해야 합니다.
장치 이름을 찾을 때 스캔하지 마십시오 /sys/dev/block/<major>:<minor>/uevent
. 대신 a readlink()
자체 /sys/dev/block/<major>:<minor>
는 결과의 기본 이름을 가져옵니다. 동일한 결과를 얻을 수 있지만 더 깨끗하고 효율적입니다.
여러 장치를 찾는 경우 /proc/mounts
전체 /sys
조회를 한 번만 스캔 및 수행하고 다음 장치 조회를 위해 결과를 캐시해야 합니다.
show_me_mounts()
시스템 호출이 없습니다 . Linux에서는 이것이 /proc/mounts
목적입니다. 하지만 아시다시피, 그것은 완벽하지 않습니다. 일반적으로 /dev/root
완전히 현대적인 initramfs 기반 부팅을 사용하면 가상/존재하지 않는 문제가 표시되지 않습니다.
편집하다요구 사항에 따라 각 파티션에 해당하는 전체 디스크를 찾으십시오.
주어진 "내부" 블록 장치(=파티션)에 대한 "외부" 블록 장치(=전체 디스크)를 얻으려면할 수 없다마이너 번호를 0으로 변경하면 됩니다.
메이저 8과 마이너 1을 찾으면 올바른 방법은 다음 파일을 보는 것입니다.
/sys/dev/block/8:1/../dev
이렇게 하면 가 생성되지만 8:0
보조 장치 ID가 항상 0으로 전환될 수 있다고 잘못 가정하지는 않습니다.
열려고 하면 ENOENT
해당 블록 장치의 종류가 내부/외부 계층이 없거나, 보조 장치 ID가 내부 장치와 일치하지 않기 때문입니다.