ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Windows Linux双系统安装:扩展分区收缩、手动分区与GRUB引导

Windows Linux双系统安装:扩展分区收缩、手动分区与GRUB引导

简介:针对仍在使用Windows XP、希望在不重装系统的前提下体验Linux的入门用户,这份文档以Red Hat Linux 9.0为例,系统讲解双系统安装的完整流程。内容围绕硬盘空间划分、Windows扩展分区剥离、定制安装、手动创建/boot、swap与根分区,以及GRUB引导配置展开,并对双硬盘、NT引导、启动盘等方案作了比较,便于读者理解引导管理器接管启动菜单的原理。资源包仅含1个docx文档,约421KB,篇幅集中,适合按步骤对照操作,也可作为老平台双系统排错与分区调整的参考。该资料已有340人学习下载,能帮助读者掌握无损分区、分区格式兼容和GRUB配置等关键环节,降低因扩展分区未剥离、引导写入位置不当导致的性能与启动问题。

1. 双系统 windows linux 的落地起点:先把分区账算干净

上周帮人收拾一台还在跑 Windows XP 的老机器,机器主人的诉求很朴素:Windows 留着跑一套老业务软件,再压一套 Linux 进去学命令、编点东西,做成双系统 windows linux。硬盘只有一块 30GB,C、D、E 三个盘,E 盘 16.6GB 里空了 7GB 左右。这种配置放到今天看确实旧,但正因为它旧,流程里每个环节都裸露着——分区怎么切、引导权交给谁、装崩了怎么退回来,一步都不能想当然。下面这套记录就是围绕这块单硬盘展开的,用的是 Red Hat Linux 9.0 的安装光盘,凡是涉及容量、扇区号、引导记录的参数都写清楚,新手照着能走通,熟手能对着看边界在哪。

2. 分区先行:把 7GB 从 Windows 扩展分区里剥干净

2.1 为什么 Linux 分区不能住在 Windows 扩展分区里

MBR 分区表只有四个表项,Windows 那套「C、D、E」在实际磁盘上通常是这样落的:C 盘占一个主分区表项,D 和 E 被塞进同一个扩展分区,扩展分区本身占第二个表项,D、E 是它内部链表上的逻辑分区。用分区工具把 E 盘「缩小」,释放出来的空间看着是空闲的,但它仍然落在扩展分区所声明的那段地址范围之内,本质上只是逻辑分区链上的一个空洞。

很多教程到这里就收手了,直接让 Linux 装进这个空洞,装完也能开机。问题出在后面:这块空间在分区表里不属于任何主分区表项,Windows 侧的磁盘工具、碎片整理程序、某些一键还原软件在扫描时会把「扩展分区里有未被逻辑分区覆盖的空洞」当成异常状态,反复尝试修正分区表。表现就是机器越用越慢,硬盘灯常亮。当年大量「装了 Linux 之后 Windows 变慢」的抱怨,根子多半在这里,而不是 Linux 抢了资源。

所以正确的做法不是「缩小 E 盘」就完事,而是两步:先把 E 盘缩到实际数据量附近,再把扩展分区本身的边界收回来,让那 7GB 彻底掉到扩展分区外面,成为主分区表项可以直接占用的空闲空间。这两步在分区魔术师里是两个独立操作,很多人只做了第一步。

注意:动手之前先在 Windows 里跑一遍磁盘检查(chkdsk)和碎片整理。分区工具移动数据时若碰上坏簇,操作会中途失败,严重时分区表直接报废。

2.2 在分区魔术师里做两次收缩

打开分区魔术师,主窗口右侧是磁盘分区的详细列表,左侧是任务列表。先选中 E 盘,点左侧「调整一个分区的容量」,弹出「调整容量/移动分区」对话框。对话框顶部那条状图是关键:左侧黑色段是已用空间,右侧绿色段是空闲空间,中间的分界可以拖,也可以直接在「新建容量」里填数值。E 盘的最小容量就是已用空间的大小,再小就要破坏数据了。这里把 E 盘从 16.6GB 压到 8GB 出头,空出约 7GB。

点确定回到主界面,你会看到 E 盘旁边多出一块标着「未分配」的区域。但此时它外面还套着扩展分区的框,说明它仍然归属扩展分区。接着选中扩展分区那一行,用完全相同的操作把扩展分区的右边界往左拖,拖到刚好包住收缩后的 E 盘为止。这一步做完,那 7GB 才会从扩展分区里彻底脱离出来,成为独立的主分区可用空间。

这里有个血泪经验:分区魔术师的所有操作默认是挂起状态,点「确定」只是把操作排进队列,必须再点左下角的「应用更改」才真正写盘。不少人以为点完确定就生效了,接着去装 Linux,结果安装程序看到的还是旧分区表。

整个过程中机器会重启一到两次,在纯 DOS 环境下搬运数据,期间不能断电、不能强行重启。7GB 的数据搬移在老机器上大概要十几分钟到半小时,进度条卡在某个百分比不动是正常的,别急着按电源键。

2.3 用 fdisk 输出验证剥离是否真的生效

进 Linux 安装盘之前,最稳妥的验证方式是在安装程序的救援模式或者第二个控制台里跑一次 fdisk,把分区表打出来看。收缩完成、尚未装 Linux 时,输出应该长这样:

# 以救援模式进入后,查看第一块 IDE 硬盘的分区表 fdisk -l /dev/hda # Disk /dev/hda: 30.0 GB, 30020272128 bytes # 255 heads, 63 sectors/track, 3649 cylinders # Units = cylinders of 16065 * 512 = 8225280 bytes # # Device Boot Start End Blocks Id System # /dev/hda1 * 1 855 6867793+ 7 HPFS/NTFS # /dev/hda2 856 2756 15265881+ f Win95 Ext'd (LBA) # /dev/hda5 856 1710 6867751+ 7 HPFS/NTFS # /dev/hda6 1711 2756 8594751+ 7 HPFS/NTFS

逐字段读一遍。Units那一行说明这块盘按 255 磁头、63 扇区每道组织,一个柱面 16065 个扇区、约 7.84MB,后面 Start/End 的柱面号就是按这个单位算的。Blocks是 1KB 块的数量,不是字节数,看着吓人但换算下来就是几个 GB。

真正要看的是编号规律。hda1 到 hda4 是主分区表项的位置,hda5 往后才是逻辑分区。上面这份输出里,hda1 是 C 盘,hda2 是扩展分区(Id 为 f,表示 Win95 扩展分区并启用 LBA),hda5、hda6 是 D 盘和 E 盘。hda3 和 hda4 是空缺的,说明这两个主分区表项还没被占用,但也不代表那块空间就自由——得看 End 柱面。hda2 的 End 停在 2756,而整块盘有 3649 个柱面,2757 到 3649 这 893 个柱面(约 6.8GB)不在任何分区项之内,这才是 Linux 能用的地盘。

如果扩展分区的 End 仍然顶到 3649,说明第二步收缩没生效,回去重做。这个检查花不了一分钟,能省掉后面重装两小时。

3. 手工分区三件套:/boot、swap、/ 的容量取舍

3.1 三个分区各自干什么,容量怎么定

经典方案是把 Linux 切成三个分区:引导分区/boot、交换分区 swap、根分区/。三者的分工和容量下限可以对着下表看:

挂载点文件系统建议容量作用下限
/bootext3100MB存放内核 vmlinuz、initrd 镜像和 GRUB 的 stage 文件50MB
swapswap内存的 1.5~2 倍相当于 Windows 的页面文件,无挂载点64MB
/ext3剩余全部,留 5% 余量目录树的根,其余所有目录都挂在它下面1.5GB

/boot单独分出来的历史原因很实际:早期 BIOS 通过 INT 13h 读盘,只能寻址到 1024 柱面以内(约 8GB 位置),如果内核文件落在更靠后的位置,引导时就读不到,机器直接黑屏。把/boot切在磁盘靠前的位置能绕开这个限制。另外内核升级会反复写入/boot,独立分区可以防止它被日志或者其他数据挤满。

swap 就是磁盘上的一块裸空间,不挂到目录树上,内核拿它当虚拟内存用。早年内存普遍 128MB 到 256MB,所以有「swap 设成内存两倍」的经验值。这个规则在内存小于 512MB 时基本成立,内存大了之后按两倍算反而浪费。还有一个上限要注意:32 位内核单个 swap 分区一般不超过 2GB,超出的部分用不上。

/把剩下的空间全吃掉,但必须留一点。Disk Druid 在剩余空间被 100% 分配时会报错,而且根分区写满之后系统连日志都写不进去,直接进不了图形界面。留 5% 到 10% 是比较稳的做法。

回到这台机器上,现实有个约束:主分区表项只剩 hda3、hda4 两个空位(hda1 是 C 盘,hda2 是扩展分区),三件套塞不进去。所以我的规划退化成两个分区:

  • /dev/hda3:swap,256MB
  • /dev/hda4:/,剩下约 6.6GB,ext3

代价是不单独分/boot,内核和 GRUB 的 stage2 都躺在根分区里。这意味着将来根分区文件系统一旦出问题,连 GRUB 菜单都进不去。既然接受了这个代价,后面就必须做一张启动盘兜底,这一点在第 4 章会讲。

提示:如果你的硬盘上 Windows 只占一个主分区、没有扩展分区,那 hda2、hda3、hda4 三个表项都空着,可以老老实实按三件套来分。

3.2 从光盘引导到进入 Disk Druid 的完整路径

先把 BIOS 的启动顺序改成光驱优先。开机按 Del 或 F2 进 BIOS(不同主板按键不一样,开机自检画面底部一般有提示),找到 Boot 或者 Advanced BIOS Features 页,把 First Boot Device 设成 CDROM,保存退出。这一步不做,插着光盘也会直接从硬盘启动。

放入第一张安装光盘,重启。出现欢迎屏幕时直接回车进图形安装界面。语言选简体中文,鼠标和键盘配置一般能自动识别,直接下一步。

安装类型那一页有五个选项:个人桌面、工作站、服务器、定制、升级现存系统。选「定制」。前三个是预设套餐,会按固定规则自动分区,把 Windows 的分区也一起吞掉,这在双系统场景下是灾难。「定制」把分区和软件包的选择权全交出来。

下一步会问分区方式,选「用 Disk Druid 手工分区」。Disk Druid 是 Red Hat 系的图形化分区工具,比命令行 fdisk 直观,能直接看到每个分区的挂载点和文件系统类型。

3.3 在 Disk Druid 里建分区,以及 fstab 最后长什么样

在 Disk Druid 的分区列表里选中那块 7GB 的空闲空间(显示为 Free Space 或者空闲),点「新建」。

先建 swap:挂载点留空(swap 没有挂载点概念),文件系统类型选 swap,容量填 256。再建根分区:挂载点填/,文件系统选 ext3,容量填剩余的全部减去几十 MB。

如果你还想把/boot单独切出来(本机没这个条件,但方法一样),就在建根分区之前先建一个挂载点为/boot、容量 100MB、ext3 的分区。顺序上先建/boot再建/,因为/要吃掉剩余空间,先建大的就没位置了。

装完之后,这些分区会写进/etc/fstab,内容大致如下:

# 设备 挂载点 文件系统 挂载选项 dump fsck顺序 LABEL=/ / ext3 defaults 1 1 /dev/hda3 swap swap defaults 0 0 none /dev/pts devpts gid=5,mode=620 0 0 none /proc proc defaults 0 0 none /dev/shm tmpfs defaults 0 0 /dev/cdrom /mnt/cdrom iso9660 noauto,owner,kudzu,ro 0 0 /dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0

六个字段从左到右分别是:设备名、挂载点、文件系统类型、挂载选项、dump 备份标志、fsck 检查顺序。第一行用LABEL=/而不是/dev/hda4,是因为 e2label 给分区打了卷标,卷标不随设备号变化,改分区顺序时不会挂错。swap 那一行的挂载点写swap是固定写法,第六字段是 0,表示开机不做文件系统检查——swap 里全是临时数据,检查没意义,还会拖慢启动。

devpts、proc、tmpfs这三行是虚拟文件系统,不对应任何真实磁盘分区,none表示设备名为空。它们由内核在运行时动态生成,手工分区时不用管,安装程序会自动加上。

这里有个容易忽略的点:根分区的 fsck 顺序是 1,/boot如果是独立分区则也是 1,其他分区从 2 开始。启动时 fsck 会按这个顺序串行检查,顺序错了不影响使用,但并行度会变差。

4. 引导权交给谁:GRUB 接管 MBR 的三处配置

4.1 GRUB 和 LILO 的差别,以及为什么默认用 GRUB

Red Hat 从 7.2 开始把默认引导器从 LILO 换成了 GRUB,这个切换不是随意的。LILO 的工作方式是「配置写死」:改完/etc/lilo.conf必须重跑/sbin/lilo,把引导代码重新写进 MBR,配置文件和实际引导块是两份东西,不同步就会出现「配置改了但不生效」的玄学。更麻烦的是 LILO 对磁盘几何参数敏感,换硬盘、改分区后经常直接罢工。

GRUB 分三段:stage1 在 MBR 里占 446 字节,只负责找到 stage1_5;stage1_5 带文件系统驱动,能直接读 ext3 分区;stage2 才是真正的菜单和引导逻辑,放在/boot/grub/下。因为 stage1_5 能读文件系统,GRUB 可以直接去读/boot/grub/grub.conf,改完文件立刻生效,不需要重装引导块。

GRUB 还有个救命功能:开机时按c进命令行,可以手动敲root、kernel、boot把系统拉起来。这在配置文件写错、菜单进不去的时候是唯一的后悔药。LILO 没有这个能力。

4.2 安装向导里的三处配置

分区完成后进入引导装载程序配置页。GRUB 默认装在/dev/hda的主引导记录上,也就是 MBR。这一页有四处要动。

第一处是默认启动项。列表里会出现两项,一个标着「DOS」(安装程序把 Windows XP 认成了 DOS),一个是 Red Hat Linux。默认勾选在 Linux 上,如果你想开机默认进 Windows,就勾 Windows 那一行的「默认」复选框。

第二处是添加条目的能力。GRUB 的探测不总是准,尤其在有多块硬盘或者隐藏分区的时候。点「添加」会弹出一个「映像」对话框,三个字段:标签填系统名称(比如Windows XP),设备从下拉列表里选那个系统的系统分区所在位置,再决定要不要设为默认。

第三处是改标签。看「DOS」这个名字不顺眼的话,选中它点「编辑」,把标签改成Windows XP Professional。这个改动最后会落到 grub.conf 的title行上。

第四处是引导装载程序的安装位置。默认是 MBR,如果后面打算走 ntldr 路线,这里要改成装到 Linux 根分区的第一个扇区。

配置完继续往下走,安装程序会提示创建一张 Linux 启动盘。这一步千万别跳过。软驱还在的话插一张空白 1.44MB 软盘进去,没有软驱就用mkbootdisk后期补做,或者至少把引导扇区备份到 U 盘和另一台机器上。

4.3 grub.conf 的真实结构和 hd 编号的坑

装完之后,/boot/grub/grub.conf的内容大致如下(部分发行版里menu.lst是指向它的符号链接):

# 默认启动第 0 项,即第一个 title default=0 # 菜单停留 10 秒,超时自动进默认项 timeout=10 # 菜单背景图,路径基于 GRUB 视角的 (hd0,3) 分区 splash <p> <a href="https://download.csdn.net/download/muyuetianxia/4400087" style="color:#ec7500;font-size:14px;"> 本文还有配套的精品资源,点击获取 </a> <img alt="menu-r.4af5f7ec.gif" src="https://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif" style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;"> </p>
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进