centos7 qemu -- 03 使用KVM虚拟机遇到的问题
1.qemu-kvm、kvm、qemu 和 qemu-system-x86_64四种命令的区别
qemu 和 qemu-system-x86_64:启动qemu虚拟机的命令,x86_64为64位系统时使用的命令
qemu-x86_64 仅仅模拟CPU
qemu-system-x86_64 模拟整个PC
qemu-kv和 kvm:如果要开启kvm支持,需要使用qemu-kvm或者kvm命令,暂时记为两个命令是等效的
2.用libvirt库创建虚拟机时会报错:internal error unable to start guest: libvir: error : cannot execute binary /usr/bin/qemu-kvm: Permission denied”
通过调研(https://bugzilla.redhat.com/show_bug.cgi?format=multiple&id=523956)得知,这跟selinux有关,但具体原因还不太清楚。
解决方法:将/etc/selinux/config中SELINUX项设为permissive,重启系统,搞定~
如下是关于selinux的介绍:
几乎可以肯定每个人都听说过 SELinux (更准确的说,尝试关闭过),甚至某些过往的经验让您对 SELinux 产生了偏见。不过随着日益增长的 0-day 安全漏洞,或许现在是时候去了解下这个在 Linux 内核中已经有8年历史的强制性访问控制系统(MAC)了。
SELinux 与强制访问控制系统
SELinux 全称 Security Enhanced Linux (安全强化 Linux),是 MAC (Mandatory Access Control,强制访问控制系统)的一个实现,目的在于明确的指明某个进程可以访问哪些资源(文件、网络端口等)。
强制访问控制系统的用途在于增强系统抵御 0-Day 攻击(利用尚未公开的漏洞实现的攻击行为)的能力。所以它不是网络防火墙或 ACL 的替代品,在用途上也不重复。
举例来说,系统上的 Apache 被发现存在一个漏洞,使得某远程用户可以访问系统上的敏感文件(比如 /etc/passwd
来获得系统已存在用户),而修复该安全漏洞的 Apache 更新补丁尚未释出。此时 SELinux 可以起到弥补该漏洞的缓和方案。因为 /etc/passwd 不具有 Apache 的访问标签,所以 Apache 对于/etc/passwd
的访问会被 SELinux 阻止。
相比其他强制性访问控制系统,SELinux 有如下优势:
- 控制策略是可查询而非程序不可见的。
- 可以热更改策略而无需重启或者停止服务。
- 可以从进程初始化、继承和程序执行三个方面通过策略进行控制。
- 控制范围覆盖文件系统、目录、文件、文件启动描述符、端口、消息接口和网络接口。
那么 SELinux 对于系统性能有什么样的影响呢?根据 Phoronix 在 2009 年使用 Fedora 11 所做的横向比较来看,开启 SELinux 仅在少数情况下导致系统性能约 5% 的降低。
SELinux 是不是会十分影响一般桌面应用及程序开发呢?原先是,因为 SELinux 的策略主要针对服务器环境。但随着 SELinux 8年来的广泛应用,目前SELinux 策略在一般桌面及程序开发环境下依然可以同时满足安全性及便利性的要求。以刚刚发布的 Fedora 15 为例,笔者在搭建完整的娱乐(包含多款第三方原生 Linux 游戏及 Wine 游戏)及开发环境(Android SDK + Eclipse)过程中,只有 Wine 程序的首次运行时受到 SELinux 默认策略的阻拦,在图形化的“SELinux 故障排除程序”帮助下,点击一下按钮就解决了。
了解和配置 SELinux
1. 获取当前 SELinux 运行状态
getenforce
可能返回结果有三种:Enforcing
、Permissive
和 Disabled
。Disabled 代表 SELinux 被禁用,Permissive 代表仅记录安全警告但不阻止可疑行为,Enforcing 代表记录警告且阻止可疑行为。
目前常见发行版中,RHEL 和 Fedora 默认设置为 Enforcing,其余的如 openSUSE 等为 Permissive。
2. 改变 SELinux 运行状态
setenforce [ Enforcing | Permissive | 1 | 0 ]
该命令可以立刻改变 SELinux 运行状态,在 Enforcing 和 Permissive 之间切换,结果保持至关机。一个典型的用途是看看到底是不是 SELinux 导致某个服务或者程序无法运行。若是在 setenforce 0 之后服务或者程序依然无法运行,那么就可以肯定不是 SELinux 导致的。
若是想要永久变更系统 SELinux 运行环境,可以通过更改配置文件 /etc/sysconfig/selinux
实现。注意当从 Disabled 切换到 Permissive 或者 Enforcing 模式后需要重启计算机并为整个文件系统重新创建安全标签(touch /.autorelabel && reboot
)。
3. SELinux 运行策略
配置文件 /etc/sysconfig/selinux
还包含了 SELinux 运行策略的信息,通过改变变量 SELINUXTYPE
的值实现,该值有两种可能:targeted
代表仅针对预制的几种网络服务和访问请求使用 SELinux 保护,strict
代表所有网络服务和访问请求都要经过 SELinux。
RHEL 和 Fedora 默认设置为 targeted
,包含了对几乎所有常见网络服务的 SELinux 策略配置,已经默认安装并且可以无需修改直接使用。
若是想自己编辑 SELinux 策略,也提供了命令行下的策略编辑器 seedit
以及 Eclipse 下的编辑插件 eclipse-slide
。
4. coreutils 工具的 SELinux 模式
常见的属于 coreutils 的工具如 ps
、ls
等等,可以通过增加 Z
选项的方式获知 SELinux 方面的信息。
如 ps auxZ | grep lldpad
system_u:system_r:initrc_t:s0 root 1000 8.9 0.0 3040 668 ? Ss 21:01 6:08 /usr/sbin/lldpad -d
如 ls -Z /usr/lib/xulrunner-2/libmozjs.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0 /usr/lib/xulrunner-2/libmozjs.so
以此类推,Z
选项可以应用在几乎全部 coreutils
工具里。
Apache SELinux 配置实例
1. 让 Apache 可以访问位于非默认目录下的网站文件
首先,用 semanage fcontext -l | grep '/var/www'
获知默认 /var/www
目录的 SELinux 上下文:
/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
从中可以看到 Apache 只能访问包含 httpd_sys_content_t
标签的文件。
假设希望 Apache 使用 /srv/www
作为网站文件目录,那么就需要给这个目录下的文件增加 httpd_sys_content_t
标签,分两步实现。
首先为 /srv/www 这个目录下的文件添加默认标签类型:semanage fcontext -a -t httpd_sys_content_t '/srv/www(/.*)?'
然后用新的标签类型标注已有文件:restorecon -Rv /srv/www
之后 Apache 就可以使用该目录下的文件构建网站了。
其中 restorecon
在 SELinux 管理中很常见,起到恢复文件默认标签的作用。比如当从用户主目录下将某个文件复制到 Apache 网站目录下时,Apache 默认是无法访问,因为用户主目录的下的文件标签是 user_home_t
。此时就需要 restorecon
将其恢复为可被 Apache 访问的 httpd_sys_content_t
类型:
restorecon -v /srv/www/foo.com/html/file.html
restorecon reset /srv/www/foo.com/html/file.html context unconfined_u:object_r:user_home_t:s0->system_u:object_r:httpd_sys_content_t:s0
2. 让 Apache 侦听非标准端口
默认情况下 Apache 只侦听 80 和 443 两个端口,若是直接指定其侦听 888 端口的话,会在 service httpd restart
的时候报错:
Starting httpd: (13)Permission denied: make_sock: could not bind to address [::]:888
(13)Permission denied: make_sock: could not bind to address 0.0.0.0:888
no listening sockets available, shutting down
Unable to open logs
这个时候,若是在桌面环境下 SELinux 故障排除工具应该已经弹出来报错了。若是在终端下,可以通过查看 /var/log/messages 日志然后用 sealert -l加编号的方式查看,或者直接使用 sealert -b
浏览。无论哪种方式,内容和以下会比较类似:
SELinux is preventing /usr/sbin/httpd from name_bind access on the tcp_socket port 888.
***** Plugin bind_ports (92.2 confidence) suggests *************************
If you want to allow /usr/sbin/httpd to bind to network port 888
Then you need to modify the port type.
Do
# semanage port -a -t PORT_TYPE -p tcp 888
`where PORT_TYPE is one of the following: ntop_port_t, http_cache_port_t, http_port_t.`
***** Plugin catchall_boolean (7.83 confidence) suggests *******************
If you want to allow system to run with NIS
Then you must tell SELinux about this by enabling the 'allow_ypbind' boolean.
Do
setsebool -P allow_ypbind 1
***** Plugin catchall (1.41 confidence) suggests ***************************
If you believe that httpd should be allowed name_bind access on the port 888 tcp_socket by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# grep httpd /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp
可以看出 SELinux 根据三种不同情况分别给出了对应的解决方法。在这里,第一种情况是我们想要的,于是按照其建议输入:
semanage port -a -t http_port_t -p tcp 888
之后再次启动 Apache 服务就不会有问题了。
这里又可以见到 semanage
这个 SELinux 管理配置工具。它第一个选项代表要更改的类型,然后紧跟所要进行操作。详细内容参考 Man 手册
3. 允许 Apache 访问创建私人网站
若是希望用户可以通过在 ~/public_html/
放置文件的方式创建自己的个人网站的话,那么需要在 Apache 策略中允许该操作执行。使用:
setsebool httpd_enable_homedirs 1
setsebool
是用来切换由布尔值控制的 SELinux 策略的,当前布尔值策略的状态可以通过 getsebool
来获知。
默认情况下 setsebool 的设置只保留到下一次重启之前,若是想永久生效的话,需要添加 -P
参数,比如:
setsebool -P httpd_enable_homedirs 1
总结
希望通过这一个简短的教程,扫除您对 SELinux 的误解甚至恐惧,个人感觉它并不比 iptables 策略复杂。如果希望您的服务器能有效抵挡 0-day 攻击时,那么 SELinux 或许就是一个值得考虑的缓和方案。
3.让命令提交后不受本地关闭终端窗口/网络断开连接的干扰
使用命令setsid,参考博客:http://blog.csdn.net/wan_hust/article/details/31428581
4.配置了网卡文件,但ifconfig时显示的信息不对
解决方法:关闭服务NetworkManager
5.编译动态库时遇到relocation R_X86_64_32 against `a local symbol'的错误
编译动态库时遇到如下错误:
...
... relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
... could not read symbols: Bad value
解决办法编译器已经提示了:recompile with -fPIC
但是我们应该重新编译谁带上这个参数呢?经过我几番折腾,发现如下情况:
1、编译.o文件的时候,没有加参数-fPIC,这问题个在gcc version 3.4.6版本没有发生,可能那个编译器默认都给加上吧。
2、当前程序中有用到某个静态库,那个静态库编译.o文件的时候没有加上-fPIC(静态库其实就是.o文件打包)。补充一点:我发现手写Makefile时即使不加-fPIC也没有这个问题,这一点很郁闷,这个只在用automake工具编译出.a文件时才出现过。
6."error while loading shared libraries: xxx.so.x" 错误的原因和解决办法
一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如:
tmux: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory
原因一般有两个, 一个是操作系统里确实没有包含该共享库(lib*.so.*文件)或者共享库版本不对, 遇到这种情况那就去网上下载并安装上即可.
另外一个原因就是已经安装了该共享库, 但执行需要调用该共享库的程序的时候, 程序按照默认共享库路径找不到该共享库文件.
所以安装共享库后要注意共享库路径设置问题, 如下:
1) 如果共享库文件安装到了/lib或/usr/lib目录下, 那么需执行一下ldconfig命令
ldconfig命令的用途, 主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下, 搜索出可共享的动态链接库(格式如lib*.so*), 进而创建出动态装入程序(ld.so)所需的连接和缓存文件. 缓存文件默认为/etc/ld.so.cache, 此文件保存已排好序的动态链接库名字列表.
2) 如果共享库文件安装到了/usr/local/lib(很多开源的共享库都会安装到该目录下)或其它"非/lib或/usr/lib"目录下, 那么在执行ldconfig命令前, 还要把新共享库目录加入到共享库配置文件/etc/ld.so.conf中, 如下:
# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
# echo "/usr/local/lib" >> /etc/ld.so.conf
# ldconfig
3) 如果共享库文件安装到了其它"非/lib或/usr/lib" 目录下, 但是又不想在/etc/ld.so.conf中加路径(或者是没有权限加路径). 那可以export一个全局变量LD_LIBRARY_PATH, 然后运行程序的时候就会去这个目录中找共享库.
LD_LIBRARY_PATH的意思是告诉loader在哪些目录中可以找到共享库. 可以设置多个搜索目录, 这些目录之间用冒号分隔开. 比如安装了一个mysql到/usr/local/mysql目录下, 其中有一大堆库文件在/usr/local/mysql/lib下面, 则可以在.bashrc或.bash_profile或shell里加入以下语句即可:
export LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH
一般来讲这只是一种临时的解决方案, 在没有权限或临时需要的时候使用.
--End--
centos7 qemu -- 03 使用KVM虚拟机遇到的问题相关推荐
- 运维之道 | CentOS7.6 安装部署KVM虚拟机(GUI图形化安装)
前言 KVM虚拟技术是完全的虚拟化,VPS之间不共用母机CPU和内存,VPS之间资源使用是独立的,互不影响.由于是完全的虚拟化,KVM虚拟技术的VPS理论上支持安装linux和windows任何版本, ...
- kvm linux重置密码,kvm虚拟机操作相关命令及虚拟机和镜像密码修改
虚拟机生命周期管理 1)查看kvm虚拟机状态 #virsh list --all 2)KVM虚拟机开机 # virsh start oeltest01 3)KVM虚拟机关机或断电 关机 默认情况下vi ...
- Centos7.4安装kvm虚拟机(使用virt-manager管理)
2019独角兽企业重金招聘Python工程师标准>>> Centos7.4安装kvm虚拟机(使用virt-manager管理) 之前介绍了使用WebVirtMgr或Openstack ...
- gdb 调试kvm虚拟机_GDB+QEMU调试内核模块(实践篇)
调试内核模块的方法有很多.最常用的,可能也是上手难度最低的就是使用prinfk打印出相关的调试信息,但是总给人的感觉不够geeek,所以这里描述一种能够使用gdb+qemu来调试内核的方法. 启动虚拟 ...
- CentOS7文本模式下配置及安装KVM虚拟机
一.准备工作: 在安装和配置kvm虚拟机之前,首先确保kvm软件已经被正确安装,如果没有安装,请参考如下几步操作: 第一步:检查CPU是否支持vmx相关指令,如果执行结 ...
- CentOS7 安装管理KVM虚拟机
为什么80%的码农都做不了架构师?>>> 系统:CentOS7 64位 [root@e3 ~]# cat /etc/redhat-release CentOS Linux re ...
- CentOS7.2部署KVM虚拟机
学习了关于PostGis.OSM数据以及Mapnik相关内容,接下来将利用假期重点学习PostgreSQL-XL和瓦片服务器集群技术,因此先把环境搭好.计划采用KVM来充分利用家里不太宽裕的" ...
- 在CentOS7上运行KVM虚拟机
在CentOS7上运行KVM虚拟机 准备工作 检查CPU特性 安装一些基础软件包(非必须) 安装KVM及相关工具 验证安装结果 启动服务并设置为开机自动运行 创建网络环境 使用KVM虚拟机 下载操作系 ...
- Centos7 KVM 虚拟机加载NVIDIA驱动
文章目录 1 Centos7.7宿主机安装NVIDIA驱动 2 KVM虚拟机安装NVIDIA 驱动 1 Centos7.7宿主机安装NVIDIA驱动 NVIDIA驱动官方下载地址 (1)关闭nouve ...
最新文章
- C#, ASP.NET面试题系列(1)
- 【C 语言】指针间接赋值 ( 指针作为 函数参数 的意义 | 间接赋值 代码示例 )
- iris数据_MAT之ELM:ELM实现鸢尾花(iris数据集)种类测试集预测识别正确率(better)结果对比...
- 9、mysql数据表中数据的查询(1)
- 团队项目电梯会议视频
- chrome浏览器中解决embed标签 loop=true 背景音乐无法循环的问题。
- wordpress在Linux nginx下权限设置
- Hi,我们的代码重构了
- 移远NB-IOT BC28 模组 与自建的UDP服务器通信
- 中美线径对照表_美标线径与国标对照
- 《插件积累》页面音乐下载,付费音乐下载.
- Failed to process import candidates for configuration class :Annotation-specified bean name ‘XXX‘ fo
- VBox 虚拟机完美迁移/复制(带快照)
- 【多目标优化】3. 基于分解的多目标进化算法 —(MOEA/D)
- vs code php终端输出中文乱码及环境配置解决办法
- 基尔霍夫定律及其应用
- python中的.nc文件处理 | 02 CMIP及MACA v2气候数据介绍
- 【20保研】北京航空航天大学网络空间安全学院 “2019年暑期优秀大学生夏令营”活动通知...
- BCS 2022大湾区网络安全峰会 | 美创CTO分享数据安全风险治理实践
- Google Chrome 旧版本下载地址