使用 UEFI 取代 BIOS

dell 12G 的机器默认已经通过 UEFI 来取代了 BIOS 了。这个起初没注意,后来在 batch 安装的过程中发现一个都没起来,开 idrac 才发现连 pxe 都没进去,调查了下情况,发现 12G 的产品已经用 UEFI 替代了 BIOS 了,这篇博客的作者讲述了这个情况的心酸经历。根据之前的调研来看,目前 UEFI 还未广泛的使用,并且该技术还相对的年轻,RH 6.0 以后支持的 2.2 的版本。

先来看下最原始的 BIOS 的方式是怎么做的。在使用 BIOS 的情况下,/var/lib/tftp/ 目录下的情况是这样的:
# tree
.
├── etc
├── grub
│   ├── 01-14-FE-B1-DA-74-0F
│   ├── 01-90-B1-3C-43-29-7C
│   ├── efidefault
│   └── images -> ../images
├── images
│   └── rhel-x86_64
│       ├── initrd.img
│       └── vmlinuz
├── memdisk
├── menu.c32
├── ppc
├── pxelinux.0
├── pxelinux.cfg
│   ├── 01-14-fe-b1-da-74-0f
│   ├── 01-90-b1-3c-43-29-7c
│   └── default
└── s390x
    └── profile_list

BIOS 默认会使用 SYSLINUX 作为 boot image,也就是 pxelinux.0 这个文件。要获取该文件很简单:
# mount -t iso9660 /path_to_image/name_of_image.iso /mnt -o loop,ro
# cp -pr syslinux-4.02-4.el6.x86_64.rpm /tmp
# umount /mnt
# rpm2cpio syslinux-4.02-4.el6.x86_64 | cpio -imdv
# mkidr /var/lib/tftp/pxelinux
# cp /tmp/usr/share/syslinux/pxelinux.0 /var/lib/tftp/pxelinux

这样,dhcpd.conf 里面的 filename 则应该如下定义:
host xxxx {
    …
    filename "pxelinux/pxelinux.0";
    …
}

将其余的文件拷贝至 tftp 目录:
# cp /boot/grub/splash.xpm.gz /var/lib/tftpboot/pxelinux/splash.xpm.gz
# cp /mnt/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/pxelinux/rhel6/

上面所有的步骤其实 cobbler 已经帮我们做好了。2.2.3 的默认是不支持 UEFI 的,这里是他的一个 patch

# cobbler get-loaders
trying hardlink /var/lib/cobbler/loaders/grub-x86_64.efi -> /var/lib/tftpboot/grub/grub-x86_64.efi
trying hardlink /var/lib/cobbler/loaders/grub-x86.efi -> /var/lib/tftpboot/grub/grub-x86.efi

此时如果还需要修改 grub 的话,修改的是 /boot/efi/grub/grub.conf 这个文件而非 /boot/grub.conf。下面就是 ks 文件的书写了。

bootloader --location=partition --driveorder=sda --append="crashkernel=auto rhgb quiet"

part /boot/efi --fstype efi --size 128 --asprimary --ondisk=sda
part /boot --fstype="ext4" --size=150 --ondisk=sda
part / --fstype="ext4" --size=20000 --fsoptions="defaults,noatime" --ondisk=sda
part /var --fstype="ext4" --size=40000 --fsoptions="defaults,noatime" --ondisk=sda
part /home --fstype="ext4" --grow --size=1 --fsoptions="defaults,noatime" --ondisk=sda

sda 的第一块分区 sda1 需要制定给 UEFI 分区,格式化为 efi 或者 vfat 格式,并将其挂载到 /boot/efi/ 目录下面;第二块分区 sda2 则需要分配给 /boot/ 目录,此分区不能分配的太大,否则会出现问题(具体的我也不清楚),官方推荐在 500M 或者同等的量级。接下分区可以随意。
另外,还需要将下面两行注释掉:
#zerombr
#clearpart –all –initlabel

UEFI 的启动流程如下:

基本上需要注意的就是上面这两点,其他的分区选项看 manual 就好了。

ref:
https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-netboot-pxe-config.html
https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-netboot-pxe-config-efi.html
https://access.redhat.com/site/solutions/315133