2012-09-06 71 views
4

我正試圖在我的C++應用程序中安裝外部驅動器。我本來試圖用支架(2),但這個失敗:在linux上用C++掛載NTFS設備?

int ret = mount(deviceName.c_str(), mountPoint.c_str(), fsType.c_str(), 0, NULL); 

錯誤號是19,ENODEV(文件系統的類型在內核中未配置)

但是,如果我切換到使用安裝(8)它的工作原理好:

std::string cmd = "mount -t " + fsType + " " + deviceName + " " + mountPoint; 
int ret = system(cmd.c_str()); 

mount(2)有一個不同的可接受的文件系統類型列表嗎?這是一個NTFS設備,所以我使用ntfs-3g作爲fstype。我檢查了/ proc/filesystems,看到這個沒有列出,所以我嘗試了fuseblk,但這只是將錯誤更改爲22,EINVAL

使用mount(2)掛載NTFS設備的正確方法是什麼?

回答

4

mount.2只是一個內核調用。 mount.8是一個完整的外部工具,它延伸到內核之外。

我想你可能正在尋找libmount這是一個庫,實現了由mount.8完成的整個安裝魔法。較新的安裝版本也使用它。它在util-linux中提供。

+0

啊,我承認我已經假設在引擎蓋下,mount.2會調用mount.8。這就解釋了他們爲什麼不能以同樣的方式運作。感謝您指向'libmount',我會檢查出來。 – jam

2

您是否嘗試過使用strace命令運行mount(8)?它將打印出由該程序進行的系統調用,包括mount(2)。當我做這樣的安裝時,它產生了mount.ntfs(這是NTFS-3g),然後mountfuseblk,然後旋轉到後臺以支持該安裝點。

由於必須啓動用戶空間守護程序,因此基於FUSE的文件系統處理方式不同。使用fuseblk進行掛載並不能爲內核啓動守護進程提供足夠的信息(並且內核甚至不具備啓動守護進程的信息)。對於ntfs-3g,通常會執行類似ntfs-3g /dev/sda1 /mnt/windows(來自幫助)。沒有一種編程方式可以告訴內核來做這件事,因爲它發生在用戶空間中。