[TOC]
0x00 系统配置
locale 命令
描述:查看或者设置系统语言的环境变量
代码语言:javascript复制#参数
系统信息:
-a, --all-locales 写出可用区域的名称
-m, --charmaps 写出可用字符映射的名称
修改输出格式:
-c, --category-name 写出选中范畴的名称
-k, --keyword-name 写出选中关键字的名称
实际案例:
代码语言:javascript复制#示例1.系统语言环境变量设置查看
$locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
#示例2.查看可用的字符集
$locale -a | egrep -n -i "en_US"
233:en_US
234:en_US.iso88591
235:en_US.iso885915
236:en_US.utf8
export LANG=en_US.utf8 #临时生效
#示例3.大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义
echo $LC_CTYPE
C.UTF-8
补充说明:
Debian 9 语系中文支持安装
代码语言:javascript复制/app# locale -a
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory
C
C.UTF-8
POSIX
cat > /etc/apt/sources.list <<'END'
deb http://mirrors.aliyun.com/debian stretch main contrib non-free
deb-src http://mirrors.aliyun.com/debian stretch main contrib non-free
deb http://mirrors.aliyun.com/debian stretch-updates main contrib non-free
deb-src http://mirrors.aliyun.com/debian stretch-updates main contrib non-free
deb http://mirrors.aliyun.com/debian-security stretch/updates main contrib non-free
deb-src http://mirrors.aliyun.com/debian-security stretch/updates main contrib non-free
END
$ apt clean && apt update
$ apt install -y locales
# Reading package lists... Done
# Building dependency tree
# Reading state information... Done
# The following additional packages will be installed:
# libc-l10n
# The following NEW packages will be installed:
# libc-l10n locales
# 0 upgraded, 2 newly installed, 0 to remove and 100 not upgraded.
# Need to get 4108 kB of archives.
# After this operation, 13.8 MB of additional disk space will be used.
# Do you want to continue? [Y/n] y
# Get:1 http://mirrors.aliyun.com/debian stretch/main amd64 libc-l10n all 2.24-11 deb9u4 [820 kB]
# Get:2 http://mirrors.aliyun.com/debian stretch/main amd64 locales all 2.24-11 deb9u4 [3289 kB]
# Fetched 4108 kB in 1s (3481 kB/s)
# perl: warning: Setting locale failed.
# perl: warning: Please check that your locale settings:
# LANGUAGE = (unset),
# LC_ALL = "zh_CN.GB18030",
# LANG = "zh_CN.GB18030"
# are supported and installed on your system.
$ sed -i 's/# zh_CN.GB18030/zh_CN.GB18030/g' /etc/locale.gen
$ locale-gen
# $ echo -e "466 n 3 n" | dpkg-reconfigure locales
# Locales to be generated: dpkg-reconfigure locales
# Locales to be generated: 466
# Many packages in Debian use locales to display text in the correct language for the user. You can choose a default locale for the system from the generated locales.
# This will select the default language for the entire system. If this system is a multi-user system where not all users are able to speak the default language, they will experience difficulties.
# 1. None 2. C.UTF-8 3. zh_CN.GB18030
# Default locale for the system environment: 3
# Generating locales (this might take a while)...
# zh_CN.GB18030... done
$ locale -a
# C
# C.UTF-8
# POSIX
# zh_CN.gb18030
localectl 命令
描述: 查询或更改系统区域设置和键盘设置。
基础语法&参数:
代码语言:javascript复制# Query or change system locale and keyboard settings.
localectl [OPTIONS...] COMMAND ...
# Commands:
status Show current locale settings
set-locale LOCALE... Set system locale
list-locales Show known locales
set-keymap MAP [MAP] Set console and X11 keyboard mappings
list-keymaps Show known virtual console keyboard mappings
set-x11-keymap LAYOUT [MODEL [VARIANT [OPTIONS]]]
Set X11 and console keyboard mappings
list-x11-keymap-models Show known X11 keyboard mapping models
list-x11-keymap-layouts Show known X11 keyboard mapping layouts
list-x11-keymap-variants [LAYOUT]
Show known X11 keyboard mapping variants
list-x11-keymap-options Show known X11 keyboard mapping options
# Options:
-h --help Show this help
--version Show package version
--no-pager Do not pipe output into a pager
--no-ask-password Do not prompt for password
-H --host=[USER@]HOST Operate on remote host
-M --machine=CONTAINER Operate on local container
--no-convert Don't convert keyboard mappings
使用案例:
代码语言:javascript复制# (1) 查看当前区域配置
~$ localectl status
# System Locale: LANG=en_US.UTF-8
# VC Keymap: n/a
# X11 Layout: cn
# X11 Model: pc105
# (2) 查看系统支持的汉语区域语言
~$ localectl list-locales
# C.UTF-8
# en_US.UTF-8
# (3) 设置区域语言
~$ localectl set-locale LANG=zh_CN.utf8
getconf 命令
描述:它是个ELF可执行文件,该命令将系统配置变量值写入标准输出用于获取系统信息,在进行LINUX编程中可以提供其帮忙;
基础语法:
代码语言:javascript复制#语法
Usage: getconf [-v specification] variable_name [pathname]
getconf -a [pathname]
#参数
-a 标志调用,并写入全部系统配置变量值到标准输出。
系统范围配置变量 描述:系统范围配置变量包含系统各部分中的最小值。
代码语言:javascript复制_CS_PATH PATH 环境变量值,用以查找命令。
---|---
ARG_MAX 用于一个 exec 子例程的参数的最大长度(以字节为单位),包含环境数据。
BC_BASE_MAX bc 命令使用的 obase 变量允许的最大值。
BC_DIM_MAX bc 命令所允许的一个数组中的最大元素数。
BC_SCALE_MAX bc 命令使用的 scale 变量允许的最大值。
BC_STRING_MAX bc 命令可接受的字符串常量的最大长度。
CHARCLASS_NAME_MAX 字符类名中的最大字节数。
CHAR_BIT 类型 character 的位数。
CHAR_MAX 类型 character 的最大值。
CHAR_MIN 类型 character 的最小值。
CHILD_MAX 每个真实用户标识同时打开进程的最大数量。
CLK_TCK 由 time 子例程返回的每秒钟时钟计数。
COLL_WEIGHTS_MAX 配给在一个语言环境定义文件的 LC_COLLATE 语言环境节中条目的最大权重。
CS_PATH PATH 环境变量值,用以查找命令。
EXPR_NEST_MAX 圆括号内可嵌套的最大表达式数,用于 expr 命令。
INT_MAX 类型的最大值,类型为 int。
INT_MIN 类型的最小值,类型为 int。
LINE_MAX 当实用程序被描述成为处理文本文件时,命令输入行(标准输入或者是其它文件)的最大长度(以字节为单位)。长度包含换行字符的空间。
LONG_BIT 类型中的位数,类型为 long int。
LONG_MAX 类型的最大值,类型为 long int。
LONG_MIN 类型的最小值,类型为 long int。
MB_LEN_MAX 在所有支持的语言环境中一个字符的最大字节数。
NGROUPS_MAX 每个进程中同时补充的最大组标识数。
NL_ARGMAX 在 printf 和 scanf 子例程调用中的数字最大值。
NL_LANGMAX 在一个 LANG 名中最大字节数。
NL_MSGMAX 最大消息数。
NL_NMAX 一个从 N 到 1 整序映射中最大字节数。
NL_SETMAX 最大设置数。
NL_TEXTMAX 一个消息字符串中最大字节数。
NZERO 缺省进程优先级。
OPEN_MAX 在进程中可同时打开的最大文件数。
PATH 用以查找命令的以冒号相隔的路径前缀的序列。
RE_DUP_MAX 当使用间隔符号参数时允许正则表达式重复出现次数的最大值,正如 ed 命令使用的 m 和 n 参数。
SCHAR_MAX 类型的最大值,类型为 signed char。
SCHAR_MIN 类型的最小值,类型为 signed char。
SHRT_MAX 类型的最大值,类型为 short。
SHRT_MIN 类型的最小值,类型为 short。
SSIZE_MAX 一个类型为 ssize_t 的对象的最大值。
STREAM_MAX 一个进程可同时打开的流数。
TMP_MAX 由 tmpnam 子例程生成的唯一路径名的最小数量。一个应用程序可靠调用 tmpnam 子例程的最多次数。
TZNAME_MAX 一个时区名支持的最大字节数(非 TZ 环境变量的长度)。
UCHAR_MAX 类型的最大值,类型为 unsigned char。
UINT_MAX 类型的最大值,类型为 unsigned int。
ULONG_MAX 类型的最大值,类型为 unsigned long int。
USHRT_MAX 类型的最大值,类型为 unsigned short int。
WORD_BIT 字或类型 int 中的位数。
KERNEL_BITMODE 内核的位方式,32 位或 64 位.
REAL_MEMORY 真实内存大小。
HARDWARE_BITMODE 计算机硬件的位方式,32 位或 64 位。
MP_CAPABLE 计算机微处理器容量。
系统标准配置变量 描述:系统标准配置变量包含由一个特殊系统标准所要求的最小值。
- POSIX、POSIX2_ 和 XOPEN 前缀显示变量包含分别由 POSIX 1003.1、POSIX 1003.2 和 X/Open 系统标准要求的系统特性最小值。
- 系统标准是系统满足的用来支持特定系统标准的全系统最小值。实际配置值可能超出这些标准。
基础信息:
代码语言:javascript复制_POSIX_ARG_MAX 用于 exec 子例程的参数的最大长度(以字节为长度),包含环境数据。
_POSIX_CHILD_MAX 每个真实用户标识同时打开进程的最大数量。
_POSIX_JOB_CONTROL 如果系统支持作业控制,则值为 1。
_POSIX_LINK_MAX 到单个文件的最大链接数。
_POSIX_MAX_CANON 在终端规范输入队列中的最大字节数。
_POSIX_MAX_INPUT 在终端输入队列中允许的最大字节数。
_POSIX_NAME_MAX 文件名中的最大字节数(不包含终止空字符)。
_POSIX_NGROUPS_MAX 每个进程中同时补充的最大组标识数。
_POSIX_OPEN_MAX 在进程中可同时打开的最大文件数。
_POSIX_PATH_MAX 路径名中的最大字节数。
_POSIX_PIPE_BUF 写入管道时保证成为原子的最大字节数。
_POSIX_SAVED_IDS 值为1。每个进程具有保存的 set-user-ID 和保存的 set-group-ID。
_POSIX_SSIZE_MAX 可存进一个类型为 ssize_t 对象的最大值。
_POSIX_STREAM_MAX 一个进程可同时打开的流数。
_POSIX_TZNAME_MAX 一个时区名支持的最大字节数(非 TZ 环境变量的长度)。
_POSIX_VERSION 操作系统遵守的 POSIX 1 标准(C 语言绑定)的版本。
_XOPEN_CRYPT 如果系统支持 X/Open 加密功能组则值为 1。
_XOPEN_ENH_I18N 如果系统支持 X/Open 增强国际化功能组则值为 1。
_XOPEN_SHM 如果系统支持 X/Open 共享内存功能组则值为 1。
_XOPEN_VERSION 操作系统所遵守的 X/Open 可移植性指南的版本。
_XOPEN_XCU_VERSION 操作系统所遵守的 X/Open 命令和实用程序规范的版本。
_XOPEN_XPG2 如果系统支持 1987 年 1 月卷 2 的 X/Open 可移植性指南,XVS 系统调用和库,则值为 1,否则为未定义。
_XOPEN_XPG3 如果系统支持 1992 年 2 月 的 X/Open 规范,系统接口和头第三版,则缺省值为 1,否则为未定义。
_XOPEN_XPG4 如果系统支持 1992 年 7 月 的 X/Open CAE 规范,系统接口和头第 4 版,则值为 1,否则为未定义。
POSIX2_BC_BASE_MAX 允许的最大值,用于 obase 变量并使用 bc 命令。
POSIX2_BC_DIM_MAX bc 命令允许数组中的最大元素数。
POSIX2_BC_SCALE_MAX 允许的最大值,用于 scale 变量,执行 bc 命令。
POSIX2_BC_STRING_MAX 可被 bc 命令接受的字符串常量的最大长度。
POSIX2_CHAR_TERM 系统支持至少一个终端类型则值为 1;否则值为 -1。
POSIX2_COLL_WEIGHTS_MAX 配给一个条目的最大权重数目,条目在一个语言环境定义文件中的 LC_COLLATE 语言环境变量中。
POSIX2_C_BIND 如果系统支持 POSIX 2 中的 C 语言绑定选项,则值为 1;否则,值为-1。
POSIX2_C_DEV 如果系统支持 POSIX 2 中的 C 语言开发实用程序则值为 1;否则,值为 -1。
POSIX2_C_VERSION 操作系统所遵守的 POSIX 2 标准(C 语言绑定)的版本。
POSIX2_EXPR_NEST_MAX 圆括号内可嵌套的最大表达式数,用于 expr 命令。
POSIX2_FORT_DEV 如果系统支持 POSIX 2 中的 FORTRAN 开发实用程序选项则值为 1;否则,值为 -1。
POSIX2_FORT_RUN 如果系统支持 POSIX 2 中的 FORTRAN 运行时实用程序选项则值为 1;否则,值为 -1。
POSIX2_LINE_MAX 当命令被描述成处理文本文件时,一个命令输入行(标准输入或其他文件)的最大字节长度。长度包含换行字符空间。
POSIX2_LOCALEDEF 如果系统支持由 localedef 命令创建语言环境,则值为 1;否则值未定义。
POSIX2_RE_DUP_MAX 当使用间隔计数参数时正则表达式所允许重复出现的最大值,例如带 m 和 n 参数使用 ed 命令。
POSIX2_SW_DEV 系统支持软件开发实用程序选项则值为 1;否则,值为 -1。
POSIX2_UPE 如果系统支持 POSIX 2 中用户可移植实用程序选项,则值为 1;否则,值为 -1。
POSIX2_VERSION 系统支持的 POSIX 2 标准的最新版本的批准日期。这个日期是一个六位数字,前四位数字表示年份后两位数字表示月份。POSIX 2 标准的不同版本由 IEEE 标准委员会定期批准,批准日期用于区分不同版本。
系统路径配置变量: 该变量值包含在系统中的路径和路径结构信息;
代码语言:javascript复制_POSIX_CHOWN_RESTRICTED chown() 子例程以适当的特权限制在进程,并且将文件的组标识只更改为进程的有效组标识或辅助组标识之一。如果 PathName 参数引用目录,其返回值应用于除在目录中已存在的或可被创建的目录外的所有文件。
_POSIX_NO_TRUNC 路径名长于变量 NAME_MAX 指定的限定值就会产生错误。如果 PathName 参数引用目录,其返回值应用于目录中的文件名。
_POSIX_VDISABLE 终端特殊字符,定义在 termios.h 文件中,可使用这一字符值禁用。
LINK_MAX 链接一个文件的最大链接数。如果 PathName 参数引用目录,则返回值应用于该目录。
MAX_CANON 在终端规范输入行中的最大字节数。
MAX_INPUT 在终端输入队列有可用空间的最大字节数。
NAME_MAX 文件名中的最大字节数(不包含终止空字符)。如果 PathName 参数引用目录,返回值应用于目录内的文件名。
PATH_MAX 路径名中的最大字节数,包含终止空字符。如果 PathName 参数引用目录,返回值为当指定目录是工作目录时的相对路径名的最大长度。
PIPE_BUF 当写入管道时保证成为原子的最大字节数。如果这个 PathName 参数指向先进先出或是管道,其返回值应用于引用对象。如果 PathName 参数引用目录,返回值应用于任何已存在的或可在目录内创建的先进先出。
DISK_PARTITION 磁盘的物理分区大小。
注:
对于 DISK_PARTITION 路径配置变量,这个 PathName 参数必须指定为之查询信息的磁盘的完整路径。
DISK_SIZE 磁盘大小以兆字节为单位。
注:
对于 DISK_SIZE 路径配置变量,这个 PathName 参数必须指定为之查询信息的磁盘的完整路径。
基础实例:
代码语言:javascript复制#获取系统所有变量信息
#查看系统内存分页大小
getconf PAGE_SIZE
#linux是32位还是64位最简单的方法
getconf LONG_BIT
#获取系统类型所占
getconf CHAR_BIT
8
#参数关键配置文件
/usr/bin/getconf #包含一个 getconf 命令。
/usr/include/limits.h #定义系统配置变量。
/usr/include/unistd.h #定义系统配置变量。
chsh 命令
描述:切换当前shell终端为zsh/或者其他shell
基础示例:
代码语言:javascript复制#查看shell列表
$ cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
/bin/zsh
#切换shell为zsh,重启后,查看当前shell
$ chsh -s /bin/zsh
Changing shell for root.
Shell changed.
WeiyiGeek# echo $SHELL
/bin/zsh
0x01 系统运行安全
1.selinux 相关
getenforce 命令
setenforce 命令
描述:SELinux是Linux系统上一个常见的安全软件,如果熟悉它的规则,可以用它来为Linux系统新增一道保障; SELinux一共有3种状态,分别是Enforcing,Permissive和Disabled状态。
- 第一种是默认状态,表示强制启用,
- 第二种是宽容的意思,即大部分规则都放行。
- 第三种是禁用,即不设置任何规则
操作实例:
代码语言:javascript复制#方式1.---------------通过图像进行管理----------------------
#我们需要安装SELinux的图形管理工具,命令是:
yum install policycoreutils-gui -y
#安装完成后,执行一个命令启动gui管理工具,命令是:
system-config-selinux
#方式2.临时生效
$getenforce #查看一下SELinux的状态,默认情况下一般都是Enforcing状态,也就是强制启用的意思
Enforcing
usage: setenforce [ Enforcing | Permissive | 1 | 0 ]
#只能通过setenforce命令来设置前面两种状态,而如果想修改为disable状态,需要修改配置文件,同时重启系统
$setenforce 2
#方式3.通过修改设置文件,让某个配置永久生效,配置文件的位置是:
vim /etc/selinux/config
SELINUX = disable
#或者
sed -i "s#SELINUX=enforcing#SELINUX = disable#g" /etc/selinux/config
semanage 命令
描述:默认目录的安全上下文查询与修改,简单得说是用来查询与修改SELinux默认目录的安全上下文。
SELinux的策略与规则管理相关命令:seinfo命令、sesearch命令、getsebool命令、setsebool命令、semanage命令
。
语法:
代码语言:javascript复制semanage {import,export,login,user,port,ibpkey,ibendport,interface,module,node,fcontext,boolean,permissive,dontaudit} -l
#usage: usage: semanage fcontext
[-h] [-n] [-N] [-S STORE] [ --add ( -t TYPE -f FTYPE -r RANGE -s SEUSER | -e EQUAL ) FILE_SPEC ) | --delete ( -t TYPE -f FTYPE | -e EQUAL ) FILE_SPEC ) | --deleteall | --extract | --list -C | --modify ( -t TYPE -f FTYPE -r RANGE -s SEUSER | -e EQUAL ) FILE_SPEC ) ]
#usage: semanage port
[-h] [-n] [-N] [-S STORE] [ --add -t TYPE -p PROTOCOL -r RANGE ( port_name | port_range ) | --delete -p PROTOCOL ( port_name | port_range ) | --deleteall | --extract | --list -C | --modify -t TYPE -p PROTOCOL -r RANGE ( port_name | port_range ) ]
```
选项:
```bash
#fcontext:主要用在安全上下文方面。
-l:查询。
-a:增加,你可以增加一些目录的默认安全上下文类型设置。
-m:修改。
-d:删除。
#port:主要用在的端口方面。
-a:增加
-t:指定SELinux 端口类型(ssh_port_t )
-p: 端口协议
实例:
fcontext
代码语言:javascript复制# 示例1.查询一下/var/www/html的默认安全性本文的设置:
$ semanage fcontext -l |grep "/var/www"
SELinux fcontext 类型 上下文
....(前面省略)....
/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
....(後面省略)....
# 如上面例子所示,我们可以查询的到每个目录的安全性本文!而目录的设定可以使用正则表达式去指定一个范围。那么如果我们想要增加某些自定义目录的安全性本文呢?
# 示例2.举例来说,我想要设置/srv/samba成为 public_content_t的类型时,应该如何设置呢?
# 答:用semanage命令设置/srv/samba目录的默认安全性本文为public_content_t:
mkdir /srv/samba && ll -Zd /srv/samba
drwxr-xr-x root root root:object_r:var_t /srv/samba
# 如上所示,默认的情况应该是var_t这个咚咚的!
semanage fcontext -l | grep '/srv'
/srv/.* all files system_u:object_r:var_t:s0
/srv/([^/]*/)?ftp(/.*)? all files system_u:object_r:public_content_t:s0
/srv/([^/]*/)?www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
/srv/([^/]*/)?rsync(/.*)? all files system_u:object_r:public_content_t:s0
/srv/gallery2(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
/srv directory system_u:object_r:var_t:s0 //看这里!
#上面则是默认的/srv底下的安全性本文资料,不过并没有指定到/srv/samba。
semanage fcontext -a -t public_content_t "/srv/samba(/.*)?"
semanage fcontext -l | grep '/srv/samba'
/srv/samba(/.*)? all files system_u:object_r:public_content_t:s0
# 示例3.在selinux中进行写入
$cat /etc/selinux/targeted/contexts/files/file_contexts.local
# This file is auto-generated by libsemanage,Please use the semanage command to make changes
/srv/samba(/.*)? system_u:object_r:public_content_t:s0 #写入这个档案默认账
$restorecon -Rv /srv/samba* #尝试恢复默认值
$ll -Zd /srv/samba
drwxr-xr-x root root system_u:object_r:public_content_t /srv/samba/ #有默认值以后用restorecon命令来修改比较简单!
补充说明:
- 如上所示你可以使用semanage来查询所有的目录默认值,也能够使用它来增加默认值的设置!
实际案例: Port-SElinux系统端口更改
代码语言:javascript复制# 示例0.查看设置的SELinux 端口类型对应的协议以及端口号
$ semanage port -l | grep "ssh"
SELinux 端口类型 协议 端口号
ssh_port_t tcp 22
# 示例1.如果希望更改SELinux系统上的端口,则必须将此更改告知SELinux。
$ semanage port -a -t ssh_port_t -p tcp 62222
$ semanage port -l | grep "ssh"
ssh_port_t tcp 62222, 22
Tips: 知识扩展 CentOS7 中防火墙设置SSHD服务通信。
代码语言:javascript复制# 修改firewall配置
firewall-cmd --zone=public --add-port=5000/tcp --permanent
# 重载防火墙
firewall-cmd --reload
# 重启ssh服务
systemctl restart sshd.service
restorecon 命令
描述:该命令用来恢复SELinux文件属性即恢复文件的安全上下文。
假设CentOS安装了apache,网页默认的主目录是/var/www/html,我们经常遇到这样的问题,在其他目录中创建了一个网页文件,然后用mv移动到网页默认目录/var/www/html中,但是在浏览器中却打不开这个文件,这很可能是因为这个文件的SELinux配置信息是继承原来那个目录的,与/var/www/html目录不同,使用mv移动的时候,这个SELinux配置信息也一起移动过来了,从而导致无法打开页面,如何解决?
此时便需要采用restorecon命令进行恢复文件安全上下文,具体如何操作请看下面得基础示例;
基础语法选项:
代码语言:javascript复制#语法
restorecon [-iFnrRv] [-e excludedir ] [-o filename ] [-f filename | pathname...]
#选项
-i:忽略不存在的文件。
-f:infilename 文件 infilename 中记录要处理的文件。
-e:directory 排除目录。
-R/-r:递归处理目录。
-n:不改变文件标签。
-o/outfilename:保存文件列表到 outfilename,在文件不正确情况下。
-v:将过程显示到屏幕上。
-F:强制恢复文件安全语境。
基础示例:
代码语言:javascript复制
#示例1.使用restorecon来恢复网页主目录中所有文件的SELinux配置信息(如果目标为一个目录,可以添加-R参数递归)
# * 这个时候我们使用firefox浏览器输入127.0.0.1/index.html发现打不开,
# * 查看一下SELinux的日志文件,发现了下面这一段报错信息,从这个报错信息不难看出,
# * 进程httpd访问网页主目录中的index.html时被SELinux阻止,原因是因为SELinux配置信息不正确,
# * 正确的SELinux配置信息应该是scontext=后面的部分,
# * 而index.html文件的SELinux配置信息却是tcontext=后面的部分,
# * 从tcontext=的第三段“admin_home_t”不难看出,这个文件的SELinux配置信息是root用户家目录的。
type=AVC msg=audit(1378974214.610:465): avc: denied { open } for pid=2359 comm="httpd" path="/var/www/html/index.html" dev="sda1" ino=1317685 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file
#/*使用ls -Z也可以看出文件和目录的SELinux信息不匹配*/
ls -Z /var/www/html/
#.... unconfined_u:object_r:admin_home_t:s0 index.html #文件
ls -Zd /var/www/html/
#.... system_u:object_r:httpd_sys_content_t:s0 /var/www/html/ #目录
restorecon -vR /var/www/html/ #恢复该目录下得所有文件得SELinux配置信息;
0x02 系统内核管理
ulimit 命令
描述:Ulimit 用于限制当前shell内进程的资源使用,并发线程限制; ulimit到底有怎样的运用? 假设:有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。
用途:用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时它支持硬资源和软资源的限制。
- 作为临时限制:ulimit 可以作用于通过使用其命令登录的 shell 会话,在会话终止时便结束限制,并不影响于其他 shell 会话。
- 长期的固定限制:ulimit 命令语句又可以被添加到由登录 shell 读取的文件中,作用于特定的shell 用户。
语法参数:
代码语言:javascript复制选项 [options] 含义 例子
-H 设置硬资源限制,一旦设置不能增加。 # ulimit – Hs 64;限制硬资源,线程栈大小为 64K。
-S 设置软资源限制,设置后可以增加,但是不能超过硬资源设置。 # ulimit – Sn 32;限制软资源,32 个文件描述符。
-a 显示当前所有的 limit 信息。 # ulimit – a;显示当前所有的 limit 信息。
-c 最大的 core 文件的大小, 以 blocks 为单位。 # ulimit – c unlimited; 对生成的 core 文件的大小不进行限制。
-d 进程最大的数据段的大小,以 Kbytes 为单位。 # ulimit -d unlimited;对进程的数据段大小不进行限制。
-f 进程可以创建文件的最大值,以 blocks 为单位。 # ulimit – f 2048;限制进程可以创建的最大文件大小为 2048 blocks。
-l 最大可加锁内存大小,以 Kbytes 为单位。 # ulimit – l 32;限制最大可加锁内存大小为 32 Kbytes。
-m 最大内存大小,以 Kbytes 为单位。 # ulimit – m unlimited;对最大内存不进行限制。
-n 可以打开最大文件描述符的数量。 # ulimit – n 128;限制最大可以使用 128 个文件描述符。
-p 管道缓冲区的大小,以 Kbytes 为单位。 # ulimit – p 512;限制管道缓冲区的大小为 512 Kbytes。
-s 线程栈大小,以 Kbytes 为单位。 # ulimit – s 512;限制线程栈的大小为 512 Kbytes。
-t 最大的 CPU 占用时间,以秒为单位。 # ulimit – t unlimited;对最大的 CPU 占用时间不进行限制。
-u 用户最大可用的进程数。 # ulimit – u 64;限制用户最多可以使用 64 个进程。
-v 进程最大可用的虚拟内存,以 Kbytes 为单位。 # ulimit – v 200000;限制最大可用的虚拟内存为 200000 Kbytes。
# 全局配置文件 :/etc/security/limits
<domain><type><item><value>
实际案例:
代码语言:javascript复制# 示例1.查看系统资源进程使用限制
~$ ulimit -a #查看默认值
# core file size (blocks, -c) 0
# data seg size (kbytes, -d) unlimited
# scheduling priority (-e) 0
# file size (blocks, -f) unlimited
# pending signals (-i) 7962
# max locked memory (kbytes, -l) 64
# max memory size (kbytes, -m) unlimited
# open files (-n) 1024 #此种参数
# pipe size (512 kbytes, -p) 8
# POSIX message queues (kbytes, -q) 819200
# real-time priority (-r) 0
# stack size (kbytes, -s) 8192
# cpu time (seconds, -t) unlimited
# max user processes (-u) 7962
# virtual memory (kbytes, -v) unlimited
# file locks (-x) unlimited
# 示例2.查看指定的参数值, 例如查看系统默认的最大文件句柄数
~$ ulimit -n
# 1024
# 示例3.限制系统参数设置
ulimit -u 10240 # 某linux用户的最大进程数设为1024个:
ulimit -n 65535 # 最大文件句柄数设置为65535
ulimit -m 5000 -v 5000 # 限制shell内存使用
# 其他建议设置成无限制(unlimited)的一些重要设置是:
数据段长度:ulimit -d unlimited
最大内存大小:ulimit -m unlimited
堆栈大小:ulimit -s unlimited
CPU 时间:ulimit -t unlimited
补充说明:
- 1.设置
ulimit
和file-max
两者之间的关系差别- file-max:/proc/sys/fs/file-max: 是设置系统
所有进程一共可以打开的文件数量
,同时一些程序可以通过setrlimit调用,设置每个进程的限制,如果得到大量使用完文件句柄的错误信息,是应该增加这个值也就是说这项参数是系统级别的。 - ulimit:即设置当前shell以及由它启动的进程的资源限制
- file-max:/proc/sys/fs/file-max: 是设置系统
# 1.修改file-max文件或者内核
# 下面面2种重启机器后会恢复为默认值
echo 9223372036854775807 > /proc/sys/fs/file-max
sysctl -w "fs.file-max=9223372036854775807"
# vim /etc/sysctl.conf,加入以下内容重启生效
fs.file-max = 65535
#2. 修改ulimit的 open file 系统默认的ulimit对文件打开数量的限制是1024
ulimit -HSn 65535 # 这只是在当前终端有效退出之后 open files又变为默认值, 当然也可以写到/etc/profile中,因为每次登录终端时都会自动执行/etc/profile
# vim /etc/security/limits.conf #加入以下配置,重启即可生效
# * 代表针对所有用户,noproc 是代表最大进程数,nofile 是代表最大文件打开数
* soft nofile 65535
* hard nofile 65535
Tips: 显然对服务器来说file-max, ulimit都需要设置,否则就可能出现文件描述符用尽的问题;
2.查看当前进程打开了多少句柄数,然后根据进程ID号来查看打开的文件信息,以及动态修改。
附录1.为了让一个程序的open files数目扩大,可以在启动脚本前面加上ulimit -HSn 65535
命令。但当程序是一个daemon时可能这种方法无效因为没有终端。
附录2.如果某项服务已经启动,再动态调整ulimit是无效的,特别是涉及到线上业务就更麻烦了,这时可以考虑通过修改/proc/程序pid/limits来实现动态修改。
代码语言:javascript复制# 查看当前进程打开了多少句柄数 (其中第一列是打开的句柄数,第二列是进程ID)
apt -y install lsof && lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more
131 24204
57 24244
57 24231
# 根据进程ID号来查看打开的文件信息
~$ sudo lsof -p 24204
# COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
# sshd 91980 weiyigeek cwd DIR 253,0 4096 2 /
# sshd 91980 weiyigeek rtd DIR 253,0 4096 2 /
WeiyiGeek.ssh服务limit设置
3./etc/security/limits.conf 文件中每一行都以以下形式描述了用户的限制:
代码语言:javascript复制#<domain> <type> <item> <value>
#
#Where:
#<domain> can be:
# - a user name
# - a group name, with @group syntax
# - the wildcard *, for default entry
# - the wildcard %, can be also used with %group syntax,
# for maxlogin limit
# - NOTE: group and wildcard limits are not applied to root.
# To apply a limit to the root user, <domain> must be
# the literal username root.
#
#<type> can have the two values:
# - "soft" for enforcing the soft limits
# - "hard" for enforcing hard limits
#
#<item> can be one of the following:
# - core - limits the core file size (KB)
# - data - max data size (KB)
# - fsize - maximum filesize (KB)
# - memlock - max locked-in-memory address space (KB)
# - nofile - max number of open file descriptors
# - rss - max resident set size (KB)
# - stack - max stack size (KB)
# - cpu - max CPU time (MIN)
# - nproc - max number of processes
# - as - address space limit (KB)
# - maxlogins - max number of logins for this user
# - maxsyslogins - max number of logins on the system
# - priority - the priority to run user process with
# - locks - max number of file locks the user can hold
# - sigpending - max number of pending signals
# - msgqueue - max memory used by POSIX message queues (bytes)
# - nice - max nice priority allowed to raise to values: [-20, 19]
# - rtprio - max realtime priority
# - chroot - change root to directory (Debian-specific)
udevadm 命令
描述:它控制 systemd-udevd 的运行时行为,请求内核事件、管理事件队列并且提供简单的调试机制,udevadm 需要命令和命令特定的操作。
语法基础:
代码语言:javascript复制udevadm info [OPTIONS] [DEVPATH|FILE] #查询sysfs或udev数据库
-q --query=TYPE Query device information:
name Name of device node
symlink Pointing to node
path sysfs device path
property The device properties
all All values
基础示例:
代码语言:javascript复制#示例:查询sysfs或udev数据库中的硬件信息
$udevadm info -q all -n /dev/sda2
P: /devices/pci0000:00/0000:00:15.0/0000:03:00.0/host2/target2:0:0/2:0:0:0/block/sda/sda2
N: sda2
S: disk/by-id/lvm-pv-uuid-WYci3Y-yQO9-eU0R-Dzmu-ccUH-Lhns-rLhVnJ
S: disk/by-path/pci-0000:03:00.0-scsi-0:0:0:0-part2
E: DEVLINKS=/dev/disk/by-id/lvm-pv-uuid-WYci3Y-yQO9-eU0R-Dzmu-ccUH-Lhns-rLhVnJ /dev/disk/by-path/pci-0000:03:00.0-scsi-0:0:0:0-part2
0x03 系统调优
1.内核调优
永久生效设置:
代码语言:javascript复制grep -q "vm.swappiness=0" /etc/sysctl.conf || sudo tee -a /etc/sysctl.conf <<'EOF'
# - 优先使用物理内存(如果是Redis类的内存数据库建议设置1)
vm.swappiness=0
# - 进程可以拥有的VMA (虚拟内存区域) 的数量
vm.max_map_count=262144
# - 开启重用允许将TIME-WAITsockets重新用于新的TCP连接
net.ipv4.tcp_tw_reuse = 1
# - 开启TCP连接中TIME-WAITsockets的快速回收
net.ipv4.tcp_tw_recycle = 1
# - 开启SYNCookies 当出现SYN等待队列溢出时,启用cookies来处理可防范少量SYN攻击(解决攻击)
net.ipv4.tcp_syncookies = 1
# - 决定了内核放弃连接之前发送SYN ACK包的数量
net.ipv4.tcp_synack_retries = 1
# - 在内核放弃建立连接之前发送SYN包的数量。
net.ipv4.tcp_syn_retries = 1
# - 用来加速连续TCP连接的数据交互的TCP协议扩展.(内核>=3.6)
net.ipv4.tcp_fastopen = 3
# - 表示修改系統TCP默认的 TIMEOUT 时间
net.ipv4.tcp_fin_timeout = 30
# - 表示当keepalive启用的时候TCP发送keepalive消息的频度。
net.ipv4.tcp_keepalive_time = 1200
# - 表示SYN队列的长度设置此参数可以容纳更多等待连接的网络连接数
net.ipv4.tcp_max_syn_backlog = 8192
# - 表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。
net.ipv4.tcp_max_tw_buckets = 5000
# - 用于向外连接的端口范围(此处因为k8s集群的原因设置32001-65535)
net.ipv4.ip_local_port_range = 32001 65535
# - TCP接收(Recive)发送(Send) buffer 总和
net.ipv4.tcp_mem = 189924 253234 379848
# - TCP接收buffer - 用于TCP接受滑动窗口的最小值、默认值、最大值;
net.ipv4.tcp_wmem = 8192 16384 4194304
# - TCP发送buffer
net.ipv4.tcp_rmem = 8192 131072 6291456
# - 尚未收到客户端确认信息的连接请求的最大值(高带宽下提高这个值可提高性能-需实际情况配置;
net.core.netdev_max_backlog = 262114
# - 允许送到队列的数据包的最大数目(结合高并发请求数来调节此值-需实际情况配置)
net.core.somaxconn = 32768
# - 表示内核套接字发送send缓存区的最大大小以及发送send缓存区默认的大小
net.core.rmem_max = 12582912
net.core.rmem_default = 6291456
# - 表示内核套接字接收receive缓存区的最大大小以及接收receive缓存区默认的大小
net.core.wmem_max = 12582912
net.core.wmem_default = 6291456
# - 进程比如一个worker进程可以同时打开的最大句柄数(该参数现在参数限制最大并发连接数-需实际情况配置)
fs.file-max = 1646839
# - 同时可以拥有的的异步IO请求数目。
fs.aio-max-nr = 1048576
# - 用来设置内存分配策略(针对于作为Redis内存数据库服务的机器推荐配置为1-可选配置)
# vm.overcommit_memory = 1
EOF
sysctl -p
2.参数调优
临时生效设置:
代码语言:javascript复制# - 最大文件句柄数设置
ulimit -HSn 65535
ulimit -HSu 65535
永久生效设置:
代码语言:javascript复制sudo tee -a /etc/security/limits.conf <<'EOF'
# 说明:* 代表针对所有用户,noproc 是代表最大进程数,nofile 是代表最大文件打开数
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
EOF