3.3.处理 FAT/VFAT 分区

编写:Steven Elliott

(提取自 wine/documentation/linux-fat-permissions)

本文描述工作在 Linux 中对 FAT 和 VFAT 文件系统的权限,焦点是为 Wine 配置它们。

3.3.1. 介绍

Linux 可以使用 FAT (老的 8.3 DOS 文件系统) 或 VFAT (新的 Windows 95 或后来的长文件名文件系统) 模块访问 DOS 和 Windows 文件系统。在双引导(Linux + Windows)系统上,要通过 Wine 访问现存的应用程序和它们的数据,挂装 FAT 或 VFAT 文件系统是提供的主要的方式。

按照 ~/.wine/config 文件的指示,Wine 把挂装的 FAT 文件系统比如 /c,映射成驱动器字母比如 "c:"。下列摘录自一个 ~/.wine/config 文件:

[Drive C]
"Path" = "/c"
"Type" = "hd"
        

尽管在长文件名支持上 VFAT 文件系统优于 FAT 文件系统,在本文剩余部分中使用术语 "FAT" 来参照 FAT 文件系统和它的衍生品。还有,本文通篇使用 "/c" 作为 FAT 挂装点的例子。

多数现代 Linux 发布要么检测现存的 FAT 文件系统要么允许配置现存的 FAT 文件系统,这样,可以要么持久的(在引导时)要么在需要的时候,在一个位置上如 /c 挂装它们。在任何一种情况下,缺省的,权限可能被配置成:

~>cd /c
/c>ls -l
-rwxr-xr-x   1 root     root           91 Oct 10 17:58 autoexec.bat
-rwxr-xr-x   1 root     root          245 Oct 10 17:58 config.sys
drwxr-xr-x  41 root     root        16384 Dec 30  1998 windows
        

这里所有的文件都属于 "root",都在 "root" 组中并只能被 "root" 写(755 权限)。 这限制了应用程序要想写文件系统的任何部分,只能以 root 运行 Wine。

有三种主要的途径来克服上面段落提及的受限制的权限:

 

  1. 以 root 运行 Wine 

  2. 用更少受限制的权限来挂装 FAT 文件系统

  3. 通过完全或部分复制它来隐蔽 FAT 文件系统

在下面的小节中将讨论每种方式。

3.3.2. 以 root 运行 Wine

要给予 Wine 所运行的应用程序无限制的对 FAT 文件系统访问,以 root 运行 Wine 是最简单和最直接的方式。以 root 运行 wine 还允许应用程序做与 FAT 文件系统无关的事情,比如监听小于 1024 的端口。 以 root 运行 Wine 是危险的,原因是对应用程序在系统上的所作所为没有限制。

3.3.3. 挂装 FAT 文件系统

可以用比缺省更少受限制的权限挂装 FAT 文件系统。要么变更挂装 FAT 文件系统的用户,要么显式的变更挂装的 FAT 文件系统的权限。 FAT 文件系统从挂装 FAT 文件系统的进程继承权限。因为挂装 FAT 文件系统的进程通常是以 root 运行的一个启动脚本,FAT 文件系统继承 root 的权限。这导致在 FAT 文件系统上的文件有类似于用 root 建立的文件的权限。例如:

~>whoami
root
~>touch root_file
~>ls -l root_file
-rw-r--r--   1 root     root            0 Dec 10 00:20 root_file
        

它匹配属主、组和除了缺少‘x’之外在 FAT 文件系统上见到的文件权限。在 FAT 文件系统上的权限可以通过改变 root 的 umask (unset permissions bits)来变更。例如:

~>umount /c
~>umask
022
~>umask 073
~>mount /c
~>cd /c
/c>ls -l
-rwx---r--   1 root     root           91 Oct 10 17:58 autoexec.bat
-rwx---r--   1 root     root          245 Oct 10 17:58 config.sys
drwx---r--  41 root     root        16384 Dec 30  1998 windows
        

用 umask 码 000 挂装 FAT 文件系统给予所有用户对它的完全控制。在挂装的时候提供额外的控制,显式的指定 FAT 文件系统的权限。与 FAT 权限相关的有三个挂装选项: uidgidumask。在手动挂装文件系统的时候可以指定它们。例如:

~>umount /c
~>mount -o uid=500 -o gid=500 -o umask=002 /c
~>cd /c
/c>ls -l
-rwxrwxr-x   1 sle      sle            91 Oct 10 17:58 autoexec.bat
-rwxrwxr-x   1 sle      sle           245 Oct 10 17:58 config.sys
drwxrwxr-x  41 sle      sle         16384 Dec 30  1998 windows
        

给予 "sle" 在 /c 上完全控制权限。可以通过在上面列出的选项添加到 /etc/fstab 文件中而使之成为永久:

~>grep /c /etc/fstab
/dev/hda1  /c  vfat  uid=500,gid=500,umask=002,exec,dev,suid,rw 1 1
        

注意 umask 码 002 一般用于用户私有组文件权限中。在 FAT 文件系统上这个 umask 确保在指定组(gid)中的所有用户可以完全访问所有文件。

3.3.4. 隐蔽 FAT 文件系统

隐蔽提供了精细的控制粒度。通过复制部分最初的 FAT 文件系统,应用程序可以安全的在复制的这部分上工作,而继续直接读其余的部分。这是通过符号连接完成的。例如,考虑一个叫 AnApp 的应用程序必须能读写 c:\windowsc:\AnApp 目录而可读整个 FAT 文件系统的的一个系统。在这个系统中 FAT 文件系统有缺省的权限,出于安全的原因或缺乏 root 访问权限而不应该被改变。在这个系统上可以用下列方式设置一个隐蔽目录:

~>cd /
/>mkdir c_shadow
/>cd c_shadow
/c_shadow>ln -s /c_/* .
/c_shadow>rm windows AnApp
/c_shadow>cp -R /c_/{windows,AnApp} .
/c_shadow>chmod -R 777 windows AnApp
/c_shadow>perl -p -i -e 's|/c$|/c_shadow|g' /usr/local/etc/wine.conf
        

上述命令给予所有用户对 windowsAnApp 目录完全的读写访问,而只有 root 可以写访问其他目录。