sed 修复 BusyBox - 启动失败,无法挂载 LVM

sed 修复 BusyBox - 启动失败,无法挂载 LVM

BusyBox 为什么您没有 vi?!

概括:

Ubuntu 14.04 服务器升级后首次启动时,仅启动到 BusyBox v1.21.1 initramfs,由于缺少 /dev/mapper/xxx-root 而“放弃等待根设备”,因为 lvm.conf 中的排除过滤器不正确,无法找到/挂载 LVM VG

设想:

  • 只有一个内核 3.11.0-17(是的,没有回退!),正常和恢复都转到 BusyBox
  • 仅 ssh 访问,或 IP KVM(系统位于距离 10,000 英里的 DC 中的远程 CoLo)
  • 无法访问可启动媒体,因为 IP KVM 未加载虚拟媒体
  • 默认 initramfs 配置(尝试使用 vi 显示 vi:未找到)
  • LVM PV 应该位于类似 /dev/sda5 的位置(假设有许多系统具有相同的配置,并且其他系统也设置为相同)

细节:

100% 确定问题是由于 LVM 过滤器不正确(OpenStack Cinder 环回设备配置不当),因此无法扫描 LVM VG。已知工作应该是 lvm.conf 中的默认设置:

filter = [ "a/.*/" ]

但是,这已被注释掉,而是在 lvm.conf 中:

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

如果我可以在 lvm.conf 中通过搜索不正确的字符串并用正确的字符串替换行来做出更改,那么我相信 LVM VG 将正确启动。

尝试的解决方案:

initramfs 没有编辑器(vi、vim、nano 等),只有 sed 尝试测试了 sed 正则表达式,遗憾的是,对于我这个正则表达式新手来说,破解它非常困难。到目前为止,我已经:

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

这不会对测试文件造成任何更改。我很难理解 sed 搜索/替换字符串中包含的斜杠以及 sed 命令斜杠语法的复杂性,也许有人可以在这里提供帮助?如果我可以破解 sed 命令正则表达式,我相当肯定内核应该能够启动到 LVM。

或者,尽管 lvm.conf 过滤器不正确,我是否可以强制/手动挂载(从 grub edit 或 initramfs),这是什么?

作为备选,我可以选择 MaaS(Ubuntu 基于 Web 的 PXE/tftp 映像启动),我已经在 DC 的另一台服务器上配置了它,但尚未测试或使用。我很高兴尝试使用 MaaS 将新的 Ubuntu 14.04 服务器安装到非启动系统上。

更理想的情况是先在 BusyBox 中破解 sed,然后正确地编辑 lvm.conf。我想了解这一点,以便将来使用,或者还有其他建议吗?在 grub 上编辑、手动 LVM VG 启动,或者任何其他有帮助的建议,我们都会很感激。谢谢。


后续编辑:

(不确定这里的 serverfault 最佳实践,无论如何我是否应该回答我自己的问题或进行此编辑..)

非常感谢 mvillar 提供的 sed 指导。好的,这是最终的语法和步骤,它们拯救了我,让我的系统免于因 lvm.conf 过滤器配置错误而无法启动(只能启动到 BusyBox)。我首先使用以下 sed 命令仔细检查在更改为“# 仅打印与正则表达式匹配的行(模拟“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 并且可能在逗号后缺少空格

sed 正则表达式用于在 lvm.conf 中使用“全部接受”过滤器替换不正确的语法:

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

经验教训:+ 空格不需要转义,文字字符串正斜杠、星号和引号需要转义 + 默认的 Ubuntu 14.04 不包含 vi 或 tail,尽管它们在上游都列为 BusyBox 命令,Ubuntu BusyBox 默认版本存在问题。我将来会检查我的所有系统是否至少在 BusyBox 版本中包含 vi 和 tail!+ sed 乍一看很难理解,但它确实是一个有用且功能强大的工具

查看 LVM 状态、重新创建 LVM vg 和 lv 以及在 sed 和检查后从 BusyBox 启动的步骤:

(initramfs) lvm
lvm> pvdisplay
lvm> vgdisplay
lvm> lvdisplay
lvm> vgchange -a y
lvm> exit
(initramfs) exit

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

然后,Ubuntu 继续以活动 root lv 正常启动并直接登录。太棒了!

答案1

根据文档,busybox 1.12.1有vi。

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

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

相关内容