要让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, root
mkswap: CommandFilter, mkswap, root
swapon: CommandFilter, swapon, root
swapoff: CommandFilter, swapoff, root