在今天的文章里,我来介绍一下两个来自ports collection的工具,它们用于操作MS-DOS文件系统上的数据。在mtools中的一套DOS风格的命令行工具可以操作软盘上的MS-DOS数据,你硬盘上的其它分区,Jaz和Zip驱动器。程序mfm提供了一个漂亮的GUI图形界面以访问软盘上的MS-DOS数据,并可以在你的宿主目录和MS-DOS格式化过的软盘间快速地传送数据。
这两个工具的优点是可以让用户透明地访问这些数据而无需事先装载文件系统。如果你还记得装载其它文件系统这篇文章里的内容,那么应该知道只有超级用户可以装载文件系统。如果你是个管理员或者使用FreeBSD系统的家庭成员,那么不会出现在有人想访问软件数据时抢着装载文件系统的情况。但是,作为一个新用户,你可能会在取出软件之前忘了卸载文件系统;如果你曾经有这样的经历,你会发现FreeBSD会惊慌,重启或者在你这样做时向你给出讨厌的错误信息。
所以,让我们还是创建这些工具并查看一下如何使用吧。要创建它们有两个方法:预编译安装包或移植port。我会以port方式创建mtools,并以安装包方式安装mfm来示范这两种方法。先成为超级用户,确保已经联入Internet,并进入mtools的port目录进行编译:
su
Password:
cd /usr/ports/emulators/mtools
make && make install
一旦编译完成,打开你最喜爱的web浏览器并联到http://www.freebsd.org/x11-fm.html。往下翻到mfm-1.5,把安装包保存到硬盘上的某个目录中;我已经在系统上建好一个目录/usr/packages用于此目的。当下载完成后:
cd /usr/packages
pkg_add mfm*
当安装好后,用exit退出超级用户账号。如果你正在用C shell,请用rehash命令使命令解释器知道有新的程序了。
让我们来看一下mtools。如果你键入它的名称,它会给出一份你可以使用的工具列表:
mtools
支持的命令有:mattrib、mbadblocks、mcat、mcd、mcopy、mdel、mdeltree、mdir、mdoctorfat、mdu、 mformat、minfo、mlabel、mmd、mmount、mpartition、mrd、mread、mmove、mren、mshowfat、 mtoolstest、mtype、mwrite、mzip。
如果你以前曾经用过DOS的话,就会觉得其中有很多程序名很熟悉的;唯一的区别只是它们都是字母m开头。每个工具都有相关的手册页,所以你可以看一下它们的语法。手册页的第1和第5部分有mtools本身的信息。
让我们来看一下如果键入mcd会发生什么:
mcd
A:/
这看起来还不错,因为这是MS-DOS的提示符用来表示你的软驱。有经验的DOS用户会注意到那个斜杠用Unix风格替代了DOS风格。现在来看看是否可以用mdir命令查看软盘上的内容:
mdir
fd0c: hard error reading fsbn 0 (No status)
plain_io: Input/output error
init A: could not read boot sector
Cannot initialize 'A:'
哦,我太心急了,都忘了在软驱里插张盘了。幸运的是,mdir会在试图访问盘上数据前作仔细检查的。好,现在插张盘再试一下:
mdir
Can't open /dev/rfd0: Permission denied
Cannot initialize 'A:'
在被权限问题搞得头晕之前,先来检查一下mtools的配置文件看它需要什么。如果你键入:
man 5 mtools
你将发现配置文件的名称是mtools.conf,而且它位于/usr/local/etc中。现在看一下谁有该文件的访问权限并更改一下:
ls -l /usr/local/etc
drwxr-xr-x 9 root wheel 1024 Dec 2 11:57 .
-r--r--r-- 1 root wheel 4441 Dec 2 11:50 mtools.conf
看起来任何人都有读此文件,但只有超级用户才能更改内容。(忘了权限的含义?)让我们先来读一下这个文件:
more /usr/local/etc/mtools.conf
# Example mtools.conf files. Uncomment the lines which correspond to
# your architecture and comment out the "SAMPLE FILE" line below
#
# A note on permissions: a user must have read and
# write permissions for the devices named here in
# order to access the DOS file systems. You might
# give ALL USERS access to ALL FLOPPY DISKS via
#the command
#
# chmod a+rw /dev/*fd* /dev/rfd[0-9]*
#
# # FreeBSD floppy drives
drive a: file="/dev/rfd0"
drive b: file="/dev/rfd1"
看来我们需要让所有的用户都有访问软驱的权限;幸运的是,指出FreeBSD软驱设备的那些行已经为我们去掉了注释,所以我们无需对此配置文件作任何更改。
现在看一下/dev/rfd0的权限情况,因为它被mtools看作是“A:”:
ls -l /dev/rfd0
crw-r----- 18 root operator 9, 0 Oct 3 08:51 /dev/rfd0
看来这就是问题所在。因为mtools.conf规定,用户需要rw读写权限来访问该设备,但现在用户只有r读。由于该文件属于root,我们必需成为超级用户才能更改它的权限;因为我只有一个软驱,所以就对这个设备加入了rw权限:
su
Password:
chmod a+rw /dev/rfd0
ls -l /dev/rfd0
crw-rw-rw- 18 root operator 9, 0 Oct 3 08:51 /dev/rfd0
离开超级用户账号并以普通用户身份再试一下mdir命令;你应该可以看到软盘上的内容了。
让我们再假设一些东西。我在自己的硬盘的起始部分有一个FAT分区;让我们来看一下mtools是否能访问它。在mtools.conf中有一些行是关于硬盘的:
more /usr/local/etc/mtools.conf
# IDE hard disks
# first disk on the first IDE
# interface (wd0) slice 1 (s1)
drive c: file="/dev/rwd0s1"
由于我使用的FreeBSD版本高于4.0,所以其第一个IDE接口实际称为ad0而不是wd0了。这样我需要变为超级用户并编辑一下刚才读到的行:
drive c: file="/dev/rad0s1"
^
当现在是超级用户时,我还要检查一下该设备的权限情况:
ls -l /dev/rad0s1
crw-r----- 1 root operator 116, 0x00020002 Oct 4 15:58 rad0s1
并更改一下以使用户可以访问C:盘:
chmod a+rw /dev/rad0s1
然后,作为一个普通用户,来看一五我是否能访问A:盘和C:盘上的数据:
mcd a:
mdir
Volume in drive A has no label
Volume Serial Number is 3505-18E3
Directory for A:/
dru3 txt 2846 11-28-2000 21:46
inetdc~1 txt 13669 10-05-2000 21:22 inetd.conf.txt
cisco doc 10752 11-13-2000 18:07
3 files 27 267 bytes
1 428 698 bytes free
mcd c:
mdir
Volume in drive C has no label
Volume Serial Number is 39D0-A67B
Directory for C:/
bootsect bsd 512 10-04-2000 15:22
confer~1 11-01-2000 20:39 conferencing server
sybex 11-10-2000 20:18 Sybex
3 files 512 bytes
492 470 272 bytes free
现在,我知道在我的C:盘上有一些隐藏文件;如果看一下man dir的话,会知道-a开关能显示隐藏文件。让我们再试一下:
mdir -a
Volume in drive C has no label
Volume Serial Number is 39D0-A67B
Directory for C:/
bootsect dos 512 10-04-2000 15:33
config sys 0 10-04-2000 15:40
autoexec bat 0 10-04-2000 15:40
io sys 0 10-04-2000 15:40
msdos sys 0 10-04-2000 15:40
bootsect bsd 512 10-04-2000 15:22
msdownld tmp 10-04-2000 16:10
confer~1 11-01-2000 20:39 conferencing server
recycled 11-01-2000 21:01 Recycled
sybex 11-10-2000 20:18 Sybex
arcldr exe 148992 12-07-1999 12:00
arcsetup exe 162816 12-07-1999 12:00
ntldr 214416 12-07-1999 12:00
ntdetect com 34468 11-25-2000 21:45
boot ini 214 11-25-2000 20:00
pagefile sys 104857600 11-25-2000 19:51
16 files 105 419 530 bytes
492 470 272 bytes free
再看一下我是否可以读取其中一个文件:
mtype boot.ini
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(3)\WINNT
[operating systems]
multi(0)disk(0)rdisk(0)partition(3)\WINNT="Microsoft
Windows 2000 Server" /fastdetect
C:\bootsect.bsd="FreeBSD"
那么我是否能把该文件拷到我的软盘上呢:
mcopy boot.ini a:
我的软盘一阵颠簸,这是个好信号。来检查一下是否正确:
mdir a:
Volume in drive A has no label
Volume Serial Number is 3505-18E3
Directory for A:/
dru3 txt 2846 11-28-2000 21:46
inetdc~1 txt 13669 10-05-2000 21:22 inetd.conf.txt
boot ini 214 12-03-2000 11:25 boot.ini
cisco doc 10752 11-13-2000 18:07
4 files 27 481 bytes
1 428 484 bytes free
在FreeBSD系统下把NT引导分区上的文件传送到软盘上真是非常棒啊。我还可以容易地把文件发回来,甚至在FreeBSD和C:盘或A:盘之间也可以。
关于mtools还要注意一点,它提供了DOS风格的工具,DOS的功能是相当有限的。例如,我就不能阅读软盘上的cisco.doc文件,因为DOS不能识别“doc”扩展名。如果你同时在A:盘和C:盘上工作,就必需象这样在它们之间用mcd切换:
mcd a: 查看和操作A:盘上的数据
mcd c: 查看和操作C:盘上的数据
另外,确保你只试图访问MS-DOS文件系统;也就是说,不要尝试查看用Unix文件系统格式化的软盘上的内容。
现在来看一下mfm。这个工具用起来很简单,因为它有个直观的界面;不过它的功能比mtools更有限,因为它只有用于访问软盘上的MS-DOS数据。让我们来看一下它安装到哪儿去了:
whereis -b mfm
mfm: /usr/X11R6/bin/mfm
因为它是个GUI,你必需在XWindows中运行它。我在XFCE工具条上建了个快捷方式。如果你还不知道如何在窗口管理器中建立快捷方式的话,打开一个xterm并键入带路径的mfm。(mfm的一个抓图链接)
当它打开时,你会看到一个带有两个面板的窗口;缺省情况下,这两个面板都会显示你宿主目录的内容。目录有一个文件夹图标,而它的名称和属性以蓝色显示。文件的图标看起来象一张纸,而它的属性以黑色显示。如果用鼠标点击Options菜单,可以选“Show dot files”以显示隐藏文件。
现在插入你的软盘;在其中一个面板顶部的菜单条上点击箭头并选a:,你会看到软盘上的内容。通过选择软盘上的一个文件并点击Copy按钮就可以把该文件拷到宿主目录里了。或者点击宿主目录里的一个文件就可以快速地把它拷到软盘上了。
在面板上点周File菜单,你会看到删除、换名、打印和选择文件的选项。用这个菜单还可以建立一个新目录。如果取出了那张盘插一张新的话,用View菜单的刷新选项查看新盘上的内容。
虽然功能有限,mfm仍然是以可视化操作宿主目录内容的最快方法。我还发现它是在软盘和宿主目录间发送文件最简单的方法。