端口窗口Api --- GetVolumeInformation到Linux

时间:2013-07-03 12:13:20

标签: linux windows

赢得Api

WINAPI GetVolumeInformation(
_In_opt_   LPCTSTR lpRootPathName,
_Out_opt_  LPTSTR lpVolumeNameBuffer,
_In_       DWORD nVolumeNameSize,
_Out_opt_  LPDWORD lpVolumeSerialNumber,
_Out_opt_  LPDWORD lpMaximumComponentLength,
_Out_opt_  LPDWORD lpFileSystemFlags,
_Out_opt_  LPTSTR lpFileSystemNameBuffer,
_In_       DWORD nFileSystemNameSize
);

您好:我想将Windows api GetVolumeInformation移植到Linux。

Q1:Linux是否具有相同的功能。

Q2:如果没有。

Q2.1 linux中的lpVolumeNameBuffer是什么(是/ dev / sda1)?我怎样才能在linux中获得它?

Q2.2 linux中的lpVolumeSerialNumber是什么?我用ioctl得到它。

struct hd_driveid id;ioctl(fd, HDIO_GET_IDENTITY, &id);

Q2.3 linux中的lpMaximumComponentLength是什么?我怎样才能在linux中获得它?

Q2.4 linux中的lpFileSystemFlags是什么?我怎样才能在linux中获得它?

Q2.5什么是lpFileSystemNameBuffer?我怎样才能在linux中获得它?

如果你有任何好主意,我会非常感激。

谢谢!

2 个答案:

答案 0 :(得分:1)

从概念上讲,linux没有像Windows那样的卷 - 由于缺乏更好的术语,Linux有挂载点,Windows有'驱动器号'。

lpVolumeName是已装入卷的友好名称 - 例如,我的C:驱动器标记为“main_disk”。此标签的要点仅在于为驱动器提供友好名称,并且只要用户决定更改标签,标签就会发生变化,并且不会影响最终文件系统布局的结构。

在linux中,卷作为挂载点挂载,例如,称为/dev/sda2的设备可能挂载在/var挂载点。这里,/var是文件系统的一部分,因此,挂载点确定最终文件系统布局的结构。这不仅仅是用户提供给他们的磁盘的友好名称,以便他们可以知道它是什么。

Linux和其他人确实支持称为磁盘标记的东西,但过去常常能够使用稳定的名称来引用磁盘,而不是其设备名称,如果硬盘驱动器是在电脑里四处走动。例如,在FreeBSD中,我可以标记我的主硬盘root;当在启动期间检测到该硬盘驱动器时,我可以将其称为/dev/label/root并使用该名称指定它的安装点。但是,这仍然被用于确定文件系统的最终结构 - 它是一个功能依赖 - 因此用户无法在不破坏某些内容或不得不更改描述的fstab文件的情况下随意更改它设备到安装点的映射。

lpVolumeSerialNumber与卷上的文件系统有关;也就是说,此字段特定于卷上使用的文件系统,并不是所有卷都具有的。

在Windows中,通常支持两个文件系统--Fat32和NTFS--两者都可以为文件系统提供序列号。在Linux,FreeBSD等中,有许多文件系统--UFS / UFS2,EXT / EXT2 / EXT3 / EXT4,ReiserFS / Reiser4,BTRFS,ZFS,FFS等。卷是否具有序列号取决于卷正在使用什么文件系统,并非所有文件系统都支持序列号。每个文件系统都有自己的实用程序命令来查询这类数据 - 例如,FreeBSD上的dumpfs用于UFS2文件系统。

列表还在继续。不幸的是,Windows和Linux之间没有关于你所询问的部分的直接类比,但正如我所展示的,有时它并不重要,当它发生时,你通常可以找到替换它的东西。

答案 1 :(得分:1)

POSIX系统具有statvfs()/ fstatvfs()子程序(可能是库函数或系统调用,具体取决于操作系统)。也许它们与您命名的Windows功能最相似,但它们的界面却截然不同。

我不知道你是否重要,但相关的问题是枚举挂载的文件系统。要枚举Linux上当前安装的文件系统,您可以阅读/proc/mounts的内容。一些其他UNIX风格(即BSD派生系统)具有getvfsstat()/ getfsstat()调用用于相同目的。 Solaris既有(或曾经有),你最好选择阅读/etc/mnttab。 AIX没有这些,并且枚举当前安装的(唯一?)可靠(?)选项是解析mount命令的输出,不带任何参数运行。