有朋友问我怎么用软件实现修改分区盘符,让我找了老半天 。终于找到了
官方:
[http://support.microsoft.com/default.aspx/kb/280297]
如何在群集服务器上配置卷装入点
| 文章编号 | : | 280297 |
| 最后修改 | : | 2004年3月11日 |
| 修订 | : | 1.0 |
概要
使用 NTFS 卷装入点功能,可以突破 26 个驱动器号的限制。通过使用卷装入点,可以将目标分区移植或
装入 到其他物理磁盘上的文件夹中。卷装入点对于程序而言是透明的。本文讨论如何在服务器群集上创建卷装入点,并讨论与其相关的注意事项。
将装入点添加到共享磁盘上与将装入点添加到非共享磁盘上相同。装入点由 Win32 API SetVolumeMountPoint 添加,由 DeleteVolumeMountPoint 删除。这与磁盘资源动态链接库 (DLL) 无关。资源 DLL 仅关心卷全局通用标识 (GUID),而不是实际的装入点。
有三种向系统添加装入点的方法(对于群集系统和非群集系统相同):
| • | 逻辑磁盘管理器 (Diskmgmt.msc) |
| • | 从命令提示符处运行 Mountvol.exe |
| • | 使用 Win32 API SetVolumeMountPoint 和 DeleteVolumeMountPoint 编写您自己的 .exe 文件 |
回到顶端
更多信息
在服务器群集上创建卷装入点时,需要考虑以下与卷装入点相关的主要事项:
| • | 不能在群集和非群集磁盘之间创建装入点。 |
| • | 不能创建“仲裁”磁盘的装入点。 |
| • | 如果您具有从一个共享磁盘到另一个共享磁盘的装入点,必须确保它们位于同一组内,并且装入的磁盘依赖于根磁盘。 |
回到顶端
在群集服务器上安装卷装入点
| 1. | 在本地使用管理权限登录到拥有根磁盘(您要将目录移植到该磁盘中)的节点。该磁盘就是将包含装入点的磁盘。 |
| 2. | 打开群集管理器 (CluAdmin.exe),并暂停群集中的其它节点。 |
| 3. | 将磁盘分区,然后创建装入点。为此,请执行以下步骤: | a. | 要打开磁盘管理,请单击开始,再单击运行,键入 diskmgmt.msc,然后单击确定。 | | b. | 选择要移植到目录中的磁盘。 | | c. | 用鼠标右键单击磁盘上的可用空间,然后单击新建磁盘分区。 | | d. | 创建主磁盘分区,然后单击下一步。 | | e. | 设置分区的大小。 | | f. | 选择“装入以下空白 NTFS 文件夹中”,单击浏览以找到要在其中创建装入点的目录,然后单击新建文件夹(这将是卷装入到的根目录)。单击新创建的文件夹,再单击确定,然后单击下一步。 | | g. | 使用 NTFS 文件系统格式化分区。
这既是 Microsoft Cluster Server (MSCS) 的要求,也是“卷装入点”功能的要求。 | |
| 4. | 新建磁盘资源,然后设置依赖项。为此,请执行以下步骤: | a. | 打开群集管理器。 | | b. | 对于刚在其中创建卷装入点的磁盘,用鼠标右键单击拥有该磁盘的“共享磁盘”资源的组。单击新建,然后单击资源。 | | c. | 对于资源类型,请单击物理磁盘。验证它与根磁盘位于同一组中。单击下一步。 | | d. | 确保所有节点都是可能的所有者,然后单击下一步。 | | e. | 双击根磁盘,使该卷装入点磁盘依赖于根磁盘。单击下一步。 | | f. | 在“磁盘参数”窗口中,应该看到磁盘被列出。磁盘将按磁盘编号和分区编号列出,这不同于标准 MSCS 磁盘(标准 MSCS 磁盘按驱动器号列出)。单击完成。 | | g. | 用鼠标右键单击新磁盘资源,然后单击联机。 | |
| 5. | 中止暂停所有其他节点,并测试您是否可以将组故障转移到每个节点并访问新创建的装入点。 |
有关如何从命令提示符处创建卷装入点的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
205524 (http://support.microsoft.com/kb/205524/EN-US/) How to Create and Manipulate NTFS Junction Points
有关操作系统如何处理驱动器的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
234048 (http://support.microsoft.com/kb/234048/EN-US/) How Windows 2000 Assigns, Reserves, and Stores Drive Letters
回到顶端
这篇文章中的信息适用于:
| • | Microsoft Windows Server 2003 Enterprise Edition |
| • | Microsoft Windows Server 2003 Datacenter Edition |
回到顶端
转自:[http://www.cnblogs.com/henryzc/articles/316806.html]
昨天,在CSDN中看见帖子寻求解决挂载盘符的问题,今天把它搞定了。
改变盘符主要是用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( _T("H:\\"), _T("\\\Device\\HarddiskVolume2"),true);
卸载的话用:
ChangeMountPoint( _T("H:\\"),NULL, false);
下面是ChangeMountPoint函数的实现:
bool ChangeMountPoint(LPCTSTR lpDriveLetter,LPCTSTR lpDevice,bool bAddMountPoint)
{
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;
}