简介
安装完 Linux 两个月後的某一天,我突然想把 Windows 删掉。原因是我根本不想再用 Windows 了! 我想许多的初学者可能也遇到和我同样的情况,所以我写了这篇文章来帮助他们 (进阶者也可以读读,给我一些建议)。这种情况有两种解决办法:
第一种是从新安装 Linux。这样的好处是即使你对 Linux 知道的不多,也可以在安装时做出很好的选择,尤其在处理磁碟分割 (Disk Partitioning) 的时侯。但缺点是你会丢掉硬碟上所有的东西。虽然你也可以把必要的档案先备份起来,但是还原的工作会花上很多的时间和心血。
第二种方法是直接移除 Windows (很简单),然後再把空出来的空间挪给 Linux 用。也就是说,「重新分割」(Repartition),这道手续有点困难,相关文件也不多。但好处是你的系统会和从前的一模一样,只是多了很多空间。而且如果你没有成功,你还是可以用第一种方法再试。以下我介绍我用的方法,但细节可能会和你的系统有一些出入。还有一点,如果你有一张空磁碟,你可以先把重要的档案备份到这张磁碟上,再重新安装。我想这是一种较安全的方法,且结果也比较理想。我是把档案备份到一张 1.44 Mb 的磁片上。不管如何希望以下的方法对初学者能有所帮助。
准备工作
首先,备份所有重要的档案。尤其是设定档和你的文件档案。以下我不再重覆。
最重要的一步是了解你到底要怎麽做。本文对使用到的指令和档案只作一些解说。最好是用 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 的分割区看成 > (未知)。我的 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) 要修改的那一个分割区。请看底下的三个步骤:
1、如果你要的分割区已经被连接上了,用 umount 指令来分离,如: umount /mnt/dos
2、启动 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.
但我不理会它所以没有重新开机。
好啦! 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 说明里解释为: > 请自行参考 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 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)