yum install -y gcc gcc-c++ openssl openssl-devel wget pam pam-devel
configure: error: lzo enabled but missing
需要手工安装lzo,yum安装的无效
wget http://www.oberhumer.com/opensource/lzo … .06.tar.gz
tar zxvf lzo-2.06.tar.gz
cd lzo-2.06
./configure --prefix=/usr/local/
make && make install
wget https://swupdate.openvpn.org/community/ … 4.6.tar.gz
tar zxf openvpn-2.4.6.tar.gz
cd openvpn-2.4.6
./configure -prefix=/etc/openvpn
make && make install
wget https://github.com/OpenVPN/easy-rsa/rel … -3.0.4.tgz
tar zxf EasyRSA-3.0.4.tgz
cp -rf EasyRSA-3.0.4 /etc/openvpn/easy-rsa
创建相关证书
# ./easyrsa init-pki #创建pki
# ./easyrsa build-ca nopass #创建ca
# ./easyrsa gen-req server nopass #创建服务端证书
# ./easyrsa sign server server #签约服务端证书
# ./easyrsa gen-dh #创建diffie-hellman文件
# ./easyrsa gen-req client #创建客户端证书
# ./easyrsa sign client client #签约客户端证书,根据提示输入服务端ca密码
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
iptables -I INPUT -p udp -m udp --dport 60022 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth1 -j MASQUERADE
service iptables save #保存防火墙配置
driftfile /var/lib/ntp/drift
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict -6 ::1
restrict 192.168.200.0 mask 255.255.255.0 nomodify notrap
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst
server ntp4.aliyun.com iburst
server 127.127.1.0 fudge
127.127.1.0 stratum 8
iptables -t nat -F
iptables -t nat -X
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t mangle -F
iptables -t mangle -X
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT
iptables -F
iptables -X
iptables -P FORWARD ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t raw -F
iptables -t raw -X
iptables -t raw -P PREROUTING ACCEPT
iptables -t raw -P OUTPUT ACCEPT
ps -ef|grep LOCAL=NO|grep -v grep|cut -c 9-15|xargs kill -9
管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入。下面说说用管道符联接起来的
几个命令:
“ps - ef”是Red Hat 里查看所有进程的命令。这时检索出的进程将作为下一条命令“grep LOCAL=NO”的输入。
“grep LOCAL=NO”的输出结果是,所有含有关键字“LOCAL=NO”的进程,这是Oracle数据库中远程连接进程的共同特点。
“grep -v grep”是在列出的进程中去除含有关键字“grep”的进程。
“cut -c 9-15”是截取输入行的第9个字符到第15个字符,而这正好是进程号PID。
“xargs kill -9”中的xargs命令是用来把前面命令的输出结果(PID)作为“kill -9”命令的参数,并执行该令。
“kill -9”会强行杀掉指定进程,这样就成功清除了oracle的所有远程连接进程。其它类似的任务,只需要修改“grep LOCAL=NO”中的关键字部分就可以了。
ps -ef|grep /usr/local/apache-tomcat-document/|grep -v grep|cut -c 9-15|xargs kill -9
((i=$j+$k)) 等价于 i=`expr $j + $k`
((i=$j-$k)) 等价于 i=`expr $j -$k`
((i=$j*$k)) 等价于 i=`expr $j \*$k`
((i=$j/$k)) 等价于 i=`expr $j /$k`
Let expressions 执行一个或多个表达式。表达式中的变量前不必有$.如果表达式中包含了空格或其他特殊字符,则必须引起来。
例:let “I = I + 1” 或 let i=i+1
算术运算符指的是可以在程序中实现加、减、乘、除等数学运算的运算符。Shell中常用的数学运算符如下所示。
— +:对两个变量做加法。
— -:对两个变量做减法。
— *:对两个变量做乘法。
— /:对两个变量做除法。
— **:对两个变量做幂运算。
— %:取模运算,第一个变量除以第二个变量求余数。
— +=:加等于,在自身基础上加第二个变量。
— -=:减等于,在第一个变量的基础上减去第二个变量。
— *=:乘等于,在第一个变量的基础上乘以第二个变量。
— /=:除等于,在第一个变量的基础上除以第二个变量。
— %=:取模赋值,第一个变量对第二个变量取模运算,再赋值给第一个变量。
在使用这些运算符时,需要注意到运算顺序的问题。例如输入下面的命令,输出1+2的结果。
echo 1+2
Shell并没有输出结果3,而是输出了1+2。在shell中有三种方法可以更改运算顺序。
— 用expr改变运算顺序。可以用echo `expr 1 +2`来输出1+2的结果,用expr表示后面的表达式为一个数学运算。需要注意的是,`并不是一个单引号,而是“Tab”键上面的那个符号。
— 用let指示数学运算。可以先将运算的结果赋值给变量b,运算命令是b=let 1 + 2。然后用echo$b来输出b的值。如果没有let,则会输出1+2。
— 用$[]表示数学运算。将一个数学运算写到$[]符号的中括号中,中括号中的内容将先进行数学运算。例如命令echo$[1+2],将输出结果3。
下面是一个shell程序实例,实现数学函数S=3(xy)+4x2+5y+6的运算。在程序中以位置变量的方式输入x与y的值。程序的编写步骤如下所示。
在主菜单中打开一个终端。在终端中输入“vim”命令打开VIM。
在VIM中按“i”键进入插入模式,然后输入下面的代码。
代码4-2 数学运算实例:\源文件\04\4.4.sh
#!/bin/bash
#4.4.sh
s=0 #定义一个求和变量,初值为0。
t=`expr$1**$2` #用expr改变运算顺序,求x的y次方。
t=$[t*3] #t乘以3。
s=$[s+t] #结果相加。
t=$[$1**2] #求x的平方。
t=$[t*4] #结果乘以4。
s=$[s+t] #结果相加。
t=`expr$2*5` #求5y的值。
s=$[s+t] #结果相加。
s=$[s+6] #结果加上6。
echo$s #输出结果。
echo$((a%b)) #取余
在这个程序中,需要注意算术运算的写法。如果没有expr或$[]更改运算顺序,则会将运算式以字符串的形式赋值,而不会赋值运算结果。
按“Esc”键返回到普通模式。然后输入“:w 4.4.sh”保存文件。
输入“:q”命令,按“Enter”键退出VIM。
在终端中,输入下面的命令对4.4.sh文件添加可执行权限。
chmod +x 4.4.sh
输入下面的命令运行程序。在命令中需要输入两个参数。
./4.4.sh 2 4
程序会完成S=3(xy)+4x2+5y+6的数学运算并输出结果,结果如下所示。
90
NFS:
1,首先要配置服务端
编辑/etc/exports,加入:
/opt/data0/courseware 172.17.1.0/24(rw,sync,no_root_squash) #IP是客户端的地址, 目录是要共享出的目录
2,然后启动nfs服务:
/etc/init.d/nfs start
systemctl start nfs
systemctl start rpcbind
修改/etc/exprots文件后需要重新启动才能生效
/etc/init.d/nfs restart
3,SSH到客户端上就可以挂载了
mount -t nfs 192.168.3.16:/data/bakup /home/data
4,修改服务器的目录权限后就可以在客户断对服务器目录文件进行编辑了
chmod -R 777 /opt/data0/courseware
防火墙时可以正常使用NFS服务:
a] TCP/UDP 111 – RPC 4.0 portmapper
b] TCP/UDP 2049 – NFSD (nfs server)
c] Portmap 静态端口—在/etc/sysconfig/nfs文件中定义的一系列TCP/UDP端口
vim /etc/sysconfig/nfs
RQUOTAD_PORT=16005
LOCKD_TCPPORT=16004
LOCKD_UDPPORT=16004
MOUNTD_PORT=16002
STATD_PORT=16003
STATD_OUTGOING_PORT=16006
service nfs restart
查看nfs端口占用rpcinfo -p
防火墙
vim /etc/sysconfig/iptables
-A INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -s 192.168.200.0/24 --dport 16002 -j ACCEPT
-A INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -s 192.168.200.0/24 --dport 16003 -j ACCEPT
-A INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -s 192.168.200.0/24 --dport 16004 -j ACCEPT
-A INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -s 192.168.200.0/24 --dport 16005 -j ACCEPT
-A INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -s 192.168.200.0/24 --dport 16006 -j ACCEPT
-A INPUT -p udp -m state --state NEW,ESTABLISHED,RELATED -s 192.168.200.0/24 --dport 16002 -j ACCEPT
-A INPUT -p udp -m state --state NEW,ESTABLISHED,RELATED -s 192.168.200.0/24 --dport 16003 -j ACCEPT
-A INPUT -p udp -m state --state NEW,ESTABLISHED,RELATED -s 192.168.200.0/24 --dport 16004 -j ACCEPT
-A INPUT -p udp -m state --state NEW,ESTABLISHED,RELATED -s 192.168.200.0/24 --dport 16005 -j ACCEPT
-A INPUT -p udp -m state --state NEW,ESTABLISHED,RELATED -s 192.168.200.0/24 --dport 16006 -j ACCEPT
-A INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -s 192.168.200.0/24 --dport 111 -j ACCEPT
-A INPUT -p udp -m state --state NEW,ESTABLISHED,RELATED -s 192.168.200.0/24 --dport 111 -j ACCEPT
-A INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -s 192.168.200.0/24 --dport 2049 -j ACCEPT
-A INPUT -p udp -m state --state NEW,ESTABLISHED,RELATED -s 192.168.200.0/24 --dport 2049 -j ACCEPT
service iptables restart
1: 如何查找大文件?
其实很多时候,你需要了解当前系统下有哪些大文件,比如文件大小超过100M或1G(阀值视具体情况而定)。那么如何把这些大文件搜索出来呢?例如我要搜索当前目录下,超过800M大小的文件
find . -type f -size +800M
如上命令所示,我们仅仅能看到超过800M大小的文件的文件名称,但是对文件的信息(例如,文件大小、文件属性)一无所知,那么能否更详细显示一些文件属性或信息呢,当然可以,如下所示
find . -type f -size +800M -print0 | xargs -0 ls -l
当我们只需要查找超过800M大小文件,并显示查找出来文件的具体大小,可以使用下面命令
find . -type f -size +800M -print0 | xargs -0 du -h
如果你还需要对查找结果按照文件大小做一个排序,那么可以使用下面命令
find . -type f -size +800M -print0 | xargs -0 du -h | sort -nr
不过如上截图所示,有时候排列的顺序并不完全是按大小一致,这个是因为du命令的参数h所致,你可以统一使用使用MB来显示,这样就能解决这个问题。到这里,这个在Linux系统查找大文件的命令已经非常完美了,当然如果你还有很多的需求,那么可以在这个命令上做修改、调整.
2: 如何查找Linux下的大目录
du -h --max-depth=1
如果你想知道flash_recovery_area目录下面有哪些大文件夹,那么可以将参数max-depth=2 ,如果你想对搜索出来的结果进行排序,那么可以借助于sort命令。如下所示
du -h --max-depth=2 | sort -n
du -hm --max-depth=2 | sort -n
有时候搜索出来的结果太多了(譬如,我从根目录开始搜索),一直在刷屏,如果我只想查出最大的12个文件夹,怎么办呢?此时就要借助head命令来显示了
du -hm --max-depth=2 | sort -nr | head -12
linux中用shell获取昨天、明天或多天前的日期:
在Linux中对man date -d 参数说的比较模糊,以下举例进一步说明:
# -d, --date=STRING display time described by STRING, not `now’
[root@Gman root]# date -d next-day +%Y%m%d #明天日期
20091024
[root@Gman root]# date -d last-day +%Y%m%d #昨天日期
20091022
[root@Gman root]# date -d yesterday +%Y%m%d #昨天日期
20091022
[root@Gman root]# date -d tomorrow +%Y%m%d # 明天日期
20091024
[root@Gman root]# date -d last-month +%Y%m #上个月日期
200909
[root@Gman root]# date -d next-month +%Y%m #下个月日期
200911
[root@Gman root]# date -d next-year +%Y #明年日期
2010
DATE=$(date +%Y%m%d --date ’2 days ago’) #获取昨天或多天前的日期
名称 : date
使用权限 : 所有使用者
使用方式 : date [-u] [-d datestr] [-s datestr] [--utc] [--universal] [--date=datestr] [--set=datestr] [--help] [--version] [+FORMAT] [MMDDhhmm[[CC]YY][.ss]]
说明 : date 能用来显示或设定系统的日期和时间,在显示方面,使用者能设定欲显示的格式,格式设定为一个加号后接数个标记,其中可用的标记列表如下 :
时间方面 :
% : 印出
% %n : 下一行
%t : 跳格
%H : 小时(00..23)
%I : 小时(01..12)
%k : 小时(0..23)
%l : 小时(1..12)
%M : 分钟(00..59)
%p : 显示本地 AM 或 PM
%r : 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M)
%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数 %S : 秒(00..61)
%T : 直接显示时间 (24 小时制)
%X : 相当于 %H:%M:%S
%Z : 显示时区
日期方面 :
%a : 星期几 (Sun..Sat)
%A : 星期几 (Sunday..Saturday)
%b : 月份 (Jan..Dec)
%B : 月份 (January..December)
%c : 直接显示日期和时间
%d : 日 (01..31)
%D : 直接显示日期 (mm/dd/yy)
%h : 同 %b
%j : 一年中的第几天 (001..366)
%m : 月份 (01..12)
%U : 一年中的第几周 (00..53) (以 Sunday 为一周的第一天的情形)
%w : 一周中的第几天 (0..6)
%W : 一年中的第几周 (00..53) (以 Monday 为一周的第一天的情形)
%x : 直接显示日期 (mm/dd/yy)
%y : 年份的最后两位数字 (00.99)
%Y : 完整年份 (0000..9999)
若是不以加号作为开头,则表示要设定时间,而时间格式为 MMDDhhmm[[CC]YY][.ss],
其中 MM 为月份,
DD 为日,
hh 为小时,
mm 为分钟,
CC 为年份前两位数字,
YY 为年份后两位数字,
ss 为秒数
把计 :
-d datestr : 显示 datestr 中所设定的时间 (非系统时间)
--help : 显示辅助讯息
-s datestr : 将系统时间设为 datestr 中所设定的时间
-u : 显示目前的格林威治时间
--version : 显示版本编号
例子 :
显示时间后跳行,再显示目前日期 : date +%T%n%D
显示月份和日数 : date +%B %d
显示日期和设定时间(12:34:56) : date --date 12:34:56
设置系统当前时间(12:34:56):date --s 12:34:56
注意 : 当你不希望出现无意义的 0 时(比如说 1999/03/07),则能在标记中插入 - 符号,比如说 date +%-H:%-M:%-S 会把时分秒中无意义的 0 给去掉,像是原本的 08:09:04 会变为 8:9:4。另外,只有取得权限者(比如说 root)才能设定系统时间。 当你以 root 身分更改了系统时间之后,请记得以 clock -w 来将系统时间写入 CMOS 中,这样下次重新开机时系统时间才会持续抱持最新的正确值。
ntp时间同步
linux系统下默认安装了ntp服务,手动进行ntp同步如下
ntpdate ntp1.nl.net
当然,也能指定其他的ntp服务器
-------------------------------------------------------------------
扩展功能
date 工具可以完成更多的工作,不仅仅只是打印出当前的系统日期。您可以使用它来得到给定的日期究竟是星期几,并得到相对于当前日期的相对日期。了解某一天是星期几
GNU 对 date 命令的另一个扩展是 -d 选项,当您的桌上没有日历表时(UNIX 用户不需要日历表),该选项非常有用。使用这个功能强大的选项,通过将日期作为引号括起来的参数提供,您可以快速地查明一个特定的日期究竟是星期几:
$ date -d "nov 22"
Wed Nov 22 00:00:00 EST 2006
$
在本示例中,您可以看到今年的 11 月 22 日是星期三。
所以,假设在 11 月 22 日召开一个重大的会议,您可以立即了解到这一天是星期三,而这一天您将赶到驻地办公室。
获得相对日期
d 选项还可以告诉您,相对于 当前日期若干天的究竟是哪一天,从现在开始的若干天或若干星期以后,或者以前(过去)。通过将这个相对偏移使用引号括起来,作为 -d 选项的参数,就可以完成这项任务。
例如,您需要了解两星期以后的日期。如果您处于 Shell 提示符处,那么可以迅速地得到答案:
$ date -d ’2 weeks’
关于使用该命令,还有其他一些重要的方法。使用 next/last指令,您可以得到以后的星期几是哪一天:
$ date -d ’next monday’ (下周一的日期)
$ date -d next-day +%Y%m%d(明天的日期)或者:date -d tomorrow +%Y%m%d
$ date -d last-day +%Y%m%d(昨天的日期) 或者:date -d yesterday +%Y%m%d
$ date -d last-month +%Y%m(上个月是几月)
$ date -d next-month +%Y%m(下个月是几月)
使用 ago 指令,您可以得到过去的日期:
$ date -d ’30 days ago’ (30天前的日期)
您可以使用负数以得到相反的日期:
$ date -d ’dec 14 -2 weeks’ (相对:dec 14这个日期的两周前的日期)
$ date -d ’-100 days’ (100天以前的日期)
$ date -d ’50 days’(50天后的日期)
这个技巧非常有用,它可以根据将来的日期为自己设置提醒,可能是在脚本或 Shell 启动文件中,如下所示:
DAY=`date -d ’2 weeks’ +"%b %d"`
if test "`echo $DAY`" = "Aug 16"; then echo ’Product launch is now two weeks away!’; fi
Debian更换源
cp /etc/apt/sources.list /etc/apt/sources_init.list
cat <<EOF > /etc/apt/sources.list
deb http://mirrors.ustc.edu.cn/debian/ buster main
deb-src http://mirrors.ustc.edu.cn/debian/ buster main
deb http://security.debian.org/debian-security buster/updates main
deb-src http://security.debian.org/debian-security buster/updates main
# buster-updates, previously known as 'volatile'
deb http://mirrors.ustc.edu.cn/debian/ buster-updates main
deb-src http://mirrors.ustc.edu.cn/debian/ buster-updates main
deb http://mirrors.ustc.edu.cn/debian/ buster-backports main non-free contrib
deb-src http://mirrors.ustc.edu.cn/debian/ buster-backports main non-free contrib
EOF
添加mysql防火墙规则:
vim /etc/sysconfig/iptables
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 30022 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
更改22端口
vim /etc/ssh/sshd_config
在#Port 22添加Port 30022
#vim /etc/sysconfig/iptables
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 30022 -j ACCEPT
service iptables save
/etc/init.d/sshd restart
ubuntu
vim /etc/ssh/sshd_config
service ssh restart
防ping
关闭ping:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
开启ping:
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
useradd test
echo "123456" | passwd --stdin test
sed -i 's/#PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config
禁止root用户远程登录
vim /etc/ssh/sshd_config,将PermitRootLogin的值改成no,并保存
使用SSH Key登录并禁用root密码登录
vim /etc/ssh/sshd_config
#RSAAuthentication yes
#PubkeyAuthentication yes
#AuthorizedKeysFile .ssh/authorized_keys
去调上面3行前面的#
PasswordAuthentication yes修改为:PasswordAuthentication no
保存后重启SSH服务。service sshd restart
Linux下的paste命令主要用于从多个文件(包括标准输入)中读取内容,将每个文件的对应行用指定分隔符(默认tab制表符)拼接起来并打印到标准输出,我们可以使用重定向命令“>”将输出结果保存到文件中,从而实现整合多个文件的功能。
常用参数:
-d<分隔符> 指定分隔符,若未使用该参数则默认制表符分隔
-s 不使用平行的行目输出模式,而是每个文件占用一行
应用实例:paste命令整合多个文件
view plaincopy to clipboardprint?
trevor@trevor-PC:~/linux/linux100$ cat username
张三
李四
王五
trevor@trevor-PC:~/linux/linux100$ cat usermail
[email protected]
[email protected]
[email protected]
trevor@trevor-PC:~/linux/linux100$ cat userjob
程序员
销售
财务
trevor@trevor-PC:~/linux/linux100$ paste username usermail userjob
张三 [email protected] 程序员
李四 [email protected] 销售
王五 [email protected] 财务
trevor@trevor-PC:~/linux/linux100$ paste -s username usermail userjob
张三 李四 王五
[email protected] [email protected] [email protected]
程序员 销售 财务
trevor@trevor-PC:~/linux/linux100$ paste -d '/' username usermail userjob
张三/[email protected]/程序员
李四/[email protected]/销售
王五/[email protected]/财务
trevor@trevor-PC:~/linux/linux100$
1. 基本使用
$iostat -d -k 1 10
参数 -d 表示,显示设备(磁盘)使用状态;-k某些使用block为单位的列强制使用Kilobytes为单位;1 10表示,数据显示每隔1秒刷新一次,共显示10次。
$iostat -d -k 1 10
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 39.29 21.14 1.44 441339807 29990031
sda1 0.00 0.00 0.00 1623 523
sda2 1.32 1.43 4.54 29834273 94827104
sda3 6.30 0.85 24.95 17816289 520725244
sda5 0.85 0.46 3.40 9543503 70970116
sda6 0.00 0.00 0.00 550 236
sda7 0.00 0.00 0.00 406 0
sda8 0.00 0.00 0.00 406 0
sda9 0.00 0.00 0.00 406 0
sda10 60.68 18.35 71.43 383002263 1490928140
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 327.55 5159.18 102.04 5056 100
sda1 0.00 0.00 0.00 0 0
tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。“一次传输”意思是“一次I/O请求”。多个逻辑请求可能会被合并为“一次I/O请求”。“一次传输”请求的大小是未知的。
kB_read/s:每秒从设备(drive expressed)读取的数据量;kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;kB_read:读取的总数据量;kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes。
上面的例子中,我们可以看到磁盘sda以及它的各个分区的统计数据,当时统计的磁盘总TPS是39.29,下面是各个分区的TPS。(因为是瞬间值,所以总TPS并不严格等于各个分区TPS的总和)
2. -x 参数
使用-x参数我们可以获得更多统计信息。
iostat -d -x -k 1 10
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 1.56 28.31 7.80 31.49 42.51 2.92 21.26 1.46 1.16 0.03 0.79 2.62 10.28
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 2.00 20.00 381.00 7.00 12320.00 216.00 6160.00 108.00 32.31 1.75 4.50 2.17 84.20
rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
rsec/s:每秒读取的扇区数;wsec/:每秒写入的扇区数。r/s:The number of read requests that were issued to the device per second;w/s:The number of write requests that were issued to the device per second;
await:每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
%util:在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。
3. -c 参数
iostat还可以用来获取cpu部分状态值:
iostat -c 1 10
avg-cpu: %user %nice %sys %iowait %idle
1.98 0.00 0.35 11.45 86.22
avg-cpu: %user %nice %sys %iowait %idle
1.62 0.00 0.25 34.46 63.67
4. 常见用法
$iostat -d -k 1 10 #查看TPS和吞吐量信息
iostat -d -x -k 1 10 #查看设备使用率(%util)、响应时间(await)
iostat -c 1 10 #查看cpu状态
5. 实例分析
$iostat -d -k 1 |grep sda10
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda10 60.72 18.95 71.53 395637647 1493241908
sda10 299.02 4266.67 129.41 4352 132
sda10 483.84 4589.90 4117.17 4544 4076
sda10 218.00 3360.00 100.00 3360 100
sda10 546.00 8784.00 124.00 8784 124
sda10 827.00 13232.00 136.00 13232 136
上面看到,磁盘每秒传输次数平均约400;每秒磁盘读取约5MB,写入约1MB。
iostat -d -x -k 1
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 1.56 28.31 7.84 31.50 43.65 3.16 21.82 1.58 1.19 0.03 0.80 2.61 10.29
sda 1.98 24.75 419.80 6.93 13465.35 253.47 6732.67 126.73 32.15 2.00 4.70 2.00 85.25
sda 3.06 41.84 444.90 54.08 14204.08 2048.98 7102.04 1024.49 32.57 2.10 4.21 1.85 92.24
可以看到磁盘的平均响应时间<5ms,磁盘使用率>80。磁盘响应正常,但是已经很繁忙了。
延伸:
rrqm/s: 每秒进行 merge 的读操作数目.即 delta(rmerge)/s
wrqm/s: 每秒进行 merge 的写操作数目.即 delta(wmerge)/s
r/s: 每秒完成的读 I/O 设备次数.即 delta(rio)/s
w/s: 每秒完成的写 I/O 设备次数.即 delta(wio)/s
rsec/s: 每秒读扇区数.即 delta(rsect)/s
wsec/s: 每秒写扇区数.即 delta(wsect)/s
rkB/s: 每秒读K字节数.是 rsect/s 的一半,因为每扇区大小为512字节.(需要计算)
wkB/s: 每秒写K字节数.是 wsect/s 的一半.(需要计算)
avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区).delta(rsect+wsect)/delta(rio+wio)
avgqu-sz: 平均I/O队列长度.即 delta(aveq)/s/1000 (因为aveq的单位为毫秒).
await: 平均每次设备I/O操作的等待时间 (毫秒).即 delta(ruse+wuse)/delta(rio+wio)
svctm: 平均每次设备I/O操作的服务时间 (毫秒).即 delta(use)/delta(rio+wio)
%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的.即 delta(use)/s/1000 (因为use的单位为毫秒)
如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘
可能存在瓶颈.
idle小于70% IO压力就较大了,一般读取速度有较多的wait.
同时可以结合vmstat 查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)
另外 await 的参数也要多和 svctm 来参考.差的过高就一定有 IO 的问题.
avgqu-sz 也是个做 IO 调优时需要注意的地方,这个就是直接每次操作的数据的大小,如果次数多,但数据拿的小的话,其实 IO 也会很小.如果数据拿的大,才IO 的数据会高.也可以通过 avgqu-sz × ( r/s or w/s ) = rsec/s or wsec/s.也就是讲,读定速度是这个来决定的.
另外还可以参考
svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致 svctm 的增加.await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式.如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU.
队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水.
别人一个不错的例子.(I/O 系统 vs. 超市排队)
举一个例子,我们在超市排队 checkout 时,怎么决定该去哪个交款台呢? 首当是看排的队人数,5个人总比20人要快吧? 除了数人头,我们也常常看看前面人购买的东西多少,如果前面有个采购了一星期食品的大妈,那么可以考虑换个队排了.还有就是收银员的速度了,如果碰上了连 钱都点不清楚的新手,那就有的等了.另外,时机也很重要,可能 5 分钟前还人满为患的收款台,现在已是人去楼空,这时候交款可是很爽啊,当然,前提是那过去的 5 分钟里所做的事情比排队要有意义 (不过我还没发现什么事情比排队还无聊的).
I/O 系统也和超市排队有很多类似之处:
r/s+w/s 类似于交款人的总数
平均队列长度(avgqu-sz)类似于单位时间里平均排队人的个数
平均服务时间(svctm)类似于收银员的收款速度
平均等待时间(await)类似于平均每人的等待时间
平均I/O数据(avgrq-sz)类似于平均每人所买的东西多少
I/O 操作率 (%util)类似于收款台前有人排队的时间比例.
我们可以根据这些数据分析出 I/O 请求的模式,以及 I/O 的速度和响应时间.
一.检查系统日志
lastb命令检查系统错误登陆日志,统计IP重试次数
二.检查系统用户
1、cat /etc/passwd查看是否有异常的系统用户
2、grep "0" /etc/passwd查看是否产生了新用户,UID和GID为0的用户
3、ls -l /etc/passwd查看passwd的修改时间,判断是否在不知的情况下添加用户
4、查看是否存在特权用户awk -F: '$3= =0 {print $1}' /etc/passwd5、查看是否存在空口令帐户awk -F: 'length($2)= =0 {print $1}' /etc/shadow
三.检查异常进程
1、注意UID为0的进程使用ps -ef命令查看进程
2、察看该进程所打开的端口和文件lsof -p pid命令查看
3、检查隐藏进程ps -ef | awk '{print }' | sort -n | uniq >1
ls /porc |sort -n|uniq >2
diff 1 2
四.检查异常系统文件
find / -uid 0 -perm -4000 -print
find / -size +10000k -print
find / -name "…" -print
find / -name ".. " -print
find / -name ". " -print
find / -name " " -print
五.检查系统文件完整性
rpm -qf /bin/ls
rpm -qf /bin/login
md5sum -b 文件名
md5sum -t 文件名
六.检查rpm完整性
rpm -Va #注意相关的/sbin,/bin,/usr/sbin,/usr/bin
七.检查网络
ip link | grep PROMISC(正常网卡不该在promisc模式,可能存在sniffer)lsof -inetstat -nap(察看不正常打开的TCP/UDP端口)arp -a
八.检查系统计划任务
crontab -u root -l
cat /etc/crontab
ls /etc/cron.*
九.检查系统后门
cat /etc/crontab
ls /var/spool/cron/
cat /etc/rc.d/rc.local
ls /etc/rc.d
ls /etc/rc3.d
十.检查系统服务
chkconfig --list
rpcinfo -p(查看RPC服务)
十一.检查rootkit
rkhunter -c
chkrootkit -q
IO调度器的总体目标是希望让磁头能够总是往一个方向移动,移动到底了再往反方向走,这恰恰就是现实生活中的电梯模型,所以IO调度器也被叫做电梯. (elevator)而相应的算法也就被叫做电梯算法.而Linux中IO调度的电梯算法有好几种,一个叫做as(Anticipatory),一个叫做 cfq(Complete Fairness Queueing),一个叫做deadline,还有一个叫做noop(No Operation).具体使用哪种算法我们可以在启动的时候通过内核参数elevator来指定.
一)I/O调度的4种算法
1)CFQ(完全公平排队I/O调度程序)
特点:
在最新的内核版本和发行版中,都选择CFQ做为默认的I/O调度器,对于通用的服务器也是最好的选择.
CFQ试图均匀地分布对I/O带宽的访问,避免进程被饿死并实现较低的延迟,是deadline和as调度器的折中.
CFQ对于多媒体应用(video,audio)和桌面系统是最好的选择.
CFQ赋予I/O请求一个优先级,而I/O优先级请求独立于进程优先级,高优先级的进程的读写不能自动地继承高的I/O优先级.
工作原理:
CFQ为每个进程/线程,单独创建一个队列来管理该进程所产生的请求,也就是说每个进程一个队列,各队列之间的调度使用时间片来调度,
以此来保证每个进程都能被很好的分配到I/O带宽.I/O调度器每次执行一个进程的4次请求.
2)NOOP(电梯式调度程序)
特点:
在Linux2.4或更早的版本的调度程序,那时只有这一种I/O调度算法.
NOOP实现了一个简单的FIFO队列,它像电梯的工作主法一样对I/O请求进行组织,当有一个新的请求到来时,它将请求合并到最近的请求之后,以此来保证请求同一介质.
NOOP倾向饿死读而利于写.
NOOP对于闪存设备,RAM,嵌入式系统是最好的选择.
电梯算法饿死读请求的解释:
因为写请求比读请求更容易.
写请求通过文件系统cache,不需要等一次写完成,就可以开始下一次写操作,写请求通过合并,堆积到I/O队列中.
读请求需要等到它前面所有的读操作完成,才能进行下一次读操作.在读操作之间有几毫秒时间,而写请求在这之间就到来,饿死了后面的读请求.
3)Deadline(截止时间调度程序)
特点:
通过时间以及硬盘区域进行分类,这个分类和合并要求类似于noop的调度程序.
Deadline确保了在一个截止时间内服务请求,这个截止时间是可调整的,而默认读期限短于写期限.这样就防止了写操作因为不能被读取而饿死的现象.
Deadline对数据库环境(ORACLE RAC,MYSQL等)是最好的选择.
4)AS(预料I/O调度程序)
特点:
本质上与Deadline一样,但在最后一次读操作后,要等待6ms,才能继续进行对其它I/O请求进行调度.
可以从应用程序中预订一个新的读请求,改进读操作的执行,但以一些写操作为代价.
它会在每个6ms中插入新的I/O操作,而会将一些小写入流合并成一个大写入流,用写入延时换取最大的写入吞吐量.
AS适合于写入较多的环境,比如文件服务器
AS对数据库环境表现很差.
查看当前系统支持的IO调度算法
dmesg | grep -i scheduler
[root@localhost ~]# dmesg | grep -i scheduler
io scheduler noop registered
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered (default)
查看当前系统的I/O调度方法:
cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]
临地更改I/O调度方法:
例如:想更改到noop电梯调度算法:
echo noop > /sys/block/sda/queue/scheduler
想永久的更改I/O调度方法:
修改内核引导参数,加入elevator=调度程序名
vi /boot/grub/menu.lst
更改到如下内容:
kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet
重启之后,查看调度方法:
cat /sys/block/sda/queue/scheduler
noop anticipatory [deadline] cfq
已经是deadline了
四)I/O调度程序的测试
本次测试分为只读,只写,读写同时进行.
分别对单个文件600MB,每次读写2M,共读写300次.
1)测试磁盘读:
[root@test1 tmp]# echo deadline > /sys/block/sda/queue/scheduler
[root@test1 tmp]# time dd if=/dev/sda1 f=/dev/null bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 6.81189 seconds, 92.4 MB/s
real 0m6.833s
user 0m0.001s
sys 0m4.556s
[root@test1 tmp]# echo noop > /sys/block/sda/queue/scheduler
[root@test1 tmp]# time dd if=/dev/sda1 f=/dev/null bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 6.61902 seconds, 95.1 MB/s
real 0m6.645s
user 0m0.002s
sys 0m4.540s
[root@test1 tmp]# echo anticipatory > /sys/block/sda/queue/scheduler
[root@test1 tmp]# time dd if=/dev/sda1 f=/dev/null bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 8.00389 seconds, 78.6 MB/s
real 0m8.021s
user 0m0.002s
sys 0m4.586s
[root@test1 tmp]# echo cfq > /sys/block/sda/queue/scheduler
[root@test1 tmp]# time dd if=/dev/sda1 f=/dev/null bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 29.8 seconds, 21.1 MB/s
real 0m29.826s
user 0m0.002s
sys 0m28.606s
结果:
第一 noop:用了6.61902秒,速度为95.1MB/s
第二 deadline:用了6.81189秒,速度为92.4MB/s
第三 anticipatory:用了8.00389秒,速度为78.6MB/s
第四 cfq:用了29.8秒,速度为21.1MB/s
2)测试写磁盘:
[root@test1 tmp]# echo cfq > /sys/block/sda/queue/scheduler
[root@test1 tmp]# time dd if=/dev/zero f=/tmp/test bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 6.93058 seconds, 90.8 MB/s
real 0m7.002s
user 0m0.001s
sys 0m3.525s
[root@test1 tmp]# echo anticipatory > /sys/block/sda/queue/scheduler
[root@test1 tmp]# time dd if=/dev/zero f=/tmp/test bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 6.79441 seconds, 92.6 MB/s
real 0m6.964s
user 0m0.003s
sys 0m3.489s
[root@test1 tmp]# echo noop > /sys/block/sda/queue/scheduler
[root@test1 tmp]# time dd if=/dev/zero f=/tmp/test bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 9.49418 seconds, 66.3 MB/s
real 0m9.855s
user 0m0.002s
sys 0m4.075s
[root@test1 tmp]# echo deadline > /sys/block/sda/queue/scheduler
[root@test1 tmp]# time dd if=/dev/zero f=/tmp/test bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 6.84128 seconds, 92.0 MB/s
real 0m6.937s
user 0m0.002s
sys 0m3.447s
测试结果:
第一 anticipatory,用了6.79441秒,速度为92.6MB/s
第二 deadline,用了6.84128秒,速度为92.0MB/s
第三 cfq,用了6.93058秒,速度为90.8MB/s
第四 noop,用了9.49418秒,速度为66.3MB/s
3)测试同时读/写
[root@test1 tmp]# echo deadline > /sys/block/sda/queue/scheduler
[root@test1 tmp]# dd if=/dev/sda1 f=/tmp/test bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 15.1331 seconds, 41.6 MB/s
[root@test1 tmp]# echo cfq > /sys/block/sda/queue/scheduler
[root@test1 tmp]# dd if=/dev/sda1 f=/tmp/test bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 36.9544 seconds, 17.0 MB/s
[root@test1 tmp]# echo anticipatory > /sys/block/sda/queue/scheduler
[root@test1 tmp]# dd if=/dev/sda1 f=/tmp/test bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 23.3617 seconds, 26.9 MB/s
[root@test1 tmp]# echo noop > /sys/block/sda/queue/scheduler
[root@test1 tmp]# dd if=/dev/sda1 f=/tmp/test bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 17.508 seconds, 35.9 MB/s
测试结果:
第一 deadline,用了15.1331秒,速度为41.6MB/s
第二 noop,用了17.508秒,速度为35.9MB/s
第三 anticipatory,用了23.3617秒,速度为26.9MS/s
第四 cfq,用了36.9544秒,速度为17.0MB/s
五)ionice
ionice可以更改任务的类型和优先级,不过只有cfq调度程序可以用ionice.
有三个例子说明ionice的功能:
采用cfq的实时调度,优先级为7
ionice -c1 -n7 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&
采用缺省的磁盘I/O调度,优先级为3
ionice -c2 -n3 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&
采用空闲的磁盘调度,优先级为0
ionice -c3 -n0 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300&
ionice的三种调度方法,实时调度最高,其次是缺省的I/O调度,最后是空闲的磁盘调度.
ionice的磁盘调度优先级有8种,最高是0,最低是7.
注意,磁盘调度的优先级与进程nice的优先级没有关系.
一个是针对进程I/O的优先级,一个是针对进程CPU的优先级.
Anticipatory I/O scheduler 适用于大多数环境,但不太合适数据库应用
Deadline I/O scheduler 通常与Anticipatory相当,但更简洁小巧,更适合于数据库应用
CFQ I/O scheduler 为所有进程分配等量的带宽,适合于桌面多任务及多媒体应用,默认IO调度器
Default I/O scheduler
问题一:
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sdi 82.40 8.90 67.00 5.30 8641.20 56.80 240.61 0.08 1.09 0.93 6.76
上面sdi是一块SSD盘,SSD又不是机械盘,怎么会有rrqm这些合并值呢?
我的理解是内核把这些指标统一对待了? 意思是这些指标对SSD不适用
问题二:
SSD的%util参数很低,但是明显感觉SSD性能到瓶颈了,难道说%util参数也是打酱油的?
if 语句格式
if 条件
then
Command
else
Command
fi
if 的三种条件表达式
if
command
then
if
函数
then
命令执行成功,等于返回0 (比如grep ,找到匹配)
执行失败,返回非0 (grep,没找到匹配)
if [ expression_r_r_r ]
then
表达式结果为真,则返回0,if把0值引向then
[ ] && ——快捷if
[ -f "/etc/shadow" ] && echo "This computer uses shadow passwors"
&& 可以理解为then 如果左边的表达式为真则执行右边的语句
shell的if与c语言if的功能上的区别
shell if | c语言if
-------------------------------|------------------------------------
0为真,走then | 正好相反,非0走then
-------------------------------|------------------------------------
不支持整数变量直接if | 支持整数变量直接if
必须:if [ i –ne 0 ] |
但支持字符串变量直接if | if (i )
if [ str ] 如果字符串非0 |
支持变量直接if |
=================================以command作为if 条件===================================
以多条command或者函数作为if 条件
echo –n “input:”
read user
if
多条指令,这些命令之间相当于“and”(与)
grep $user /etc/passwd >/tmp/null
who -u | grep $user
then 上边的指令都执行成功,返回值$?为0,0为真,运行then
echo "$user has logged"
else 指令执行失败,$?为1,运行else
echo "$user has not logged"
fi
以函数作为if条件 (函数就相当于command,函数的优点是其return值可以自定义)
if
以函数作为if条件,
getyn
then 函数reture值0为真,走then
echo " your answer is yes"
else 函数return值非0为假,走else
echo "your anser is no"
fi
if command 等价于 command+if $?
(1)
$ vi testsh.sh
#!/bin/sh
if
cat 111-tmp.txt | grep ting1
then
echo found
else
echo "no found"
fi
(2)
$ vi testsh.sh
#!/bin/sh
cat 111-tmp.txt | grep ting1
if [ $? -eq 0 ]
then
echo $?
echo found
else
echo $?
echo "no found"
fi
========================================以条件表达式作为 if条件=============================
传统if 从句子——以条件表达式作为 if条件
if [ 条件表达式 ]
then
command
command
command
else
command
command
fi
条件表达式
?文件表达式
if [ -f file ] 如果文件存在
if [ -d ... ] 如果目录存在
if [ -s file ] 如果文件存在且非空
if [ -r file ] 如果文件存在且可读
if [ -w file ] 如果文件存在且可写
if [ -x file ] 如果文件存在且可执行
?整数变量表达式
if [ int1 -eq int2 ] 如果int1等于int2
if [ int1 -ne int2 ] 如果不等于
if [ int1 -ge int2 ] 如果>=
if [ int1 -gt int2 ] 如果>
if [ int1 -le int2 ] 如果<=
if [ int1 -lt int2 ] 如果<
? 字符串变量表达式
If [ $a = $b ] 如果string1等于string2
字符串允许使用赋值号做等号
if [ $string1 != $string2 ] 如果string1不等于string2
if [ -n $string ] 如果string 非空(非0),返回0(true)
if [ -z $string ] 如果string 为空
if [ $sting ] 如果string 非空,返回0 (和-n类似)
-eq -ne -lt -nt只能用于整数,不适用于字符串,字符串等于用赋值号=
=放在别的地方是赋值,放在if [ ] 里就是字符串等于,shell里面没有==的,那是c语言的等于
无空格的字符串,可以加" ",也可以不加
= 作为等于时,其两边都必须加空格,否则失效
等号也是操作符,必须和其他变量,关键字,用空格格开 (等号做赋值号时正好相反,两边不能有空格)
If [ $ANS ] 等价于 if [ -n $ANS ]
如果字符串变量非空(then) , 空(else)
整数条件表达式,大于,小于,shell里没有> 和< ,会被当作尖括号,只有-ge,-gt,-le,lt
整数操作符号-ge,-gt,-le,-lt, 别忘了加-
============================逻辑表达式=========================================
逻辑非 ! 条件表达式的相反
if [ ! 表达式 ]
if [ ! -d $num ] 如果不存在目录$num
逻辑与 –a 条件表达式的并列
if [ 表达式1 –a 表达式2 ]
逻辑或 -o 条件表达式的或
if [ 表达式1 –o 表达式2 ]
逻辑表达式
? 表达式与前面的= != -d –f –x -ne -eq -lt等合用
? 逻辑符号就正常的接其他表达式,没有任何括号( ),就是并列
if [ -z "$JHHOME" -a -d $HOME/$num ]
? 注意逻辑与-a与逻辑或-o很容易和其他字符串或文件的运算符号搞混了
===================以 test 条件表达式 作为if条件===================================
if test $num -eq 0 等价于 if [ $num –eq 0 ]
test 表达式,没有 [ ]
if test $num -eq 0
then
echo "try again"
else
echo "good"
fi
======================if简化语句=================================
最常用的简化if语句
&& 如果是“前面”,则“后面”
[ -f /var/run/dhcpd.pid ] && rm /var/run/dhcpd.pid 检查 文件是否存在,如果存在就删掉
|| 如果不是“前面”,则后面
[ -f /usr/sbin/dhcpd ] || exit 0 检验文件是否存在,如果存在就退出
用简化 if 和$1,$2,$3来检测参数,不合理就调用help
[ -z "$1" ] && help 如果第一个参数不存在(-z 字符串长度为0 )
[ "$1" = "-h" ] && help 如果第一个参数是-h,就显示help
rpm
vsftpd-2.2.2-21.el6.x86_64.rpm
ftp-0.17-54.el6.x86_64.rpm
1.安装vsftpd、db_load,省略
centos7执行:
yum install -y vsftpd
systemctl daemon-reload
2.在一个目录创建一个用户名密码文件,比如
vim account.txt #输入用户名密码奇数行是用户名、偶数行是密码
yum
rxhz1004
3.生成db文件
db_load -T -t hash -f /etc/vsftpd/account.txt /etc/vsftpd/account.db
4.修改权限
chmod 600 /etc/vsftpd/account.db
5.配置pam文件
vim /etc/pam.d/vsftpd.v #输入以下配置
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/account
account required /lib/security/pam_userdb.so db=/etc/vsftpd/account
#后来登录ftp出现530错误,需要把上面两行改为:可能是跟64位系统有关
auth required pam_userdb.so db=/etc/vsftpd/account
account required pam_userdb.so db=/etc/vsftpd/account
--6.创建虚拟用户
useradd virtual_user -d /home/ftpdata -s /sbin/nologin
指定home目录,-s设置成不可登录系统的用户
修改目录权限chown -R virtual_user.virtual_user /home/ftpdata/feiyan
修改目录权限chmod 777 /home/Centos.yum
7.修改vsftpd配置文件
vim /etc/vsftpd/vsftpd.conf
listen_port=21
ftp_data_port=20
#listen_data_port_20=8080
pasv_enable=YES
pasv_min_port=20
pasv_max_port=20
如果ftp发布到外网添加下面的参数,可解决某些单片机ftp模块 opereation error的问题,如果还有问题请取消虚拟用户模式虽然不安全,但没有办法
pasv_addr_resolve=YES
pasv_address=www.xxx.cn #你的域名或者ip
guest_enable=YES
guest_username=virtual_user
pam_service_name=vsftpd.v
user_config_dir=/etc/vsftpd/user_conf
chroot_local_user=YES
allow_writeable_chroot=YES
use_localtime=YES
8.创建用户配置文件
mkdir /etc/vsftpd/user_conf
vim /etc/vsftpd/user_conf/feiyan #给全部权限,限定根目录
local_root=/home/ftpdata/feiyan
write_enable=YES
virtual_use_local_privs=YES
10.重启vsftpd
service vsftpd restart
wget --no-check-certificate https://raw.githubusercontent.com/clang … ll-frps.sh -O ./install-frps.sh
chmod 700 ./install-frps.sh
./install-frps.sh install
二、安装步骤
Loading network version for frps, please wait...
frps Latest release file frp_0.8.1_linux_amd64.tar.gz #此步骤会自动获取frp最新版本,自动操作,无需理会
Loading You Server IP, please wait...
You Server IP:12.12.12.12 #自动获取你服务器的IP地址
Please input your server setting:
Please input frps bind_port [1-65535](Default Server Port: 5443): #输入frp提供服务的端口,用于服务器端和客户端通信
Please input frps dashboard_port [1-65535](Default dashboard_port: 6443): #输入frp的控制台服务端口,用于查看frp工作状态
Please input frps vhost_http_port [1-65535](Default vhost_http_port: 80): #输入frp进行http穿透的http服务端口
Please input frps vhost_https_port [1-65535](Default vhost_https_port: 443): #输入frp进行https穿透的https服务端口
Please input privilege_token (Default: WEWLRgwRjIJVPx2kuqzkGnvuftPLQniq): #输入frp服务器和客户端通信的密码,默认是随机生成的
Please input frps max_pool_count [1-200](Default max_pool_count: 50): #设置每个代理可以创建的连接池上限,默认50
##### Please select log_level #####
1: info
2: warn
3: error
4: debug
#####################################################
Enter your choice (1, 2, 3, 4 or exit. default [1]): #设置日志等级,4个选项,默认是info
Please input frps log_max_days [1-30]
(Default log_max_days: 3 day): #设置日志保留天数,范围是1到30天,默认保留3天。
##### Please select log_file #####
1: enable
2: disable
#####################################################
Enter your choice (1, 2 or exit. default [1]): #设置是否开启日志记录,默认开启,开启后日志等级及保留天数生效,否则等级和保留天数无效
设置完成后检查你的输入,如果没有问题按任意键继续安装
第一部分包含了CPU报告
?%user : 显示了在执行用户(应用)层时的CPU利用率
?%nice : 显示了在以nice优先级运行用户层的CPU利用率
?%system : 显示了在执行系统(内核)层时的CPU利用率
?%iowait : 显示了CPU在I/O请求挂起时空闲时间的百分比
?%steal : 显示了当hypervisor正服务于另外一个虚拟处理器时无意识地等待虚拟CPU所占有的时间百分比。
?%idle : 显示了CPU在I/O没有挂起请求时空闲时间的百分比
第二部分包含了设备利用率报告
?Device : 列出的/dev 目录下的设备/分区名称
?tps : 显示每秒传输给设备的数量。更高的tps意味着处理器更忙。
?Blk_read/s : 显示了每秒从设备上读取的块的数量(KB,MB)
?Blk_wrtn/s : 显示了每秒写入设备上块的数量(KB,MB)
?Blk_read : 显示所有已读取的块
?Blk_wrtn : 显示所有已写入的块
以KB或MB捕捉iostat
默认上,iostat以B为单位衡量I/O系统。为了更便于阅读,我们可以iostat将报告转换成以KB或者MB为单位。只需要加入-k参数来创建以KB为单位,-m参数来创建以MB为单位。
iostat -k
iostat -m
一. 行距:
1. 每行间加一个空行
awk'1; { print "" }' filname.ext #输出当前行,在输出一个空行
awk'1 { print } { print "" }' filname.ext
awk'{ print } { print "" }' filname.ext
2. 1的另外一种实现方法:
awk'BEGIN { ORS="/n/n" }; 1' filname.ext #预先设置每一行的分隔符号为两个换行;你可以尝试把ORS设置为其他的看看效果如何
3. 仅输出非空行,并每行间在加一个空行
awk'NF { print $0 "/n" }' filname.ext #NF表示当前行的字段数,$0表示当前行,最后再加一个换行
4. 双倍行距;没行间两个空行
awk'1; { print "/n" }' filname.ext #默认输出后会换行的,输出/n,则会输出两个空白行
等同于:
awk'{ print; print "/n" }' filname.ext
二. 行号和计算
5. 显示当前行在所在文件中的行号
awk'{ print FNR "/t" $0 }' filname.ext #FNR,表示当前行在文件中的行号
6. 显示当前行在本次处理过程中的行号
awk'{ print NR "/t" $0 }' filname.ext #NR,表示当前行在本次处理过程中的行号
小疑问:为啥有FNR和NR的差别呢?效果不都是一样么? 如果你给如:filname1.ext filname2.ext,你就会看到差别了。原来:FNR,是每个文件中的,换了一个文件,会归零;而NR则每个文件会累加起来的
7. 使用简单样式来输出
awk'{ printf("%5d : %s/n", NR, $0) }' filname.ext #行号占用5位,不足补空格
8. 显示非空行
awk'NF { $0=++a " :" $0 }; { print }' filname.ext #NF前面说了,表示当前行的行号,此处用他作为条件,如果是空行,则NF为0,跳过;否则,用动态变量a存储非空行的数目
9. 计算行数:效果类似wc -l
awk'END { print NR }' filname.ext #END表示每行都处理完了后,在执行,此时NR就是最后一行的行号,也就是总的行数了。
10. 计算每一行的和
awk'{ s = 0; for (i = 1; i <= NF; i++) s = s+$i; print s }' filname.ext
#s用作每行和的累加,从1到NF(每行总的字段数),依次累加
11. 计算文件中所有字段的和
awk'{ for (i = 1; i <= NF; i++) s = s+$i }; END { print s }' filname.ext
#s用作总和的累加,每行都处理完成了,再输出s;注意和10对比,此处没有每行清零,所以累加了。没有设置的变量,默认为空,但是会根据上下文数值计算情况自动变为0
12. 将每个字段用其绝对值代替
awk'{ for (i = 1; i <= NF; i++) if ($i < 0) $i = -$i; print }' filname.ext
#$i表示当前行中的字段,$0表示当前行,可以改变$i的值
13. 计算文件中总的字段和(例如计算单词数)
awk'{ total = total + NF }; END { print total }' filname.ext
14. 计算匹配指定信息的总行数
awk'/Linux/ { n++ }; END { print n+0 }' filname.ext
15. 找到文件中每行第一个字段中,最大的数,以及其所在的行
awk'$1 > max { max=$1; maxline=$0 }; END { print max, maxline }' filname.ext
#用max存储最大的数,maxline存储最大数所在的行,并在最后输出
16. 显示当前行的字段数,并输出当前行
awk'{ print NF ":" $0 } ' filname.ext
17. 显示每行最后一个字段的内容
awk'{ print $NF }' filname.ext #NF表示当前行的字段数,例如为3,则$NF,就是$3,也就是第三个字段了
18. 显示最后一行的最后一个字段
awk'{ field = $NF }; END { print field }' filname.ext
#每行处理没有输出,尽在最后输出,field作为每行的最后一行的暂存变量
19. 显示字段数小于4的行
awk'NF < 4' filname.ext #{}以外的内容,作为条件,没有{},则默认输出当前行
20. 显示每行的最后一个字段小于4的行
awk'$NF < 4' filname.ext #注意和19对比
Gentoo Linux 11 LiveDVD快速安装法
安装步骤:
1. 分割磁区
2. 格式化分割区
3. 挂载分割区
4. 复制Live DVD Gentoo档案
5. 把环境切到硬碟
6. 修改root密码
7. 安装grub到 mbr
8. 设定、注解与停用服务
9. 复制kernel到 /boot区
10. 修改/etc/fstab
11. 编辑/boot/grub/grub.conf
12. 重开机,退出光碟
13. 完成基础Gentoo Live DVD安装
LiveDVD 光碟开机,不进X-Window开机,加快安装速度
boot: gentoo nox
分割磁区
这里是 boot 100M、SWAP 1G、ROOT 79G,其实 ROOT分割10G就可以了,如果不在安装什么的话!保险一点就是开大一点啰。
Livecd ~ # fdisk /dev/sda
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (15-10443, default 15): 1
Last cylinder, +cylinders or +size{K,M,G} (15-10443, default 10443):+100M
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (15-10443, default 15): 15
Last cylinder, +cylinders or +size{K,M,G} (15-10443, default 10443): +1G
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (15-10443, default 15): 147
Last cylinder, +cylinders or +size{K,M,G} (15-10443, default 10443): 10443
Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 82
Changed system type of partition 2 to 82 (Linux swap / Solaris)
Command (m for help): p
Disk /dev/sda: 85.8GB, 85899345920 bytes
255 heads, 63 sectors/track, 10443 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x52a68f74
Device Boot Start End Blocks Id System
/dev/sda1 1 14 112423+ 83 Linux
/dev/sda2 15 146 1060290 82 Linux swap / Solaris
/dev/sda3 147 10443 82710652+ 83 Linux
Command (m for help): wq
格式化分割区
mkfs.ext3 /dev/sda1
mkswap /dev/sda2
mkfs.ext4 /dev/sda3
挂载分割区
swapon /dev/sda2
mount /dev/sda3 /mnt/gentoo
mkdir /mnt/gentoo/boot
mount /dev/sda1 /mnt/gentoo/boot
复制 Live DVD Gentoo文件
cp –apf /mnt/livecd/* /mnt/gentoo
===============================================================================
复制 kernel 到 /boot区
复制内核映像,从initramfs(把cache当作文件系统装载的思想)的LiveDVD到新系统。
mkdir -p /mnt/cdrom/
mount /dev/cdrom /mnt/cdrom/
cp /mnt/cdrom/boot/gentoo /boot/kernel
cp /mnt/cdrom/boot/gentoo.igz /boot/initramfs
------------------------------------------------------
方法2:
cp /usr/src/linux/System.map /boot/System.map-genkernel-x86-2.6.30-gentoo-r5
cp /usr/src/linux/arch/x86/boot/bzImage /boot/kernel-genkernel-x86-2.6.30-gentoo-r5
=============================================================================
cd
把环境切换到硬盘
chroot /mnt/gentoo /bin/bash
env-update && source /etc/profile
修改 root 密码
passwd
New password: ******
Retype new password: ******
passwd: password updated successfully
从默认boot中移除启动AutoConfig服务,否则您的root密码是每次启动时复位。
rc-update del autoconfig default 【经测试,这样会导至不能进入桌面,可以把passwd设为no并注释掉passwd段】
安装 grub 到 mbr
grub
root (hd0,0)
setup (hd0)
quit
注解 /etc/conf.d/local.start 里面全部东西,或用下面的指令清空
cat /dev/null > /etc/conf.d/local.start
rc-update del autoconfig
设定时区
rm /etc/localtime
ln –s /usr/share/zoneinfo/Asia/Taipei /etc/localtime
修改 /etc/fstab
/dev/sda1 /boot ext3 defaults 1 2
/dev/sda2 none swap sw 0 0
/dev/sda3 / ext4 defaults 0 1
===============================================
编辑 /boot/grub/grub.conf 内容如下
default 0
timeout 30
title Gentoo Linux 2.6.30-r6
root (hd0,0)
kernel /boot/kernel-genkernel-x86-2.6.30-gentoo-r5 root=/dev/rm0 real_root=/dev/sda3
initrd /boot/initramfs-genkernel-x86-2.6.30-gentoo-r5
退出环境,重开机,退出光碟
exit
reboot
===================================================
gentoo网络设置参考方法
/etc/conf.d/net文件的一个示例
# DHCP
config_eth0=( "dhcp" )
# 使用CIDR形式表示的静态IP
config_eth0=( "192.168.0.7/24" )
routes_eth0=( "default via 192.168.0.1" )
# 使用netmask形式表示的静态IP
config_eth0=( "192.168.0.7 netmask 255.255.255.0" )
routes_eth0=( "default via 192.168.0.1" )
启动和停止网络脚本
# /etc/init.d/net.eth0 start
# /etc/init.d/net.eth0 stop
这是x86系列cpu的东西,写16bit汇编,若涉及中断操作,才要弄明白中断向量表.
比如这2条指令
mov ah,0
int 16h
它就是16h中断,ah是读键功能编号,执行后,若键入a,ah回存a键的扫瞄码,al回存a键的ascii码
cpu如何执行int 16h? 这就需要中断向量表,电脑启动后,系统会在0:0000~0:0400h的地址上建立一个表格
0:0001~0:0003 共4个字节,放置一个'段:偏移的地址',表示中断1的入口
0:0004~0:0007 共4个字节,放置一个'段:偏移的地址',表示中断2的入口
...
...
一共256个中断(16进制0-ffh),占据0:0~0:0400h
cpu执行int 16h时,就会在16h * 4 的地址,取得16h的入口,保存cs,ip和flag后,就将控制权交给int16h的函式.
这是软中断,但还有硬中断,比如时脉,8h号中断,它不须要int 8h,而是直接对cpu发出中断要求,cpu收到后,和软中断一样,在中断向量表中,
找出int8h的时脉中断入口,运行之.....
https://jaist.dl.sourceforge.net/projec … 2.7.tar.gz
2.安装依赖
yum install gtk2 gtk2-devel gtk2-devel-docs gtk2.0-dev xorg-dev
3.编译安装
./configure --prefix=/usr/local/bochs --enable-debugger --enable-iodebug --enable-x86-debugger --with-x --with-x11
make && make install
一定加上--enable-debugger,这样才能调试代码