近来越来热衷于 Arch Linux ,它的 KISS 设计理念以及滚动升级的包管理机制很吸引人,同时其 wiki 网站 Arch Wiki 资料详尽、界面优雅、更新及时,实在是学习 Linux 知识的好去处。于是我决定使用 Arch Linux 替换现在使用的 openSUSE 。同时前几天刚好了解到 LVM ,可以用来替换常规的分区方式。于是想将 Arch Linux 直接安装在 LVM 上,但是最终因为 MBR gap 空间不足以放进 grub2 的 core.img 而失败。这篇文章主要记录折腾的过程,如果你想安装 Arch Linux 或者了解 LVM,那看 Arch Wiki 才是最佳选择。
我使用的是官网提供的安装镜像进行安装的,同时使用了 Ubuntu 提供的 Image Writer 将 ISO 镜像写入 U 盘安装。Arch Linux 并不像其他流行的发行版一样提供 GUI 安装程序,所有的安装都必须通过命令行来进行,甚至安装镜像里面也不包含 X Server 和任何桌面环境。通过 U 盘启动 Arch Linux 安装环境后,我便开始折腾 LVM 。
LVM 即 Logical Volumn Management ,它提供了一个逻辑卷 (logical volumn) 的概念,使得 Linux 系统使用的分区独立于具体的硬盘布局。比如你现在有一个 10G 的分区 /dev/sda1
,以及一个 20G 的分区 /dev/sda2
,你可以使用 LVM 创建一个 15G 的逻辑卷用于挂载 /
,再使用另外 15G 创建一个逻辑卷用于挂载 /home
。一个逻辑卷可以无视硬盘分区的限制,跨越不同分区(如 /dev/sda1
和 /dev/sda2
)组成,甚至可以跨越不同硬盘,而且可以动态增缩空间(当然缩小空间还是存在些许限制)。官网的一个例子清晰地说明了 LVM 的简单应用:
Physical disks
Disk1 (/dev/sda):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|Partition1 50GB (Physical volume) |Partition2 80GB (Physical volume) |
|/dev/sda1 |/dev/sda2 |
|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
Disk2 (/dev/sdb):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|Partition1 120GB (Physical volume) |
|/dev/sdb1 |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ _ _|
LVM logical volumes
Volume Group1 (/dev/MyStorage/ = /dev/sda1 + /dev/sda2 + /dev/sdb1):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|Logical volume1 15GB |Logical volume2 35GB |Logical volume3 200GB |
|/dev/MyStorage/rootvol|/dev/MyStorage/homevol |/dev/MyStorage/mediavol |
|_ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
LVM 提供的特性的确比较吸引人,于是我按步就班地创建了 2 个逻辑卷用于挂载用户目录和根目录。值得一提的是 Grub Legacy 并未提供 LVM 支持,如果使用 Grub Legacy 则需要开辟一个分区用以挂载 /boot
,不过 Grub2 则不存在这个问题。Arch Linux 已经使用了 Grub2 ,这使得我并不需要为 /boot
开辟一个新的物理分区,但是却导致了后面安装失败的问题。有关 MBR Gap 的问题将在后面详述。使用 LVM 之前,需要用分区工具(cfdisk, fdisk, etc.)将要使用的分区设置为 Linux LVM 文件系统。关于 LVM 的使用,关键的几条指令有:
# modprobe dm-mod // device-mapping 所需载入的模块
# pvcreate /dev/sda2 // 于 /dev/sda2 上创建物理卷
# pvdisplay // 查看所有物理卷
# vgcreate ArchLinuxVG /dev/sda2 // 在 /dev/sda2 上创建逻辑卷组
# vgextend VolGroup00 /dev/sdb1 // 扩展逻辑卷组
# vgdisplay // 显示逻辑卷组信息
# lvcreate -L 10G ArchLinuxVG lvhome // 创建 10G 大小的逻辑卷 lvhome
# lvdisplay // 显示逻辑卷信息
创建完逻辑卷之后,就可以对逻辑卷创建文件系统啦:
# mkfs.ext4 /dev/ArchLinuxVG/lvhome
之后按官网安装指南所说,使用 pacstrap
安装基本的程序包,然后开始装 Grub2 。然后问题出现了,执行 grub-install
命令时报出错误信息:your core.img is unusually large, it won’t fit in theembedding area。Google 一番之后,发现类似的例子不少(1, 2, 3, 4)。原因是分区程序一般会在 MBR 与第一个分区之间留 63 个 sector ,称为 MBR gap 或 embedded area ,而 Grub2 使用了这个区域用于存放各种模块以实现引导和启动。Grub2 会生成 core.img 用于写入 MBR gap 之中,一般情况下 core.img 的体积不足 31.5Kb ,可以顺利放进 MBR gap 中,但是像我这样添加了 LVM 支持后,core.img 的大小稍大于 31.5Kb 而无法放进 MBR gap 中,因此报错。
解决方法有这么几种:
/boot
中,再安装 Grub Legacy 用于引导 Grub2由于我的第一个分区装着 Win7,所以第一种方法不可行。第二种及第三种相对难维护,我也不想尝试。试着查了能否指定 core.img 中的模块,发现 core.img 由 grub-mkimage
命令生成,而且这个命令可以指定所使用的模块。但是找不到关于模块的详细信息,所以没能将 core.img 的体积降下来。
最后只好重新使用正常方法安装了一次,总算能跑了,以后会继续将各种折腾写进博客作为积累,同时强力推荐一下 Arch Wiki,实在是相当 pratical 的 wiki 文档。Gentoo Wiki 也是相当不错的。