DBUS 커넥터(DBUS Connector)를 사용하여 USB 저장 장치에 사용 가능한 디스크 공간이 얼마나 되는지 확인하려고 합니다 sdbus-c++
. USB 메모리의 연결 상태에 대한 신호를 받기 위해 이 org.freedesktop.UDisks2
서비스를 이용합니다.
정상적으로 작동하지만 "사용 가능한 디스크 공간" 정보가 포함된 속성을 찾을 수 없습니다.
이 기능을 구현하려면 다른 서비스를 사용해야 합니까? 아니면 이 정보를 어떻게 얻을 수 있습니까? 현재 나는 Debian 시스템을 사용하고 있지만 첫 번째 테스트 후에는 임베디드 비지박스 시스템으로 전환할 것입니다(이 정보가 중요한 경우를 대비해).
답변1
Udisks는 실제로 파티션/볼륨 마운트에 이르기까지 저장 장치의 하드웨어 측면을 다룹니다. 이러한 파티션에 어떤 파일 시스템이 있고 얼마나 많은 여유 공간이 있는지는 Udisks2의 범위를 약간 벗어납니다. Udisk로 마운트할 수 있는 일부 파일 시스템은 "여유 공간" 개념조차 이해하지 못합니다(예: ISO9669).
내 머리 꼭대기에서 사용 가능한 DBUS 인터페이스에 대해 조사한 후에 DBUS가 "여유 공간" 속성을 노출한다고 생각하지 않습니다. 글쎄, 그것은 매우 구식이지만 효과적인 해결책은 실행입니다 df /path/to/mount
. (많은 파일 시스템에서는 여유 공간의 양을 추정하기 위해 읽기 전용이라도 마운트가 필요합니다. 그런데 많은 파일 시스템에서 여유 공간과 사용된 공간은 이면에서 매우 복잡합니다.)
df
이제 특히 나중에 이를 최소 비지박스 기반 시스템으로 축소하는 경우 GNU coreutil 실행을 사용하여 텍스트에서 구문 분석해야 하는 내용을 읽고 스스로 얻을 수 있는 정보를 얻기를 원하지 않을 것입니다 . 당신이 C++를 하고 있다는 것을 확인하고(제 생각에는 컴파일을 시도조차 하지 않았습니다) C++17이 없다고 가정합니다.std::filesystem::space
, 확실히 DBUS를 사용하는 것보다 시작하는 것이 훨씬 덜 번거롭습니다.
#include <sys/statvfs.h>
std::string mountpoint;
/*
* Get the mount point using org.freedesktop.UDisks2.Filesystem's "MountPoints" property, see
* http://storaged.org/doc/udisks2-api/latest/gdbus-org.freedesktop.UDisks2.Filesystem.html#gdbus-property-org-freedesktop-UDisks2-Filesystem.MountPoints
* We'll act as if you already did this and it was stored in `mountpoint`.
*/
// Terrible naming choices made the structure typename be the same as the function name, so even in C++ we have to use `struct`. Wah.
struct statvfs filesystem_info;
statvfs(mountpoint.c_str(), &filesystem_info);
auto bytes_per_block = filesystem_info.f_bsize;
auto blocks_free_for_unprivileged_users = filesystem_info.f_bavail;
auto blocks_free_total = filesystem_info.f_bfree;