快速业务通道

Linux下如何迁移VG及文件系统

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-07

这个系统调用向指定设备发送控制代码和其他数据.相应设备驱动程序按照控制代码 dwIoControlCode 的指示工作.例如,使用IOCTL_DISK_GET_DRIVE_GEOMETRY 可以从物理驱动器获取结构参数(介质类型、柱面数、每柱面磁道数、每磁道扇区数等).可以在 MSDN 网站上找到所有控制代码定义、头文件和其他详细内容(参见 参考资料 获得相关链接).

是否需要输入/输出缓冲,以及它们结构和大小怎样,都取决于实际 ioctl 过程涉及的设备和操作,并由该调用指定的 dwIoControlCode 确定. 拥有帝国一切,皆有可能。欢迎访问phome.net

如果重叠操作的指针设为 NULL,那么 DeviceIoControl 将以阻塞(同步)方式工作.否则,它以异步方式工作.

Linux 函数 ioctl

Linux 可以使用 ioctl — int ioctl(int fildes, int request, /* arg */ ...); — 向指定设备发送控制信息.第一个参数 fildes 是函数 open() 返回的文件描述符,用于指称具体设备.

与对应的系统调用 DeviceIOControl 不同,ioctl 的输入参数列表并不固定.它取决于 ioctl 进行何种请求,以及请求参数有何说明,正如 Windows 函数 DeviceIOControl 的参数 dwIoControlCode 一样.但是,迁移期间需要注意何时选择正确的请求参数, DeviceIOControl 的 dwIoControlCode 和 ioctl 的 request 具有不同的取值. dwIoControlCode 与 request 之间没有显式映射列表.通常可以在相关头文件中查找请求参数值的定义来选择参数值.所有控制代码的定义在 /usr/include/{asm,linux}/*.h 文件中.

参数 arg 为具体设备的运转提供详细的命令信息.arg 的数据类型取决于特定控制请求.这个参数可以用于发送详细命令和接收返回数据.

迁移示例

我们查看一个从 Windows 向 Linux 迁移的过程的示例.这个示例涉及从个人电脑主 IDE 硬盘驱动器读取 SMART 日志.

步骤 1. 识别设备类型

如前所述,Linux 的各个设备被当作文件.要描述设备在 Linux 上的文件名.只有使用这个文件名,才能获取设备控制需要的设备句柄.

在这个示例中,对象是 IDE 硬盘驱动器.Linux 将其描述为 /dev/hda、/dev/hdb 等.本例将要迁移的硬盘设备路径名是 \\.\PhysicalDrive0./dev/hda 是该设备对应的 Linux 文件名.

步骤 2. 改变包含头文件

将 #include 头文件改为 Linux 形式(参见表 3):


表 3. #include 头文件
拥有帝国一切,皆有可能。欢迎访问phome.net
Windows Linux
#include <windows.h> #include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <devioctl.h> #include <sys/ioctl.h>
#include <ntddscsi.h> #include <linux/hdreg.h>

windows.h 包含打开和关闭设备的函数(CreateFile 和 CloseHandle).相应地,在 Linux 中用于 open() 和 close() 的函数应当包含头文件 sys/types.h、sys/stat.h 和 fcntl.h.

Windows 的 devioctl.h 用于函数 DeviceIoControl,我们将其改为 sys/ioctl.h 以确保该函数 ioctl 能够工作.

ntddscsi.h(它是来自 DDK 的头文件)定义了一组用于设备控制的控制代码.本例只处理 IDE 硬盘驱动器,只需将 linux/hdreg.h 添加到 Linux 程序.

对于其他情况,应当确保包含所有头文件(它们带有所需的控制代码的定义).例如,如果访问 CD-ROM 而非硬盘驱动器,那么应当包含 linux/cdrom.h.

步骤 3. 改正函数和参数

现在我们详细查看代码.清单 4 显示命令的详细信息.


清单 4. 命令详解
                

unsigned char cmdBuff[7];

cmdBuff[0] = SMART_READ_LOG;  // Used for specifying SMART "commands"

cmdBuff[1] = 1;               // IDE sector count register

cmdBuff[2] = 1;               // IDE sector number register

cmdBuff[3] = SMART_CYL_LOW;   // IDE low order cylinder value

cmdBuff[4] = SMART_CYL_HI;    // IDE high order cylinder value

cmdBuff[5] = 0xA0 | (((Dev->Id-1) & 1) * 16); // IDE drive/head register

cmdBuff[6] = SMART_CMD;       // Actual IDE command


凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号