注意: 本程序编写时考虑了 RedHat Linux 6.0。虽然此程序通常适用于所有 Linux 发行版,但细节可能有所不同。 欢迎您添加适用于您的发行版的详细信息。 许多用户已经拥有专门用于 Linux 的交换分区。 我假设您有一个。
启动 Linux。 通过编辑 /etc/fstab 文件并注释掉描述您的交换分区的行来关闭交换。
在 Linux 下使用 fdisk,删除交换分区以便在磁盘上创建可用空间。
启动 DOS。 创建一个 DOS 分区(使用 FDISK),大小 = 您想要的交换空间大小。 如果您无法创建分区(可能是因为 DOS FDISK 表示扩展分区中的所有空间都已分配给逻辑驱动器),您可以使用 Linux 下的 fdisk 或 cfdisk 来创建分区。 您甚至可以只将交换分区的类型从 82h(Linux 交换)更改为 06h(FAT16)。 在这种情况下,您不需要删除交换分区,只需更改类型即可。
创建分区后,如果您尚未进入 DOS,请启动 DOS。 DOS 将为您的新分区分配一个驱动器盘符。 在这些说明列出诸如“LABEL X:”或“COPY FOO X:DUMMY.DAT”之类的命令时,请使用该驱动器盘符代替 X。
使用 DOS FORMAT 命令格式化此分区。
C:\>FORMAT X:
使用 DOS LABEL 命令将此分区的卷标设置为“SWAP SPACE”。 通过 DIR 命令验证它。 请将其作为单独的步骤执行。 某些版本的 FORMAT 似乎没有像应有的那样将卷标放入引导扇区。[注意:有人写信告诉我卷标存储在根目录中。 是的,但至少自 DOS 5.0 以来,它也位于引导扇区中。]
C:\>LABEL X:
C:\>DIR X:
在此阶段,您已经准备好一个 DOS 分区用于交换。
启动 Windows。 转到控制面板,选择“386 增强”。 选择“虚拟内存”,并在驱动器 X: 上创建最大大小的 Windows 永久交换文件(Windows 会告诉您最大大小)。 Windows 可能会抱怨说它不会使用如此大的交换文件。 忽略该消息并仍然创建文件。
退出 Windows。
启动 Windows。 转到控制面板(开始 | 设置 | 控制面板)。 双击“系统”图标。 在出现的“系统属性”对话框中,选择“性能”选项卡。 现在单击“虚拟内存”按钮。 这将弹出“虚拟内存”对话框。 选择“让我自己指定虚拟内存设置”。 选择您打算与 Linux 共享作为交换空间的驱动器 (X:)。 将最大值和最小值保持为 Windows 选择的值。 单击“确定”。 Windows 将提示您重新启动计算机。 执行重启。
当您重新启动 Windows 时,您将看到 win386.swp 文件已在 X: 驱动器上创建。 此外,还有一个 Recycled 文件夹。 由于您不打算在此驱动器上存储任何其他文件,并且此分区上的单个文件也很方便,请告诉 Windows 不要为此 (X:) 驱动器维护回收站。 在桌面上,左键单击“回收站”图标,然后在弹出的菜单中,单击“属性”。 这将弹出“回收站属性”对话框。 单击“全局”选项卡,然后选择“独立配置驱动器”。 现在单击 X: 驱动器的选项卡(卷标为 SWAP SPACE)。 在此对话框中,将“回收站的最大大小”滑块移动到 0%。 “已保留空间”条目现在应显示为 0 字节。 单击“确定”。 重新启动计算机。
现在您没有为驱动器 X: 维护回收站,理想情况下,Windows 应该删除 X: 中的 RECYCLED
文件夹。 Windows 不仅没有这样做,而且也不允许您删除该文件夹。 但正如我之前所说,此文件夹现在是不必要的,我们希望驱动器 X: 仅包含 win386.swp 文件。 为此,首先在 MS-DOS 模式下启动计算机。 选择“开始”|“关机”|“在 MS-DOS 模式下重新启动计算机”,或者如果您正在启动 Windows,请在启动时按 F8,然后从启动菜单中选择“仅命令提示符”。 进入 MS-DOS 模式后,键入以下命令
C:\>X:
X:\>ATTRIB -R -H -S RECYCLED
X:\>DELTREE RECYCLED
现在您的驱动器 X: 仅包含 win386.swp。 您可以使用 dir
命令的各种选项来验证这一点。 这并不意味着 RECYCLED
文件夹将不会存在于驱动器 X: 上。 当 Windows 启动并发现 X: 上没有 RECYCLED
文件夹时,它将自动创建它。 但是,当我们从 Linux 恢复 X: 时,它将仅包含 win386.swp 文件。 如果有人知道阻止 Windows 创建 RECYCLED
文件夹的方法,请给我发送电子邮件。
如果您安装了磁盘清理,那么 Windows 偶尔会弹出“驱动器 X: 磁盘空间不足”。 由于我们正在使用整个 X: 驱动器进行交换,因此无需在 X: 上有任何可用空间。 要阻止此对话框出现,请启动磁盘清理(指向“开始”|“程序”|“附件”|“系统工具”|“磁盘清理”)。 在出现的对话框中,选择 X: 驱动器,然后单击“确定”。 出现“驱动器 X: 的磁盘清理”对话框。 单击“设置”选项卡,然后取消选中“如果此驱动器磁盘空间不足... 啦啦啦”复选框。
>从这个阶段开始,Windows 将假定其交换文件位于驱动器 X: 上。 因此,每次启动 Windows 时,驱动器 X: 都必须完好无损。 如果您正在使用一些额外的系统实用程序(如适用于 Windows 95 的 Norton Utilities),那么您应该查阅在线帮助或手册,以使它们了解设置的更改,否则它们可能会弹出错误消息。
启动 Linux,然后以 root 用户身份登录。
使用 fdisk 命令查找分区名称及其大小(以块为单位)。 从 /dev/winswap
创建到此分区的符号链接。 如果分区是 hda7,则键入
# ln -s /dev/hda7 /dev/winswap
[给纯粹主义者的提示:请使用符号链接。 此分区的名称将进入多个配置文件,不一致可能会致命。]
查找交换驱动器的“总特殊扇区”。 这些仅仅是引导扇区、FAT 和根目录所需的扇区总数。 有多种方法可以找到这个数字。 最简单的方法是使用您喜欢的编辑器复制 msinfo.sh 文件。 在 shell 提示符下给出以下命令
# cp Swap-Space-HOWTO msinfo.sh
# chmod +x msinfo.sh
(如果您使用带有 KDE 或 GNOME 的编辑器之一,则更容易)
现在,在编辑器中打开 msinfo.sh 文件,并删除除第 8 节中的 msinfo.sh 文件外的所有内容。 现在运行此文件,如下所示
# ./msinfo.sh /dev/winswap
该程序将打印有关交换分区的一些信息。 记下显示“总特殊扇区”的数字,并验证卷标是否显示“SWAP SPACE”。 如果没有,请重新启动 DOS 并重新执行 LABEL 命令。
注意: 您还可以使用可以显示引导扇区的工具(如 Norton Disk Editor 或 Linux 下 mtools 中的 minfo)来查找“总特殊扇区”。 对于 Norton Disk Editor,从“对象”菜单中选择“引导扇区”。 记下以下条目
Reserved Sectors at beginning : r
FAT Copies : f
Sectors per FAT : s
Root directory entries : r
现在,“总特殊扇区”由下式给出
T = r + (s * f) + (d / 16)
但是,使用上面的程序更方便。
让我们用 XXX 表示这些总特殊扇区。
[可选步骤] 即使告诉 Windows 不要这样做,它也可能会偶尔在分区上留下一些空间。 不要尝试使用此空间,因为它会在您运行 Linux 时被擦除。 如果您想避免意外使用它(并丢失数据),您可以创建一个虚拟文件来填充该空间,使用以下命令
mkdir /mnt
mount -t msdos /dev/winswap /mnt
dd if=/dev/zero of=/mnt/dummy.fil
umount /mnt
dd 命令将报告“设备上没有剩余空间”。 这正是您想要的。
在 shell 提示符下键入
# dd if=/dev/winswap bs=512 count=XXX | gzip -9 > /etc/winswap.gz
^^^
... 其中 XXX 替换为“总特殊扇区”数字。
这里我们将总特殊扇区以压缩形式保存在文件 /etc/winswap.gz 中
现在,我们将修改我们的初始化脚本,以便每次 Linux 启动时都会在分区上创建交换空间,并且每次 Linux 关闭时都会恢复 DOS/Windows 特殊扇区。
我们将准备两个单独的文件,名为 swapinit.sh 和 swaphalt.sh,而不是直接在初始化脚本中放置处理细节的命令。 末尾的章节给出了一个在 Red Hat Linux 下应该可以工作的这些文件的示例。 您可以选择将这些文件放在任何目录中,最好是 /etc/rc.d/init.d。 在此目录中创建这两个文件,并将末尾章节中给出的脚本复制到其中。 一种简单的方法是将此 HOWTO 复制到这些文件中,如下所示:
# cp Swap-Space-HOWTO /etc/rc.d/init.d/swapinit.sh
# cp Swap-Space-HOWTO /etc/rc.d/init.d/swaphalt.sh
然后使用您喜欢的编辑器,删除除所需部分外的所有内容。 现在通过给出以下命令使这些文件“可执行”
# chmod +x swapinit.sh
# chmod +x swaphalt.sh
运行 fdisk 并查找交换分区的大小(以块为单位)。 在上述两个文件 (swap????.sh) 中,将 YYYYY 替换为此数字。
检查关闭文件的名称。 对于 SysVinit,这是 /etc/inittab 的以下行中列出的文件; 如果您没有,请添加它。
# Runlevel 0 means shut down the system
l0:0:wait:/etc/brc
(在 Red Hat Linux 下,此文件可能是 /etc/rc.d/init.d/halt)如果您无法找到它,请浏览 /etc 目录并找到包含“swapon -a”命令的初始化文件。 目前就这么多!
对于本文档的其余部分,我将假定文件名为 /etc/rc.d/init.d/halt(简称为 halt)。
检查您的系统初始化文件的名称。 对于 SysVinit,这是 /etc/inittab 的以下行中列出的文件。
# System initialization
si::sysinit:/etc/rc.d/rc.sysinit
在您的发行版中,您的文件可能不同。 我假设该文件是 /etc/rc.d/rc.sysinit(简称为 rc.sysinit)
将以下代码片段添加到您的初始化文件 (rc.sysinit) 中,以替换“swapon -a”命令。 您可以考虑不删除而只是注释掉原始命令,这样如果出现问题,我们可以将脚本恢复到初始状态。
如果您的 swapon 在 /etc 中,请将 /sbin/swapon 替换为 /etc/swapon。 如果它在 /bin 中,则替换为 /bin/swapon。 对 mkswap 执行相同的操作。
# -----------------------------------------------------------------------
# removed by yourname
# Start up swapping.
# action "Activating swap partitions" swapon -a
# -----------------------------------------------------------------------
# ----------------------------------------------------------------------
# added by yourname
# Verify and initialize swap space
#
/etc/rc.d/init.d/swapinit.sh
# ----------------------------------------------------------------------
粘贴文本的一种简单方法是启动两个虚拟控制台。 在两种情况下都以 root 身份登录。 使用您喜欢的编辑器在一个控制台上打开此 HOWTO,在另一个控制台上打开要修改的脚本。 现在用鼠标选择上面的代码,然后切换到另一个控制台。 将光标放在要粘贴的所需位置,然后按鼠标右键。 所选文本将被复制。
将以下代码片段添加到您的关闭文件 (halt)。 将其放在任何可能需要交换才能就位的命令之后。 通常,您的 halt 文件将具有“swapoff -a”命令。 首先将 -a 替换为 /dev/winswap。 然后紧接在该部分之后,添加以下命令。
RedHat Linux 6.1 注意事项: 似乎 Red Hat Linux 6.1 halt 脚本会自动查找所有交换分区并关闭交换。 因此,RedHat Linux 6.1 用户无需将 swapoff $SWAPS
命令替换为 swapoff -a
命令。 在这种情况下,只需将 /etc/rc.d/init.d/swaphalt.sh
命令添加到 halt 文件即可
# ------------------------------------------------------------------------
# Modified by yourname
# replaced "swapoff -a" by "swapoff /dev/winswap"
#
# Turn off swap, then unmount file systems.
runcmd "Turning off swap and accounting" swapoff /dev/winswap
[ -x /sbin/accton ] && /sbin/accton
# ------------------------------------------------------------------------
# ------------------------------------------------------------------------
# Added by yourname
# check swap signature and restore Windows swap info
/etc/rc.d/init.d/swaphalt.sh
# ------------------------------------------------------------------------
取消注释您之前注释掉的 /etc/fstab 中的行。(实际上没有必要,因为我们现在不参考 fstab 来获取交换分区)。 重新启动 Linux。 您现在应该在新交换设备上进行交换。