针对BusyBox的sed修复 – 启动失败无法挂载LVM

BusyBox为什么你没有vi?

概要:

Ubuntu 14.04服务器在升级第一次启动后,由于缺less/ dev / mapper / xxx-root,只能启动到BusyBox v1.21.1 initramfs,因为“放弃等待根设备”,因为无法find/挂载LVM VG,因为排除filter不正确lvm.conf

场景:

  • 只有单核3.11.0-17(是的,没有后备!),正常和恢复到BusyBox
  • 只有ssh访问,或者IP KVM(系统位于距离10,000英里远的DC的远程CoLo中)
  • 由于IP KVM不加载虚拟媒体,因此不能访问可启动媒体
  • 默认的initramfsconfiguration(尝试使用vi显示vi:未find)
  • LVM PV应该放在/ dev / sda5之类的东西(假设这是因为许多系统具有相同的configuration,而其他设置则是这样)

详情:

100%确定的问题是LVMfilter不正确(为LVMconfigurationOpenStack Cinder环回设备),因此不扫描LVM VG。 在lvm.conf中已知的工作应该是默认的:

filter = [ "a/.*/" ] 

然而,这被注释掉了,而是在lvm.conf中:

 filter = [ "a/sda1/", "a/sdb/", "r/.*/"] 

如果我可以通过在lvm.conf中search不正确的string并用正确的stringreplacelvm.conf中的更改,那么我相信LVM VG将正确引导。

尝试解决scheme:

initramfs没有编辑(vi,vim,nano等),只有sed试过sed正则expression式,遗憾的是这对于这个正则expression式noob是非常难以破解的。 我到目前为止:

 sed -i '/filter = [ "a/sda1/", "a/sdb/", "r/.*/"]/c\filter = [ "a/.*/" ]' /etc/lvm/lvm.conf 

这不会改变testing文件。 我无法理解sedsearch/replacestring中包含的斜线与sed命令的斜杠语法的复杂性,也许有人可以在这里协助? 如果我可以破解sed命令的正则expression式,我相当确定内核应该能够启动到LVM。

或者是有一个强制/手动安装我可以使用(从GRUB编辑或initramfs),尽pipelvm.conffilter不正确,这是什么?

作为回退,我可以走在MaaS(基于Ubuntu的基于Web的PXE / tftp映像引导)的path上,我已经在DC的另一个服务器上configuration了这个path,但还没有testing或使用过。 我很高兴尝试使用MaaS将新的Ubuntu 14.04服务器推向非引导系统。

通过在BusyBox中首先破解sed正确编辑lvm.conf是比较理想的。 我想了解未来,或任何其他build议? 在grub编辑,手动LVM VG启动,或任何其他build议,帮助表示赞赏。 谢谢。


后续编辑:

(不确定在这里serverfault最佳做法,无论我应该回答我自己的问题或做这个编辑,无论如何..)

非常感谢你的sed指导。 好的,这是最后的synatax和步骤,由于lvm.conffilterconfiguration中的错误,我的培根从无法启动的系统(仅限于BusyBox)中保存下来。 我第一次使用下面的sed命令来检查正确的语法前后更改为'#只打印符合正则expression式(模拟“grep”)“的行:

 sed -n '/loop/p' /etc/lvm/lvm.conf 

资料来源: http : //www.catonmat.net/blog/wp-content/uploads/2008/09/sed1line.txt

所以我发现了lvm.conf中的实际不正确的行(不同于我原来所说的):

 filter = [ "a/sdc5*/","a/loop2*/", "r/.*/" ] 

注意:我相信引导错误的原因是原始lvm.conf中的语法不正确。 我想要:筛选接受sda5和loop2并拒绝所有其他人。 我错误地指出:sdc5,可能在逗号后缺less空格

sed正则expression式,用lvm.conf中的'accept all'filterreplace不正确的语法:

 sed -i "s/filter \= \[ \"a\/sdc5\*\/\",\"a\/loop2\*\/\", \"r\/\.\*\/\" \]/filter = [ \"a\/.\*\/\" ]/" /etc/lvm/lvm.conf 

经验教训:+转义不需要空格,需要文字string正斜杠,asterix和引号+默认的Ubuntu 14.04不包括vi或尾巴,尽pipe他们在上游列为BusyBox命令,这里与Ubuntu BusyBox默认构build这里的东西。 我将来会检查我所有的系统在BusyBox构build中都包含AT LEAST vi和tail! + sed首先是复杂的理解,但是一个非常有用和强大的工具

查看LVM状态的步骤,重新创buildLVM vg和lv并在sed后从BusyBox启动并检查:

 (initramfs) lvm lvm> pvdisplay lvm> vgdisplay lvm> lvdisplay lvm> vgchange -ay lvm> exit (initramfs) exit 

资料来源: http : //ubuntuforums.org/showthread.php?t=1898901

然后Ubuntu继续正常启动与活跃的根LV,并直接login。 真棒!

根据文档 ,busybox 1.12.1有vi。

无论如何,这是你的sed正则expression式:

 sed -i "s/filter\ \=\ \[\ \"a\/loop2\/\",\ \"r\/\.\*\/\"\ \]/filter = [ \"a\/.*\/\" ]/" /etc/lvm/lvm.conf