SELinux(Security-Enhanced Linux)是CentOS的核心安全模块,通过**强制访问控制(MAC)**管理文件、进程等对象的上下文(用户、角色、类型、级别),以下是关键管理技巧:
使用ls -Z命令查看文件/目录或进程的SELinux上下文,格式为user:role:type:level。例如:
ls -Z /var/www/html/index.html
# 输出示例:system_u:object_r:httpd_sys_content_t:s0
该命令能快速确认对象的上下文是否符合预期。
临时更改:使用chcon命令修改单个对象或递归修改目录的上下文。例如,将/var/www/html/test.html设置为Web服务器上下文:
sudo chcon -t httpd_sys_content_t /var/www/html/test.html
# 递归修改目录
sudo chcon -R -t httpd_sys_content_t /var/www/html/myapp
注意:chcon的更改在文件系统重标记或恢复时会失效。
永久更改:通过semanage fcontext添加自定义上下文规则,再用restorecon恢复默认上下文。例如:
# 添加规则(将/var/www/html/myapp/*关联到httpd_sys_content_t类型)
sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/html/myapp(/.*)?"
# 恢复默认上下文(根据规则生效)
sudo restorecon -Rv /var/www/html/myapp
此方法修改的是SELinux策略数据库,永久有效。
使用restorecon命令将对象上下文恢复为SELinux策略定义的默认值。例如:
# 恢复单个文件
sudo restorecon /var/www/html/index.html
# 递归恢复目录
sudo restorecon -R /var/www/html/myapp
常用于修复误操作导致的上下文错误。
SELinux布尔值是可开关的功能开关,用于灵活调整访问控制。例如,允许Apache访问用户家目录:
# 查看所有布尔值
sudo getsebool -a
# 开启httpd_enable_homedirs布尔值
sudo setsebool -P httpd_enable_homedirs on
-P参数表示永久生效,避免重启失效。
当SELinux拒绝合法操作时,使用audit2allow工具分析日志并生成自定义策略。例如:
# 查看SELinux拒绝日志
sudo ausearch -m avc -ts recent
# 根据日志生成策略模块
sudo grep "denied" /var/log/audit/audit.log | audit2allow -M mypolicy
# 安装策略模块
sudo semodule -i mypolicy.pp
注意:仅允许可信的操作,避免过度放宽策略。
通过getenforce查看当前模式(Enforcing/Permissive/Disabled),用setenforce临时切换模式(需root权限)。例如:
# 查看模式
getenforce
# 切换到Permissive模式(仅记录拒绝,不阻止)
sudo setenforce 0
# 切换回Enforcing模式
sudo setenforce 1
修改/etc/selinux/config文件可永久更改模式(需重启系统)。
上下文切换指CPU从一个进程/线程切换到另一个的过程,频繁切换会消耗CPU资源,降低性能。以下是优化方法:
调整内核参数减少不必要的上下文切换:
vm.swappiness控制内核使用交换空间的倾向(0-100),值越低越倾向于使用物理内存。例如:# 临时设置
sudo sysctl vm.swappiness=10
# 永久设置(写入配置文件)
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
kernel.sched_migration_cost_ns控制进程迁移的成本阈值(纳秒),增大该值可减少频繁迁移。例如:echo "kernel.sched_migration_cost_ns=1000000" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
这些参数需根据系统负载调整,建议在测试环境验证。/etc/security/limits.conf,添加:* soft nofile 65535
* hard nofile 65535
并确保/etc/pam.d/common-session包含session required pam_limits.so,使设置生效。net.core.somaxconn(监听队列长度)等参数,减少网络相关的上下文切换。例如:echo "net.core.somaxconn=4096" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
ThreadPoolExecutor)控制线程数量。aio库、Python的asyncio)可避免线程阻塞,减少等待时的上下文切换。pthread_rwlock_t)、无锁数据结构(如std::atomic)减少线程竞争,降低锁导致的上下文切换。使用工具定位频繁切换的进程:
cs列)和CPU使用情况。例如:vmstat 1 # 每秒刷新一次
cswch/s列,自愿切换;nvcswch/s列,非自愿切换)。例如:pidstat -w -p <PID> 1
perf top -e sched:sched_switch
/etc/selinux/config、/var/www/html)。