Linux 基础

介绍Linux 基础与相关配置

Linux常用命令

  • mkdir 创建目录
  • cd 切换目录
  • /bin/cp 覆盖不提示,默认是有提示的alias cp -i
  • rm -rf 删除目录以及子目录,参数列表过长find ./ -type f -name "*.*"|xargs rm -f find ./ -type f -name "*.xx"|xargs rm -f。*删除操作需要谨慎,避免误删,最好不要执行这个命令,如果在根目录执行整个服务器就废了。特别不能打开发送到所有连接,这样就完蛋了。 *
  • mkdir 创建目录
  • touch 创建文件
  • ls 查看文件列表,ll -h查看列表与权限, ls -a 显示隐藏文件
  • pwd 查看当前路径
  • tar -cvf xxx.tar xxx/ tar包打包还有一个压缩命令tar -zcvf
  • tar -xvf xxx.tar -C /xxx/xxx tar包解压还有一个压缩命令tar -zxvf
  • tcpdump 查看tcp抓包 tcpdump -i eth0 -w ./target.cap
  • ps -ef|grep java 查看java进程信息
  • ps -aux(英文全拼:process status) 显示所有包含其他使用者的行程 ps -A 列出所有的进程 ps -u abc 查看指定用户进程
  • ifconfig 查看IP信息
  • ./install.sh 当前目录执行sh脚本
  • wget 下载网络数据
  • cat /proc/cpuinfo 查看CPU
  • top 查看进程信息与内存信息
  • free -m 内存容量,redhat需要 -buffers +cached。free -h centos available:真正剩余的可被程序应用的内存数
  • df -h 查看硬盘容量
  • du -sh * | sort -n 查看目录占用容量
  • ll -lht 查看文件大小
  • ssh -p222 root@192.168.1.3 ssh登录其他服务器 -v查看详情,目标服务器需要允许外部ssh登录hosts.allow
  • mv ./* ../ 移动当前目录下的所有文件到上级目录
  • curl -H "Content-Type: application/json" -X POST --data '{"id":1}' http://www.infotech.vip/user POST范围URL
  • chown -R user:usergroup * 更改目录与子目录所有者
  • chmod -R 766 目录 修改目录权限,755。rwx = 4 + 2 + 1 = 7 (可读写运行),rw = 4 + 2 = 6 (可读写不可运行),rx = 4 +1 = 5 (可读可运行不可写)
  • netstat -tunlp 查看本机监听,-t:tcp,-u:udp,-n:数字表示,-a:全部,-l:监听服务,-p:进程名
  • whereis mysql which mysqld rpm -qa |grep mysql rpm -ql mysql-libs.... rpm -qal |grep mysql find / -name mysql ps -ef|grep mysql查找程序
  • rpm -e mysqld --nodeps 卸载不需要带上版本号,会导致只能精确卸载某个版本
  • head -n 200 filename 查看头部200行
  • tail -1000 xxx.txt > 2.txt tail -3000 catalina.out |grep Error > 3.txt 查看文件另存为 tail -10000 catalina.out | grep error最后1万行查询错误tail -f xx 实时查看最新记录
  • rz sz xxx.txt 上传下载
  • find / -name "*.out" find . -name "*.out" 查找所有.out结尾的文件 查找当前目录.out文件
  • ls -l|grep "^-"| wc -l 查看当前目录文件个数,”^-“代表文件,wc -l统计行数,或者 find . -type f -print | wc -l
  • history 查看历史操作命令
  • killall mongod kill进程 windows关闭进程:taskkill /f /im java.exe
  • less xxx.txt 查看文件内容 q 退出
  • sed -n '$=' /etc/sysctl.conf cat /etc/sysctl.conf | wc -l 查看文件行数
  • df -i 查看inode数与使用率
  • for i in /*; do echo $i; find $i | wc -l; done 查询下一级级目录inode数,可以一级一级排查,找出占用大的目录
  • lsb_release -a uname -r 查看版本信息
  • ab -c 10 -n 100 http://www.baidu.com/ -c 10表示并发用户数为10 - n100表示每个用户请求数为100。安装命令:yum -y install httpd-tools
  • date -s "2020-06-07 14:14:00" 修改系统时间;clock -w 系统时间写到服务器时钟
  • vi xxx 编辑文件,内部命令:/xxx搜索n下一条N上一条,:q!强制退出,:wq 保存退出,gg第一行,shift+G最后一行,dd删除一行,a录入,Esc退回命令模式
  • sftp(ftp) abc@192.169.1.2 跨服务器文件传输支持centos系统用户作为ftp用户,put 本地文件的地址 服务器上文件存储的位置
  • ftpopen 192.168.1.2 288 通过ftp登录目标ftp服务器,dir:查看目录
  • scp -P 288 /home/test/ss.txt root@192.168.33.113:/home 复制文件到目标服务器指定目录,-r 代表复制子目录文件
  • ss -ant |grep 80 Socket Statistics t:tcp a:all
  • nohup xxx & nohup 加在一个命令的最前面,表示不挂断的运行命令(退出账号/关闭终端还能继续运行),输出都将附加到当前目录的 nohup.out 文件中(如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中),&加在一个命令的最后面,表示这个命令放在后台执行,ps 和 jobs查看后台运行进程。nohup 英文全称 no hang up(不挂起)。可以把需要执行的命令写成sh脚本nohup sh /tmp/xxx.sh &
  • umask -S [权限掩码] umask 命令指定在建立文件时预设的权限掩码,获取当前权限掩码,umask的分数是”该默认值777需要减去的权限”,一般是022(同组或者其他组都没有写权限)
  • find / -name openssh 按文件名查找
  • find /data1 -type f | wc -l 查询文件数
  • crontab -e 编辑定时任务
  • lsof -i:111 lsof(list open files)是一个列出当前系统打开文件的工具
  • cat /etc/services | grep -w 111 查看正在监听的端口
  • cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 20 Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz 核心数与型号
  • cat /proc/version centos:Linux version 3.10.0-957.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Thu Nov 8 23:39:32 UTC 2018 redhat:Linux version 2.6.32-431.el6.x86_64 (mockbuild@x86-023.build.eng.bos.redhat.com) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Sun Nov 10 22:19:54 EST 2013
  • cat /etc/redhat-release 查看内核版本信息
  • sed -i 's/8080/8081/g' server.xml 替换文件中的字符串,如果包含转义字符可以直接定义变量shell直接执行 temp=/home/test echo $temp sed -i "s/$temp/sdfds/g" abc.test 要用双引号。/支持模糊替换
  • :%s#/test/ff#abc/# vi 替换全部 /test/ff 为 /abc/ ,使用#替换/做分隔符
  • :s/str1/str2/g vi 用字符串 str2 替换行中所有出现的字符串 str1
  • :%s/str1/str2/g vi 用字符串 str2 替换文件中所有出现的字符串 str1
  • sed -n '/<db_host>.*<\/db_host>/p' test.xml 使用类似正则表达式占位符匹配,可以修改成替换语句,<db_host>192.168.33.181</db_host>,sed -i 's#<db_host>.*</db_host>#<db_host>192.168.33.186</db_host>#g' test.xml 可能出现替换失败的情况,可能是由于字符集输入的时候写错了等等,可以重新编写后测试
  • usermod -G group1 user1 usermod -a -G group1 user1 给user1添加一个新组group1
  • netstat -an|grep tcp 查看tcp连接信息
  • su - nginx -s /bin/bash -c 'cat /home/test/files/abc.png' su - nginx -s /bin/sh -c 'll /home/test' su - nginx -s /bin/sh -c 'groups'验证用户是否有对某文件读权限
  • id nginx 查看某用户权限信息
  • getfacl files 查看文件acl权限
  • groups nginx 查看用户所属组
  • tar --no-same-owner -zxvf xxx.tar.gz 目录权限会使用当前操作用户的权限作为文件的所属
  • find ./ -size 0k 按大小查找文件
  • sed -i 'ni\x' a.file 表示向a.file文件里的第n行的前面添加x内容
  • sed -i 'na\x' a.file 表示向a.file文件里的第n行的后面添加x内容
  • ping -6 fe80::44bc:5f76:39cb:3d70%ens192 ipv6 ping 接口ens192
  • telnet -6 fe80::44bc:5f76:39cb:3d70%ens192 22 ipv6 telnet 接口ens192 22端口
  • ls -l /home/xx/.bash_profile 查看文件权限
  • cat /var/log/secure|grep ssh 查看登录者ip cat /var/log/secure-xxx|grep ssh 不同日期一个文件
  • netstat -an 查看服务器建立的网络连接
  • arp -a 查看网络内的IP与MAC地址
  • wc -l catalina.out 统计行数
  • grep -rn 字符串 * 查找当前目录(包含子目录)的字符串,并输出行号,cat -n catalina.out |grep ERROR|tail -200cat -n catalina.out |head 200,cat -n catalina.out|sed -n '10,20p'tail -200 catalina.out >> 1.log
  • sed -n '3, 8p' xxx.c 显示指定行,这里显示3到8行
  • grep "physical id" /proc/cpuinfo|sort -u|wc -l cpu核数查询.
  • zcat 可以查看打包成gz的日志文件
  • objdump -x /usr/sbin/ntpd |grep NEEDED ldd /usr/sbin/ntpd 查看应用或者so的依赖关系,ll /usr/lib64/libcap.so查看文件位置,libcap不能乱删除,好像安装的时候自带就有这个
  • scp -P 222 xxxx.tar.gz root@192.168.1.200:/root/ 服务器之间传输文件
  • ulimit -a 查看文件句柄等资源限制
  • systemctl -l 查看启动项列表,systemctl管理的程序,如果程序被kill掉需要用systemctl restart才能启动,如果是用systemctl stop,那么用systemctl start就行了
  • ps -p ${pid} -o rss,vsz VSZ是虚拟内存,RSS是实际使用的内存,单位KB,换算单位ps -p 16567 -o rss,vsz | awk '{sum=$1/1024} {print $0 " " $1 " " sum " MB"}'| awk '{sum=$2/1024} {print $0 " " $1 " " sum " MB"}'
  • ps -aux | awk '{sum=$6/1024} {print $0 " " $1 " " sum " MB"}' 内存使用率查看
  • ls /home正常使用,ls /home|xargs file会出现cannot open (No such file or directory)find /home -type f -print |xargs file 这个可以用
  • iostat -t 1 查看磁盘IO情况
  • cat /etc/*release* 查看系统版本号码
  • grep 'X_VENxxx' * 当前目录所有文件中模糊查询关键字

Linux命令一张图

linux命令汇总

Linux存储系统

存储一张图

linux命令汇总

注意事项

  • 不能给目录随便分配权限,比如给/根目录下所有文件777权限会导致很多功能不可用

常用命令详解

CURL

发送HTTP GET请求 带中文处理。需要把中文进行urlencode放入参数中,可以找一个在线工具操作。 -d 表示编码,-G 表示get请求

1
2
curl -G -d code=a123 -d name=%e7%a6%8f%e5%b7%9e http://www.infotech.vip
curl -d 'account=abc&password=123'-X POST http://infotech.vip/login

复制文件夹

cp -rf dir1 dir2会把dir1中的内容复制到dir2中,但是dir2中原有而dir1中没有的文件不受影响。同名文件不覆盖

mv -T dir1 dir2当目标目录都为空时,复制覆盖进去,目录非空时,则不可覆盖。

cp -r -T dir1 dir2 dir2中原有而dir1中没有的文件不受影响,不会被删除。目录内同名文件会被覆盖。

rsync -r --delete dir1 dir2 dir2中原有而dir1中没有的文件会被删除掉。

由于别名所以要使用/bin/cp -rf xxx xxx2不然会出现确认提示,或者先取消别名unalias cp、复制好再恢复别名alias cp='cp -i'

创建文件默认权限设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
chmod -R g+wx /tmp/abc/ # 给group添加写与执行权限,目录如果没有执行权限会导致程序无法访问里面内容
# umask 设置用户在创建文件时的默认权限
# umask值 目录 文件
# 022 755 644
# 027 750 640
# 002 775 664
# 006 771 660
# 007 770 660

umask 002 # 设置
umask # 查看

# -------
vim /etc/sudoers
xxx ALL=(ALL:ALL) ALL # 用sudo su快速切换到root用户,可以通过sudo执行root权限命令
xxxyyy ALL=(ALL) NOPASSWD: ALL # 用sudo su快速切换到root用户,可以通过sudo执行root权限命令,并且免密码

# ------
sudo ls # 验证
# ------

# vsftpd 通过修改vsftpd.conf或者虚拟用户配置文件local_umask配置项实现比如 local_umask=022 改成 local_umask=002
# local_umask file_open_mod anon_umask 最终文件权限
# 022 0777 0777 0755

# 其他用户也添加到同一个组里面
usermod -G group1 user1 # 给user1添加一个新组
id user1 # 查看权限详情
# 改成002,其他组就可以修改文件了,但是还是无法删除文件,因为删除需要目录权限所以在目录加上权限
chmod -R g+wr /data

<<EOF

<<EOF的作用,官方的说法是这样的:在shell脚本中(bash编程),<<EOF表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主Shell。而EOF可以换成任何其他字符都可以。

$(cd dirname $0; pwd)

在命令行状态下单纯执行是毫无意义的。因为他返回当前路径的”.”。
这个命令写在脚本文件里才有作用,他返回这个脚本文件放置的目录,并可以根据这个目录来定位所要运行程序的相对位置(绝对位置除外)。

shell中cat文件内容并且赋值

1
version=$(cat /home/abc.txt)

shell中使用.

1
. /xxx/xxxx.sh  可以把某个文件里面的参数,方法引用导入过来

获取当前目录的上层目录,上上层目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 当前目录
pwd
脚本调用
current_path="$PWD" # 同 "`pwd`"
current_path=$(cd `dirname $0`; pwd) # 当前目录绝对路径

# 上级目录
dirname "$PWD"
脚本调用
path=$(dirname "$PWD")

# 上上级目录
dirname $(dirname "$PWD")
脚本调用
path=$(dirname $(dirname "$PWD"))

# 目录的最后部分
basename "$PWD"
脚本调用
last_component=$(basename "$PWD")

目录说明

  • /bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里
  • /etc 存放系统管理和配置文件
  • /home 存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示
  • /opt 用来安装附加软件包,是用户级的程序目录,可以理解为D:/Software,装到/opt目录下的程序,它所有的数据、库文件等等都是放在同个目录下面。java、tomcat等也可以安装在opt目录下
  • /usr 可以理解为C:/Windows/用于存放系统应用程序, /usr/lib理解为C:/Windows/System32,/usr/local 本地系统管理员软件安装目录(安装系统级的应用),可以理解为C:/Progrem Files/用户自己编译的软件默认会安装到这个目录下。 这里主要存放那些手动安装的软件,即不是通过“yum”或apt-get安装的软件。它和/usr目录具有相类似的目录结构。让软件包管理器来管理/usr目录,而把自定义的脚本(scripts)放到/usr/local目录下面。自动化的安装程序通常要到/usr或/usr/local目录下寻找所依赖的文件
  • /usr/share放置共享文件的地方/usr/share/man:联机帮助文件/usr/share/doc:软件杂项的文件说明/usr/share/zoneinfo:与时区有关的时区档案
  • /usr/src 系统级的源码目录
  • /usr/local/src 用户级的源码目录,redis、nginx源码就可以放这边,编译后可以放在/usr/local/redis(nginx)根据需要软连接到/usr/local/bin中 有多版本的话一般通过环境变量单独配置或者引用中年单独配置可以避免冲突。
  • /usr/local/bin 本地增加的命令
  • /usr/local/lib 本地增加的库
  • /usr/doc Linux文档
  • /usr/bin 应用程序
  • /usr/sbin 超级用户管理程序
  • /dev 存放设备文件
  • /mnt 系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统
  • /boot 系统引导时使用的各种文件
  • /lib 存放跟文件系统中的程序运行所需要的共享库及内核模块
  • /tmp 用于存放各种临时文件,是公用的临时文件存储点
  • /var 用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件。mysql、mongodb默认数据文件就是这个目录下
  • /var/log 系统日志

文件访问权限通过用户组实现,一个用户可以属于多个用户组。

NTP服务配置|NTP版本升级

主要配置文件

/etc/ntp.confNTP主要配置文件

查看NTPD版本号

执行命令

1
ntpd -v

打开防火墙

1
iptables -I INPUT -p udp -m udp --sport 123 -j ACCEPT

NTP安全加固

1. 确认环境

RedHat6.5 Ver. 4.2.8p9升级到 ntp-4.2.8p12.tar

版本包下载地址:https://support.ntp.org/bin/view/Main/SoftwareDownloads http://distfiles.macports.org/ntp/

2. 安装依赖包

1
yum -y install gcc libcap libcap-devel glibc-devel

3. 升级Ntp

1
2
3
4
5
tar zxvf ntp-4.2.8p12.tar.gz 
./configure --prefix=/usr --bindir=/usr/sbin --sysconfdir=/etc --enable-linuxcaps --with-lineeditlibs=readline --enable-all-clocks --enable-parse-clocks --enable-clockctl
make
make install
chkconfig ntpd on

4. 查看版本号

1
ntpd --version

5. 版本查看

ntp-4.2.6p5-29.el7.centos.2 RPM for x86_64 补丁已经打到Tue Jun 23 2020了,所以跟ntp-4.2.6p15漏洞状态其实是一样的。
–enable-linuxcaps 这个功能需要libcap-devel包才能编译过

centos NTP升级

可以先安装Centos自带的一个老版本,然后再进行升级,这样就不用配置ntpd.service了

  1. 下载本次的编译后的安装包,ntp-4.2.8p15.tar.gz
  2. 解压安装包,tar xvf ntp-4.2.8p15.tar.gz
  3. 卸载老版本,覆盖新的文件
    备份ntp.conf文件
    cp -rf /etc/ntp.conf /etc/ntp.conf-bak
    卸载老版本 yum -y remove ntp
    覆盖配置文件 mv /etc/ntp.conf-bak /etc/ntp.conf
    cd ntp-4.2.8p15 同上步骤安装ntp服务
  4. 查看对应的版本信息 ntpd -v
  5. 重启ntpd
    将ntpd服务加入系统管理,增加ntpd.service文件

cd /usr/lib/systemd/system/
vim ntpd.service

[Unit]
Description=Network Time Service
After=syslog.target

[Service]
Type=forking
EnvironmentFile=-/etc/sysconfig/ntpd
ExecStart=/usr/sbin/ntpd -u ntp:ntp $OPTIONS

PrivateTmp=true
[Install]
WantedBy=multi-user.target

添加开机启动项 systemctl enable ntpd.service
重启服务 systemctl restart ntpd.service
使用ntptime查看是否正常

ntpdate -u 时间服务器的ip

NTP安装其他问题

../include/ntp_crypto.h:27:24: fatal error: openssl/bn.h: No such file or directory

yum install openssl-devel

make[4]: * No rule to make target /root/dep-install/src/ntp-4.2.8p15/sntp/unity/auto/generate_test_runner.rb', needed by run-crypto.c’. Stop.
make[4]: Leaving directory /test/dep-install/src/ntp-4.2.8p15/sntp/tests' make[3]: *** [all-recursive] Error 1 make[3]: Leaving directory /test/dep-install/src/ntp-4.2.8p15/sntp’
make[2]: *
[all] Error 2
make[2]: Leaving directory /test/dep-install/src/ntp-4.2.8p15/sntp' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory /test/dep-install/src/ntp-4.2.8p15’
make: *** [all] Error 2

需要重新编译,从config 到make 再到make istall,应该是make使用的依赖与编译器与make install的不同导致的。

编译安装
/usr/bin/ld: cannot find -lcap
collect2: error: ld returned 1 exit status
make[4]: * [sntp] Error 1
make[4]: Leaving directory /root/dep-install/src/ntp-4.2.8p15/sntp' make[3]: *** [install-recursive] Error 1 make[3]: Leaving directory /root/dep-install/src/ntp-4.2.8p15/sntp’
make[2]: *
[install] Error 2
make[2]: Leaving directory /root/dep-install/src/ntp-4.2.8p15/sntp' make[1]: *** [install-recursive] Error 1 make[1]: Leaving directory /root/dep-install/src/ntp-4.2.8p15’
make: *** [install] Error 2

解决方案:yum install libpcap-devel
就可以了,如果还有问题可以查看下面操作做参考:

find / -name "*libcap.so*"
出现/usr/lib64/libcap.so.2
cd /usr/lib 执行 ln -sv /lib64/libcap.so.2 /usr/lib/libcap.so

1
2
3
4
5
6
7
8
9
10
11
12
13
14
../../ntpd/ntp_parser.c:2014:6: warning: assuming pointer wraparound does not occur when comparing P +- C1 with P +- C2 [-Wstrict-overflow]
CC ntp_scanner.o
CC ntpd.o
ntpd.c:131:29: fatal error: sys/capability.h: No such file or directory
# include <sys/capability.h>
^
compilation terminated.
make[3]: *** [ntpd.o] Error 1
make[3]: Leaving directory `/root/dep-install/src/ntp-4.2.8p15/ntpd'
make[2]: *** [all] Error 2
make[2]: Leaving directory `/root/dep-install/src/ntp-4.2.8p15/ntpd'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/root/dep-install/src/ntp-4.2.8p15'
make: *** [all] Error 2

解决:yum install libcap* -y

查看文件校验值

  • md5值:
1
2
3
windows : certutil -hashfile filename MD5

linux : md5sum filename
  • SHA1值:
    1
    2
    3
    windows:certutil -hashfile filename SHA1

    Linux : sha1sum filename
  • SHA256值:
    1
    2
    3
    windows :certutil -hashfile filename SHA256

    Linux:sha256sum filename

shell脚本

  • $0 $加数字可以获取传入的参数值
  • $HA_ST $加字符,获取环境变量的值,echo $HA_ST

Linux 网卡配置

网卡配置

1
vi /etc/sysconfig/network-scripts/ifcfg-eth0

配置IP,网关,DNS1,自动启动。是通过MAC与网卡绑定的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DEVICE=eth0
TYPE=Ethernet
UUID=41f56913-77c5-45b4-bd21-5029d2a553a
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
HWADDR=00:E0:4C:15:52:1B
IPADDR=192.168.38.202
PREFIX=24
GATEWAY=192.168.38.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"
DNS1='114.114.114.114'

多网卡同IP地址段配置-比如交换机主备

一般情况下不要把多个网卡的IP地址设置成同一个地址段。还可能出现数据只路由到一个网口的情况。linux系统网卡自动路由的问题,比如拔掉一个口的网线会出现网络不通,系统不懂自动切换到另一个口。如果通过命令把这个口ifdown 掉就可以正常了,系统会删除掉这个口的路由。

1
arp -a # 查看ARP缓存中所有项目的选项

如果想吧多个网口弄成热备,或者其他模式可以通过insmod bonding实现提供了6种模式。mode=0,表示load balancing (round-robin)为负载均衡方式,两块网卡都工作,但是与网卡相连的交换必须做特殊配置。mode=6,表示load balancing (round-robin)为负载均衡方式,两块网卡都工作,做bonding的这两块网卡使用不同的MAC地址。mode=1,表示fault-tolerance (active-backup)提供冗余功能,工作方式是主备的工作方式,只有一块网卡工作,另一块做备份。

1
2
3
4
5
6
7
8
9
10
# 1.创建bond0文件
# 2.先配置网卡
vim /etc/modprobe.d/dist.conf # 3.添加下面参数
alias bond0 bonding
options bond0 mode=0 miimon=100

vim /etc/rc.local # 4.添加下面参数设置开机启动
ifenslave bond0 eth0 eth1
# 5. reboot
cat /proc/net/bonding/bond0 # 查看状态

配置默认DNS

1
vi /etc/resolv.conf

添加:

1
nameserver 114.114.114.114

HOST本地地址解析,主机名IP地址

1
vi /etc/hosts

添加:

1
14.215.177.38 www.baidu.com

查看进程与关闭进程

  1. 查看端口占用情况命令netstat -anp | grep 8080

  2. 根据进程id(12345),或者进程名查询进程详情

    1
    2
    ps -ef | grep 12345
    ps -ef | grep tomcat
  3. 关闭进程kill -9 12345

网络查看

  1. 查看端口占用情况命令netstat -anp。对于监听(State LISTEN)指定端口中 Foreign Address 中的 0.0.0.0:* 代表任意IP对应的端口都是可以接入的。Local Address 中的 0.0.0.0 代表监听本地所有IP地址,并且修改IP不受影响,IP是127.0.0.1表示只监听回环地址,只能本机访问,x.x.x.x:ip 只监听指定ip。:::* 是ipv6的规则
  2. 开放端口检测:lsof -i:3306, lsof -i TCP| fgrep LISTEN
  3. tcp/ip的范围从0到65535。其中公认端口1023以下的端口,查看cat /etc/services
  4. 有出现过127.0.0.1无法访问使用主机名找固定ip可以访问本机程序(数据库)的情况,比较奇怪能拿访问到ipv4与ipv6的问题也可能是系统配置问题

分区工具

Gparted、fdisk、gdisk、parted

守护进程

nohup

  • nohup 不挂断运行
  • & 在后台运行,如果在脚本中就会直接返回不等待程序启动完成,异步
  • 例子:nohup ./program &

Supervisor

守护进程工具,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起

查看系统信息

查看内存

1
2
3
4
5
[root@node1 ~]# free
total used free shared buffers cached
Mem: 8008876 7865764 143112 0 13316 4642096
-/+ buffers/cache: 3210352 4798524
Swap: 33554424 1938404 31616020

free命令查看。对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收
可用内存=系统free memory+buffers+cached=143112+13316+4642096=4798524

其他

服务管理两种方式service和systemctl

复制文件夹修改权限

1
2
3
4
cp -r v1.72 test
chown -R virtusers:virtusers test # (英文全拼:change ownerp设置关联所有者virtusers:virtusers)
cd test
tar -zcvf test.tar.gz * --exclude=test.tar.gz

授权

1
2
3
4
5
cat /etc/group # 查看所有用户组
cat /etc/passwd # 查看用户信息
usermod -g web -G www,virtusers web # 给web用户设置主用户组web组,virtusers,www附属用户组
groups version # 查看所属组
chmod -R g+w lte # lte以及子目录所属分组+w, u g o

设置快捷方式,可以直接启动

通过软连接

1
ln -s /usr/local/a/bin/b /usr/bin/b

添加PATH环境变量

vi /etc/profile 在最后添加:

1
2
PATH=/usr/local/a/bin:$PATH
export PATH

保存退出,执行source /etc/profile

配置错误可能导致命令不可用比如-bash: vi: 未找到命令。通过执行export PATH=/usr/bin:/usr/sbin:/bin:/sbin临时修复,重新修改环境变量文件

比如:LD_LIBRARY_PATH环境变量配置上当前目录,应该是程序启动的时候就会从当前目录找对应的库。

  • LD_LIBRARY_PATH是Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径。

安装软件注意事项

需要先安装相关的依赖包,特别是源码安装需要安装gcc等依赖包。依赖包可以yum安装或者rpm包安装也可以源码安装

防火墙配置

命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 保存,修改后需要执行的命令
service iptables save
# 重启,使配置生效
service iptables restart
# 关闭,关闭后可以访问所有端口
service iptables stop
# 通过命令加规则 -A add
iptables -A INPUT -s 192.168.1.111 -p tcp --dport 222 -j ACCEPT # 只允许192.168.1.111访问222端口,批量过滤加上掩码192.168.1.0/24过滤192.168.1.1到192.168.1.225
# 指定端口或者端口端添加白名单规则
iptables -A INPUT -s 192.168.1.22 -p tcp --dport 8000:9000 -j ACCEPT # -I 插入在前面 -A添加在后面
iptables -A INPUT -p tcp --dport 8000:9000 -j DROP
# 保存
iptables save
# 查看规则,显示行号
iptables -nL --line-number # Chain INPUT (policy ACCEPT)与 Chain INPUT (policy DROP)
# 删除某行规则 1
iptables -D INPUT 1

配置 vi /etc/sysconfig/iptables直接添加相关规则:

1
2
3
4
5
6
7
8
9
10
11
12
*filter    # 星号开头的指的是表格,这里为 filter
:INPUT ACCEPT [0:0] # 冒号开头的指的是链,三条内建的链,三条内建链的政策都是 ACCEPT,如果是 :INPUT DROP [0:0] #丢弃所有进入请求
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p tcp -m tcp --dport 30000 -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 针对 INPUT 的规则
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT # 本机内部接口开放
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT # 默认配置
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited # FORWARD 的规则
COMMIT

配置项目说明

1
2
3
4
5
-p protoco # 协议
-i input # network interface name
-m match # 扩展匹配
--dport port # 目标端口
-j target # 跳过

配置链管理命令

1
2
iptables -P INPUT DROP # 这就把默认规则给拒绝了
iptables -F # 清空规则链

内核配置

文件句柄配置

修改/etc/security/limits.conf配置文件句柄
ulimit -a 查看详细限制信息
ulimit -n 最大文件描述符数量
ulimit -u 用户最大可用进程数量

1
2
3
4
5
6
7
* soft nofile 1048576
* hard nofile 1048576
* soft nproc 1048576
* hard nproc 1048576
* soft memlock unlimited
* hard memlock unlimited 
* soft core unlimited

或者

1
2
3
4
root soft nofile 204800
root hard nofile 204800
evan soft nofile 204800
evan hard nofile 204800

内核参数配置说明

软限制(soft limit):内核实际执行的限制,任何进程都可以将软限制设置为任意小于或等于对进程限制的硬限制的值、最大线程数(noproc)和文件数(nofile)
硬限制(hard limit):可以在任何时候任何进程中设置,但硬限制只能由超级用户修改

sysctl -a 查看可修改参数名

etc/sysctl.conf /proc/sys/ /proc/sys/net/ipv4/内核参数配置。把参数添加到/etc/sysctl.conf中,然后执行sysctl -p使参数生效,永久生效。

1
2
3
4
5
cat /proc/sys/net/core/netdev_max_backlog   #每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目,对重负载服务器而言,该值需要调高一点,建议16384
cat /proc/sys/net/ipv4/tcp_mem
cat /proc/sys/net/ipv4/tcp_wmem


1
2
net.ipv4.tcp_syn_retries = 2
...

安全配置

关闭root用户SSH登录PermitRootLogin

  1. 新建一个用户用于SSH登录授权相关权限
  2. vi /etc/ssh/sshd_configPermitRootLogin值从yes改成no
  3. service sshd restart

限制ssh 访问IP

1
2
3
4
5
6
7
8
# vi /etc/hosts.allow  添加
sshd:192.168.33.1:allow #允许 192.168.33.1 这个IP地址SSH登录
sshd:192.168.33.:allow #允许192.168.33.1/24这段IP地址的用户登录,多个网段可以以逗号隔开,比如192.168.0.,192.168.1.:allow

# vi /etc/hosts.deny 添加
sshd:ALL # 拒绝全部IP

# 两个文件需要同时设置,这样就只允许192.168.33.1网段的IP访问了

也可以通过防火墙策略进行限制。

现在ssh 访问用户

1
2
3
4
5
6
7
8
9
# vi /etc/ssh/ssh_config 添加

AllowUsers test2 test@192.168.33.1 # 允许 test2 和从 192.168.33.1 登录的 test 帐户通过 SSH 登录系统

# 添加黑名单
DenyUsers test3 test4 # 拒绝test3 test4 ssh登录

# 重启
service sshd restart

其他安全说明

  1. 开启防火墙限制IP端口范围
  2. ACL控制用户文件夹访问权限
  3. 记录日志,查看/var/log/secure history ~/.bash_history

CPU信息查看

查看CPU插槽数量Sockets:cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l 1
查看逻辑CPU个数processor: cat /proc/cpuinfo |grep "processor"|wc -l 20
查看每个CPU封装的是几核cores:cat /proc/cpuinfo |grep "cores"|uniq 10

physical id:CPU的物理封装的编号,从0开始依次编码(看出真正的物理核数)
siblings:每一个物理封装上的逻辑核心数目
cpu cores:每个物理封装上的物理核心数目
core id:当前物理核心在物理封装上的编号
processor:逻辑CPU核心编号,从0开始依次编码

siblings/(cpu cores) = 每一个物理封装上的逻辑核心数目/每个CPU物理核心下逻辑CPU数目,如果等于1 则没有超线程,如果大于1则有超线程;
逻辑核数自己算出公式:siblings*(max(physical id) +1) = 机器所有逻辑核心的数目 = max(processor)+1

CPUs是指代逻辑CPU数量,即processor;
Cores是 不考虑线程的 真实CPU核数,即单颗CPU封装核数×插槽数
Sockets指代主板上的CPU插槽,即该服务器支持的最大的CPU数量

例子:服务器CPU使用了超线程技术,主板上4个CPU插槽,满配4个CPU物理封装,每个CPU物理封装有6个物理核心,一共4*6=24个物理核心,使用超线程,24*2=48个逻辑核心。

故障修复

磁盘故障修复

通过Linux启动U盘

  1. 在即将进入启动系统页面按键盘出现菜单,选择rescue
  2. 按提示选择
  3. fsck -y /dev/ada1 用来检查和维护不一致的文件系统。若系统掉电或磁盘发生问题,可利用fsck命令对文件系统进行检查
  4. reboot

无启动盘

  1. 启动系统,按任意键进入grub
  2. 选择Linux,按e进入编辑页面
  3. 选择kernel行,按e进入编辑页
  4. 在kernel行的最后加上init=/bin/bash,按回车键(Enter),然后按“b”进行重新引导
  5. 引导系统会得到一个bash shell,但进入的系统是read-only的,需使用fsck检查系统
    fsck -a /dev/hda1
  6. 将系统挂载成read-write的:mount / -o remount,rw
  7. 其他操作
  8. 系统重新挂载,重启: mount / -o remount,ro

单用户模式修改root密码

  1. 启动系统,按任意键进入grub
  2. 选择Linux,按e进入编辑页面
  3. 选择kernel行,按e进入编辑页
  4. 在kernel行的最后加上single,按回车键(Enter),然后按“b”进行重新引导
  5. 输入passwd修改root密码
  6. reboot

开机自启动

1
chkconfig --list |grep vsftpd

chkconfig的级别:

0:关机
1:单用户模式
2:无网络支持的多用户模式
3:有网络支持的多用户模式
4:保留,未使用
5:有网络支持有X-Windows(图形界面)支持的多用户模式
6:重新引导系统,即重启

开机不重启:

1
chkconfig vsftpd  off

server 0:off 1:off 2:off 3:off 4:off 5:off 6:off
上面的输出0~6都off时表示 没有开机自启动
开启自启动:

1
chkconfig vsftpd on

其它相关命令:
添加开机自启动服务:chkconfig –add vsftpd

添加自定义服务

  1. 在/etc/init.d/目录下新建一个自定义服务的文件如:test

  2. vi test 添加下面两句到 #!/bin/bash 之后。

    1
    2
    # chkconfig: 2345 90 10 
    # description: test ....
  3. chkconfig --add test

  4. chkconfig test on off 开启关闭,永久生效

  5. 如果不生效update-rc.d 命名设置开机自启动,95是脚本启动的顺序号

    1
    2
    cd /etc/init.d
    sudo update-rc.d test defaults 95
  6. update-rc.d 卸载启动脚本的方法

    1
    2
    cd /etc/init.d
    sudo update-rc.d -f test remove

安全加固Redhat6.5

关闭rpcbind服务 111端口

1
2
3
4
5
6
service rpcbind status
service rpcbind stop
chkconfig --list rpcbind
chkconfig rpcbind off
chkconfig --list rpcbind
lsof -i:111

关闭Telnet服务 23端口

开启Telnet

1
2
3
4
5
6
rpm -qa|grep telnet
rpm -ivh telnet-server-0.17-47.el6_3.1.x86_64
chkconfig --list | grep telnet
vi /etc/xinetd.d/telnet # disable=yes 改成 disable=no
chkconfig telnet on
service xinetd restart

关闭Telnet

1
2
3
4
5
vi /etc/xinetd.d/telnet # disable=no 改成 disable=yes
chkconfig telnet off # 关闭 chkconfig --del telnet 或者 chkconfig del telnet
service xinetd restart # 或者 /etc/init.d/xinetd restart
rpm -e telnet-server --nodeps # 删除Telnet包,非必须
vi /etc/services # 注释23端口

关闭cpus 631端口

1
2
3
4
lsof | grep ipp # 查看ipp相关进程
/etc/rc.d/init.d/cups stop # 手动关闭或者 /etc/init.d/cups stop
chkconfig --list | grep cups # 查看自启动
chkconfig cups off

进程说明

cupsd 打印机进程 631端口
sshd SSH进程 22端口
rpcbind 通用地址和RCP程序号码(RPC program number)之间的映射器。NFS服务有用到 111端口

IO

在生产环境Linux系统中,基本上都需要解除文件句柄数的限制。Linux系统的默认值为1024,也就是说,一个进程最多可以接受1024个socket连接。
在Linux系统中,通过ulimit命令,可以查看单个进程能够打开的最大文件句柄数量。

1
2
ulimit -n
ulimit -a

配置/etc/security/limits.conf

1
2
*  soft    nofile  65536
* hard nofile 65536

或者cat /etc/profile中添加ulimit -n 65535。根据具体情况加更大也是可以的。

磁盘读写性能测试

1
2
3
time dd if=/dev/zero of=test.dbf bs=8k count=30000 # 可能会直接使用缓存,1G多每秒的读写速度。不符合实际。网络上很多用这个命令测试的数据都是错误的。
time dd if=/dev/zero of=test.dbf bs=8k count=30000 conv=fsync # count可以改成3000,太慢的话。也是比较接近实际情况的。
time dd if=/dev/zero of=test.dbf bs=8k count=30000 oflag=dsync # 非常慢。

fdatasync 结束前将数据写入磁盘
fsync 类似上面,但是元数据也一同写入

但是感觉dsync与 -fsync怎么感觉有些一样? 网上的说法是 dd if=/dev/zero of=test bs=64k count=4k oflag=dsync 这个可以当成是模拟数据库插入操作,所以很慢,但还是没太明白。

后来自己认真的抠了这英文用词, conv=fsync Synchronize output data and metadata just before finishing 意思也就是在dd命令结束前同步data和metadata,那就是不是每一次写都同步一次咯,也就是如果我们在dd命令中写了100次,他可能是等到最后的时候才把他们同步到磁盘。而oflag=dsync是说Use synchronized
I/O for data. For the output file, this forces a physical write of output data on each write,注意这里边用词 a physical write of output data on each write,那就是他是每一次写都得等到这一次写写到了磁盘才进行下一个写,也就是如果我们使用dd写100次,他每次写都是写到磁盘后才进行下一次写的。所以这样当然要比conv=fsync慢一些吧。那么自己感觉如果只是写一次的话,两者应该是差别不大的,后来做了下小实验,证实确实是这样的。

物理机写盘会比虚拟机快一点,但是不会快太多,很多网络上说速度差一个数量级是错误的。写内存的速度参考价值不大,实际应用中是达不到这个速度的。

非direct模式就是数据写入系统缓存,然后就认为IO成功,由操作系统决定缓存数据什么时候写入磁盘。正常测试磁盘速度需要规避掉文件系统cache,直接读写,不使用buffer cache。

升级

ssh升级

避免升级后执行ssh服务重启,服务无法正常启动导致ssh断开链接。可以先临时打开telnet服务或者VNC服务备用。如果在脚本里面执行可能导致ssh关闭脚本无法执行完,可以在重启命令(nohup service sshd restart &)或者脚本上加后台执行重启命令,比较奇怪,正常脚本已经是在服务器上了具体原因还得再查。

开发注意事项

  • linux(\n),windows(\r\n),mac(\r) 换行符的区别。\n十六进制为0x0A,\r十六进制为0x0D
  • 路径问题 根据情况尽量使用全路径,比如想打印日志,在编写脚本的时候,可能你的脚本是给其他程序调用的,可能其他程序运行脚本的当前路径跟你预期的不一致导致日志打印到了其他目录。当然对于比较熟悉linux系统的也是可以根据具体情况使用现对路径的,主要是要注意路径可能导致的问题。特别是在配置文件里面配置信息路径使用相对路径,当前的相对的路径不是配置文件那级目录,而是启动程序的路径。
  • Licence功能实现,一般可以取CPU、网卡等信息进行验证,最好是通过硬件U盾进行验证。

扩展

  • .tar.gz与.zip文件的区别
    • .tar.gz文件一般用于Linux系统上,而.zip文件一般流行于Windows系统上
    • .tar.gz格式的文件比.zip文件要小很多
  • linux各种东西都是文件,所以还可以通过删除文件释放内存。
  • bash: /bin/rm: 参数列表过长 ,使用find . -name "*"|xargs rm -rf "*"命令删除当前目录下文件

TELNET

开启Telnet

  1. rpm -qa | grep telnet
  2. vi /etc/xinetd.d/telnet disable = no 将disable改为no
  3. mv /etc/securetty /etc/securetty.bak
  4. service xinetd restart
  5. 客户端,telnet xxx.xxx.xxx.xxx 23

关闭Telnet

  1. vi /etc/xinetd.d/telnet disable = yes 将disable改为yes
  2. mv /etc/securetty.bak /etc/securetty
  3. service xinetd restart

Linux依赖包

一般大部分软件Linux依赖包都在系统盘ISO里面可以找到。

/与~的区别

/跟目录
~家目录

循环写入文件

1
seq 1 1000000000 | while read i; do         echo $i>>/home/abc.out; done # 有点慢

相关原理

信号与软中断的区别?
硬中断-外部设备对CPU的中断
软中断-中断服务程序对内核的中断
信号-内核(或其他进程)对某个进程的中断
软件中断一种是通过显式调用int指令触发的。信号一般是操作系统层面的,SIGINT信号就是由键盘中断触发的,信号就是操作系统层进行的中断处理,信号是软件中断的一种,但是不是所有的软件中断都是信号。
中断有优先级、信号没有。

发生中断就意味着需要操作系统介入,开展管理工作。当发生了中断,就意味着需要操作系统的介入,开展管理工作。由于操作系统的管理工作(如进程切换、分配IO设备)需要使用特权指令,因此CPU要从用户态转换为核心态。中断就可以使CPU从用户态转换为核心态,使操作系统获得计算机的控制权。因此,有了中断,才能实现多道程序并发执行。
用户态到核心态的转换就是通过中断机制实现的,并且中断是唯一途径。
核心态到用户态的切换时通过执行一个特权指令,将程序状态字(PSW)标志位设置为用户态。
(1) 当中断发生时,CPU立即进入内核态。
(2) 当中断发生后,当前运行的进程暂停运行,并由操作系统内核对中断进程处理。
(3) 对于不同的中断信号,会进行不同的处理。

中断可分为三类:

第一类是由CPU外部引起的,称作中断,如I/O中断、时钟中断、控制台中断等。
第二类是来自CPU的内部事件或程序执行中的事件引起的 过程,称作异常,如由于CPU本身故障(电源电压低于105V或频率在47~63Hz之外)、
程序故障(非法操作码、地址越界、浮点溢出等)等引起的过程。
第三类由于在程序中使用了请求系统服务的系统调用而引发的过程,称作“陷入”(trap,或者陷阱)。前两类通常都称作中断,它们的产生往往是无意、
被动的,而陷入是有意和主动的。
第一类(中断)+第二类(异常)= 中断
第三类(系统调用)= 系统调用

Linux编程

程序收到11信号sig,段错误,可能原因是越界,范围了不是分配给它的空间,申请的空间太大,也可能内存释放不当,free 多次,fclose 多次,引用空指针成员,fclose 空指针
Segmentation fault can also occur under following circumstances:
a) A buggy program / command, which can be only fixed by applying patch.
b) It can also appear when you try to access an array beyond the end of an array under C programming.
c) Inside a chrooted jail this can occur when critical shared libs, config file or /dev/ entry missing.
d) Sometime hardware or faulty memory or driver can also create problem.
e) Maintain suggested environment for all computer equipment (overheating can also generate this problem).

编译

编译器就像工厂,只有建造一个工厂,后面就可以按各自流程无限生产产品。比如生产机器人,机器人建设工厂,工厂再生产机器人无限循环的过程,机器人可以无穷多。
编译就是把原材料(高级语言代码)转换成产品(二进制可执行程序)。“自举编译器” 比如第一个C语言编译器可以用汇编写的,但是第一个成熟的C语言编译器应该是由汇编和C语言共同写的。就是先用底层语言(应该是汇编)写一个能运行,但效率极低的C语言编译器,有了C语言的编译器以后,就可以用C语言好好写一个编译器了,用之前那个运行没问题,但效率低得编译器编译一下,就得到了另一个可以使用的编译器了。
任何语言都可以写编译器,java也可以,编译器工作主要就是把高级语言代码转化成二进制可执行程序。

脚本编写

判断文件是否存在,文件内容是否包含

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
if [ -f "/usr/bin/a.sh" ];then
if cat '/usr/bin/a.sh' | grep "tomcat-a" > /dev/null
then
#sed -i '4a\systemctl start tomcat-a' /usr/bin/a.sh
echo 'a.sh has been updated'
else
sed -i '4a\systemctl start tomcat-a' /usr/bin/a.sh
echo 'update a.sh success'
fi
fi

grep "/opt/xxx/xxx" /etc/xxx.conf >> /dev/null
if [ $? -ne 0 ]; then
echo `not found`
fi

if cat '/root/.bash_profile' | grep "LD_LIBRARY_PATH" > /dev/null
then
echo '.bash_profile LD_LIBRARY_PATH has been updated'
else
sed -i '$a\export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./' /root/.bash_profile
source /root/.bash_profile
echo ${LD_LIBRARY_PATH}
echo '.bash_profile LD_LIBRARY_PATH update success'
fi


shell语句出错退出

使用set -u
使用set -e

1
2
3
4
5
6
7
8
9
10
11
command
if [ "$?" -ne 0 ]; then echo "command failed"; exit 1; fi

command || { echo "command failed"; exit 1; }
if ! command; then echo "command failed"; exit 1; fi


set +e # 取消错误校验
command1
command2
set -e

注意事项

递归创建目录后的目录权限,授权。

程序防御:空格、设置的陷阱、信号描述、竞态条件、保持原子化

编程

重启自己,比如tomcat是没办法调用linux shell脚本来重启自己的,必须弄一个守护进程,通过socket或者写个参数到文件或者其他通信手段通知守护进程来重启自己。调用关闭脚本的时候如果父进程关闭了执行脚本的子进程也会关闭,目前实验的结果是没办法重启自己,为了会不会支持,或者是不是有其他更好的渠道就不知道了弄成systemctl之类估计也没用(没试过)。可能可以借助execl之类的方法实现。

问题与修复

su: warning: cannot change directory to /home/xxxx: Permission denied

执行chmod -R 755 /home/ 修复问题。
还有个命令是绝对不能执行的:chmod -R 755 / 会导致/etc目录下的东西,全部都是755状态,开另一个终端登录不上,原先执行的窗口还可以操作,要回复权限才可以继续使用服务器。

行1: #!/bin/bash: 没有那个文件或目录

可能是回车换行问题 文件被在windows下处理过了,也可能是编码问题。可以通过在linux重新创建一个文件,把内容复制进去来解决。

root 用户 ssh登陆服务器后 显示sh-4.2的解决办法

vi /root/.bashrc

1
2
3
4
5
6
7
8
9
10
11
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions

执行. ~/.bashrc

查看.bash_profile内容,如果没有这个配置文件,新建

1
2
3
4
5
6
7
8
9
10
11
12
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

运行 然后执行source ~/.bash_profile

如果还是不行使用下面方法

1
2
3
4
5
6
7
cat /etc/shells   #查看所有解释器
sh #切换成sh解释器
exit #退出sh解释器
echo $SHELL # 查看当前使用的shell ,发现用的是sh
chsh -s /bin/bash # 修改成bash

# 退出重新登录解决问题

/bin/sh: cc: command not found

yum -y install gcc gcc-c++ libstdc++-devel

fatal error: openssl/bn.h: No such file or directory

yum install openssl-dev

vsftpd出现/usr/bin/ld: cannot find -lcap错误解决方法

安装yum install libcap-devel就可以了,如果还有问题可以查看下面操作做参考:

find / -name "*libcap.so*"
出现/usr/lib64/libcap.so.2
cd /usr/lib 执行 ln -sv /lib64/libcap.so.2 /usr/lib/libcap.so

libevent_pthreads.a(evthread_pthread.o): unable to initialize decompress status for section .debug_info

/usr/bin/ld: ./libevent/.libs/libevent_pthreads.a(evthread_pthread.o): unable to initialize decompress status for section .debug_info
/usr/bin/ld: ./libevent/.libs/libevent_pthreads.a(evthread_pthread.o): unable to initialize decompress status for section .debug_info
./libevent/.libs/libevent_pthreads.a: error adding symbols: File format not recognized
collect2: error: ld returned 1 exit status

修复方法:
yum install binutils
然后重新上传原始的ntp-4.2.8p15.tar.gz,解压,执行./configure xxx 然后make clean 然后make 然后make install

硬件

华为服务器一直在cheking media,System will find bootable device automatically,No bootable device进不了系统

进入bios,将启动修改成legacy,然后重启

其他系统配置

修改语言

脚本有改系统root用户的/root/.bash_profile默认语言 LANG系统变量
所以改了/etc/sysconfig/i18n的语言配置都不生效。xdg-user-dirs-gtk-update烫出语言更新确认窗口

SSH登录时“no matching host key type found. Their offer: ssh-rsa,ssh-dss“的错误

之所以报错是因为OpenSSH 7.0以后的版本不再支持ssh-dss (DSA)算法,解决方法是增加选项-oHostKeyAlgorithms=+ssh-dss,即可成功解决

ssh -oHostKeyAlgorithms=+ssh-dss root@192.168.1.2

文件名乱码

1
2
3
4
5
6
7
8
9
10
iconv -f UTF-8 -t GB2312 abc.txt -o def.txt #命转换文件内容格式
yum install convmv
convmv -f UTF-8 -t GBK --notest 火星.md # 转换文件名格式

# 程序判断文件名编码
if (str.equals(new String(str.getBytes(encode), encode))) { # 这种方法也是不行的,文件名就是普通字符串编码,就是看用这个编码是否可以正常读出内容,这种可能在读取文件内容的时候可以用。

## 可以判断文件是否存在,如果用UTF8格式来读取文件目录下的文件不存在,就安GBK格式读文件名。然后在转码出去。
new String("xxx".getBytes("GBK"),"GBK");// 按照GBK编码格式读取进来,按照GBK编码显示,这样GBK格式的文件名在java程序内部日志中可以正常打印,重命名后就可以背正常识别到了,最终还是会变成UTF8格式,估计是使用了操作系统编码。

IO太高排查

1
2
3
4
5
6
7
8
iostat -x 1 # 1秒刷新一次,%util很高时,表示IO就很高了,可以看IO利用率,以及每秒钟的读写,如果每秒钟读写60-70MIO可能被吃满了。查看iowait 是否太高(Amount of time the CPU has been waiting for I/O complete.)
iotop # 查看哪个进程把IO刷满了
fio # 测试IO工具

top # wa值超过50%,首先想到的是IO瓶颈
vmstat 2 5

注意:程序循环扫描目录读取文件进行处理转移就有可能导致IO非常高(比如文件有几十万个,list一下就卡住了需要读非常多数据)。所以扫目录要用stream的方法不要使用列listFiles方法,文件过来使inotify用事件驱动。

参考