笔记--linux系统配置

        ------内核配置--------
            ---swap---
                控制swap使用的系统参数:
                    swappiness,Swappiness为60(100%-60%=40%)表示物理内存使用到40%的时候使用swap空间

                默认swappiness:
                    cat /proc/sys/vm/swappiness
                临时调整:
                    sysctl vm.swappiness=10
                永久调整:
                    vim /etc/sysctl.conf
                        vm.swappiness=10
                    sysctl -p
                    
                关闭swap
                    临时生效:
                        sysctl -w vm.swappiness=0
                    永久生效:
                        echo "vm.swappiness = 0">> /etc/sysctl.conf     (尽量不使用交换分区,注意不是禁用)

                刷新SWAP
                    swapoff -a && swapon -a
                    sysctl -p  (执行这个使其生效,不用重启)
                                            
            ---共享内存:
                shmall/shmmax
                    kernel.shmall(共享内存页总数)
                    kernel.shmmax (共享内存段的最大值)
                    一般来讲,这两个参数的值应该是物理内存的一半,可以通过操作系统的值_PHYS_PAGES和PAGE_SIZE计算得出。
                     
                    kernel.shmall = ( _PHYS_PAGES / 2)
                    kernel.shmmax = ( _PHYS_PAGES / 2) * PAGE_SIZE
                    也可以通过以下两个命令得出这两个参数的值:
                    $ echo $(expr $(getconf _PHYS_PAGES) / 2) 
                    $ echo $(expr $(getconf _PHYS_PAGES) / 2 \* $(getconf PAGE_SIZE))
                     
                    如果得出的kernel.shmmax值小于系统的默认值,则引用系统默认值即可
                        cat /proc/sys/kernel/shmall
                        cat /proc/sys/kernel/shmmax
                        
                信号量:
                    信号量充当共享内存的标志。信号量可以设置为开或关。当Oracle进程访问SGA(在共享内存中)时,它将检查该内存部分的信号量。如果它发现为该内存部分设置了信号量,则进程将休眠并稍后再次检查。如果没有为内存的那部分设置信号量,它将设置一个并继续操作。当它完成时,它将把信号灯切换回关闭状态。
                    查看:
                        [root@zeng ~]# cat /proc/sys/kernel/sem
                        250     32000   100     128
                        上面输出的4个值分别对应内核信号量参数:
                        semmsl  250    每个信号量集中的最大信号量数。对于processes参数设置较大的系统建议设置为processes+10
                        semmns  32000  整个系统中的最大信号量数。SEMMSL * SEMMNI 
                        semopm  100    每一个semop系统调用操作的最大信号量数。至少100;或者等于SEMMSL 
                        semmni  128    信号量集最大数。
                    修改:
                        echo "kernel.sem =250 32000 100 128" >> /etc/sysctl.conf
                        sysctl -p

            ---内存分配
                (1)vm.overcommit_memory
                    执行grep -i commit  /proc/meminfo
                    看到CommitLimit和Committed_As参数。
                    CommitLimit是一个内存分配上限,CommitLimit = 物理内存 * overcommit_ratio(默认50,即50%) + swap大小
                    Committed_As是已经分配的内存大小。
                    --------
                    vm.overcommit_memory文件指定了内核针对内存分配的策略,其值可以是0、1、2                             
                    0: (默认)表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。0 即是启发式的overcommitting handle,会尽量减少swap的使用,root可以分配比一般用户略多的内存
                    1: 表示内核允许分配所有的物理内存,而不管当前的内存状态如何,允许超过CommitLimit,直至内存用完为止。在数据库服务器上不建议设置为1,从而尽量避免使用swap.
                    2: 表示不允许超过CommitLimit值
                 
                (2)vm.overcommit_ratio
                    默认值为:50 (即50%)
                    这个参数值只有在vm.overcommit_memory=2的情况下,这个参数才会生效。
                    
            ---网络:
                net.ipv4.tcp_tw_recycle &  net.ipv4.tcp_timestamps 
                    nat网络下,一定不能配置
                    net.ipv4.tcp_timestamps = 1
                    net.ipv4.tcp_tw_recycle = 1
                    TCP协议中有一种机制,缓存了每个主机(即ip)过来的连接最新的timestamp值。这个缓存的值可以用于PAWS(Protect Against Wrapped Sequence numbers,是一个简单的防止重复报文的机制)中,来丢弃当前连接中可能的旧的重复报文。而Linux实现这个机制的方法就是同时启用net.ipv4.tcp_timestamps和net.ipv4.tcp_tw_recycle 这两个选项。
                    这种机制在 客户端-服务器 一对一的时候,没有任何问题,但是当服务器在负载均衡器后面时,由于负载均衡器不会修改包内部的timestamp值,而互联网上的机器又不可能保持时间的一致性,再加上负载均衡是会重复多次使用同一个tcp端口向内部服务器发起连接的,就会导致什么情况呢:

                    负载均衡通过某个端口向内部的某台服务器发起连接,源地址为负载均衡的内部地址——同一假如恰巧先后两次连接源端口相同,这台服务器先后收到两个包,第一个包的timestamp被服务器保存着,第二个包又来了,一对比,发现第二个包的timestamp比第一个还老——客户端时间不一致。服务器基于PAWS,判断第二个包是重复报文,丢弃之。

                    反映出来的情况就是在服务器上抓包,发现有SYN包,但服务器就是不回ACK包,因为SYN包已经被丢弃了。为了验证这一结果,可以执行netstat -s | grep timestamp 命令,看输出里面passive connections rejected by timestamp 一项的数字变化。

                    解决办法:
                    tcp_tw_recycle=0 或(和)net.ipv4.tcp_timestamps=0
                    
                核心转发:
                    临时:
                    echo "1" > /proc/sys/net/ipv4/ip_forward
                    永久:
                    vim /etc/sysctl.conf
                        net.ipv4.ip_forward = 1
                        0为关闭
                
            ---cpu:
                睿频:/sys/devices/system/cpu/intel_pstate/no_turbo #0开启,1关闭
            
        ------ipcs/ipcrm--------------
            --ipcs
                1. 命令格式
                  ipcs [resource-option] [output-format]
                  ipcs [resource-option] -i id
                2. 命令功能
                  提供IPC设备的信息
                3. 使用方法
                 resource选项:
                  ipcs -m  查看系统共享内存信息
                  ipcs -q  查看系统消息队列信息
                  ipcs -s  查看系统信号量信息
                  ipcs [-a] 系统默认输出信息,显示系统内所有的IPC信息
                    输出格式控制:
                  ipcs -c  查看IPC的创建者和所有者
                  ipcs -l  查看IPC资源的限制信息
                  ipcs -p  查看IPC资源的创建者和使用的进程ID
                  ipcs -t  查看最新调用IPC资源的详细时间
                  ipcs -u  查看IPC资源状态汇总信息
                    额外格式控制:
                     ipcs -l --human    以人类可以阅读的方式显示size
                    
                --ipcrm
                    1. 命令功能
                      通过指定ID删除删除IPC资源,同时将与IPC对象关联的数据一并删除,只有超级用户或IPC资源创建者能够删除
                    2. 使用方法
                      ipcrm -M shmkey #移除用shmkey创建的共享内存段
                      ipcrm -m shmid #移除用shmid标识的共享内存段
                      ipcrm -S semkey    #移除用semkey创建的信号量
                      ipcrm -s semid #移除用semid标识的信号量
                      ipcrm -Q msgkey #移除用msgkey创建的消息队列
                      ipcrm -q msgid #移除用msgid标识的消息队列
            
        -----NetworkManager和network-----
            network :读取的设定档路径为「/etc/sysconfig/network-scripts/*」下的设定档。
            NetworkManager :读取的设定档路径为「/etc/NetworkManager/*」下的设定档。
    
        -----文件权限--
            umask :
                假设,我们让用户设置754权限则: 777-754= 023 所以,umask =023
                而创建文件的时候,666-023 = 643。但是文件的默认权限是不具有x权限的,所以643会自动将其变成642
            文件权限属性后面的点的含义:
                开启了SELinux功能的Linux系统才会有这个点。
                那个点表示文件带有“SELinux的安全上下文”。
                CentOS7默认是开启SELinux的,所以会有这个点,
                如果关闭SELinux,然后再创建文件,新创建的文件就不会再有这个点了,
                但是以前创建的文件本来有这个点的还会显示这个点(虽然SELinux不起作用了)
            文件夹可以进入,不能ls:
                缺少r权限
            
        ---系统模块--
            动态加载模块:
                modprobe  模块名
                例:
                    modprobe ipmi_msghandler;modprobe ipmi_si;modprobe ipmi_devintf
                        IPMI(Intelligent Platform Management Interface,智能平台管理接口),许多服务器的远程控制卡,或KVM over IP设备,都使用了这个接口
            动态卸载模块:
                modprobe  -r  模块名

            查看模块:
                lsmod|less
    
        ---ssh----------
            /etc/ssh/sshd_config
                GSSAPIAuthentication yes --->no 81行左右 是否允许使用基于 GSSAPI 的用户认证
                UseDNS yes -->UseDNS no 122行左右
                ClientAliveInterval=60 超时
            设置超时:~/.bash_profile
                export TMOUT=600
                unset TMOUT  取消设置
            问题:
                ssh-copy-id已设置,但无法免密登录
                一般和用户的家目录或.ssh目录的权限有关系
        
        -----关闭mail提示-------------
            1 不关闭mail服务
            unset MAILCHECK

            2 关闭mail服务
            systemctl status postfix
            systemctl stop postfix && systemctl disable postfix
        
        -----history------------
            定义history
                export HISTSIZE=8192
                export HISTFILESIZE=8192
                USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
                [[ -d "/tmp/.log/${LOGNAME}" ]] || mkdir -p  "/tmp/.log/${LOGNAME}"
                export HISTFILE="/tmp/.dbasky/${LOGNAME}/${USER_IP}"
                export HISTTIMEFORMAT="%F %T  "        #定义history显示时间

        ---------ulimit------------
            修改登录用户限制:
                ulimit命令
                    -a  显示目前资源限制的设定。 
                    -c <core文件上限>  设定core文件的最大值,单位为区块。 
                    -d <数据节区大小>  程序数据节区的最大值,单位为KB。 
                    -f <文件大小>  shell所能建立的最大文件,单位为区块。 
                    -H  设定资源的硬性限制,也就是管理员所设下的限制。 
                    -m <内存大小>  指定可使用内存的上限,单位为KB。 
                    -n <文件数目>  指定同一时间最多可开启的文件数。 
                    -p <缓冲区大小>  指定管道缓冲区的大小,单位512字节。 
                    -s <堆叠大小>  指定堆叠的上限,单位为KB。 
                    -S  设定资源的弹性限制。 
                    -t <CPU时间>  指定CPU使用时间的上限,单位为秒。 
                    -u <程序数目>  用户最多可开启的程序数目。 
                    -v <虚拟内存大小>  指定可使用的虚拟内存上限,单位为KB。
                      
                    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) 2058698
                        max locked memory       (kbytes, -l) 64
                        max memory size         (kbytes, -m) unlimited
                        open files                      (-n) 65535
                        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) 2058698
                        virtual memory          (kbytes, -v) unlimited
                        file locks                      (-x) unlimited

                    例:ulimit -SHn 65535 软硬限制文件数
                永久修改---/etc/security/limits.conf        #重新登录后生效
                    例:
                        vi /etc/security/limits.conf:
                            *           soft  core   unlimited
                            *           hard  core   unlimited
                            *           soft  fsize  unlimited 
                            *           hard  fsize  unlimited 
                            *           soft  data   unlimited 
                            *           hard  data   unlimited 
                            *           soft  nproc  65535 
                            *           hard  nproc  63535 
                            *           soft  stack  unlimited 
                            *           hard  stack  unlimited 
                            *           soft  nofile  409600 
                            *           hard  nofile  409600
                        
                    *             代表针对所有用户 
                    noproc     是代表最大进程数 
                    nofile     是代表最大文件打开数

                    core - 限制内核文件的大小
                    date - 最大数据大小
                    fsize - 最大文件大小
                    memlock - 最大锁定内存地址空间
                    rss - 最大持久设置大小
                    stack - 最大栈大小
                    cpu - 以分钟为单位的最多 CPU 时间
                    as - 地址空间限制
            
            centos7修改:
                在Centos7系统中,使用Systemd替代了之前的SysV。/etc/security/limits.conf文件的配置作用域缩小了。/etc/security/limits.conf的配置,只适用于通过PAM认证登录用户的资源限制,它对systemd的service的资源限制不生效。因此登录用户的限制,通过/etc/security/limits.conf与/etc/security/limits.d下的文件设置即可。
                对于systemd service的资源设置,则需修改全局配置,全局配置文件放在/etc/systemd/system.conf和/etc/systemd/user.conf,同时也会加载两个对应目录中的所有.conf文件/etc/systemd/system.conf.d/*.conf和/etc/systemd/user.conf.d/*.conf。system.conf是系统实例使用的,user.conf是用户实例使用的。
                vim /etc/systemd/system.conf
                    DefaultLimitNOFILE=100000
                    DefaultLimitNPROC=65535
                注意:配置完成后,需要执行:systemctl daemon-reexec
                也可以在/usr/lib/systemd/system/xxx.service中增加(需要systemctl daemon-reload && systemctl xxx restart):
                    LimitCORE=infinity
                    LimitNOFILE=100000
                    LimitNPROC=100000

        ------------Linux 服务器buff/cache清理------------
            使用Top命令查看内存及缓冲区使用情况
            
            当磁盘频繁产生IO时会导致buff/cache占用很高的内存,导致可用物理内存很少,但是当真正需要内存时,缓冲区内存会自动释放.如果需要清理可以用:
                cache清理   sync;echo 3 > /proc/sys/vm/drop_caches
            前面加sync 是为了防止内容丢失
            
                free pagecache:echo 1 >/proc/sys/vm/drop_caches
                To free dentries and inodes:echo 2 >/proc/sys/vm/drop_caches
                二者都清理就是  sync;echo 3 > /proc/sys/vm/drop_caches
    
        ------------abrtd------------
            abrtd:
                automatically bug report daemon. 自动的报告bug守护进程
                abrt-hook-ccpp 钩子函数
                配置目录:/etc/abrt/*.conf
                注意:ulimit -c unlimited
            cpu占用过高:
                abrt-action-save-package-data.conf:
                    ProcessUnpackaged = yes
                systemctl restart abrtd
            coredump存储目录:
                /proc/sys/kernel/core_pattern定义了下coredump路径的pattern
            gdp调试coredump:
                gdb sbin/nginx cores/core.nginx.xxxx

        ------------lib and include------------
            添加lib:
                方法一:
                      在配置文件/etc/ld.so.conf里添加动态库所在的路径,编辑完后在命令行输入ldconfig。
                方法二:
                      指定环境变量 export LD_LIBRARY_PATH=[动态库所在的路径]。
                方法三:
                      把动态库拷贝到/usr/lib目录下。
                方法四:
                      把动态库拷贝到/lib目录下。

                *优先级从高到低依次是:方法二,方法一,方法四,方法三
                  
            添加头文件:
                直接将文件复制到/usr/include/XXX,或建一个软连接
    
        -------alternatives---------------
            alternatives版本管理软件:
                alternatives --install <link> <name> <path> <priority>
                    例: alternatives --install /usr/bin/myjava  myjava  /usr/java/jdk1.6.0_21/bin/java  300
                alternatives --config <name>
                    例: alternatives  --config myjava
        
        -----CentOS7自定义脚本服务-------
            1 路径:/usr/lib/systemd/system/*.service(systemctl脚本目录    /usr/lib/systemd/)
                例1:
                    [Unit]
                    Description=OpenSSH server daemon
                    Documentation=man:sshd(8) man:sshd_config(5)
                    After=network.target sshd-keygen.service
                    Wants=sshd-keygen.service

                    [Service]
                    EnvironmentFile=/etc/sysconfig/sshd
                    ExecStart=/usr/sbin/sshd -D $OPTIONS
                    ExecReload=/bin/kill -HUP $MAINPID
                    KillMode=process
                    Restart=on-failure
                    RestartSec=42s

                    [Install]
                    WantedBy=multi-user.target
                例2:
                    [Unit]
                    Description=Zabbix Server with MySQL DB
                    After=syslog.target network.target mysqld.service

                    [Service]
                    Type=simple
                    ExecStart=/usr/sbin/zabbix_server -f
                    User=zabbixsrv

                    [Install]
                    WantedBy=multi-user.target
                    
            2 配置说明:
                1、[unit]区块:设置管理启动顺序与依赖关系
                    Description=服务描述    给出当前服务的简单描述                                              
                    Documentation=路径或url    给出文档位置
                    After=服务.target或服务.service               
                    定义在某些服务之后启动。例如sshd服务启动必须在network.target sshd-keygen.service服务开启之后才能启动,可以使用如下命令查看sshd服务的配置:cat  /usr/lib/systemd/system/sshd.service
                    Before=服务.target    定义在某些服务之前启动
                    Wants=服务.service    弱依赖,表示等号填写服务启动或失败,不影响此配置文件服务的启动
                    Requires=服务.service    强依赖,表示等号填写服务启动或失败,那么此配置文件的服务将启动失败
                
                2、[Service]区块:设置启动行为
                    •启动命令
                        ExecStart=命令    定义启动进程时执行的命令
                        ExecReload=命令    重启服务时执行的命令                                                                                                                                                         
                        ExecStop=命令    停止服务时执行的命令
                        ExecStartPre=命令    启动服务之前执行的命令
                        ExecStartPost=命令    启动服务之后执行的命令
                        ExecStopPost=命令    停止服务之后执行的命令
                     ***所有的启动设置之前,都可以加上一个连词号(-),表示"抑制错误",即发生错误的时候,不影响其他命令的执行。例如:ExecStop=-/bin/sh /server/scripts/xx.sh

                    •启动类型  Type字段定义启动类型。它可以设置的值如下:
                        simple(默认值)    ExecStart字段启动的进程为主进程    #前台运行的命令可以使用此类型
                        forking    ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程    #后台运行
                        oneshot    类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务
                        dbus    类似于simple,但会等待 D-Bus 信号后启动
                        notify    类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务
                        idl    类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合
                        
                    •重启行为 
                        KillMode字段,定义Systemd如何停止服务,它可以设置的值如下
                            control-group(默认值)    当前控制组里面的所有子进程,都会被杀掉
                            process    只杀主进程
                            mixed    主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
                            none    没有进程会被杀掉,只是执行服务的 stop 命令    
                        Restart字段,定义了服务退出后,Systemd的重启方式,它可以设置的值如下
                            no(默认值)    退出后不会重启
                            on-success    只有正常退出时(退出状态码为0),才会重启
                            on-failure    非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启
                            on-abnormal    只有被信号终止和超时,才会重启
                            on-abort    只有在收到没有捕捉到的信号终止时,才会重启
                            on-watchdog    超时退出,才会重启
                            always    不管是什么退出原因,总是重启    
                            
                    •service区块的其他一些字段
                        EnvironmentFile=文件路径    指定当前服务的环境参数文件
                        RestartSec=数值    表示Systemd重启服务之前,需要等待的秒数
                        PIDFile=PID文件路径    PID进程文件
                        KillSignal=信号量    停止信号量,值一般为SIGQUIT
                        TimeoutStopSec=数值    停止超时时间
                        PrivateTmp=布尔值    独立空间true或false,即文件系统名字空间的配置将被该命令行启动的进程忽略    
                        
                    limit配置:
                        LimitCORE=infinity
                        LimitNOFILE=100000
                        LimitNPROC=100000                    
                        
                3、[Install]区块:定义如何安装这个配置文件,即怎样做到开机启动
                        这个设置非常重要,如果设置开机自启动,在/etc/systemd/system目录下面的multi-user.target.wants子目录之中就会创建一个服务的软链接
                            WantedBy字段,表示该服务所在的 Targe,target的含义是服务组,表示一组服务,它可以设置的值如下
                            multi-user.target    表示多用户命令行状态
                            graphical.target    表示图形用户状态,它依赖于multi-user.target     
            
            注:
                1,static服务,没有Install项的service都是static的, 所以你不可能enable/disable他了, 所以他的状态永远是static的了, 也就是说他的运行只能通过其他的服务单元触发
                2,重载服务使用:systemctl daemon-reload

        -------patch----
            语  法:
                patch [-bceEflnNRstTuvZ][-B <备份字首字符串>][-d <工作目录>][-D <标示符号>][-F <监别列数>][-g <控制数值>][-i <修补文件>][-o <输出文件>][-p <剥离层级>][-r <拒绝文件>][-V <备份方式>][-Y <备份字首字符串>][-z <备份字尾字符串>][--backup-if   -mismatch][--binary][--help][--nobackup-if-mismatch][--verbose][原始文件 <修补文件>] 或 path [-p <剥离层级>] < [修补文件]
                    -p<剥离层级>或--strip=<剥离层级>  设置欲剥离几层路径名称。
                        patch -p0       (“p”指的是路径,后面的数字表示去掉路径的第几部分。0,表示不去掉,为全路径)
                        patch -p1       (“p”后面的数字1,表示去掉前第一个路径)fetch http://people.freebsd.org/~delphij/misc/patch-bge-releng62
                        patch -p < patch-tcp_auto_buf-20061212-RELENG_6.diff

        -----/etc/hosts.conf------
            一 作用
                  指定如何解析主机域名。可设置网络安全。
            二 参数说明
                 默认情况,/etc/hosts.conf 文件有如下内容——
                 order hosts,bind
                 multi on
            参数说明:
            1. order 是解析顺序的参数,order hosts,bind,nis //说明先查询解析/etc/hosts文件,然后DNS,再是NIS
            2. multi on  //表示是否运行/etc/hosts文件允许主机指定多个多个地址 ,on表示运行
            3. nospoof on //是否允许服务器对ip地址进行其欺骗,这里的on表示不允许
            4. rccorder  //如果被设置为on,那么所有查询将被重新排序。    

        -----------bash-4.2#解决方法-----------
            cp /etc/skel/.bashrc ~/
            cp /etc/skel/.bash_profile  ~/

猜你喜欢

转载自blog.csdn.net/weixin_42573277/article/details/114121815