LTOOLS - 从 Windows 9x 和 Windows NT 访问你的 Linux 文件
LTOOLS 的核心是一组命令行程序,可以从 DOS 或者 Windows 9x 或 Windows NT 的 DOS 窗口中调用。 它们提供与众所周知的 LINUX 命令 ls、cp、rm、chmod、chown 和 ln 相同的功能。 因此,在 DOS/Windows 下,你可以执行以下操作
列出 Linux 文件和目录(命令: ldir)
将文件从 Linux 复制到 Windows,反之亦然(命令: lread、lwrite)
删除或重命名 Linux 文件(命令: ldel、lren)
创建符号链接(命令: lln)
创建新的 Linux 目录(命令: lmkdir)
修改 Linux 文件的访问权限和所有者(命令: lchange)
更改 Linux 默认目录(命令: lcd)
设置 Linux 默认驱动器(命令: ldrive)并且
显示你的硬盘分区设置(命令: ldir -part)
与许多 UNIX 工具一样,这些功能都包含在一个可执行文件中,该文件通过一组命令行参数调用。 为了简化操作,提供了一组批处理文件(shell 脚本),因此你无需记住和键入所有这些参数。
此外,还有一个 UNIX/Linux 版本的 LTOOLS,可以在 Solaris 甚至 Linux 下使用,当你想要访问另一个硬盘分区上的文件而无需挂载该分区时。
有些人可能觉得命令行程序已经过时,并询问:“LTOOLS 的图形用户界面在哪里?” 好吧,没问题:使用 LTOOLgui。 LTOOLgui 使用 JDK 2 的 Swing 库用 Java 编写,提供类似于 Windows 资源管理器的用户界面(图 1)。 在两个子窗口中,LTOOLgui 显示你的 DOS/Windows 和 Linux 目录树。 可以使用通常的点击操作进行导航。 通过复制和粘贴或拖放操作,可以将文件从 Windows 复制到 Linux,反之亦然。 单击鼠标右键将打开一个对话框,以查看和修改文件属性,如访问权限、GID 或 UID。 双击一个文件将启动它(如果是 Windows 可执行文件),或者使用与其关联的应用程序打开它。 如果 Linux 文件已注册 Windows 应用程序,这也适用。
顺便说一下,你也可以将 LTOOLgui 用作 Linux 下的文件管理器。 由于 LTOOLS 命令行程序也提供 Linux 版本,因此你可以在不挂载磁盘的情况下访问磁盘上的文件。
我选择 Java 用于 LTOOLgui,因为 Java 特别适合低级硬盘访问...开玩笑! 不,当然,这在 Java 中根本不可能。 如果你想直接访问硬件,你必须使用 C++ 代码和 JNI(Java 本地接口)。 但是,由于 JNI 仅适用于 32 位代码,因此在 Windows 9x 下,这意味着使用 32 位到 16 位转换(见下文)。 由于我不喜欢将 Sun 的 Java 与 Microsoft 的 MASM 代码结合使用的想法,因此我采用了另一种方法。 我只是使用了 LTOOLS 的命令行程序,该程序通过众所周知的 stdin/stdout 接口从 Java 调用。 因此,对于 Java 端,硬件访问意味着简单的基于流的文件 I/O。
毫无疑问,任何最先进的程序都必须具有 Internet 意识。 好吧,如果你在一台远程计算机上运行 LREADjav 并通过 LTOOLgui 的连接按钮连接到它,你可以访问此远程服务器上的 Linux 文件,就好像它们是本地文件一样。 LREADjav 是一个简单的服务器守护进程,它将 LTOOLgui 通过 TCP/IP 发出的请求转换为 LTOOLS 命令行程序调用。 命令行程序的输出通过 TCP/IP 发送回 LTOOLgui(见图 2)。 当然,你不仅可以查看目录列表,还可以远程执行所有本地可以执行的操作,包括文件上传和下载。 远程计算机可以运行 UNIX/Linux 或 Windows。 在这一点上,这更像是一个玩具而不是一个严肃的应用程序,因为 LREADjav 可能会带来安全问题。 在默认配置中,它只能从 “localhost” 使用,但可以配置为允许来自三个不同远程客户端的连接。 由于它们仅通过其 IP 地址识别,因此没有密码保护或类似的东西。 但是,如果用户确实需要这样做,他可以轻松地实现登录/密码方案......一切都是开源的!
也许你没有安装 Java 2。 好吧,没问题,只要你有一个 Web 浏览器。 启动 LREADsrv 和你的 Web 浏览器,并在 URL 中键入 http:localhost(见图 3)。 现在,你的 Linux 目录列表应该以图形方式显示在你的 Web 浏览器中。 LREADsrv 是一个小型的本地 Web 服务器,它通过一个简单的 CGI 类似接口,使 LTOOLS 可以通过 HTTP 请求访问,并将它们的输出动态转换为 HTML 页面(见图 4)。 当然,这不仅提供本地访问,还允许通过 Internet 进行远程访问。 但是,对于远程用户,LREADsrv 确实具有与 LREADjav 相同的低安全级别。
由于 LREADsrv 基于 HTML 表单,不支持拖放或直接复制和粘贴,因此使用 Web 浏览器工作比使用基于 Java 的 GUI 稍微不方便。 然而,它提供了相同的功能。
由于 DOS/Windows 本身不支持与外部文件系统的接口,LTOOLS 必须直接访问磁盘上的 “原始” 数据字节。 为了理解 LTOOLS 的内部原理,你需要对以下领域有基本的了解
硬盘如何在分区和扇区中组织,以及如何访问它们,即如何从磁盘读取或写入 “原始” 字节。
在哪里可以找到这些信息。
Linux 的扩展二文件系统是如何组织的。
这自然导致了 LTOOLS 内核的分层架构(见图 5),它由几个 C 文件组成
最低层,第 1 层(在文件 Readdisk.c 中),物理访问硬盘。 这一层处理 DOS、Windows 9x、Windows NT 和 Linux/UNIX 在直接硬盘访问方面(几乎所有)的差异,并尝试将它们对高层隐藏起来(稍后详细介绍)。
第 2 层处理 UNIX 典型的 inode、块和组结构,ext2 文件系统组织成这些结构。
第 3 层管理文件系统的目录结构。
最高层,第 4 层(在 Main.c 中),提供用户界面并扫描命令行参数。
在 DOS 的美好旧时代,生活是轻松的。 只有一种方法可以对你的硬盘进行低级读写访问:BIOS 中断 13h /3/。 BIOS 数据结构将硬盘限制为 1,024 个柱面,63 个磁头和 255 个扇区,每个扇区 512 字节,或 8GB。 大多数 C 编译器都提供一个名为 biosdisk() 的函数。 可以直接使用此函数,而无需用汇编语言进行编码。 几年前,为了适应更大的硬盘,引入了 “扩展” int 13h 函数。 为了克服 BIOS 限制,这些函数使用线性寻址方案,逻辑块地址 (LBA),而不是旧的柱面-磁头-扇区 (CHS) 寻址。
只要程序是用 16 位编译器编译的,这仍然可以在 Windows 9x 的 DOS 窗口中使用(见侧边栏),至少对于读取访问而言。(LTOOLS 使用 Borland C,Windows NT 版本使用 Microsoft Visual C 编译,UNIX/Linux 版本使用 GNU C。)如果你想要低级写入访问权限,你需要 “卷锁定” /3/。 此机制通知操作系统你的程序正在执行绕过操作系统驱动程序的直接磁盘写入,因此 Windows 可以阻止其他程序访问磁盘,直到你完成为止。 同样,可以通过使用 C 编译器的 ioctl() 函数来完成此操作,而无需汇编编程。
在 16 位 Windows 程序中,只能通过 DPMI 调用 BIOS 函数。 由于大多数 C 编译器不提供包装函数,因此这将需要内联汇编器。 但是,Win16 根本不允许命令行程序,所以不用担心。
在 Windows NT 的 DOS 框中,使用 BIOS int 13h 将导致 GPF(一般保护错误)。 出于安全原因,Windows NT 不允许绕过操作系统的直接硬盘访问。 但是,Microsoft 提供了一个几乎与你在 UNIX/Linux 下编写的程序一样简单的解决方案
int disk_fd = open("/dev/hda1", O_RDWR);
这将打开你的硬盘分区 /dev/hda1;要读取,你可以调用 read(),要写入,你可以调用 write()。 简单明了,不是吗? 在 Windows NT 下,如果你使用 WIN32 API /5/,函数 CreateFile() 不仅允许创建和打开文件,还允许创建和打开磁盘分区
HANDLE hPhysicalDrive =<\n> CreateFile("\\\\.\\PhysicalDrive0", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0 );现在可以通过 ReadFile() 和 WriteFile() 完成读取和写入磁盘扇区。
你可能会认为你可以在 Windows 9x 下使用相同的 Win32 函数。 但是,如果你继续阅读 CreateFile() 的文档,你会发现
Windows 95: This technique does not work for opening<\n> a logical drive. In Windows 95, specifying a string in this form causes CreateFile to return an error.
在 Windows 9x 下,微软的 Win32 文档建议通过 VWIN32(系统的一个 VxD 驱动程序,即内核驱动程序)来调用 BIOS Int 13h。但是,如果你尝试这样做,你会失败。微软知识库中的问题报告 Q137176 指出,尽管官方 Win32 文档如此说明,但这只适用于软盘,而不适用于硬盘。正如该问题报告所述,对于硬盘,唯一的选择是在 16 位代码中调用 BIOS Int 16h。要从 32 位程序调用 16 位代码,你需要微软的“32 位到 16 位 thunking”技术。这不仅是另一个 API(具有其他未公开的功能或已知的 bug?),thunking 还要求使用微软的 thunking 编译器,该编译器从定义脚本生成汇编代码。然后,必须使用微软的汇编器 MASM 生成 16 位和 32 位目标文件。这些文件将与你必须编写的十几行 C 代码链接,从而生成 16 位和 32 位 DLL(动态链接库)。顺便说一句,你不仅需要 32 位 Visual C++,还必须拥有旧版本的 16 位 Microsoft C 编译器。使用捆绑的专有且不常用的工具对于像 LTOOLS 这样的开源软件工具来说不是一个好的解决方案!
总而言之,必须为 DOS/Windows 9x、Windows NT 和 Linux/UNIX 提供单独的版本。为了尽可能地对用户隐藏这一点,LTOOLS 尝试找出它正在哪个操作系统下运行,并自动调用相应的可执行文件。
使用 LTOOLS 可能在一定程度上造成安全问题。任何用户都可以访问和修改 Linux 文件系统上的文件;更改文件访问权限或文件所有者;交换密码文件等等。但是,使用简单的磁盘编辑器也可以做到这一点。尽管如此,只有在运行 DOS 或 Windows 9x 时才能实现无限制访问。在 Windows NT 下,LTOOLS 用户需要具有管理权限才能直接访问硬盘。在大多数标准的 UNIX/Linux 安装中,只有系统管理员才具有对原始磁盘设备 /dev/hda、/dev/hda1 等的访问权限。
LTOOLS 不是从 DOS/Windows 访问 Linux 文件的唯一解决方案。Claus Tondering 的 Ext2tool /6/(一套于 1996 年开发的命令行工具)可能是解决此问题的第一个方案。但是,Ext2tool 仅限于只读访问,并且不能在 Windows NT 下运行。基于 Ext2tool,Peter Joot 在 1997 年编写了一个 Windows NT 版本,但仍然限于只读 /7/。这两个程序都是用 C 语言编写的,并且提供了源代码。
John Newbigin 为我们提供了 Explore2fs /8/,它带有一个非常友好的 GUI 并且可以在 Windows 9x 和 Windows NT 下运行。通过读写访问,它提供了与 LTOOLgui 相同的功能。顺便说一下,John 做了出色的工作;他甚至成功地在 Borland 的 Delphi 下实现了微软的 32 位到 16 位 thunking(参见上文)!所有 Delphi 程序 Explore2fs 都可以“无缝”地集成到 Windows 中,但移植到非 Windows 操作系统可能很困难。
LTOOLS 的第一个版本,最初名为“lread”,由 Jason Hunter 和 David Lutz 在俄勒冈州塞勒姆市的威拉米特大学创建。第一个版本在 DOS 下运行,可以显示 Linux 目录列表并将文件从 Linux 复制到 DOS,并且仅限于小型 IDE 硬盘和主分区上的 Linux。
我在 1996 年接管了维护和进一步开发。从那时起,LTOOLS 学会了处理更大的硬盘,访问 SCSI 驱动器,并在 Windows 9x 和 Windows NT 下运行。它们具有额外的写入访问权限,并被移植回 UNIX 以在 Solaris 和 Linux 本身下运行。它们现在有一个基于 Web 浏览器的和基于 Java 的图形用户界面等等。许多 Linux 用户(其中大部分在源代码中都有提及)帮助进行了测试和调试。谢谢你们。
与此同时,在撰写本文时,LTOOLS 已经达到 V4.7 版本 /1/。除了附加功能外,还修复了很多 bug,并且很可能引入了新的 bug。多年来,一个常见的问题一直存在:没有人预见到硬盘技术的快速发展,硬盘大小爆炸式增长并不断达到操作系统限制。你还记得 DOS 的 512MB 磁盘问题,Windows 3.x 的 2GB 分区问题,BIOS 的 8GB 限制以及 Windows NT 在 2GB、4GB 和 8GB 上遇到的各种问题吗?那只是不久前的事情。顺便说一下,即使是 Linux 也有自己的问题。在 2.3 之前的内核中,没有文件可以超过 2GB,因为像大多数 32 位 UNIX 系统一样,Linux 在 read() 或 write() 中使用带符号的 32 位偏移指针。(这个问题在内核 2.4 中通过将偏移量更改为 64 位值来解决,但保持向上兼容性可能会使 Linux 陷入与我们上面讨论的 Windows 相同的问题。)磁盘访问的软件标准化总是比磁盘开发商的步伐慢得多,因此他们发明了专有解决方案来克服操作系统限制。与往常一样,LTOOLS 的开发者(以及许多其他程序员)不得不处理它。因此,如果 LTOOLS 在你全新的 64GB 驱动器上不起作用,请不要生气。它是开源的,所以只需尝试帮助调试和进一步开发它们。
不要忘记,如果你使用 LTOOLS,你需要自行承担风险!对 Linux 的只读访问并不重要。但是,如果你使用写入访问权限来删除文件或修改 Linux 磁盘上的文件属性,LTOOLS(以及你作为用户)可能会造成真正的混乱,因此请始终保留备份。
在“现实生活中”,Werner Zimmermann (Werner.Zimmermann@fht-esslingen.de) 在德国埃斯林根应用技术大学(FH Esslingen—University of Applied Sciences)教授控制工程、数字系统和计算机体系结构。他拥有汽车和工业嵌入式系统的硬件和软件背景。他作为 Linux 系统软件开发人员的“职业生涯”始于 1994 年,当时他购买了一个 Linux 不支持的 CD-ROM 驱动器。他开发了 aztcd.c,一个 Linux CD-ROM 驱动程序,即使驱动器现在已经非常过时,它仍然包含在所有标准的 Linux 内核中 (http://www/it.fht-esslingen.de/~zimmerma/)。