BusyBox为什么你没有vi?
概要:
Ubuntu 14.04服务器在升级第一次启动后,由于缺less/ dev / mapper / xxx-root,只能启动到BusyBox v1.21.1 initramfs,因为“放弃等待根设备”,因为无法find/挂载LVM VG,因为排除filter不正确lvm.conf
场景:
详情:
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