当前位置 : 首页 » 文章分类 :  开发  »  Linux-常用配置

Linux-常用配置

linux配置笔记


进程组/会话

进程都有父进程,父进程也有父进程,这就形成了一个以 init 进程为根的家族树。

此外,进程、进程组、会话之间也形成层次关系:进程组是一组相关进程的集合,会话是一组相关进程组的集合。
ps -ejH 查看所有进程的层次关系
ps axjf 查看所有进程的层次关系

PID 进程的唯一标识。对于多线程的进程而言,所有线程调用getpid函数会返回相同的值。
PGID 进程组ID。每个进程都会有进程组ID,表示该进程所属的进程组。默认情况下新创建的进程会继承父进程的进程组ID。
SID 会话ID。每个进程也都有会话ID。默认情况下,新创建的进程会继承父进程的会话ID。

进程组

进程组简单来说就是一组进程,他们有相同的进程组 ID,可以向一个进程组里的所有进程发送信号。
一般使用管道 | 可以创建一个进程组。

当我们在终端中敲下一条命令,然后按下回车的时候,Shell会开启一个新进程来执行这条命令。如果这条命令是由管道连接起来的多个命令组成的话,Shell便会开启多个进程来执行这一组任务。无论是单独的一条命令,还是由管道连接的多条命令,都会被放入到一个新的进程组(任务)中。只包含一条命令的时候,就会创建一个由一个进程组成的进程组。进程组中的每个进程都具有相同的进程组标识符(进程组ID),这个进程组标识符其实就是进程组中某个进程(即进程组组长)的进程ID。

比如命令 ps -ef|grep nginx & 会创建一个进程组,后台的 ps 和 grep 有相同的进程组号,组号就是第一个进程 ps 的进程号。
一般第一个进程的进程号会作为这一组进程的组 ID
进程组会有一个进程组长(process group leader),其进程 ID 即为这个进程组的组ID

会话

当有新的用户登录Linux时,登录进程会为这个用户创建一个会话。用户的登录shell就是会话的首进程。会话的首进程ID会作为整个会话的ID。会话是一个或多个进程组的集合,囊括了登录用户的所有活动。

在任意时刻,会话中总有一个前台进程组(前台任务),可以从终端读取输入,向终端发送输出。如果用户输入Ctrl+C或者Ctrl+Z,就可以分别让任务终止或挂起。同时,一个会话还可以拥有任意多个后台进程组,后台进程组可以用 & 结尾的命令行创建。


linux OOM killer机制

分配物理页面的方式,可以大大节省物理内存的使用,但有时会导致 Memory Overcommit。所谓 Memory Overcommit,也就是说,所有进程使用的虚拟内存超过了系统的物理内存和交换空间的总和。默认情况下,Linux 是允许 Memory Overcommit 的。并且在大多数情况下,Memory Overcommit 也是安全的,因为很多进程只是申请了很多内存,但实际使用到的内存并不多。
但万一很多进程都使用了申请来的大部分内存,就可能导致物理内存和交换空间不够用了,这时内核的 OOM Killer 就会出马,它会选择杀掉一个或多个进程,这样就能腾出一些内存给其它进程使用。

vm.overcommit_memory

在 Linux 中,可以通过内核参数 vm.overcommit_memory 去控制是否允许 overcommit:
默认值是 0,在这种情况下,只允许轻微的 overcommit,而比较明显的 overcommit 将不被允许。
如果设置为 1,表示总是允许 overcommit。
如果设置为 2,则表示总是禁止 overcommit。也就是说,如果某个申请内存的操作将导致 overcommit,那么这个操作将不会得逞。

vm.overcommit_memory = 1: 总是允许 overcommit
vm.overcommit_memory = 0: 则比较 此次请求分配的虚拟内存大小和系统当前空闲的物理内存加上swap,决定是否放行。
vm.overcommit_memory = 2: 则会比较 进程所有已分配的虚拟内存加上此次请求分配的虚拟内存和系统当前的空闲物理内存加上swap,决定是否放行。

查看 vm.overcommit_memory

$ cat /proc/sys/vm/overcommit_memory
0

有三种方式修改内核参数,但要有root权限:
(1)编辑/etc/sysctl.conf ,改vm.overcommit_memory=1,然后sysctl -p使配置文件生效
(2)sysctl vm.overcommit_memory=1
(3)echo 1 > /proc/sys/vm/overcommit_memory

vm.overcommit_ratio

那么对内核来说,怎样才算 overcommit 呢?
Linux 设定了一个阈值,叫做 CommitLimit,如果所有进程申请的总内存超过了 CommitLimit,那就算是 overcommit 了。在 /proc/meminfo 中可以看到 CommitLimit 的大小:

$ cat /proc/meminfo | grep CommitLimit
CommitLimit:     3037408 kB

CommitLimit 的值是这样计算的:
CommitLimit = [swap size] + [RAM size] * vm.overcommit_ratio / 100
其中的 vm.overcommit_ratio 也是内核参数,它的默认值是 50。
查看 vm.overcommit_ratio

$ cat /proc/sys/vm/overcommit_ratio
50

改为 100
sysctl vm.overcommit_ratio=100

当物理内存和交换空间不够用时,OOM Killer 就会选择杀死进程,那么它是怎样知道要先杀死哪个进程呢?
其实 Linux 的每个进程都有一个 oom_score (位于 /proc/<pid>/oom_score),这个值越大,就越有可能被 OOM Killer 选中。oom_score 的值是由很多因素共同决定的,这里列举几个因素:
如果进程消耗的内存越大,它的 oom_score 通常也会越大。
如果进程运行了很长时间,并且消耗很多 CPU 时间,那么通常它的 oom_score 会偏小。
如果进程以 superuser 的身份运行,那么它的 oom_score 也会偏小。

每个进程都有一个 oom_adj (位于 /proc/<pid>/oom_adj),这个值的范围是 [-17, +15],进程的 oom_adj 会影响 oom_score 的计算,也就是说,我们可以通过调小进程的 oom_adj 从而降低进程的 oom_score。对于一些比较重要的进程,例如 MySQL,我们想尽量避免它被 OOM Killer 杀死,这时候就可以调低它的 oom_adj 的值,例如:
sudo echo -10 > /proc/$(pidof mysqld)/oom_adj

overcommit
https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

Linux 的 OOM Killer 机制分析
http://senlinzhan.github.io/2017/07/03/oom-killer/


/proc/meminfo 内存信息

其实 free 命令中的信息都来自于 /proc/meminfo 文件。/proc/meminfo 文件包含了更多更原始的信息,只是看起来不太直观:

# cat /proc/meminfo
MemTotal:       792007468 kB
MemFree:        709449688 kB
MemAvailable:   755187684 kB
Buffers:          380068 kB
Cached:         48825324 kB
SwapCached:            0 kB
Active:         35776944 kB
Inactive:       42300196 kB
Active(anon):   28767328 kB
Inactive(anon):    97048 kB
Active(file):    7009616 kB
Inactive(file): 42203148 kB
Unevictable:     1536004 kB
Mlocked:         1536004 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                48 kB
Writeback:             0 kB
AnonPages:      30405140 kB
Mapped:           867892 kB
Shmem:             98740 kB
Slab:            1636412 kB
SReclaimable:    1326768 kB
SUnreclaim:       309644 kB
KernelStack:       29296 kB
PageTables:        73488 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    396003732 kB
Committed_AS:   34904492 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
HardwareCorrupted:     0 kB
AnonHugePages:  11761664 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:     1018912 kB
DirectMap2M:    14092288 kB
DirectMap1G:    789577728 kB

/proc/cpuinfo CPU信息

lscpu 命令的内容来自 cat /proc/cpuinfo

processor    : 95
vendor_id    : GenuineIntel
cpu family    : 6
model        : 85
model name    : Intel(R) Xeon(R) Gold 6271C CPU @ 2.60GHz
stepping    : 7
microcode    : 0x5002f00
cpu MHz        : 1000.124
cache size    : 33792 KB
physical id    : 1
siblings    : 48
core id        : 29
cpu cores    : 24
apicid        : 123
initial apicid    : 123
fpu        : yes
fpu_exception    : yes
cpuid level    : 22
wp        : yes
flags        : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single intel_ppin ssbd mba ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb intel_pt avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts pku ospke avx512_vnni arch_capabilities
bugs        : spectre_v1 spectre_v2 spec_store_bypass
bogomips    : 5198.41
clflush size    : 64
cache_alignment    : 64
address sizes    : 46 bits physical, 48 bits virtual
power management:

查看cpu核数

总核数 = 物理CPU个数 X 每颗物理CPU的核数
总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

# 查看每个物理CPU中core的个数
cat /proc/cpuinfo| grep "cpu cores"| uniq

# 查看逻辑CPU的个数(即总核数),等于 lscpu 结果的 CPU(s) 数,等于 nproc 结果
cat /proc/cpuinfo| grep "processor"| wc -l

/proc/pid 查看进程的运行目录

通过 ps 及 top 只能看到进程的相对路径,看不到的进程的详细信息,如绝对路径等。
可以通过查看 /proc/pid 得到进程可执行文件的绝对路径信息。
Linux 在启动一个进程时,会给进程分配一个 ID,就是进程号 PID,同时系统会在 /proc 下创建一个以 PID 命名的文件夹,在该文件夹下会有我们的进程的信息,其中包括一个名为 exe 的文件即记录了可执行文件的绝对路径,通过 llls –l 命令即可查看。

exe 符号连接就是可执行程序的绝对路径
cwd 符号链接的是进程运行目录
cmdline 就是程序运行时输入的命令行命令,是个文本文件,可以 cat 查看
environ 记录了进程运行时的环境变量,是个文本文件,可以 cat 查看
fd 目录下是进程打开或使用的文件的符号连接。

[centos@centos ~]$ sudo ls -al /proc/13998
总用量 0
dr-xr-xr-x   9 centos root 0 6月  27 23:23 .
dr-xr-xr-x 141 root   root 0 6月  27 22:58 ..
dr-xr-xr-x   2 centos root 0 8月   8 17:13 attr
-rw-r--r--   1 centos root 0 8月   8 17:13 autogroup
-r--------   1 centos root 0 8月   8 17:13 auxv
-r--r--r--   1 centos root 0 8月   8 17:13 cgroup
--w-------   1 centos root 0 8月   8 17:13 clear_refs
-r--r--r--   1 centos root 0 6月  28 14:23 cmdline
-rw-r--r--   1 centos root 0 8月   8 17:13 comm
-rw-r--r--   1 centos root 0 8月   8 17:13 coredump_filter
-r--r--r--   1 centos root 0 8月   8 17:13 cpuset
lrwxrwxrwx   1 centos root 0 8月   8 17:13 cwd -> /usr/share/elasticsearch
-r--------   1 centos root 0 8月   8 17:13 environ
lrwxrwxrwx   1 centos root 0 8月   8 17:13 exe -> /usr/share/elasticsearch/jdk/bin/java
dr-x------   2 centos root 0 8月   8 17:13 fd
dr-x------   2 centos root 0 8月   8 17:13 fdinfo
-rw-r--r--   1 centos root 0 8月   8 17:13 gid_map
-r--------   1 centos root 0 8月   8 17:13 io
-r--r--r--   1 centos root 0 8月   8 17:13 limits
-rw-r--r--   1 centos root 0 8月   8 17:13 loginuid
dr-x------   2 centos root 0 8月   8 17:13 map_files
-r--r--r--   1 centos root 0 8月   8 17:13 maps
-rw-------   1 centos root 0 8月   8 17:13 mem
-r--r--r--   1 centos root 0 8月   8 17:13 mountinfo
-r--r--r--   1 centos root 0 8月   8 17:13 mounts
-r--------   1 centos root 0 8月   8 17:13 mountstats
dr-xr-xr-x   6 centos root 0 8月   8 17:13 net
dr-x--x--x   2 centos root 0 8月   8 17:13 ns
-r--r--r--   1 centos root 0 8月   8 17:13 numa_maps
-rw-r--r--   1 centos root 0 8月   8 17:13 oom_adj
-r--r--r--   1 centos root 0 8月   8 17:13 oom_score
-rw-r--r--   1 centos root 0 8月   8 17:13 oom_score_adj
-r--r--r--   1 centos root 0 8月   8 17:13 pagemap
-r--------   1 centos root 0 8月   8 17:13 patch_state
-r--r--r--   1 centos root 0 8月   8 17:13 personality
-rw-r--r--   1 centos root 0 8月   8 17:13 projid_map
lrwxrwxrwx   1 centos root 0 8月   8 17:13 root -> /
-rw-r--r--   1 centos root 0 8月   8 17:13 sched
-r--r--r--   1 centos root 0 8月   8 17:13 schedstat
-r--r--r--   1 centos root 0 8月   8 17:13 sessionid
-rw-r--r--   1 centos root 0 8月   8 17:13 setgroups
-r--r--r--   1 centos root 0 8月   8 17:13 smaps
-r--r--r--   1 centos root 0 8月   8 17:13 stack
-r--r--r--   1 centos root 0 6月  27 23:23 stat
-r--r--r--   1 centos root 0 6月  27 23:30 statm
-r--r--r--   1 centos root 0 6月  28 14:23 status
-r--r--r--   1 centos root 0 8月   8 17:13 syscall
dr-xr-xr-x  59 centos root 0 8月   8 17:13 task
-r--r--r--   1 centos root 0 8月   8 17:13 timers
-rw-r--r--   1 centos root 0 8月   8 17:13 uid_map
-r--r--r--   1 centos root 0 8月   8 17:13 wchan

/proc/pid/fd 进程打开的文件描述符

/proc/pid/fd 目录保存进程打开的全部文件描述符的编号


/proc/swaps 交换空间信息

swapon -s 查看系统交换空间使用状况:

$ swapon -s
文件名             类型      大小    已用   权限
/dev/nvme0n1p2  partition    839676    227688    -1

其实 swapon -s 命令查看的是 /proc/swaps 文件的内容,等价于:
cat /proc/swaps

$ cat /proc/swaps
Filename                Type        Size    Used    Priority
/swapfile1                              file        1048572    142592    -2

/proc/version 内核版本信息

$ cat /proc/version
Linux version 4.17.11-1.el7.elrepo.x86_64 (mockbuild@Build64R7) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC)) #1 SMP Sat Jul 28 09:33:09 EDT 2018

/proc/filesystems 支持的文件系统

# cat /proc/filesystems
nodev    sysfs
nodev    rootfs
nodev    ramfs
nodev    bdev
nodev    proc
nodev    cpuset
nodev    cgroup
nodev    cgroup2
nodev    tmpfs
nodev    devtmpfs
nodev    configfs
nodev    debugfs
nodev    tracefs
nodev    securityfs
nodev    sockfs
nodev    dax
nodev    bpf
nodev    pipefs
nodev    hugetlbfs
nodev    devpts
nodev    autofs
nodev    pstore
nodev    mqueue
    ext3
    ext2
    ext4
nodev    overlay
nodev    rpc_pipefs
nodev    binfmt_misc
    fuseblk
nodev    fuse
nodev    fusectl

/proc/pid/cgroup 进程所属cgroup

/proc/pid/cgroup 记录进程所属的 cgroup


/etc/resolv.conf DNS服务器配置文件

/etc/resolv.conf 中是本地 DNS 服务器的配置信息,包括 DNS 服务器的 IP 地址、域名、域名搜索顺序。
/etc/resolv.conf 配置文件由域名解析器 resolver(一个根据主机名解析IP地址的库)使用。

/etc/resolv.conf 中的配置项有:

  • nameserver 指定 DNS 服务器的 IP 地址,可以设置多个,一行一个。系统会按照在文件中的顺序来使用这些服务器。如果第一个服务器无法解析域名,则会尝试使用下一个,也只有当第一个nameserver 没有反应时才会使用下一个 nameserver
  • domain 设置本地的域名,例如:domain mydomain.com,如邮件系统会用到。如果没有域名,会使用主机名。
  • search 后面可以跟一个或多个域名,这些域名构成了一个搜索列表。当你尝试访问一个没有明确指定域名的服务时,系统会在这些域名后面添加搜索列表中的域名,然后尝试进行解析。
  • sortlist 可以设置一些优先级规则,让系统在解析域名时优先使用某些特定的DNS服务器。
  • options 后面跟的是一些可选的解析选项,例如timeout(超时时间)、attempts(尝试次数)等。

域名解析过程:
当通过域名访问网络服务时,域名解析过程如下:
1、系统首先查看 /etc/resolv.conf 文件中的 nameserver 行,从上到下顺序访问每个 DNS 服务器,并发送一个解析请求,请求的内容是你需要访问的服务的域名。
2、如果第一个 DNS 服务器无法解析域名,或者在设定的超时时间内没有响应,系统会尝试访问下一个 DNS 服务器。
3、当系统找到可以解析域名的 DNS 服务器后,它会返回一个 IP 地址,然后系统就可以使用这个IP地址来访问网络服务。
4、如果你尝试访问的是一个没有完全指定的域名,例如只输入了 “google” 而不是 “www.google.com",系统会使用 search 行中指定的域名列表来尝试解析。例如,如果 search 行后面的内容是”example.com”,系统会尝试解析”google.example.com”。

对于 search 配置项,典型的使用例子是 k8s 中的域名解析,k8s pod 内的 /etc/resolv.conf 中的 search 配置为:

search default.svc.cluster.local svc.cluster.local cluster.local baidu.com

所以我们通过 Service 名访问其他服务时,例如访问 app1-service,域名解析时会自动拼接为 app1-service.default.svc.cluster.local


/etc/hosts 本机DNS

其实 hosts 文件的作用相当如DNS,提供IP地址到hostname的对应。
早期的互联网计算机数量少,单机hosts文件里足够存放所有联网计算机。
不过随着互联网的发展,这就远远不够了。于是就出现了分布式的DNS系统。由DNS服务器来提供类似的IP地址到域名的对应。
具体可以man hosts查看相关信息。

Linux系统在向DNS服务器发出域名解析请求之前会查询 /etc/hosts 文件,如果里面有相应的记录,就会使用hosts里面的记录。
/etc/hosts 文件通常里面包含这一条记录
127.0.0.1 localhost.localdomain localhost
hosts文件格式是一行一条记录,分别是IP地址 、hostname、 aliases,三者用空白字符分隔,aliases可选。
127.0.0.1到localhost这一条建议不要修改,因为很多应用程序会用到这个,比如sendmail,修改之后这些程序可能就无法正常运行。


设置主机名

hostname 命令用于显示和设置系统的主机名称。

hostname 显示当前主机名
hostname dell 临时设置主机名为dell

环境变量 $HOSTNAME 也保存了当前的主机名。
在使用hostname命令设置主机名后,系统并不会永久保存新的主机名,重新启动机器之后还是原来的主机名。
如果需要永久修改主机名,需要同时修改 /etc/hosts/etc/sysconfig/network 的相关内容。

hostname newhostname 运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
echo newhostname > /proc/sys/kernel/hostname 运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
sysctl kernel.hostname=newhostname 运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
修改 /etc/sysconfig/network 下的 HOSTNAME 变量 HOSTNAME=centos , 重启后生效,永久性修改。
修改 /etc/hosts 添加一行 127.0.0.1 centos, 使得本机的应用程序通过 centos 能够解析到本机

深入理解Linux修改hostname
https://www.cnblogs.com/kerrycode/p/3595724.html


Centos7 hostname 配置

在 CentOS7 中有三种定义的主机名: 静态的(static)、瞬态的(transient)、和灵活的(pretty)。

  • 静态主机名也称为内核主机名,是系统在启动时从 /etc/hostname 内自动初始化的主机名。
  • 瞬态主机名是在系统运行时临时分配的主机名。
  • 灵活主机名则允许使用特殊字符的主机名。

static 主机名设置后是永久生效的,不需要重启系统。

hostnamectl 是 CentOS7 中新增的命令,用来修改主机名。

hostnamectl 查看主机名

hostnamectlhostnamectl status 查看所有当前主机名
aws

$ hostnamectl
   Static hostname: centos
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 05cb8c7b39fe0f70e3ce97e5beab809d
           Boot ID: 10b51cd92dd449b0a72132fc1eb30ab8
    Virtualization: xen
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-957.1.3.el7.x86_64
      Architecture: x86-64

linode

$ hostnamectl
   Static hostname: localhost.localdomain
Transient hostname: li1875-57.members.linode.com
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 7d3446d2dcad4627b80beedf2d3f479a
           Boot ID: 8943de6ddbeb4a66b0bb6d9dd69ceb3f
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-1127.el7.x86_64
      Architecture: x86-64

hostnamectl set-hostname 设置主机名

此命令需要 root 权限

hostnamectl set-hostname name 设置所有主机名为 name
这样会将 pretty、static 和 transient 主机名变得相似。Static 和 transient 主机名会简化为 pretty 主机名格式。使用 “-” 替换空格,并删除特殊字符。

hostnamectl set-hostname name [option...] 设置特定类型的主机名为 name
其中 option 是 --pretty, --static--transient 中的一个或多个选项。

hostnamectl set-hostname "" [option...] 清除特定主机名,并将其还原为默认形式,"" 是空白字符串


/etc/passwd 用户信息

使用 useradd 指令所建立的帐号,实际上是保存在 /etc/passwd 文本文件中。
在该文件中,每一行用户记录的各个数据段用 “:” 分隔,分别定义了用户的各方面属性。各个字段的顺序和含义如下:
注册名:口令:用户标识号:组标识号:用户名:用户主目录:登录shell

口令(passwd):系统用口令来验证用户的合法性。超级用户root或某些高级用户可以使用系统命令passwd来更改系统中所有用户的口令,普通用户也可以在登录系统后使用passwd命令来更改自己的口令。
现在的Unix/Linux系统中,口令不再直接保存在passwd文件中,通常将passwd文件中的口令字段使用一个“x”来代替,将/etc/shadow作为真正的口令文件,用于保存包括个人口令在内的数据。当然shadow文件是不能被普通用户读取的,只有超级用户才有权读取。

查看所有用户

cat /etc/passwd
看第三个参数 uid, 500 以上的就是后面建的用户了,其它则为系统的用户

禁止用户登录

1 通过修改指定用户的登录 shell 为 /sbin/nologin 来禁止用户登录
例如
usermod -s /sbin/nologin testuser 将 testuser 的 login shell修改为nologin
或者
chsh testuser -s /sbin/nologin 将用户 testuser 的shell修改为nologin
此外,还可以修改 /etc/nologin.txt (没有就新建一个),在里面添加给被禁止用户的提示
解禁用户的方式就是把shell改为他原有的就可以了。

2 如果你是root用户,当你不想让所有用户登录时(比如你要维护系统升级什么的),一个一个地去禁止很麻烦
有一种禁止除 root 用户外所有其他用户登录的方法
在 /etc 目录下建立一个名为 nologin 的文档
touch /etc/nologin 如果该文件存在,那么Linux上的所有用户(除了root以外)都无法登录
可以在 /etc/nologin 中写点什么,告诉用户为何无法登录
cat /etc/nologin
9:00-10:00 系统升级,所有用户都禁止登录!

解禁帐号也简单,直接将 /etc/nologin 删除就行了

This account is currently not available

修改完 elasticsearch 用户的密码,su 切换时提示 This account is currently not available

原因: elasticsearch 账号被禁止登录了
cat /etc/passwd | grep elasticsearch 查看 elasticsearch 账号信息
elasticsearch:x:991:986:elasticsearch user:/nonexistent:/sbin/nologin
发现它的 shell 是 /sbin/nologin

解决:将 elasticsearch 账号的 shell 改成 /bin/bash
sudo usermod -s /bin/bash elasticsearch
或者直接编辑 /etc/passwd


/etc/shells 可用shell列表

/etc/shells 是系统可用 shell 列表
chsh 改变登陆shell时,会查询这个文件。
一些程序会根据这个文件来判断一个用户是否是有效用户,例如FTP服务会阻止那些shell不在/etc/shells里的用户登陆。

# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/zsh
/bin/tcsh
/bin/csh

常用shell

(1)Bourne Shell(sh)是 AT&T Bell 实验室的 Steven Bourne 为 AT&T 的 Unix 开发的,它是 Unix 的默认 Shell,也是其它 Shell 的开发基础。Bourne Shell 在编程方面相当优秀,但在处理与用户的交互方面不如其它几种 Shell 。

(2)C Shell(csh)是加州伯克利大学的 Bill Joy 为 BSD Unix 开发的,与 sh 不同,它的语法与 C 语言很相似。它提供了 Bourne Shell 所不能处理的用户交互特征,如命令补全、命令别名、历史命令替换等。但是,C Shell 与 BourneShell 并不兼容。

(3)Korn Shell(ksh)是 AT&T Bell 实验室的 David Korn 开发的,它集合了 C Shell 和 Bourne Shell 的优点,并且与 Bourne Shell 向下完全兼容。Korn Shell 的效率很高,其命令交互界面和编程交互界面都很好。

(4)Bourne Again Shell (即bash)是自由软件基金会(GNU)开发的一个 Shell,它是 Linux 系统中一个默认的 Shell。Bash 不但与 Bourne Shell 兼容,还继承了 C Shell、Korn Shell 等优点。


/etc/group 组信息

将用户分组是 Linux 系统中对用户进行管理及控制访问权限的一种手段。每个用户都属于某个用户组;一个组中可以有多个用户,一个用户也可以属于不同的组。当一个用户同时是多个组中的成员时,在 /etc/passwd 文件中记录的是用户所属的主组,也就是登录时所属的默认组,而其他组称为附加组。

用户组(Group)配置文件主要有 /etc/group 和 /etc/gshadow,其中 /etc/gshadow 是 /etc/group 的加密信息文件。

用户组的所有信息都存放在 /etc/group 文件中。此文件的格式是由冒号(:)隔开若干个字段,这些字段具体如下:
组名:口令:组标识号:组内用户列表 每个用户组一条记录
组名:组名是用户组的名称,由字母或数字构成。与 /etc/passwd 中的登录名一样,组名不应重复。
口令:口令或免密字段存放的是用户组加密后的口令字。一般 Linux 系统的用户组都没有口令,即这个字段一般为空,或者是x,密码存放在 /etc/gshadow 中
组标识号:组标识号 GID 与用户标识号类似,也是一个整数,被系统内部用来标识组。别称 GID
组内用户列表:是属于这个组的所有用户的列表,不同用户之间用逗号(,)分隔。这个用户组可能是用户的主组,也可能是附加组。本字段可以为空;

/etc/group 的内容包括用户组(Group)、用户组口令、GID及该用户组所包含的用户(User),每个用户组一条记录;

wheel 用户组

在 Linux 中为了更进一步加强系统的安全性,一个管理员的组,只允许这个组的用户来执行 su - 命令登录为 root 用户,而让其他组的用户即使执行 su - 输入了正确的root密码,也无法登录为root用户。在UNIX和Linux下,这个组的名称通常为 wheel。而这个是在配置文件 /etc/pam.d/su 里面配置的:

auth   required     pam_wheel.so use_uid

wheel 组的概念继承自 UNIX。当服务器需要进行一些日常系统管理员无法执行的高级维护时,往往就要用到 root 权限;而“wheel” 组就是一个包含这些特殊权限的用户池;也就是说,如果你不是“wheel”组的成员,就无法取得 root 权限进行一些特权的操作;
除了 root 用户,只有 wheel 组的成员有特权执行高级操作


/etc/sysctl.conf

vm.max_map_count 虚拟内存区域数量

vm.max_map_count 文件包含限制一个进程可以拥有的 VMA(virtual memory areas, 虚拟内存区域)的数量。虚拟内存区域是一个连续的虚拟地址空间区域。在进程的生命周期中,每当程序尝试在内存中映射文件,链接到共享内存段,或者分配堆空间的时候,这些区域将被创建。调优这个值将限制进程可拥有VMA的数量。限制一个进程拥有VMA的总数可能导致应用程序出错,因为当进程达到了VMA上线但又只能释放少量的内存给其他的内核进程使用时,操作系统会抛出内存不足的错误。如果你的操作系统在NORMAL区域仅占用少量的内存,那么调低这个值可以帮助释放内存给内核用。

默认值为 65536

调整示例,如下调整为默认的4倍
sysctl -w vm.max_map_count=262144

查看修改结果
sysctl vm.max_map_count

注意如果使用

sysctl -w vm.max_map_count=262144
sysctl -p

来修改,操作系统重启后值会改变,如果想永久改变需要采用如下形式。
vm.max_map_count=262144 直接写到 /etc/sysctl.conf 中

echo "vm.max_map_count=262144" > /etc/sysctl.conf
sysctl -p

net.core.somaxconn socket监听队列长度

net.core.somaxconn 是 Linux 中的一个 kernel 参数,表示 socket 监听队列 backlog 的长度,即服务的最大并发 TCP 连接数。
什么是backlog呢?backlog就是socket的监听队列,当一个请求(request)尚未被处理或建立时,他会进入backlog。而socket server可以一次性处理backlog中的所有请求,处理后的请求不再位于监听队列中。当server处理请求较慢,以至于监听队列被填满后,新来的请求会被拒绝。
对于一个经常处理新连接的高负载 web 服务环境来说,默认的 128 太小了,大多数环境这个值建议增加到 1024 或者更多。

每一个处于监听(Listen)状态的端口,都有自己的监听队列,监听队列的长度与如下两方面有关:
1、somaxconn 参数.
2、使用该端口的程序中的listen()函数.

解决:
将 net.core.somaxconn 设置为 1024
1、临时生效,重启系统后失效
echo 1024 > /proc/sys/net/core/somaxconn

sysctl -w net.core.somaxconn=1024
2、永久生效
vim /etc/sysctl.conf
net.core.somaxconn=1024
sysctl -p


/etc/fstab 文件系统挂载信息

/etc/fstab 是用来存放文件系统的静态信息的文件。
当系统启动的时候,系统会自动地从这个文件读取信息,并且会自动将此文件中指定的文件系统挂载到指定的目录。
它只是一个文本文件,你能够用你喜欢的编辑器打开它,但是必须是root用户才能编辑它。同时fsck、mount、umount的等命令都利用该文件。

$ cat /etc/fstab
#
# <file system>  <dir>  <type>  <options>     <dump> <pass>
LABEL=/     /           ext4    defaults,noatime  1   1
tmpfs       /dev/shm    tmpfs   defaults        0   0
devpts      /dev/pts    devpts  gid=5,mode=620  0   0
sysfs       /sys        sysfs   defaults        0   0
proc        /proc       proc    defaults        0   0

挂载设备 : 不是我们通常理解的文件系统,而是指设备(硬盘及其分区,DVD光驱等)。它告知我们设备(分区)的名字,这是你在命令行中挂载(mount)、卸载(umount)设备时要用到的。
挂载点:告诉我们设备挂载到哪里。
文件系统类型:Linux支持许多文件系统。 要得到一个完整的支持名单查找mount man-page。典型 的名字包括这些:ext2, ext3, reiserfs, xfs, jfs,iso9660, vfat, ntfs, swap和auto, ‘auto’ 不是一个文件系统,而是让mount命令自动判断文件类型,特别对于可移动设备,软盘,DVD驱动器,这样做是很有必要的,因为可能每次挂载的文件类型不一致。
文件系统参数:这部分是最有用的设置!!! 它能使你所挂载的设备在开机时自动加载、使中文显示不出现乱码、限制对挂载分区读写权限。它是与mount命令的用法相关的,要想得到一个完整的列表,参考mount manpage.
备份命令:dump utility用来决定是否做备份的. dump会检查entry并用数字来决定是否对这个文件系统进行备份。允许的数字是0和1。如果是0,dump就会忽略这个文件系统,如果是1,dump就会作一个备份。大部分的用户是没有安装dump的,所以对他们而言这个entry应该写为0。
是否以fsck检验扇区:启动的过程中,系统默认会以fsck检验我们的 filesystem 是否完整 (clean)。 不过,某些 filesystem 是不需要检验的,例如内存置换空间 (swap) ,或者是特殊文件系统例如 /proc 与 /sys 等等。fsck会检查这个头目下的数字来决定检查文件系统的顺序,允许的数字是0, 1, 和2。0 是不要检验, 1 表示最早检验(一般只有根目录会配置为 1), 2 也是要检验,不过1会比较早被检验啦!一般来说,根目录配置为1,其他的要检验的filesystem都配置为 2 就好了。

fstab (简体中文)
https://wiki.archlinux.org/index.php/Fstab_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)


查看Linux各磁盘的文件系统

直接看 /etc/fstab 即可

# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Wed Sep 19 00:58:30 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       ext2    defaults        1 1
UUID=dc6d65e4-28fd-4252-a560-76346afba23f /boot                   ext4    defaults        1 2
/dev/mapper/centos-home /home                   ext2    defaults        1 2
/dev/sdb1               /data                   ext4    defaults        1 2

/etc/sysconfig

/etc/sysconfig/network

设置主机名

临时设置
使用hostname命令设置主机名。格式为:hostname 主机名,如下:
hostname hadoop1
该设置为临时生效。重新启动系统后,设置失效。

永久设置
编辑/etc/sysconfig/network文件中的HOSTNAME字段就可以修改主机名。如下所示:

NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=hadoop1

HOSTNAME=hadoop1 表示主机设置为hadoop1 .
注意:修改主机名后,需要重启系统后永久生效。


linux文件系统

inode

文件储存在硬盘上,硬盘的最小存储单位叫做“扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。

操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个”块”(block)。这种由多个扇区组成的”块”,是文件存取的最小单位。”块”的大小,最常见的是4KB,即连续八个 sector组成一个 block。

文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点”。

每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。

inode存储的信息

文件的字节数
文件拥有者的User ID
文件的Group ID
文件的读、写、执行权限
文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间
链接数,即有多少文件名指向这个inode
文件数据block的位置

可以用stat命令,查看某个文件的inode信息:

$ stat hexo-deploy.log
  文件:"hexo-deploy.log"
  大小:34931         块:72         IO 块:4096   普通文件
设备:ca01h/51713d    Inode:1751972     硬链接:1
权限:(0664/-rw-rw-r--)  Uid:( 1000/  centos)   Gid:( 1000/  centos)
最近访问:2020-09-28 10:28:31.430850658 +0800
最近更改:2020-10-22 20:53:06.144234658 +0800
最近改动:2020-10-22 20:53:06.144234658 +0800
创建时间:-

inode号码

每个 inode 都有一个号码,操作系统用 inode 号码来识别不同的文件

这里值得重复一遍,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号

表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:
首先,系统找到这个文件名对应的inode号码;
其次,通过inode号码,获取inode信息;
最后,根据inode信息,找到文件数据所在的block,读出数据。

使用 ls -istat 命令,可以看到文件名对应的inode号码

inode个数/使用率过大排查

df -i 查看每个硬盘分区的inode总数和已经使用的数量

云监控报警中有个指标叫“inode使用率”,如果inode使用率过高,但磁盘使用率不高,一般是因为小文件过多。

执行 for i in /*; do echo $i; find $i | wc -l; done 查看各个文件夹的文件数,删除。
执行 for i in ./*; do echo $i; find $i | wc -l; done 查看当前文件夹下的文件数

目录文件

Unix/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。

目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。

目录的权限。
目录文件的读权限(r)和写权限(w),都是针对目录文件本身。由于目录文件内只有文件名和inode号码,所以如果只有读权限,只能获取文件名,无法获取其他信息,因为其他信息都储存在inode节点中,而读取inode节点内的信息需要目录文件的执行权限(x)。

进程打开文件的机制

目录也是文件,文件里存着文件名和对应的 inode 编号。通过这个 inode 编号可以查到文件的元数据和文件内容。文件的元数据有引用计数、操作权限、拥有者 ID、创建时间、最后修改时间等等。文件件名并不在元数据里而是在目录文件中。因此文件改名、移动,都不会修改文件,而是修改目录文件。

进程每新打开一个文件,系统会分配一个新的文件描述符给这个文件。文件描述符对应着一个文件表。文件表里面存着文件的状态信息(O_APPEND/O_CREAT/O_DIRECT…)、当前文件位置和文件的 inode 信息。系统会为每个进程创建独立的文件描述符和文件表,不同进程是不会共用同一个文件表。正因为如此,不同进程可以同时用不同的状态操作同一个文件的不同位置。文件表中存的是 inode 信息而不是文件路径,所以文件路径发生改变不会影响文件操作。

硬链接

一般情况下,文件名和 inode 号码是一一对应的关系,每个 inode 号码对应一个文件名。但是,Unix/Linux 系统允许多个文件名指向同一个 inode 号码。

这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为 硬链接(hard link)

创建硬链接 ln 源文件 目标文件
运行上面这条命令以后,源文件与目标文件的 inode 号码相同,都指向同一个 inode。
inode 信息中有一项叫做”链接数”,记录指向该inode的文件名总数,这时就会增加1。

反过来,删除一个文件名,就会使得 inode 节点中的”链接数”减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。

查看文件的硬链接数

ls -li 即可查看文件的硬链接数。

下面通过 ln 创建了 docker-delploy.log 的硬链接文件 ddddd.log,
ls -li 结果中第三列的 2 就是文件的硬链接数,第一列是文件的 inode 号 2810664,可以看到是相同的。

$ ll
-rw-rw-r--. 1 centos centos     20250 5月  23 2020 docker-delploy.log
$ ln docker-delploy.log ddddd.log
$ ls -li
  2810664 -rw-rw-r--. 2 centos centos     20250 5月  23 2020 ddddd.log
  2810664 -rw-rw-r--. 2 centos centos     20250 5月  23 2020 docker-delploy.log

find / -type f -links 2 查找硬链接数为的文件

目录的链接数

创建目录时,默认会生成两个目录项:”.”和”..”。

前者的inode号码就是当前目录的inode号码,等同于当前目录的”硬链接”;,后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的”硬链接”。

所以,任何一个目录的”硬链接”总数,总是等于2加上它的子目录总数(含隐藏目录)。

软链接

文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的”软链接”(soft link)或者”符号链接(symbolic link)。

这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:”No such file or directory”。

这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode 链接数 不会因此发生变化


logrotate 日志滚动工具

logrotate 在很多 Linux 发行版上都是默认安装的。系统会定时运行 logrotate,一般是每天一次。

crontab 会每天定时执行 /etc/cron.daily 目录下的脚本,而这个目录下有个文件叫 logrotate。在 centos 上脚本内容是这样的:

$ sudo cat /etc/cron.daily/logrotate
#!/bin/sh

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

可以看到这个脚本主要做的事就是以 /etc/logrotate.conf 为配置文件执行了 logrotate。就是这样实现了每天执行一次 logrotate。

Linux 日志切割神器 logrotate 原理介绍和配置详解
https://wsgzao.github.io/post/logrotate/


SELinux 访问控制

SELinux(Security Enhanced Linux) 是 Linux 的一个核心模块,由美国国家安全局 (NSA) 开发并整合到 Linux 核心,是对于强制访问控制(MAC)的实现,是 Linux 历史上最杰出的新安全子系统,提供了比传统的 UNIX 权限更好的访问控制。在 SELinux 的访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。

SELinux 的三种运行模式

  • enforcing 强制模式,表示 SELinux 运行中,且已经正确的开始限制 domain/type 了;
  • permissive 宽容模式,表示 SELinux 运行中,不过仅会有警告信息,并不会实际限制 domain/type 的存取。这种模式可以运来作为 SELinux 的 debug 之用;
  • disabled 关闭,SELinux 没有运行。

sestatus 查看SELinux状态

通过命令 sestatus 查看 SELinux 状态:

$ sestatus
SELinux status:                 disabled
$ sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      31

getenforce 获取SELinux运行状态

$ getenforce
Disabled
$ getenforce
Enforcing

setenforce 0/1 切换SELinux运行模式

setenforce [0|1] 切换 SELinux 运行模式
setenforce 0 转成 Permissive 宽容模式;
setenforce 1 转成 Enforcing 强制模式
由于 SELinux 整合到 Linux 核心里了,如果由 enforcing 或 permissive 模式改成 disabled,或由 disabled 改成其他两个,系统必须要重新启动;
在 SELinux运行(enforcing 或 permissive模式)时,只能在 enforcing 和 permissive 模式切换,不能够直接关闭 SELinux,只能通过修改配置文件,然后重启系统。
在 SELinux关闭(disabled)时,setenforce 命令不能设置 Enforcing 或 Permissive 模式,只能通过修改配置文件来设置,然后重启系统。

切换为 permissive 模式

$ getenforce
Enforcing
$ sudo setenforce 0
$ getenforce
Permissive

/etc/selinux/config 配置SELinux的状态

/etc/selinux/config 配置 SELinux 的状态,修改后必须重启系统。

SELINUX=enforcing 默认为enforcing,可设置为enforcing、permissive、disabled中的一项。
SELINUXTYPE=targeted 目前只能设置成targeted、mls中的一项

$ cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

1 如果从 disable 切换到enforcing或permissive模式时,由于系统必须要针对文档写入安全性本文的信息,因此开机过程会花费不少时间在等待重新写入 SELinux 安全性本文 (有时也称为 SELinux Label),而且在写完之后还得要再次的重新启动。
2 如果已经运行在Enforcing模式,但是可能由于SELinux的设置问题,导致某些服务无法正常的运行,此时可以将Enforcing 模式改为Permissive模式,让 SELinux只会警告无法顺利联机的信息,而不是直接阻挡主体程序的读取权限。


/etc/security/limits.conf 资源限制

/etc/security/limits.conf 文件配置通过 PAM 登录的用户的资源限制。
注意此配置并不会影响系统服务的资源限制。

/etc/security/limits.d 子目录中的配置文件会按字母序加载,覆盖此配置中的同名配置项。子目录中的配置如果更具体,会覆盖 limits.conf 中的通配符配置。

ulimit -a 查看所有 shell 资源限制值

# 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) 3093684
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65536
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 3093684
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

limits.conf 工作原理

limits.conf 文件实际是 Linux PAM(插入式认证模块,Pluggable Authentication Modules)中 pam_limits.so 的配置文件,突破系统的默认限制,对系统访问资源有一定保护作用。
limits.conf 和 sysctl.conf 区别在于 limits.conf 是针对用户,而 sysctl.conf 是针对整个系统参数配置。
limits.conf 是 pam_limits.so 的配置文件,然后 /etc/pam.d/ 下的应用程序调用 pam_*.so 模块。譬如说,当用户访问服务器,服务程序将请求发送到 PAM 模块,PAM 模块根据服务名称在 /etc/pam.d 目录下选择一个对应的服务文件,然后根据服务文件的内容选择具体的PAM模块进行处理。


limits.conf文件格式

limits.conf 文件格式:

#<domain>      <type>  <item>         <value>
#

#*               soft    core            0
#*               hard    rss             10000
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#@student        -       maxlogins       4

其中
<domain> 设置需要被限制的用户名,组名前面加 @ 和用户名区别。也可用通配符*来做所有用户的限制。

<type> 类型有 soft, hard-. 其中 soft 指的是当前系统生效的设置值。hard 表明系统中所能设定的最大值。soft 的限制不能比 hard 限制高。用 - 就表明同时设置了 soft 和 hard 的值

<item> 表示要限制的资源,包括如下:

  • core 内核文件大小 KB
    何谓 core 文件?当一个程序崩溃时,在进程当前工作目录的 core 文件中复制了该进程的存储映象。core 文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的。core 文件是个二进制文件,需要用相应的工具来分析程序崩溃时的内存映像,系统默认 core 文件的大小为0,所以没有被创建。可以用 ulimit 命令查看和修改 core 文件的大小,但如果想让修改永久生效,则需要修改配置文件,如 .bash_profile, /etc/profile 或 /etc/security/limits.conf
  • data 最大数据大小 KB
  • fsize 最大文件大小 KB
  • memlock 最大内存锁地址空间 KB
  • nofile 打开文件的最大数目(number of open file)
    对于需要做许多套接字连接并使它们处于打开状态的应用程序而言,最好为用户把文件描述符的数量设置得比默认值高一些。
  • rss 最大驻留集大小(resident set size) KB
  • stack 最大栈大小 KB
  • cpu 最大 CPU 时间,单位 MIN 分钟
  • noproc 最大进程数目。限制某用户下最多可以运行多少进程或线程
  • as 地址空间限制 KB
  • maxlogins 此用户允许登录的最大数目
  • maxsyslogins 系统最大登录数
  • priority 用户进程优先级
  • locks 用户可持有的最大文件锁个数
  • sigpending pending 信号的最大个数
  • msgqueue POSIX 消息队列可用的最大内存 bytes
  • nice 允许提升的最大 nice 优先级 [-20, 19]
  • rtprio 最大实时优先级

limits.conf设置生效

  • 暂时生效,适用于通过 ulimit 命令登录 shell 会话期间
  • 永久生效,通过将一个相应的 ulimit 语句添加到由登录 shell 读取的文件之一(例如 ~/.profile),即特定于 shell 的用户资源文件;或者通过编辑 /etc/security/limits.conf

注意:要使 limits.conf 文件配置生效,必须要确保 pam_limits.so 文件被加入到启动文件中。
查看 /etc/pam.d/login 文件中有:session required /lib/security/pam_limits.so


/proc/pid/limits 查看某进程的资源限制

拿到进程号 pid 后,直接 cat /proc/pid/limits 可查看此进程的资源限制。

# cat /proc/43359/limits
Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        0                    unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             3093684              3093684              processes
Max open files            50000                50000                files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       3093684              3093684              signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us

修改打开文件数限制open files(默认1024)

Linux 默认每个用户的最大打开文件数默认是 1024, ulimit -n 查看打开文件数限制,ulimit -a 查看所有 shell 资源限制,其中的 open files 就是打开文件数限制。

$ ulimit -a|grep open
open files                      (-n) 1024

一、临时修改 ulimit -n 65536 只适用于当前 shell 登录,要想永久修改,需要修改 /etc/security/limits.conf 配置文件

二、limits.conf 永久修改所有用户打开文件最大数目
1、CentOS 5 及之前
vi /etc/security/limits.conf 添加

* hard nofile 65536
* soft nofile 65536

第一个星号代表全部用户,或者指定具体用户也可以

2、CentOS 6 及之后
在 CentOS 6 系统版本及之后发行版本中,增加了 X-nproc.conf 文件管理 Ulimit 系统环境限制。
X-nproc.conf 文件在不同系统版本中前缀数字不同,比如在 CentOS 6 版本中为 90-nproc.conf, 在 CentOS 7 版本中为 20-nproc.conf, 以现场环境为准。
将上述配置添加到 vi /etc/security/limits.d/20-nproc.conf
当然,直接添加到 /etc/security/limits.conf 中也可以,前提是要确认没有被 20-nproc.conf 中的同名配置覆盖。

退出 session 后重新登录 ulimit -a 查看已生效。


修改进程数限制max user processes(默认4096)

Linux 默认每个用户的进程/线程数限制为 4096, ulimit -a 中的 max user processes 就是最大进程/线程数限制。

$ ulimit -a|grep processes
max user processes              (-u) 4096

修改进程/线程数限制
CentOS 6 及之后,编辑 /etc/security/limits.d/20-nproc.conf 配置,增加

mysql      soft    nproc     unlimited
mysql      hard    nproc     unlimited
vitess     soft    nproc     unlimited
vitess     hard    nproc     unlimited
root       soft    nproc     unlimited
root       hard    nproc     unlimited

退出 session 后重新登录即可生效。


限制admin用户登录到sshd的服务不能超过2个

在 /etc/security/limits.conf 中添加:admin - maxlogins 2
在 /etc/pam.d/sshd 中添加 session required pam_limits.so


/etc/profile 环境变量配置

  • /etc/profile 系统级环境变量,对所有用户起作用。profile 文件在系统启动时将被运行。在 profile 文件添加或修改的内容需要注销系统或执行 source 命令才能生效。

  • /etc/bashrc 系统级环境变量,对所有用户起作用。修改这个文件不用重启,重新打开一个 bash 即可生效。

  • ~/.bash_profile /etc/profile 对所有用户生效,~/.bash_profile 只对当前用户生效。修改 .bash_profile 后需要注销系统或执行 source 命令才能生效。

  • ~/.bashrc 此文件类似于 /etc/bashrc 不需要重启生效,重新打开一个 bash 即可生效,/etc/bashrc 对所有用户新打开的 bash 都生效,但 ~/.bashrc 只对当前用户新打开的bash生效,比如 root 用户就是 /root/.bashrc


login方式与non-login方式

~/.bash_profile 是交互式、login 方式进入 bash 运行的;
~/.bashrc 是交互式、non-login 方式进入 bash 运行的;
简单地说,.bash_profile 只在会话开始时被读取一次,而 .bashrc 则每次打开新的终端时,都会被读取。
所以一般优先把变量设置在 .bashrc 里面。
通常二者设置大致相同,所以通常前者会调用后者。

交互式的:顾名思义,这种 shell 中的命令时由用户从键盘交互式地输入的,运行的结果也能够输出到终端显示给用户看。
非交互式的:这种 shell 可能由某些自动化过程启动,不能直接从请求用户的输入,也不能直接输出结果给终端用户看。输出最好写到文件。


常见的环境变量

: 表示并列含义,例如A变量值有多个,用:符号进行分离。
. 表示你操作的当前目录。

使用env命令显示所有的环境变量 ,set命令显示所有本地定义的Shell变量。

  • PATH:决定了shell将到哪些目录中寻找命令或程序
  • HOME:当前用户主目录
  • MAIL:是指当前用户的邮件存放目录。
  • SHELL:是指当前用户用的是哪种Shell。
  • HISTSIZE:是指保存历史命令记录的条数。
  • LOGNAME:是指当前用户的登录名。
  • HOSTNAME:是指主机名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的。
  • LANG/LANGUGE:是和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。
  • PS1:是基本提示符,对于root用户是#,对于普通用户是$。
  • PS2:是附属提示符,默认是“>”。

Linux代理配置

vi /etc/profile
添加如下内容:

http_proxy=http://[username:password@]proxy_ip:port/
https_proxy=http://[username:password@]proxy_ip:port/
ftp_proxy=http://[username:password@]proxy_ip:port/
no_proxy = 192.168.20. # 访问局域网地址192.168.20.*时不使用代理,可以用逗号分隔多个地址
ALL_PROXY=socks5://127.0.0.1:1080 # 全局代理
export http_proxy
export https_proxy
export ftp_proxy
export no_proxy
export ALL_PROXY

之后
source /etc/profile 使配置生效

例如:

http_proxy=http://172.17.18.80:8080/
https_proxy=http://172.17.18.80:8080/
ftp_proxy=http://172.17.18.80:8080/
ALL_PROXY=socks5://127.0.0.1:1080 # 全局代理
export http_proxy
export https_proxy
export ftp_proxy
export ALL_PROXY

如果需要为某个用户设置一个系统级的代理,可以在~/.bash_profile中设置。


$PS1命令提示符配置

$PS1 是Linux终端用户的一个环境变量,用来说明命令行提示符的设置。
可以使用 man bash命令查看bash手册,找到该变量支持的特殊字符,以及这些特殊字符的意义:

\d :#代表日期,格式为weekday month date,例如:"Mon Aug 1"
\H :#完整的主机名称。
\h :#仅取主机的第一个名字,如上例,则为fc4,.linux则被省略
\t :#显示时间为24小时格式,如:HH:MM:SS
\T :#显示时间为12小时格式
\A :#显示时间为24小时格式:HH:MM
\u :#当前用户的账号名称
\v :#BASH的版本信息
\w :#完整的工作目录名称。家目录会以 ~代替
\W :#利用basename取得工作目录名称,所以只会列出最后一个目录
\# :#下达的第几个命令
\$ :#提示字符,如果是root时,提示符为:# ,普通用户则为:$

centos 中默认命令提示符格式:

$ echo $PS1
[\u@\h \W]\$

写入 /etc/profile/etc/bashrc 对全部用户生效;
写入 ~/.bash_profile~/.bashrc 只对当前用户生效。

配置 ~/.bashrc 文件, 然后使用source使其生效

$ vi ~/.bashrc
#在文件最后添加如下设置
export PS1="[\u@\h \W] \$ "
$ source ~/.bashrc #使其设置生效

/etc/locatime Linux时区设置

查看当前时区date -R

$ date -R
Sun, 10 Mar 2019 05:05:22 +0000

下面以设置上海时区Asia/Shanghai为例:

修改linux时区

1、使用tzselect获取时间文件

$ tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent, ocean, "coord", or "TZ".
 1) Africa
 2) Americas
 3) Antarctica
 4) Asia
 5) Atlantic Ocean
 6) Australia
 7) Europe
 8) Indian Ocean
 9) Pacific Ocean
10) coord - I want to use geographical coordinates.
11) TZ - I want to specify the time zone using the Posix TZ format.
#?

输入序号选择大洲,输入4选择亚洲

#? 4
Please select a country whose clocks agree with yours.
 1) Afghanistan          18) Israel            35) Palestine
 2) Armenia          19) Japan            36) Philippines
 3) Azerbaijan          20) Jordan            37) Qatar
 4) Bahrain          21) Kazakhstan        38) Russia
 5) Bangladesh          22) Korea (North)        39) Saudi Arabia
 6) Bhutan          23) Korea (South)        40) Singapore
 7) Brunei          24) Kuwait            41) Sri Lanka
 8) Cambodia          25) Kyrgyzstan        42) Syria
 9) China          26) Laos            43) Taiwan
10) Cyprus          27) Lebanon            44) Tajikistan
11) East Timor          28) Macau            45) Thailand
12) Georgia          29) Malaysia            46) Turkmenistan
13) Hong Kong          30) Mongolia            47) United Arab Emirates
14) India          31) Myanmar (Burma)        48) Uzbekistan
15) Indonesia          32) Nepal            49) Vietnam
16) Iran          33) Oman            50) Yemen
17) Iraq          34) Pakistan
▽
#?

输入序号选择国家,输入9选择中国

#? 9
▽
ZONE="Asia/Shanghai"
Please select one of the following time zone regions.
1) Beijing Time
2) Xinjiang Time
#?

输入序号选择时区,中国有两个时区,选择1北京时间

#? 1
The following information has been given:

    China
    Beijing Time

Therefore TZ='Asia/Shanghai' will be used.
Selected time is now:    Sun Mar 10 13:06:20 CST 2019.
Universal Time is now:    Sun Mar 10 05:06:20 UTC 2019.
Is the above information OK?
1) Yes
2) No
#?

输入序号确认,输入1确认yes

#? 1
You can make this change permanent for yourself by appending the line
    TZ='Asia/Shanghai'; export TZ
to the file '.profile' in your home directory; then log out and log in again.

Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Asia/Shanghai

获取时间文件完成后,就有了时间文件:/usr/share/zoneinfo/Asia/Shanghai
注意:tzselect命令只告诉你选择的时区的写法,并不会生效。所以现在它还不是东8区北京时间。
你可以在.profile、.bash_profile或者/etc/profile中设置正确的TZ环境变量并导出。 例如在.bash_profile里面设置 TZ=’Asia/Shanghai’; export TZ并使其生效source .bash_profile

如果想全局生效,可以继续下面的步骤。

2、修改系统时区文件/etc/sysconfig/clock

注意, 有的系统 比如 centos7 中没有此时区文件,可以跳过步骤2
使用新时区更新 /etc/sysconfig/clock 文件。
(1)使用您常用的文本编辑器(如 vim 或 nano)打开 /etc/sysconfig/clock 文件。您需要在编辑器命令中使用 sudo,因为 /etc/sysconfig/clock 归 root 所有。
(2)查找 ZONE 条目,将其更改为时区文件 (忽略路径的 /usr/share/zoneinfo 部分)。例如,要更改为上海时区,请将 ZONE 条目更改为以下内容:

ZONE="Asia/Shanghai"

(3)保存文件,退出文本编辑器。

3、替换或链接/etc/locatime的时区文件

/etc/localtime 与时区文件之间创建一个符号链接,以便实例在引用本地时间信息时找到此时区文件。

sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

或者直接替换

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

查看时区:

$ date -R
Sun, 10 Mar 2019 14:36:00 +0800

看到已经修改为+8区

/etc/sysconfig/clock和/etc/localtime的区别

1)/etc/sysconfig/clock 文件,只对 hwclock 命令有效,且只在系统启动和关闭的时候才有用
在 /etc/sysconfig/clock 中 UTC=false 时,date、hwclock、hwclcok –localtime 输出的时间应该都一致,且此时 hwclock –utc是没有意义的;
在 /etc/sysconfig/clock 中 UTC=ture 时,date、hwclock 的输出是一致的,hwclock –localtime 的输出则是UTC时间;
系统关闭时会同步系统时间到硬件时钟,系统启动时会从硬件时钟读取时间更新到系统,这2个步骤都要根据 /etc/sysconfig/clock 文件中UTC的参数来设置时区转换。

2)/etc/localtime
这个文件用来设置系统的时区,将 /usr/share/zoneinfo/ 中相应文件拷贝到 /etc 下并重命名为 localtime 即可修改时区设置,而且这种修改对 date 命令是及时生效的。不论是 date 还是 hwclock 都会用到这个文件,会根据这个文件的时区设置来进行UTC和本地之间之间的换算。

linux修改时区
http://coolnull.com/235.html

Linux查看设置系统时区
https://www.cnblogs.com/kerrycode/p/4217995.html

/etc/localtime和/etc/timezone区别

/etc/timezone 是一个纯文本文件

$ cat /etc/timezone
Asia/shanghai

/etc/localtime 通常链接到一个时区文件

$ ll /etc/localtime
lrwxrwxrwx. 1 root root 33 12月 21 21:15 /etc/localtime -> /usr/share/zoneinfo/Asia/Shanghai

/etc/localtime 是用来描述本机时间,而 /etc/timezone 是用来描述本机所属的时区


NTP 时间

NTP(Network Time Protocol,网络时间协议),是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS 等等)做同步化,并提供高精准度的时间校正(LAN 上与标准间差小于1毫秒,WAN 上几十毫秒),且可通过加密确认的方式来防止恶毒的协议攻击。

不同机器之间的时间同步,可以使用ntpdate命令,也可以使用ntpd服务
1、使用 ntpdate 比较简单,强制性的将系统时间设置为 ntp 服务器时间,一般配合 crontab 来进行定期同步设置。
并且,ntpdate 同步时间,会造成时间的跳跃,对一些依赖时间的程序和服务会造成影响。
ntpdate time.ntp.org
ntpdate 192.168.0.2

2、ntpd 服务运行后, 先是每64秒与上源服务器同步一次, 根据每次同步时测得的误差值经复杂计算逐步调整自己的时间, 随着误差减小, 逐步增加同步的间隔. 每次跳动, 都会重复这个调整的过程。
使用ntpd服务,要好于ntpdate加cron的组合。
ntpd有一个自我保护设置: 如果本机与上源时间相差太大, ntpd不运行. 所以新设置的时间服务器一定要先ntpdate从上源取得时间初值, 然后启动ntpd服务。

/etc/sysconfig/ntpd 配置

一般,在开机的时候,使用ntpdate强制同步时间,在其他时候使用ntpd服务来同步时间。

the NTP socket is in use, exiting

ntpdate 同步时间报错:

ntpdate 192.168.0.2
29 Dec 19:36:43 ntpdate[67036]: the NTP socket is in use, exiting

原因:
ntpd 服务正在运行,占用了端口。

解决:
systemctl stop ntpd 关闭ntpd服务, ntpdate 同步时间后再 systemctl start ntpd 开启。

# ntpdate 10.153.106.15
29 Dec 19:37:06 ntpdate[72803]: step time server 10.153.106.15 offset -69.140396 sec

Linux locale 配置

locale 这个单词中文翻译成地区或者地域,其实这个单词包含的意义要宽泛很多。Locale是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境。

locale 把按照所涉及到的文化传统的各个方面分成12个大类,这12个大类分别是:
1、语言符号及其分类(LC_CTYPE)
2、数字(LC_NUMERIC)
3、比较和排序习惯(LC_COLLATE)
4、时间显示格式(LC_TIME)
5、货币单位(LC_MONETARY)
6、信息主要是提示信息,错误信息,状态信息,标题,标签,按钮和菜单等(LC_MESSAGES)
7、姓名书写方式(LC_NAME)
8、地址书写方式(LC_ADDRESS)
9、电话号码书写方式(LC_TELEPHONE)
10、度量衡表达方式 (LC_MEASUREMENT)
11、默认纸张尺寸大小(LC_PAPER)
12、对locale自身包含信息的概述(LC_IDENTIFICATION)。

所以说,locale就是某一个地域内的人们的语言习惯和文化传统和生活习惯。一个地区的locale就是根据这几大类的习惯定义的。

linux 中,这些locale定义文件放在 /usr/share/i18n/locales 目录下面,例如en_US, zh_CN and de_DE@euro都是locale的定义文件,
这些文件都是用文本格式书写的,你可以用写字板打开,看看里边的内容,当然出了有限的注释以外,大部分东西可能你都看不懂,因为是用的Unicode的字符索引方式。

locale 显示和设置语言环境

locale 显示默认的语言字符集
locale -a 查看可用的语言环境

localedef 定义语言环境

localedef 命令用于定义一个语言环境
ocaledef [选项...] 名称

-i 指定源locale
-f 指定字符集

localedef -i zh_CN -f UTF-8 myzh.UTF8 读取了 /usr/share/i18n/locales/zh_CN 和 /usr/share/i18n/charmaps/UTF-8.gz 并对其做编译生成名为 myzh.UTF8 的 locale

locale localedef –之Linux字符集理解
https://www.cnblogs.com/wn1m/p/10837609.html


上一篇 2016年第三季度运动记录

下一篇 VPS

阅读
评论
16.3k
阅读预计66分钟
创建日期 2016-06-17
修改日期 2024-07-10
类别
标签
目录
  1. 进程组/会话
    1. 进程组
    2. 会话
  2. linux OOM killer机制
    1. vm.overcommit_memory
    2. vm.overcommit_ratio
  3. /proc/meminfo 内存信息
  4. /proc/cpuinfo CPU信息
    1. 查看cpu核数
  5. /proc/pid 查看进程的运行目录
    1. /proc/pid/fd 进程打开的文件描述符
  6. /proc/swaps 交换空间信息
  7. /proc/version 内核版本信息
  8. /proc/filesystems 支持的文件系统
  9. /proc/pid/cgroup 进程所属cgroup
  10. /etc/resolv.conf DNS服务器配置文件
  11. /etc/hosts 本机DNS
    1. 设置主机名
    2. Centos7 hostname 配置
      1. hostnamectl 查看主机名
      2. hostnamectl set-hostname 设置主机名
  12. /etc/passwd 用户信息
    1. 查看所有用户
    2. 禁止用户登录
    3. This account is currently not available
  13. /etc/shells 可用shell列表
    1. 常用shell
  14. /etc/group 组信息
    1. wheel 用户组
  15. /etc/sysctl.conf
    1. vm.max_map_count 虚拟内存区域数量
    2. net.core.somaxconn socket监听队列长度
  16. /etc/fstab 文件系统挂载信息
    1. 查看Linux各磁盘的文件系统
  17. /etc/sysconfig
    1. /etc/sysconfig/network
      1. 设置主机名
  18. linux文件系统
    1. inode
    2. inode存储的信息
    3. inode号码
    4. inode个数/使用率过大排查
    5. 目录文件
    6. 进程打开文件的机制
    7. 硬链接
      1. 查看文件的硬链接数
    8. 目录的链接数
    9. 软链接
  19. logrotate 日志滚动工具
  20. SELinux 访问控制
    1. SELinux 的三种运行模式
    2. sestatus 查看SELinux状态
    3. getenforce 获取SELinux运行状态
    4. setenforce 0/1 切换SELinux运行模式
    5. /etc/selinux/config 配置SELinux的状态
  21. /etc/security/limits.conf 资源限制
    1. limits.conf 工作原理
    2. limits.conf文件格式
    3. limits.conf设置生效
    4. /proc/pid/limits 查看某进程的资源限制
    5. 修改打开文件数限制open files(默认1024)
    6. 修改进程数限制max user processes(默认4096)
    7. 限制admin用户登录到sshd的服务不能超过2个
  22. /etc/profile 环境变量配置
    1. login方式与non-login方式
    2. 常见的环境变量
    3. Linux代理配置
    4. $PS1命令提示符配置
  23. /etc/locatime Linux时区设置
    1. 查看当前时区date -R
    2. 修改linux时区
      1. 1、使用tzselect获取时间文件
      2. 2、修改系统时区文件/etc/sysconfig/clock
      3. 3、替换或链接/etc/locatime的时区文件
    3. /etc/sysconfig/clock和/etc/localtime的区别
    4. /etc/localtime和/etc/timezone区别
  24. NTP 时间
    1. the NTP socket is in use, exiting
  25. Linux locale 配置
    1. locale 显示和设置语言环境
    2. localedef 定义语言环境

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论