赢得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中获得它?
如果你有任何好主意,我会非常感激。
谢谢!
答案 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
命令的输出,不带任何参数运行。