Port Window Api---GetVolumeInformation to Linux

2019-09-08 08:25发布

win 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
);

Hello: I want to port windows api GetVolumeInformation to Linux.

Q1:Does Linux have the same function.

Q2:if not.

Q2.1 what is lpVolumeNameBuffer in linux(is /dev/sda1)? how can i get it in linux?

Q2.2 what is lpVolumeSerialNumber in linux(is )? i use ioctl get it.

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

Q2.3 what is lpMaximumComponentLength in linux? how can i get it in linux?

Q2.4 what is lpFileSystemFlags in linux? how can i get it in linux?

Q2.5 what is lpFileSystemNameBuffer? how can i get it in linux?

If you have any good ideas I would really appreciate it.

Thanks!

标签: linux windows
2条回答
Juvenile、少年°
2楼-- · 2019-09-08 09:15

Conceptually, linux doesn't have volumes in the same way that Windows does - linux has mount points, Windows has 'drive letters', for lack of a better term.

lpVolumeName is the friendly name of a mounted volume - for instance, my C: drive is labeled 'main_disk'. The point of this label is only to give a friendly name to the drive, and the label can change whenever the user decides to change it, and it does not affect the structure of the ultimate file system layout.

In linux, volumes are mounted as mount points, eg, the device referred to as /dev/sda2 might be mounted at the /var mount point. Here, /var is part of the file system, and thus, mount points determine the structure of the ultimate file system layout. This is not simply a friendly name for the user to give to their disk so that they can know what it is.

Linux and others do support something called disk labeling, but that's used to be able to refer to the disk using a stable name, instead of its device name, which could change if the hard drives are moved around in the computer. For instance, in FreeBSD, I could label my main hard drive root; when that hard drive is detected during boot up, i can instead refer to it as /dev/label/root and specify the mount point for it using that name. However, this is still being used to determine the ultimate structure of the file system - it's a functional dependency - and so the user can't change it willy-nilly without breaking something or having to change the fstab file that describes device-to-mount-point mappings.

lpVolumeSerialNumber has to do with the filesystem on the volume; that is, this field is specific to what filesystem is being used on the volume, and isn't something that all volumes will have.

In Windows, typically two filesystems are supported - Fat32 and NTFS - both of which can give a serial number to a file system. In Linux, FreeBSD, etc, there are many, many file systems - UFS/UFS2, EXT/EXT2/EXT3/EXT4, ReiserFS/Reiser4, BTRFS, ZFS, FFS, etc. Whether or not a volume has a serial number depends on what file system the volume is using, and not all filesystems support serial numbers. Each filesystem will have its own utility commands to query this sort of data - for instance, dumpfs on FreeBSD for UFS2 file systems.

The list goes on. Unfortunately, there are no direct analogs between Windows and Linux for the parts you're asking about, but as I've shown, sometimes it doesn't matter and when it does, you can usually find something to replace it with.

查看更多
地球回转人心会变
3楼-- · 2019-09-08 09:23

POSIX systems have statvfs()/fstatvfs() subroutines (which might be a library function or system call, depending on the OS). Perhaps they are what most closely resemble what the Windows' function you named does, but they have a very different interface.

I don't know if it matters to you, but a related problem is to enumerate mounted filesystems. To enumerate currently mounted filesystems on Linux, you can read the contents of /proc/mounts. Some other UNIX flavors (namely BSD-derived systems) have getvfsstat()/getfsstat() calls for the same purpose. Solaris has (or used to have) neither, and you best choice was to read /etc/mnttab. AIX has none of these, and your (only?) reliable (?) option to enumerate current mounts is to parse the output of the mount command, run without any argument.

查看更多
登录 后发表回答