当使用libvirt启动QEMU后,QEMU进程便成为后台进程在运行,刚刚分析了QEMU启动的代码,将其转换为daemon进程的过程简单解释如下(QEMU-2.3.0):
1 概述
QEMU在被libvirt启动的时候,可以传入一些参数来设置QEMU进程的运行状态,主要参数有:-runas指定以某个用户的权限运行虚拟机、-chroot改变当前QEMU的工作根目录、-daemonize让QEMU以后台进程的形式运行。
主要的参数解析工作为函数os_parse_cmd_args(),通过系统调用getpwnam得到用户的相关信息,并赋值给变量user_pwd;得到工作根目录的字符串,并赋值给变量chroot_dir;如果是后台进程,则将变量daemonize赋值为1.
除了以上QEMU进程状态外,还有信号设置、进程名字更改、改变回话ID等。
2 启动代码分析
在main函数中,关于设置QEMU运行状态的参数的调用顺序如下:
os_setup_early_signal_handling() 2815
os_daemonize() 3772
parse_name() -> os_set_proc_name() 3783
os_find_datadir 3857
qemu_create_pidfile 4019
os_set_line_buffering 4110
realtime_init() -> os_mlock() 4228
os_setup_signal_handling 4292
os_setup_post 4354
2.1 os_setup_early_signal_handling()
代码如下:
void os_setup_early_signal_handling(void)
{
struct sigaction act;
sigfillset(&act.sa_mask); //初始化信号集合,将所有的信号加入集合中。
act.sa_flags = 0;
act.sa_handler = SIG_IGN; //忽略所选信号。
sigaction(SIGPIPE, &act, NULL);
}
忽略信号SIGPIPE,