Debian

DBUS 獲取 USB 記憶體的可用磁碟空間

  • August 26, 2022

我正在嘗試使用 DBUS 連接器 ( ) 確定 USB 儲存設備上有多少可用磁碟空間sdbus-c++。為了接收 USB 儲存器連接狀態的信號,我使用該org.freedesktop.UDisks2服務。

這很好用,但我找不到任何帶有“可用磁碟空間”資訊的屬性。

我是否需要為此功能使用其他服務或如何獲取此資訊?目前我使用的是 Debian 系統,但在第一次測試後,我將切換到嵌入式busybox 系統(以防萬一此資訊很重要)。

Udisks 真正致力於處理儲存設備的硬體方面,直至安裝分區/卷。這些分區上有哪些文件系統,以及它們有多少可用空間,對於 Udisks2 來說有點超出了範圍。您可能使用 Udisk 掛載的某些文件系統甚至不理解“可用空間”的概念(如 ISO9669)

從我的頭上看,通過對可用 DBUS 介面的一些研究,我認為 DBUS 不會有“可用空間”屬性。好吧,hacky 但有效的解決方法只是 execing df /path/to/mount。(許多文件系統需要掛載,即使只是只讀的,以估計可用空間的數量。順便說一下,對於許多文件系統來說,可用空間和使用的空間是一件非常複雜的事情。)

現在,特別是如果您稍後將其縮小為基於busybox的最小系統,您可能不想使用GNU coreutildf執行來讀取您需要從文本中解析的內容,只是為了獲取您自己可以獲得的資訊. 看到你在做 C++(我的頭腦,甚至沒有嘗試編譯它),並假設你沒有 C++17’s 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;

引用自:https://unix.stackexchange.com/questions/714965