我的原文链接:https://www.52pojie.cn/thread-1139724-1-1.html
很多事情,不能想当然,不能看到文档或者书上写的简单,就不亲自做一遍。亲自做的时候,才会发现你的机器会跳出各种各样书上或者文档上没有写到的情况。遇到困难迎难而上去解决,才会有更大的收获。
在之前的帖子里,我提到过在服务器上想测试UEFI安装方式的rhel7升级8。这个帖子是关于这部分的详细内容。
本文涉及到了一下内容:
1、RHEL的锁定发行版本方法
2、LVM池的一些使用经验
3、Linux系统Boom快照的使用方法(重点内容,网上搜了半天没有教程,也许我是第一个写boom使用教程的?)
4、热插拔硬盘后rhel系统没有识别,需要手动重新识别硬盘的命令
5、命令行模式下的grub手动加载启动系统
6、GRUB2的一些较为深度的探索
说一下我当前系统的状况吧。我是win2012R2的系统,用UEFI的方式安装了RHEL7.6。就结果而言,安装完RHEL无法启动,也没有GRUB,仍然直接进入WIN系统。EFI分区里有了REDHAT的文件夹。我手动添加了UEFI启动项,发现进入了GRUB命令行模式。又手动加载系统,启动成功后,制作了GRUB.CFG文件,才实现了GRUB的启动。在这个系统里,GRUB的各种文件一概都没有,重装也不管用。官网下载了GRUB2手动编译,安装的EFI版本。到现在,还是一堆BUG没有解决……
一开始,我下载的是rhel7.7,结果发现不支持升级,官网说只支持7.6升级到8.1,并且提示通常会遇到Btrfs等相关问题需要解决。我就又下载了rhel7.6,安装完成后做了一些其他实验(例如先用UEFI模式装WIN后再装RHEL导致/BOOT下的EFI跑到了WIN的EFI里面导致无法启动RHEL,并且缺失grub如何修复实验、自动双击打开NTFS、搭建KMS自动激活服务器、搭建WEB网页服务器管理、docker管理、用bin升级BIOS与管理和诊断模块、VNC控制等等,都是在这里实验成功的)。
在想做的实验差不多都做完了,接下来该做升级兼容性实验了。
首先我把发行版本设定为7.6,避免升级给升多了
subscription-manager release --set 7.6
这里提示,如果使用了版本锁的话,要先清除掉
yum versionlock clear
升级到最新的7.6系统
yum -y update
由于我目前的系统,本身并不是纯净安装(和WIN是双系统,引导都是专门改过的),另外之前做实验又装了各种各样的包。用leapp的默认脚本升级,没有办法升级。下面开始一步一步来处理问题,做这个实验应该又会学到不少知识。
由于当前系统的复杂性,我先用boom给root做一个快照,万一坏了我也好有个补救措施。
首先安装boom
yum install lvm2-python-boom
安装完成后创建一个26G的快照分区,起名字叫rollback76(快照分区是用来保存你的更改内容的,超出快照空间的部分会导致快照失效。平时使用不需要如此之大,我也是为了不用计算可以无脑放置。我当前系统本身有可能动用的快照空间,我估计最多也就是10G)
(当时我是在WIN下压缩出来30GB安装RHEL,其中1G是boot,有3G是交换分区,所以剩下26G的系统分区。加上换算数值之后的缩小部分的话,系统分区的实际容量是25.36G,交换分区是3.93G)
lvcreate -s -L 26G -n rollback76 rhel/root
(-s是指定我要快照rhel/root分区,-L是指定分区大小26g,-n是制定名字叫rollback76,我的VG名字叫做rhel,注意修改成自己名字)
但是这时候提示vg的vfree空间不足,输入vgs后看到vfree只有4mb
于是乎调整我的windows分区大小,从尾部挪出来30gb用来增加vg池的容量(调整选项里不能从头部挪动只能尾部)
https://blog.51cto.com/yijiu/1329332
这篇文章里写lvm2的使用很详细
https://wiki.archlinux.org/index.php/GRUB_%28简体中文%29#UEFI_Shell
这里详细讲解了GRUB2
我先是创建了一个分区,然后在命令行下添加到池里
创建完分区之后,用这个分区创建pv分区(我的分区号是sda8)
pvcreate /dev/sda8
然后添加到vg组里(我的vg组名字叫做rhel)
vgextend rhel /dev/sda8
现在再用vgs就可以看到vfree已经空余出30gb,这回空间够了
接下来用上面的命令,用26gb创建了一个用于boom快照的分区
lvcreate -s -L 26G -n rollback76 rhel/root
现在就可以创建快照了
boom create --title "Root Snapshot - 20200323" --rootlv rhel/rollback76
再次注释:最后一句是我的vg池rhel里的rollback76分区,大家再用的时候要改成自己的。
创建的速度几乎是瞬间完成,反馈信息里包含了设备ID、版本、内核、启动ramfs、还有lvm.lv指向位置是rhel/rollback76。
创建成功后,要把快照加到grub2里,重新生成一下grub.cfg
grub2-mkconfig > /boot/grub2/grub.cfg
上面的是通常生成的位置。我之前装双系统,引导在efi/EFI/redhat里面,上次装完后grub我在两个地方都生成了,也不知道到底从哪里启动的。这次我只写这一个地方,试验一下。
试验完成,启动的是efi文件目录下的grub.cfg,我的启动文件是shimx64-redhat.efi,网上说64位系统用这个好。经过我自己试验,用grubx64、shimx64、shimx64-redhat.efi都是可以开机启动的,似乎没有什么分别。
最后boom list一下,可以看到我们的快照已经成功生成了。
快照一次具体占用多少空间我不知道,因为分区改成这样的快照模式之后,就无法加载了,是快照专用分区。boom建议容量是要和现有root分区一样或者大一点。
重启电脑后,看到我的启动项里多出来一个Snapshots。我打开了一下,报了一行错误:
error: file /efi/redhat/x86-64-efi/blscfg.mod not found
这里报错,是我自己复杂的系统构成导致,正常是可以显示的。
通常这里会显示出当前的快照,用物理机安装RHEL或者CENTOS的同学,就可以用这种方式来实现像虚拟机一样的快照功能,避免自己一不小心给弄错哪里导致无法还原。在进入快照之后,仍然可以重启进入普通状态,都是可以自己选择的。
既然是经验分享,那这里我多说一下删除快照的方式:
首先,打开快照的列表:boom list
可以看到第一行写的有BootID号,你找到你要删除的ID号,然后执行删除命令
boom entry delete d2c8369
(这里假装d2c8369是你要删除的ID号)
之后再运行boom list,就能看到你删除的快照已经不见了。
如果你想删除快照分区,可以执行下面的命令:
lvremove rhel/rollback76
然后会询问是否删除,YES即可。
如果你从快照选项进入系统,是临时进入快照。
假如你快照完了之后,进入普通模式,做系统实验、安装各种软件,意外把系统搞坏了,想还原快照怎么办呢?下面说一下永久性回滚到快照状态应该如何操作:
lvconvert --merge /dev/rhel/Root Snapshot - 20200323
(Root Snapshot - 20200323是我文章上面写过的,我创建的快照的名字。)
系统会提示,快照当前是打开状态,下次重启电脑会恢复到这个快照。我们reboot重启电脑,就回滚成功了。回滚完成后,这个快照就没了,因为变成了你正在使用的系统。有需要的话,可以重新再创建一个快照。
boom快照的使用方法,我就先写这么多。我在网上搜了一下,没找到写boom快照使用方法的教程,我这里就写下来,方便想要给linux拍摄快照使用的朋友,有个地方可以查看的到。
当然,想到此就实现快照功能的前提是正常安装的情况下。我这个情况属于特殊情况,会报一个错误,暂时无法实现快照恢复。
看样子,应该是boom释放或者生成了这么一个文件,用来恢复快照时候用的。在百度过后,这是RHEL8上的GRUB2生成的用来代替GRUB.CFG文件的一个东西。
我试着把I386-PC文件夹改了X86_64-EFI的文件夹名字,复制到了EFI/redhat的下面,开机后,果然仍旧无法进入快照,提示如下:
error: invalid arch-dependent ELF magic。
想来也是,毕竟这是传统BIOS改为UEFI的工程,只复制个文件夹多半不行。接下来接着研究,如何改造。
首先用grub2-install /dev/sda试了一下,不行。提示无法嵌入。
很显然,我的7系统应该还需要再找一下原因。经过一番努力研究过后,我终于发现,是我装的RHEL出的问题。
刚安装完成后,我就发现不能启动。网上都说,先装WIN再装LINUX,引导会被覆盖导致WIN无法启动。我恰好相反,我的WIN好好的,RHEL不能启动。后来还是我手动添加的UEFI启动项,增加EFI引导文件,才让RHEL成功的启动了。
启动过后,我发现没有grub的其他文件,没有GRUB.CFG,普通模式下安装的各种文件和文件夹都没有。奇怪了半天,因为暂时对系统没有什么影响,也就暂时没管它。直到现在试验快照的时候,频频提示缺文件,我打开我虚拟机里的RHEL,这些文件都好端端的呆在那里。为什么我没有?
重新安装grub2,提示还是缺文件。我打开他找文件的目录后,发现了I386-PC的文件夹。
这时候我才恍然大悟。原来,我的WIN是UEFI安装的,我的RHEL是用U盘安装的。而BIOS里并没有什么传统BIOS启动或者UEFI启动的选项。
在启动列表里,IBM的机器不会像普通机器一样,传统启动的就是名称,UEFI启动的会在前面有一个UEFI:XXX的标识。IBM的机器就是统一的一个设备名。
我在安装虚拟机的时候发现,RHEL无法在VMWARE里用UEFI的方式安装,为什么VMWARE不支持我并不清楚。
我看到我的U盘是应该是支持UEFI的,里面的EFI文件这些我都确认过,包含有grubx64.efi。按理说里面是可以UEFI和BIOS两种启动都支持的。当然我自己确实没有试过UEFI能否真的启动它,只是猜测而已。我在装系统的时候,是在BOOT选单里选择的U盘启动,这样一路安装下来的。
下面我得找个设备测试一下,到底能不能UEFI安装。我先用虚拟机测试一下,原本的虚拟机只有一个硬盘,肯定也是没有空余空间让我做快照的实验的,又在vmware里添加一块硬盘,相当于热插拔了一块硬盘。插上之后系统没有识别,需要运行下面的命令让系统重新识别一下:
for i in /sys/class/scsi_host/host*/scan;do echo "- - -" >$i;done
现在再ls /dev/sd* 就可以看到有一块新的硬盘了。
经过实验,专门再UEFI下安装了系统,GRUB2仍然是I386-PC版本。说明我之前错误的误会了IBM的UEFI,不是人家没有加载U盘里的EFI去安装RHEL,人家加载的没有问题,是RHEL在安装的过程中出的问题。
如果要让RHEL在安装的时候可以安装为x86_64-efi型的GRUB2的话,不知道手动分区管不管用,下次可以试一试。
无论是我操作失误,还是一个没有发现的BUG。现在既然已经知道了是GRUB2的安装方式有问题,那么我就手动下载一个GRUB2重新编译并安装,编译完后发现还是I386-pc的。我就去GRUB的官网GNU上查手册,查到了可以手动指定编译GRUB2为x86_64-efi的指令:
./configure --with-platform=efi --target=x86_64 --disable-werror --prefix=/usr/local/你的安装位置
make
make install
(一开始我把安装位置给写错了……默认安装的话直接./configure --with-platform=efi --target=x86_64 --disable-werror就好了。disable-werror是关闭错误提示,你也可以开着没关系)
编译安装完成后,就可以重新安装GRUB了:
grub2-install
安装显示成功,显示安装的是x86_64-efi的版本
哈哈,重启电脑~
进入了GRUB的命令行模式……
估计是我安装完了之后,忘了grub2-mkconfig > /boot/grub2/grub.cfg
另外,因为我是改造版,所以我的cfg位置是grub2-mkconfig > /boot/efi/EFI/redhat/grub.cfg
好吧……命令行模式下的grub手动加载启动系统。正好本文又多了一个知识点……
首先ls一下,看到了我的硬盘还有硬盘内的分区
我的EFI在1号分区,BOOT文件在5号分区,root位置在lvm:rhel下的root分区
首先设置root为BOOT分区
root=(hd0,gpt5)
然后加载内核并表明root的位置
linux /vmlinuz-3.10.0………… root=/dev/rhel/root
initrd /initramfs-3.10.0………………img
(这里提示一下,省略号部分,是内核的名字,太长我就不写了。linux和initrd的命令,有三个版本,分别是linux、linux16、linuxefi,initrd也是一样的命名方式。根据具体情况来选择。我第一次系统崩溃的时候,i386版本的grub下我用的linuxefi,升级成efi版本后,这个命令没了……我就改用linux命令来启动了)
(root=/dev/rhel/root这条命令我解释一下,不能照搬我的。他的含义是,在dev里,我有一个名叫rhel的vg池,池里有一个分区名字叫root。如果你不是用的lvm,或者改的名字不一样,要用自己的名字)
加载完毕,敲入boot回车,系统正常启动成功。
我赶紧先做个grub.cfg:grub2-mkconfig > /boot/efi/EFI/redhat/grub.cfg做完之后,我再试试快照好使不好使了。
呵呵哒……还是grub命令行……莫非我重装grub后,默认cfg的位置又变回去了?!
再来一遍,重新生成一个cfg到默认目录去……
成功了,进入了系统选单。但是又遇到了一个新的问题………………
没有发现linuxefi和initrdefi……
刚才还奇怪,怎么变成linux了……我的linuxefi哪里去了。试验了一下快照,返现还是找不到x86_64的目录。看来,路径还是有问题啊……问题的关键就在于,我安装的路径查看了并没有什么问题。说明我启动的grub和我目录里的grub不是一个grub……
接着折腾吧……
按E进入手动编辑模式,把启动两条命令的名字先去掉efi,按F10先开机再说。
因为系统里装了两个grub,我还装错了两次位置……系统里的grub太多了……我决定,删除掉重新编译一次吧……
全套搞完之后,重启电脑。神奇的是,GRUB成了中文的了?!还美化了边框?
快照仍旧无法启动,不过这次不是找不到文件了,而是提示和之前我复制粘贴那次一样的错误。区别在于变成了中文提示:
无效的架构相关的ELF魔数,无法找到命令bls_import
进系统依旧是找不到linuxefi……
折腾还是要继续折腾的。目前的小结论就是,对于我刚开始的那种情况,我的WIN2012R2是UEFI启动,RHEL虽然安装的是UEFI启动模式,GRUB也安装了linuxefi的启动文件,但是实际启动模式确实i386的。整个就是一个混合体……因为是传统与UEFI的混合体,所以也会有个EFI的文件夹,里面包括了传统启动和UEFI启动的所有文件。因为UEFI和BIOS不可能同时启动,所以系统默认启动了UEFI的文件。而我的RHEL实际上并没有以UEFI的方式安装(安装的i386的文件包),所以自然也就没有那些专属UEFI的文件,只是有个GRUB2启动器罢了。
好生无语啊……继续探索吧……
经过多方探索,linuxefi的名称问题,无论哪种安装模式下,grub生成的均是linuxefi名称的命令。在GRUB里的mod列表里,只有linux和linux16,并没有这条命令。至于为什么会这样?linuxefi这个命令到底哪里来的?为什么i386可以执行x86_64就不能运行?经过研究和百度后,我看到了很多遇到和我一样的人,不过均没有结果……
这个问题暂且搁置把。
另一个,boom快照在UEFI启动模式下无法启动的问题,我似乎找出了一些端倪。boom是用blscfg文件来运作的,这个文件会联合/boot/loader/entries里的文件来实现传统的启动模式。当用UEFI启动时候,虽然有blscfg.mod加载项,但是只要打开就会提示error: invalid arch-dependent ELF magic。想想也是,用UEFI的启动方式执行传统启动模式里的东西,确实从道理上也行不通……
在经过长时间的搜索后,发现遇到这个问题的,都是用的grub-efi型的启动模式,而解决方法都是删掉EFI改为传统的i386-pc模式。虽然这种方法可以打到我想快照的目的,但是违背了我折腾的精神。传统启动可以,UEFI不行,说明还是哪里有问题没有解决。就目前而言,暂时找不到解决方法……
这个问题就也先暂且搁置把。
就我写的快照部分的教程而言,传统安装模式安装的RHEL或者CENTOS,肯定是可以用的。一直研究下去,就没办法接着完成这篇文章了~接着升级吧,不要快照了,死就死了……
直接执行leapp upgrade
在漫长的等待过后,检测结果提示,我的GRUB有问题,解决后才可升级……
问题内容里写的是,在/etc/default/grub里没有发现文件。
创建了一个grub,问题解决。
运行leapp upgrade --debug再次检测~
漫长的等待过后,获得了彻底堵死我升级之路的终极ERROR:
2020-03-24 21:30:06.559690 [ERROR] Actor: verify_check_results Message: Detected loaded kernel drivers which have been removed in RHEL 8. Upgrade cannot proceed.
之前试过直接装RHEL8.1,一直无法检测到我的SAS控制器。照此显示,我这台服务器看来是升级无望了。内核驱动不支持,以我目前的能力,多半是解决不了了……
太累了,暂时先休息吧,随后再研究。
总结:
用UEFI版本的RHEL不仅是升级,处处有难题,一步一个坎。建议大家还是用传统启动方式安装比较好,能省很多事情。
传统版本的RHEL7.6升级8.1,操作并不复杂,也没遇到什么大问题,可能也是因为本来就没安装几个包吧。在虚拟机里试验成功了,在UEFI安装的实体机上,现在仍然没有成功……
青山不改,绿水长流。待我养精蓄锐一下,我们择日再战~