善用EFI系统分区ESP

原创
2014/03/19 14:20
阅读数 5.1W

EFI系统分区,即 EFI system partition,简写为 ESP。ESP 是一个 FAT16 或 FAT32 格式的物理分区,但是其分区标识是 EF (十六进制) 而非常规的 0E 或 0C,因此,该分区在 Windows 操作系统下一般是不可见的。支持 EFI 模式的电脑需要从 ESP 启动系统,EFI 固件可从 ESP 加载 EFI 启动程序或者应用。

一般情况下,大家仅仅是为了应和 EFI 规范而不得不划分这样一个分区,而且也只把它当作一个 EFI 启动程序和 EFI 应用程序的存储空间。因此,许多资料都推荐只划分一百多M空间给 ESP,这也使得该分区除了遵循 EFI 规范以及存储 EFI 启动文件之外没有太大用处。然而,我认为 ESP 可以有更多更好的用法。既然 ESP 是必要的,何不物尽其用?

首先,看下 ESP 本身的特点,以及由此带来的好处。

ESP的特点和好处

  • FAT分区与通用性 EFI 规范规定 ESP 使用 FAT 格式。尽管这种老旧的格式有很多局限性,但也不算一无是处。尤其对我来说,系统中有个 FAT32 分区是很好的,因为我经常使用多个系统,包括 Windows、Linux、FreeBSD,而这些系统都能安全地访问 FAT 分区,因此,我可以把各个系统的启动相关的文件包括启动管理程序等放到 ESP 里,而且,这也方便我可以在一个系统中去修改另一个系统的启动文件,至少我可以把 ESP 当作各个系统的公共交换空间吧。
  • 独立于操作系统 ESP是一个独立于操作系统之外的分区,操作系统被引导之后,就不再依赖它。这使得 ESP 非常适合用来存储那些系统级的维护性的工具和数据,比如:引导管理程序、驱动程序、系统维护工具、系统备份等,甚至可以在 ESP 里安装一个特殊的操作系统(SlaTaz Linux? PuppyLinux? Win PE?)。
  • ESP分区标识与安全、隐藏 尽管 ESP 分区是一个 FAT 格式的分区,但它的分区标识却是一个特别的标识(EF),EFI 规范的这一规定使得 ESP 在 Windows 下一般是不可见的,起码,对一般的 Windows 用户来说,这是一块“无法访问”的隐藏起来的区域。这意味什么?我们可以利用这个特点做什么? 我们不妨先回顾下其它煞费苦心地划分特殊分区以达到特殊目的的一些技术或方案。许多品牌机会在硬盘里划分一个特殊的隐藏的分区,用以存放系统恢复镜像等文件,可利用该分区“一键”恢复系统。无忧论坛上提到了UD隐藏分区,在磁盘上划分一块未使用的空白区域,用于存储引导文件甚至PE系统。除了这些,应该还有一些类似的东西,它们的目标其实都是为了维护或恢复系统,一般来说,木马和病毒不会破坏这些分区里的文件,普通用户也不会触及它们,使得它们相对来说是安全的。但是,它们的用户其实只是普通的 Windows 使用者,其它操作系统的用户,以及稍懂点技术的 Windows 用户,非常不愿意见到那些“多余”的分区,相信许多人都会把那些分区删除了吧?不过,ESP 呢?与提及的那些技术相比,ESP 也可以看作是一个特殊的分区,它有何特别? 首先,EFI 规范要求有 ESP,既然是强制的,那我们不妨拿它多做点事,而不是去删除它。其次,与上面提及的那些技术相比,ESP 也可以看做是一个安全的隐藏的分区,这使得我们完全可以使用 ESP 来替代那些技术,我们可以把引导管理程序、系统维护工具、系统恢复工具及镜像等放到 ESP,可以自己打造“一键恢复系统”,等等。而且,不仅可以自己进行 DIY,还要更方便、更通用。再者,ESP 是个标准的 FAT 分区,因此与上面提及的那些技术不同,ESP 在“隐藏”的同时并没有失去可访问性,不管你用什么操作系统,都是可以安全地访问它的(后面讲),所以,ESP 绝不会是“多余”的,相反,它很有用。 精心打造后的 ESP 可以成为你系统中的“救命稻草”,因它的特性使得它可能会是所有分区中最为“安全”的,当你的系统受损时,你还能依靠这个 ESP 进入维护系统对系统进行修复,或是“一键恢复”,或是进入 ESP 里的 某个 Linux 系统,或者,进入预先安装好的某个 Win PE,甚或一个 RamXP?你想怎么打造你的 ESP 呢?

善用ESP

  • 大容量的 ESP 与常识相反,我使用大容量的 ESP。我一般会划分一个 20G 或 32G 的 ESP,并且,不管系统是否支持 EFI(事实上我现在用的这台机器根本不支持 EFI),我都会在主硬盘上划分这么一个 ESP。

  • 访问 ESP 在 Linux 等系统下,ESP 和普通的 FAT 分区没什么两样,可以使用相同的方式进行挂载(使用 vfat 分区类型)。可以把 ESP 的挂载写到 /etc/fstab 里。我一般把 ESP 挂载为 /boot。 在 Windows 下,ESP 一般是不可见的,使用 Windows 自己的磁盘管理器无法为 ESP 分配盘符,因此需要借助一些工具或方法。如果是 PE 系统,或是 Win 7 以下版本的 Windows,可以使用 BOOTICE 的分区管理功能,给 ESP 分配一个盘符。另外,无忧论坛上有人写了一个 MountESP 程序,可以用来挂载 ESP 并为之分配盘符。然而,在 Win 7 以上版本的 Windows 中,那些工具虽然可以成功给 ESP 分配盘符,但在资源管理器中看不到。 其实,不借助其它工具,使用 MKLINK 命令就可以挂载 ESP。假设 ESP 位于第一块硬盘的第一个分区,以管理员身份打开 CMD,运行以下命令:

<pre class="brush:shell; toolbar: true; auto-links: false;"> MKLINK /J C:\ESP \\?\GLOBALROOT\Device\Harddisk0\Partition1\ </pre>

运行成功之后,C:\ESP 就是指向 ESP 的一个符号链接,欲访问 ESP,访问 C:\ESP 即可。这个方法在 Windows 上其实是通用的,Win 7 以下版本也可以用,只是在 Win 7 以下版本并没有 MKLINK 命令,需要自行下载 junction 这个程序来代替 mklink。

  • 引导管理程序 对于 EFI 系统来说,系统的引导文件会安装到 ESP。Windows 会在 ESP 建立 EFI 目录并把引导文件复制到这里。Linux 则有多种选择方案,我一般选择 Grub2,也使用过 rEFIt。 而对于非 EFI 系统,主引导记录(MBR)我一般会使用 GRUB4DOS 或 NT6.X MBR,并把 GRUB4DOS (包括 grub.mbr, grub.exe, grldr, menu.lst)安装到 ESP,并且,附加上 SISO 模块(可以在无忧论坛里找到它)。还可以从 Win 8.1 复制 bootmgr 及 boot 目录到 ESP,并使用 BOOTICE 来管理 MBR 和 BCD。 不管系统是否是 EFI 的,我一般都会在 ESP 里安装 GRUB4DOS。GRUB4DOS 并不支持 EFI,但没关系,我们可以借用 GRUB 2 EFI 来引导 GRUB4DOS,给 GRUB 2 加个菜单就可以了,类似这样:

<pre> menuentry "GRUB4DOS" { insmod part_msdos insmod fat set root=(hd0,1) linux /grub.exe } </pre>

以后我打算尝试下Clover,这样,不管是否是 EFI 系统,我都可以用同样一个引导管理程序。

  • 在 ESP 里安装非日常用操作系统 当然,你不会想在 ESP 里安装日常所用的操作系统,我们可以挑选那些小巧便携的一些操作系统放到 ESP 里以备不时之需。许多系统可以借助某些引导管理程序以 ISO 镜像的方式直接启动,比如,SliTaz Linux, Ubuntu 等,很多 Win PE 系统也可借由 GRUB4DOS 从 ISO 直接启动。 GRUB 2 可以使用 loopback 模块启动一些 ISO 镜像,假设 ESP 是第一块硬盘的第一个分区,下面是一些 Grub 2 的菜单例子:

<pre> ### GRUB 2 菜单文件: /boot/grub/grub.cfg menuentry "Ubuntu Live" { set ISO=/OS/Ubuntu/ubuntu.iso loopback loop (hd0,1)$ISO ### 如果是32位的Ubuntu,应将下面的 vmlinuz.efi 改为 vmlinuz linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=$ISO noprompt noeject initrd (loop)/casper/initrd.lz } menuentry "SliTaz" { set ISO=/OS/SliTaz/slitaz-cooking.iso loopback loop (hd0,1)$ISO linux (loop)/boot/bzImage root=/dev/null initrd (loop)/boot/rootfs.gz } menuentry "Fedora Live" { set ISO=/OS/Fedora/fedora.iso loopback loop (hd0,1)$ISO linux (loop)/EFI/boot/vmlinuz0 root=live:$ISO rootfstype=auto ro liveimg quiet rhgb rd.luks=0 rd.md=0 initrd (loop)/EFI/boot/initrd0.img } menuentry "Knoppix Live ISO" { set ISO=/OS/Knoppix/knoppix.iso loopback loop (hd0,1)$ISO linux (loop)/boot/isolinux/linux bootfrom=/dev/sda1$ISO acpi=off keyboard=us language-us initrd (loop)/boot/isolinux/minirt.gz } </pre>

相对来说,我对 GRUB4DOS 更熟悉一些,而且 GRUB4DOS 可以启动更多种类的镜像文件。如果你的系统是 EFI 启动的,你可以安装 GRUB 2 EFI 并借由它来引导 GRUB4DOS,前面已经说过。GRUB4DOS 的菜单文件是 menu.lst,以下是一些例子:

<pre> iftitle [find --set-root --devices=h /bootmgr && call set R=%@root^%] BOOTMGR of Windows VISTA/WIN7/WIN2008 on %R% chainloader %bootmgr%/bootmgr </pre>

<pre> iftitle [find --set-root --devices=h /OS/Ubuntu/ubuntu.iso && call set R=%@root^%] Ubuntu LiveCD set F=/OS/Ubuntu/ubuntu.iso map %F% (0xff) || map --mem-top %F% (0xff) map --hook kernel (0xff)/casper/vmlinuz boot=casper iso-scan/filename=%F% ro quiet splash initrd (0xff)/casper/initrd.lz </pre>

<pre> title SliTaz ISO set F=/OS/SliTaz/slitaz.iso find --set-root --ignore-floppies --ignore-cd %F% map %F% (0xff) || map --mem-top %F% (0xff) map --hook chainloader (0xff) </pre>

<pre> title Win8.1 RamOS set F=/OS/Win8/usm8.1ramos.iso find --set-root --ignore-floppies --ignore-cd %F% map %F% (0xff) || map --mem-top %F% (0xff) map --hook chainloader (0xff) </pre>

<pre> title 0PE LiveISO set F=/OS/0PE/0PE.iso find --set-root --ignore-floppies --ignore-cd %F% map %F% (0xff) || map --mem-top %F% (0xff) map --hook chainloader (0xff) </pre>

更高级点,还可以利用 Win7 以上版本的差分 VHD 及 GRUB4DOS 的 dd 命令做一键恢复。

  • 系统维护工具、PETOOLS、脚本文件 上面所述的操作系统本身只能提供有限的工具,为便于系统维护,我把各种系统维护工具、PETOOLS等都放在了 ESP 里,这样,从 ESP 启动 PE 系统后就可以调用它们。这些工具包括:磁盘工具、分区工具、镜像/备份工具、辅助安装工具、硬件检测工具、系统清理、恢复工具,等等。 还有,我把自己写的一些维护用的脚本也放在了这里。

  • 操作系统镜像、备份及驱动 我很过分,我把这些东西也都塞到 ESP 里。如果日常使用的系统坏了,没关系,从 ESP 启动一个系统,或安装新系统,或进行恢复,都可以,对其它分区进行调整也可以,只要 ESP 没坏,其它系统都坏了也没关系。

后记

现在,你应该可以理解我为什么弄那么大容量的 ESP 了吧? 请不要把 ESP 与微软的 MSR 分区混淆,那个 MSR 分区并没有存在的必要。 你准备怎样使用 ESP 呢?

--

展开阅读全文
加载中
点击加入讨论🔥(1) 发布并加入讨论🔥
打赏
1 评论
14 收藏
6
分享
返回顶部
顶部