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 全称 Security Enhanced Linux (安全强化 Linux),是 MAC (Mandatory Access Control,强制訪问控制系统)的一个实现。目的在于明白的指明某个进程能够訪问哪些资源(文件、网络端口等)

强制訪问控制系统的用途在于增强系统抵御 0-Day 攻击(利用尚未公开的漏洞实现的攻击行为)的能力

所以它不是网络防火墙或 ACL 的替代品,在用途上也不反复

/etc/passwd 来获得系统已存在用户)。而修复该安全漏洞的 Apache 更新补丁尚未释出。此时 SELinux 能够起到弥补该漏洞的缓和方案。由于 /etc/passwd 不具有 Apache 的訪问标签,所以 Apache 对于/etc/passwd

相比其他强制性訪问控制系统,SELinux 有例如以下优势:

  • 控制策略是可查询而非程序不可见的。
  • 能够热更改策略而无需重新启动或者停止服务。
  • 能够从进程初始化、继承和程序执行三个方面通过策略进行控制。
  • 控制范围覆盖文件系统、文件夹、文件、文件启动描写叙述符、端口、消息接口和网络接口

那么 SELinux 对于系统性能有什么样的影响呢?依据 Phoronix 在 2009 年使用 Fedora 11 所做的横向比較来看,开启 SELinux 仅在少数情况下导致系统性能约 5% 的减少

SELinux 是不是会十分影响一般桌面应用及程序开发呢?原先是。由于 SELinux 的策略主要针对server环境。但随着 SELinux 8年来的广泛应用。眼下SELinux 策略在一般桌面及程序开发环境下依旧能够同一时候满足安全性及便利性的要求。以刚刚公布的 Fedora 15 为例,笔者在搭建完整的娱乐(包括多款第三方原生 Linux 游戏及 Wine 游戏)及开发环境(Android SDK + Eclipse)过程中,仅仅有 Wine 程序的首次执行时受到 SELinux 默认策略的阻拦,在图形化的“SELinux 故障排除程序”帮助下,点击一下button就攻克了。

了解和配置 SELinux

1. 获取当前 SELinux 执行状态

getenforceEnforcingPermissive 和 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 保护,stricttargeted,包括了对差点儿全部常见网络服务的 SELinux 策略配置,已经默认安装而且能够无需改动直接使用。seedit 以及 Eclipse 下的编辑插件 eclipse-slide

4. coreutils 工具的 SELinux 模式

psls 等等,能够通过添加 Zps auxZ | grep lldpadsystem_u:system_r:initrc_t:s0 root 1000 8.9 0.0 3040 668 ? Ss 21:01 6:08 /usr/sbin/lldpad -dls -Z /usr/lib/xulrunner-2/libmozjs.so-rwxr-xr-x. root root system_u:object_r:lib_t:s0 /usr/lib/xulrunner-2/libmozjs.soZ 选项能够应用在差点儿全部 coreutils

Apache SELinux 配置实例

1. 让 Apache 能够訪问位于非默认文件夹下的站点文件

semanage fcontext -l | grep '/var/www' 获知默认 /var/www/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0httpd_sys_content_t/srv/www 作为站点文件文件夹,那么就须要给这个文件夹下的文件添加 httpd_sys_content_tsemanage fcontext -a -t httpd_sys_content_t '/srv/www(/.*)?' 然后用新的标签类型标注已有文件:restorecon -Rv /srv/wwwrestorecon 在 SELinux 管理中非经常见,起到恢复文件默认标签的作用。比方当从用户主文件夹下将某个文件拷贝到 Apache 站点文件夹下时。Apache 默认是无法訪问,由于用户主文件夹的下的文件标签是 user_home_t。此时就须要 restorecon 将其恢复为可被 Apache 訪问的 httpd_sys_content_trestorecon -v /srv/www/foo.com/html/file.htmlrestorecon 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 侦听非标准端口

service httpd restartStarting 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:888no listening sockets available, shutting downUnable to open logs 这个时候,若是在桌面环境下 SELinux 故障排除工具应该已经弹出来报错了。若是在终端下,能够通过查看 /var/log/messages 日志然后用 sealert -l加编号的方式查看,或者直接使用 sealert -bSELinux 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 888Then 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 NISThen you must tell SELinux about this by enabling the 'allow_ypbind' boolean.Dosetsebool -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.Doallow 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

具体内容參考 Man 手冊

3. 同意 Apache 訪问创建私人站点

~/public_html/setsebool httpd_enable_homedirs 1setsebool 是用来切换由布尔值控制的 SELinux 策略的,当前布尔值策略的状态能够通过 getsebool-Psetsebool -P httpd_enable_homedirs 1

总结

希望通过这一个简短的教程,扫除您对 SELinux 的误解甚至恐惧,个人感觉它并不比 iptables 策略复杂。假设希望您的server能有效抵挡 0-day 攻击时,那么 SELinux 也许就是一个值得考虑的缓和方案。



3.让命令提交后不受本地关闭终端窗体/网络断开连接的干扰

使用命令setsid,參考博客:

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里加入下面语句就可以:


e

xport LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH    

一般来讲这仅仅是一种暂时的解决方式, 在没有权限或暂时须要的时候使用.
--End--


转载于:


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 全称 Security Enhanced Linux (安全强化 Linux),是 MAC (Mandatory Access Control,强制訪问控制系统)的一个实现。目的在于明白的指明某个进程能够訪问哪些资源(文件、网络端口等)

强制訪问控制系统的用途在于增强系统抵御 0-Day 攻击(利用尚未公开的漏洞实现的攻击行为)的能力

所以它不是网络防火墙或 ACL 的替代品,在用途上也不反复

/etc/passwd 来获得系统已存在用户)。而修复该安全漏洞的 Apache 更新补丁尚未释出。此时 SELinux 能够起到弥补该漏洞的缓和方案。由于 /etc/passwd 不具有 Apache 的訪问标签,所以 Apache 对于/etc/passwd

相比其他强制性訪问控制系统,SELinux 有例如以下优势:

  • 控制策略是可查询而非程序不可见的。
  • 能够热更改策略而无需重新启动或者停止服务。
  • 能够从进程初始化、继承和程序执行三个方面通过策略进行控制。
  • 控制范围覆盖文件系统、文件夹、文件、文件启动描写叙述符、端口、消息接口和网络接口

那么 SELinux 对于系统性能有什么样的影响呢?依据 Phoronix 在 2009 年使用 Fedora 11 所做的横向比較来看,开启 SELinux 仅在少数情况下导致系统性能约 5% 的减少

SELinux 是不是会十分影响一般桌面应用及程序开发呢?原先是。由于 SELinux 的策略主要针对server环境。但随着 SELinux 8年来的广泛应用。眼下SELinux 策略在一般桌面及程序开发环境下依旧能够同一时候满足安全性及便利性的要求。以刚刚公布的 Fedora 15 为例,笔者在搭建完整的娱乐(包括多款第三方原生 Linux 游戏及 Wine 游戏)及开发环境(Android SDK + Eclipse)过程中,仅仅有 Wine 程序的首次执行时受到 SELinux 默认策略的阻拦,在图形化的“SELinux 故障排除程序”帮助下,点击一下button就攻克了。

了解和配置 SELinux

1. 获取当前 SELinux 执行状态

getenforceEnforcingPermissive 和 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 保护,stricttargeted,包括了对差点儿全部常见网络服务的 SELinux 策略配置,已经默认安装而且能够无需改动直接使用。seedit 以及 Eclipse 下的编辑插件 eclipse-slide

4. coreutils 工具的 SELinux 模式

psls 等等,能够通过添加 Zps auxZ | grep lldpadsystem_u:system_r:initrc_t:s0 root 1000 8.9 0.0 3040 668 ? Ss 21:01 6:08 /usr/sbin/lldpad -dls -Z /usr/lib/xulrunner-2/libmozjs.so-rwxr-xr-x. root root system_u:object_r:lib_t:s0 /usr/lib/xulrunner-2/libmozjs.soZ 选项能够应用在差点儿全部 coreutils

Apache SELinux 配置实例

1. 让 Apache 能够訪问位于非默认文件夹下的站点文件

semanage fcontext -l | grep '/var/www' 获知默认 /var/www/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0httpd_sys_content_t/srv/www 作为站点文件文件夹,那么就须要给这个文件夹下的文件添加 httpd_sys_content_tsemanage fcontext -a -t httpd_sys_content_t '/srv/www(/.*)?' 然后用新的标签类型标注已有文件:restorecon -Rv /srv/wwwrestorecon 在 SELinux 管理中非经常见,起到恢复文件默认标签的作用。比方当从用户主文件夹下将某个文件拷贝到 Apache 站点文件夹下时。Apache 默认是无法訪问,由于用户主文件夹的下的文件标签是 user_home_t。此时就须要 restorecon 将其恢复为可被 Apache 訪问的 httpd_sys_content_trestorecon -v /srv/www/foo.com/html/file.htmlrestorecon 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 侦听非标准端口

service httpd restartStarting 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:888no listening sockets available, shutting downUnable to open logs 这个时候,若是在桌面环境下 SELinux 故障排除工具应该已经弹出来报错了。若是在终端下,能够通过查看 /var/log/messages 日志然后用 sealert -l加编号的方式查看,或者直接使用 sealert -bSELinux 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 888Then 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 NISThen you must tell SELinux about this by enabling the 'allow_ypbind' boolean.Dosetsebool -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.Doallow 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

具体内容參考 Man 手冊

3. 同意 Apache 訪问创建私人站点

~/public_html/setsebool httpd_enable_homedirs 1setsebool 是用来切换由布尔值控制的 SELinux 策略的,当前布尔值策略的状态能够通过 getsebool-Psetsebool -P httpd_enable_homedirs 1

总结

希望通过这一个简短的教程,扫除您对 SELinux 的误解甚至恐惧,个人感觉它并不比 iptables 策略复杂。假设希望您的server能有效抵挡 0-day 攻击时,那么 SELinux 也许就是一个值得考虑的缓和方案。



3.让命令提交后不受本地关闭终端窗体/网络断开连接的干扰

使用命令setsid,參考博客:

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里加入下面语句就可以:


e

xport LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH    

一般来讲这仅仅是一种暂时的解决方式, 在没有权限或暂时须要的时候使用.
--End--