首页 地图 索引 搜寻 新闻 库存档案 相关网站 关於 LinuxFocus
[功能表 1]
[功能表 2]
[Photo of the Author]
作者: Olivier Chapuis

关於作者:

作者主修数学,尤其是电脑的逻辑,方程和理论。 他最近才发现 Linux 而且非常喜爱它。作者喜欢 Muriel ,跳水, 也喜欢 Brittney ,海,航行和好吃的东西。

内容:

  1. 简介
  2. 主要步骤
  3. 准备工作
  4. 重新建立 Windows 的硬碟分割区
  5. 使用新的分割区
  6. 问题
  7. 参考资料

如何移除 Windows

[Ilustration]

前言:

我在这篇文章里要讲解的是如何从 Linux 和 Windows 共存的机器中移除 Windows 系统, 而且把空出来的空间留给 Linux 用。 这篇文章的主要对象是给 Linux 的新手 (也包括我自己)。



 

简介

安装完 Linux 两个月後的某一天,我突然想把 Windows 删掉。 原因是我根本不想再用 Windows 了! 我想许多的初学者可能也遇到和我同样的情况, 所以我写了这篇文章来帮助他们 (进阶者也可以读读,给我一些建议)。 这种情况有两种解决办法:

第一种是从新安装 Linux。这样的好处是即使你对 Linux 知道的不多, 也可以在安装时做出很好的选择,尤其在处理磁碟分割 (Disk Partitioning) 的时侯。 但缺点是你会丢掉硬碟上所有的东西。虽然你也可以把必要的档案先备份起来, 但是还原的工作会花上很多的时间和心血。

第二种方法是直接移除 Windows (很简单),然後再把空出来的空间挪给 Linux 用。 也就是说,「重新分割」(Repartition),这道手续有点困难,相关文件也不多。 但好处是你的系统会和从前的一模一样,只是多了很多空间。而且如果你没有成功, 你还是可以用第一种方法再试。以下我介绍我用的方法, 但细节可能会和你的系统有一些出入。还有一点,如果你有一张空磁碟, 你可以先把重要的档案备份到这张磁碟上,再重新安装。 我想这是一种较安全的方法,且结果也比较理想。 我是把档案备份到一张 1.44 Mb 的磁片上。 不管如何希望以下的方法对初学者能有所帮助。

我要感谢 Olivier Tharan 在 fr.col.moderated 上的回信, 那封信算是本文的第"负一"版。还有 Finn bo Jorgensen 和 Chomouel boudjnah 他们的回信。

 

主要步骤

- 准备工作: 备份且记下重要的档案。读完整篇文章再继续。(请参照第三节)

- 移除 Windows 。(请参照第四节)

- 重新分割,较难的步骤。(请参照第五节)

 

准备工作

首先,备份所有重要的档案。尤其是设定档和你的文件档案。 以下我不再重覆。

最重要的一步是了解你到底要怎麽做。本文对使用到的指令和档案只作一些解说。 最好是用 man 读一读这些指令的说明: fdisk, mk2ext, cp (蛮实用的指令), lilo, lilo.conf 和 fstab (此外还有一些设定档的 man 说明)。 Lilo 有些很详尽的说明放在 /usr/doc/lilo-0.20/doc 下(因系统而异), 而且还有一篇长达 46 页的使用说明书。有关 fdisk 的完整说明则是放在 /usr/doc/util-linux-2.7/README.fdisk。 写这篇文章的时侯我还发现了一篇很有用的 mini-HOWTO: 硬碟升级 Mini How-To (Hard Disk Upgrade Mini How-To)。

第一步,底下是我的磁碟分割表 (Partition Table):

   [olivier@snoopy  olivier]# /sbin/fdisk -l         (用超级使用者 su 的身份)

   Disk /dev/hda: 128 heads, 63 sectors, 788 cylinders
   Units = cylinders of 8064 * 512 bytes

      Device Boot  Begin   Start     End  Blocks  Id System
   /dev/hda1   *       1       1     397 1600672+  c Unknown
   /dev/hda2         398     398     601  822528  83 Linux native
   /dev/hda3         602     602     627  104832  82 Linux swap
   /dev/hda4         628     628     788  649152  83 Linux native

我们可以看到 Windows 位在 hda1 上。fdisk 通常都会把 FAT32 的分割区看成 <<Unknown>> (未知)。我的 Linux 核心 (Kernel, 2.0.34 版) 知道怎麽存取 FAT32,但 fdisk 却不知道。底下是 df 指令的输出,可以发现 /dev/hda1 的确可以被 Linux 使用。

    [olivier@snoopy olivier]# df

    Filesystem        1024-blocks    Used   Available  Capacity  Mounted on
    /dev/hda2            796065    506992      247947     67%    /
    /dev/hda4            628351    226366      369528     38%    /home
    /dev/hda1           1594456    850420      744036     53%    /mnt/dos

你得修改两个设定档 /etc/fstab 和 /etc/lilo.conf ,它们看起来有点像底下的输出。

    [olivier@snoopy olivier] less /etc/fstab

    /dev/hda2          /                 ext2         defaults        1 1
    /dev/hda4          /home             ext2         defaults        1 2
    /dev/hda3          swap              swap         defaults        0 0
    /dev/fd0           /mnt/floppy       ext2         user,noauto     0 0
    /dev/cdrom         /mnt/cdrom        iso9660      user,noauto,ro  0 0
    none               proc              proc         defaults        0 0
    /dev/hda1          /mnt/dos          msdos        user,noauto     0 0
    [olivier@snoopy olivier] less /etc/lilo.conf

    boot=/dev/hda
    map=/boot/map
    install=/boot/boot.b
    prompt
    timeout=500
    image=/boot/vmlinuz-2.0.34-1
            label=linux
            root=/dev/hda2
            read-only
    other=/dev/hda1
           label=dos
           table=/dev/hda

 

重新建立 Windows 的硬碟分割区

从现在起你一定得用 root 的身份操作。我尤其建议你用 root 登入(别用 su)。 如果你用的是 vi 编辑器,你可能要下 w! 指令才能存档。 建议你在每回存档完後,检查是否修改过的档案真的被存起来了。 (离开编辑器用 less 指令来查看)

你现在要用 fdisk 和 mke2fs 两个指令。这些可以在硬碟或是其它储存媒体上用。 在使用前最好是不要连接 (mount) 要修改的那一个分割区。请看底下的三个步骤:

- 如果你要的分割区已经被连接上了,用 umount 指令来分离,如: umount /mnt/dos

- 启动 fdisk。更换 hda1 的分割区类别 (System Id)。 我们现在告诉 fdisk 这个分割区要改成为 Linux 自有的分割区 (Linux Native Partition)。 用 t 指令 (t, 1, 83)来修改。再用 p 指令来查看。 唯一不同的地方是 Unkown 现在变成了 linux native 还有 System Id 现在变成了 83。最後,用 w 指令储存和离开。 用 fdisk -l 指令再看一次。离开时我遇到以下的错误讯息:

   The partition table has been altered!
       Calling ioctl() to re-read partition table.
       Syncing disks.
       Re-read table failed with error 16: Device or resource busy.
       Reboot your system to ensure the partition table is updated.

但我不理会它所以没有重新开机。

- 格式化 (Format): mke2fs /dev/hda1。 你会先看见很多数字在跳动,然後就再也见不到 Windows 了! 你也可以在 mke2fs 後加上 -c 的 参数,这样可以顺便检查硬碟有没有损坏的地方。

好啦! Windows 没啦! 其实我并不是很排斥 Win98 (但讨厌 Microsoft),只是很喜欢 Linux...

 

使用新的分割区

好了,现在我有一个 1.5 Gb 的空白分割区,我打算把 600 Mb 拿来做 /home , 800 Mb 做 / 和 100 Mb 做交换区 (Swap partition)。我把 /home/myaccount 里 100Mb 的资料 移到 /usr/local ,把 /usr/local 留在 hda2 上再把 / 移到 hda1 上:

   Filesystem      1024-blocks  Used   Available Capacity Mounted on
   /dev/hda1        1600672    465000   1130672     29%    /
   /dev/hda2         796065    110000    696065     13%    /usr/local 
   /dev/hda4         628351     40739    587612      6%    /home

足够我用好几年了....

照我上面的计划,我得先把 hda1 连接起来才行。一般就连接到 /mnt 即可。

- 在 /mnt 底下再建一个 tmp 的次目录 (sub-directory) 。来连接 hda1: mkdir/mnt/tmp.

- 连接 hda1 到 /mnt/tmp : mount -t ext2 /dev/hda1 /mnt/tmp (-t ext2 指定档案系统的种类)。

- 复制 / 到 /mnt/tmp/ 但保留目录结构: cp -ax / /mnt/tmp/。-a 参数在 man 说明里解释为: <<Preserve as much possible of the structure and attributes of the original file in the copy. The same as -dpR>> 请自行参考 cp 的 man 说明。-x 参数指定不要把和现在所在位置不同的分割区也包括进来。 以我为例,这样就不会把 /home 一起复制了。整个复制过程在我的 AMD K6 266 上花了 15 分钟。 所以你可以先去喝杯咖啡或威士忌再回来。

- 但这样做还是有一些地方不完整,因为 -x 参数的关系有两个目录没有被复制进来, /home 和 /proc。所以现在我们要在新的分割区上建立这两个目录: mkdir /mnt/tmp/home 然後 mkdir /mnt/tmp/proc 这两个目录一定不可漏掉,这样 /home (在 hda3 上) 和 /proc 以後才可以被连接上。

现在更复杂的是我们得修改 fstab 和 lilo.conf 档案,重新开机後 Lilo 和 Linux 本身才知道 / 在哪里。注意,我们必须修改 /mnt/tmp/etc/ 下的 fstab 而不是 /etc 下的。 因为新的系统在 /mnt/tmp 下。但是在重新开机前我们必须重新安装 Lilo (如果你有 用 Lilo 的话)。现在必须修改 /etc/ 下的 lilo.conf 因为我们现在 就要执行 lilo 指令来重新安装 Lilo。然後再把 /etc/lilo.conf 复制到新的分割区 /mnt/tmp/etc。 或者你可以直接修改 /mnt/tmp/etc/lilo.conf 然後在执行 lilo 的时候加上 -C 的参数告 诉 lilo 你的设定档不是在 /etc/lilo.conf 而是在 /mnt/tmp/etc/lilo.conf 中。我示□的 是第二种方法。

- /mnt/tmp/etc/fstab

这个档案指示系统在启使的时侯如何连接不同的分割区。我们现在想把 / 连接到 hda1 上,所以要如下修改。但我们不可以有两个 / 连接点! 所以我把 /dev/hda2 改 为连接到 /mnt/tmp。其它地方则没变。

    /dev/hda1        /                ext2     defaults         1 1
    /dev/hda2        /mnt/tmp         ext2     defaults         1 2
    /dev/hda4        /home            ext2     defaults         1 3
    /dev/hda3        swap             swap     defaults         0 0
    /dev/fd0         /mnt/floppy      ext2     user,noauto      0 0
    /dev/cdrom       /mnt/cdrom       iso9660  user,noauto,ro   0 0
    none             /proc            proc     defaults         0 0

- /mnt/tmp/etc/lilo.conf.

lilo.conf 是 lilo 的设定档,lilo 是位在 MBR (启动磁区) 的开机管理程式。 我不想浪费篇幅说明 MBR。如果有人还在用 Loadlin 或用软碟开机,我强烈建议换成 lilo ,因为我们的系统上 loadlin 已经没用,而且这年头谁还用软碟片来开机呢? 我们告诉 lilo Linux 的核心 (Kernel) 现在是在 hda1 上 (原本是 hda2) 还有我们 得删除所有有关 Windows 的设定。

     boot=/dev/hda
     map=/boot/map
     install=/boot/boot.b
     prompt
      timeout=500
     image=/boot/vmlinuz-2.0.34-1
           label=linux
           root=/dev/hda1
           read-only

- 执行 lilo: /sbin/lilo -v -C /mnt/tmp/etc/lilo.conf. -v 告诉 lilo 给予详尽的输出。 这时应该没有任何的错误讯息,因为我们要重新启动所以一定不能犯错。 lilo 的讯息如下:

    LILO version 20, Copyright 1992-1997 Werner Almesberger
    Reading boot sector from /dev/hda
    Merging with /boot/boot.b
    Boot image: /boot/vmlinuz-2.0.34
    Added linux *
    /boot/boot.0300 exists - no backup copy made.
    Writing boot sector.

- 重新开机,再做一些小测试 (df, fdisk -l) 看看档案系统是不是和我们指定的符合。

- 把 /mnt/tmp 底下 (hda2) 所有的东西删除掉: (在 /mnt/tmp 下) rm -rf *

按照先前的安排,我们再用 cd 切换到 /usr/local 下,复制所有档案到 /usr/tmp: cp -a * /mnt/tmp

验证是否一切顺利,再删除 /usr/local: (在 /usr/local 下) rm -rf * ,注意不可以删除 /usr/local 这个名字。

- 再编辑 /etc/fstab ,修改第二行:

     /dev/hda2    /usr/local          ext2    defaults       1 2

- 重新开机,再测试。

大功告成! 告诉你我当时非常的满意,尤其是所有的程式後来都能正常的工作!

 

问题

事实上我在实作时遇到了一些问题。但我建议你去了解这些步骤,所以在你遇到问题的 时候你可以试著自行解决。Olivier Tharan 建议我重新启动到单人模式中 (Single-user mode) 但我偷懒而跳过这一节。最好能在重新启动前准备一张开机磁片 (但我不知道怎麽弄)。

底下是我遭遇到的问题。在第一次重新开机後,我的 /home 和 /proc 没有被连接进来, 但幸好登入系统不成问题,所以我赶快用:

    [root@snoopy root]$ df
     Filesystem      1024-blocks    Used   Available  Capacity  Mounted on
     /dev/hda1          1548535   506977    961525     35%       /
     /dev/hda2           796065   506992    247947     67%       /mnt/tmp

/home 没有被连接进来,所以我试著用 mount /home ,但 mount 却显示: <<mount: mount point /home does not exist>> 我才发觉我没了解什麽叫"连接点" (Mount Point) 而漏了cp 的 -x 的参数。 所以我重新建立了 /home 和 /proc 两个连接点,结果才和前面所叙述的一样。


 

参考资料

  • man 说明: fdisk, mk2ext, cp, mv, rm, lilo, lilo.conf, fstab
  • /usr/doc/lilo-0.20/doc/User_Guide.ps
  • /usr/doc/util-linux-2.7/README.fdisk
  • Hard Disk Upgrade Mini How-To (硬碟升级 Mini How-To)
  • 原文以法文写成,英文翻译 Paul Kienzle,中文翻译 郭予廷

    网页维护:LinuxFocus 编辑组
    © Olivier Chapuis
    LinuxFocus 1999

    1999-08-03, generated by lfparser version 0.6.1