有朋友问我怎么用软件实现修改分区盘符,让我找了老半天 。终于找到了
官方:
[http://support.microsoft.com/default.aspx/kb/280297]
如何在群集服务器上配置卷装入点
文章编号 | : | 280297 |
最后修改 | : | 2004年3月11日 |
修订 | : | 1.0 |
概要
<script type="text/javascript">loadTOCNode(1, 'summary');</script>将装入点添加到共享磁盘上与将装入点添加到非共享磁盘上相同。装入点由 Win32 API SetVolumeMountPoint 添加,由 DeleteVolumeMountPoint 删除。这与磁盘资源动态链接库 (DLL) 无关。资源 DLL 仅关心卷全局通用标识 (GUID),而不是实际的装入点。
有三种向系统添加装入点的方法(对于群集系统和非群集系统相同):
• | 逻辑磁盘管理器 (Diskmgmt.msc) |
• | 从命令提示符处运行 Mountvol.exe |
• | 使用 Win32 API SetVolumeMountPoint 和 DeleteVolumeMountPoint 编写您自己的 .exe 文件 |
更多信息
<script type="text/javascript">loadTOCNode(1, 'moreinformation');</script>• | 不能在群集和非群集磁盘之间创建装入点。 |
• | 不能创建“仲裁”磁盘的装入点。 |
• | 如果您具有从一个共享磁盘到另一个共享磁盘的装入点,必须确保它们位于同一组内,并且装入的磁盘依赖于根磁盘。 |
在群集服务器上安装卷装入点
<script type="text/javascript">loadTOCNode(2, 'moreinformation');</script>1. | 在本地使用管理权限登录到拥有根磁盘(您要将目录移植到该磁盘中)的节点。该磁盘就是将包含装入点的磁盘。 | ||||||||||||||
2. | 打开群集管理器 (CluAdmin.exe),并暂停群集中的其它节点。 | ||||||||||||||
3. | 将磁盘分区,然后创建装入点。为此,请执行以下步骤:
| ||||||||||||||
4. | 新建磁盘资源,然后设置依赖项。为此,请执行以下步骤:
| ||||||||||||||
5. | 中止暂停所有其他节点,并测试您是否可以将组故障转移到每个节点并访问新创建的装入点。 |
这篇文章中的信息适用于:
• | Microsoft Windows Server 2003 Enterprise Edition |
• | Microsoft Windows Server 2003 Datacenter Edition |
昨天,在优快云中看见帖子寻求解决挂载盘符的问题,今天把它搞定了。
改变盘符主要是用SetVolumeMountPoint和DeleteVolumeMountPoint 两个函数。DeleteVolumeMountPoint 很简单就不多说了。SetVolumeMountPoint 的使用主要是要找到被挂载设备的VolumeName。但是设备被卸载以后用GetVolumeNameForVolumeMountPoint根本取不到VolumeName,怎么办呢?
微软XP的系统文件夹里面有一个叫diskpart.exe的命令行工具,用它可以改变盘符。那么它是怎么做到的呢?简单的分析(用VC6自带的工具DEPENDS.EXE)就可以看见这个程序使用了很多Setup API函数,我判断使用SetupDiEnumDeviceInfo来取得VolumeName的ClassGUID,但是结果发现取到的ClassGUID和用GetVolumeNameForVolumeMountPoint获取的没有卸载前的VolumeName中的ClassGUID不一样。怎么办呢?
没关系,让我们祭出屠龙刀:IDA Pro。如何反汇编分析不在本文的介绍了(挺麻烦,而我这人又比较懒嘿嘿)。我一阵海扁它,发现关键是要通过DefineDosDevice 函数将设备Attach到盘符上,然后用GetVolumeNameForVolumeMountPoint取到VolumeName,之后就可以用SetVolumeMountPoint将设备挂载到盘符上了
。我把它写成了函数如果要加载盘符就可以使用(前提是盘符未被占用):
卸载的话用:
下面是ChangeMountPoint函数的实现:
{
bool bRet = false ;
TCHAR szDriveLetterAndSlash[ 4 ] = { 0 };
TCHAR szDriveLetter[ 3 ] = { 0 };
TCHAR szUniqueVolumeName[MAX_PATH] = { 0 };
if (lpDriveLetter && lpDevice)
{
szDriveLetter[ 0 ] = lpDriveLetter[ 0 ];
szDriveLetter[ 1 ] = TEXT(':');
szDriveLetter[ 2 ] = TEXT('/ 0 ');
szDriveLetterAndSlash[ 0 ] = lpDriveLetter[ 0 ];
szDriveLetterAndSlash[ 1 ] = TEXT(':');
szDriveLetterAndSlash[ 2 ] = TEXT('//');
szDriveLetterAndSlash[ 3 ] = TEXT('/ 0 ');
if ( bAddMountPoint )
{
// Try to Attach lpDevice to lpDriveLetter
bRet = DefineDosDevice (DDD_RAW_TARGET_PATH, szDriveLetter,
lpDevice);
if (bRet)
{
if ( ! GetVolumeNameForVolumeMountPoint (szDriveLetterAndSlash,
szUniqueVolumeName,
MAX_PATH))
{
// Can't Find Attached lpDevice 's VolumeName
szUniqueVolumeName[ 0 ] = '/ 0 ';
}
bRet = DefineDosDevice (
DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION |
DDD_EXACT_MATCH_ON_REMOVE, szDriveLetter,
lpDevice);
if ( ! bRet)
return bRet;
bRet = SetVolumeMountPoint(szDriveLetterAndSlash,
szUniqueVolumeName);
}
}
else
{
bRet = DeleteVolumeMountPoint (szDriveLetterAndSlash);
}
}
return bRet;
}