Nova执行命令的原理

来源:互联网 发布:江苏域名备案 编辑:程序博客网 时间:2024/05/16 09:56

要让Nova在计算节点上执行一些需要root权限的命令,其原理是这样的:
首先基于sudo的原理,因为openstack-nova-compute服务是属于nova用户和nova组的,它们本身不具有root权限,因此需要sudo;
但是sudo去执行的是这样的一个命令”/usr/bin/nova-rootwrap /etc/nova/rootwrap.conf”,于是 /etc/sudoers 中需要有以下这一行(一般来说,这一行在安装了Nova之后都是有的):

nova ALL = (root) NOPASSWD: /usr/bin/nova-rootwrap /etc/nova/rootwrap.conf

因此想让Nova执行的命令,其实是作为上述命令的参数,比如要执行 systemctl restart sshd ,真正运行的应该是:

sudo /usr/bin/nova-rootwrap /etc/nova/rootwrap.conf systemctl restart sshd 

也就是说,在修改Nova代码的时候,写的就类似是:

os.system("sudo /usr/bin/nova-rootwrap /etc/nova/rootwrap.conf systemctl restart sshd")

为何需要这样一个命令加上一个conf文件呢?其道理也很简单:在 /etc/nova/rootwrap.conf 中定义了一个path,即 /usr/share/nova/rootwrap/compute.filters 文件,而该文件给出了可以以root权限执行的命令。于是不在这个列表中的命令将不会被执行了。

compute.filters 的示例如下:

[Filter]# zram feature modprobe: CommandFilter, modprobe, rootmkswap: CommandFilter, mkswap, rootswapon: CommandFilter, swapon, rootswapoff: CommandFilter, swapoff, root

参考文献:
https://wiki.openstack.org/wiki/Rootwrap

1 0