tongsiying

阅读|运动|自律

0%

linux-draft

001-文件管理

通配符

1
2
3
4
5
6
*:匹配0或多个字符
?:匹配随意一个字符
[list]:匹配list中的随意单一字符
[!list]:匹配非list中的随意单一字符
[a1-a3]:匹配a1和a3之间的随意一个字符。如0-9,a-z
{string1,string2,string3...}:匹配string1,或string2或……当中的一个字符串

字符串

1
2
1、字符串或串(String)是由数字、字母、下划线组成的一串字符。一般记为 s=“a1a2···an”(n>=0)。它是编程语言中表示文本的数据类型。在程序设计中,字符串(string)为符号或数值的一个连续序列,如符号串(一串字符)或二进制数字串(一串二进制数字)。
2、只要用双引号“ ”括起来的都是String

ASCII比较大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ASCII比较大小的时候,是比较两个数中的第一个字符 
1)常用字符有128个,编码从0127
2)控制字符:0~31127,共33个,不可显示;
3)普通字符:95个,包括10个阿拉伯数字、52个英文大小写字母、33个运算符。
4)每个字符占一个字节,7位,最高位为0

常见ASCII码的大小规则,09<A-Z<a-z:
1)数字比字母要小。如 “7”<“F”
2)数字0比数字9要小,并按09顺序递增。如 “3”<“8
3)字母A比字母Z要小,并按A到Z顺序递增。如“A”<“Z”
4)同个字母的大写字母比小写字母要小32。如“A”<“a”

记住几个常见字母的ASCII码大小:
“A”为65;“a”为97;“0”为48

cat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
突破
在搜索引擎项目工作时,看到过研发工程师在调试问题时这样使用了cat——他们启动服务后,使用了命令cat some_data.txt > /dev/null,虽然当时没有直接向他们请教原委,但这个命令给我留下了深刻的印象:
/dev/null是linux的位桶文件,写入它的内容会永远丢失,从它那里什么也读取不到。一般用法是想丢弃命令产生的标准输出和标准错误时,通常使用command > /dev/null 2>&1,因此,cat some_data.txt > /dev/null似乎没有任何效果。
当时观察到cat some_data.txt > /dev/null这个命令的执行时间常长,这说明了some_data.txt这个文件也足够大。但第二次执行这个命令时,执行时间则大大缩减了。
由以上大致可以判断出,该用法是为了将文件内容导入到内存中,以便需要使用文件内容时能够快速获取。一般来说,从硬盘中读取数据需要5ms到10ms的时间,而从内存中读取数据时通常只需要50ns到100ns的时间,这就是page cache(页高速缓冲存储器)的作用。

总结
这个经历给我的体会是,许多时候,我们认为自己掌握了全部或绝大部分,而实际上,只是因为自己知道的太少,并且不认为自己知道的太少——我们压根不觉得是因为自己不知道。就像美国前国防部长拉姆斯菲尔德说过的那样:
because as we know, there are known knowns; there are things we know we know. We also know there are known unknowns; that is to say we know there are some things we do not know. But there are also unknown unknowns - the ones we don't know we don't know.
我们有已知的已知,已知的未知,以及未知的未知。

 其它读文件:
cat     由第一行开始显示内容,并将所有内容输出
tac     从最后一行倒序显示内容,并将所有内容输出
more    根据窗口大小,一页一页的显示文件内容
less    和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head    只显示头几行
tail    只显示最后几行
nl     类似于cat -n,显示时输出行号

https://www.cnblogs.com/chenxiaomeng/p/10066821.html
echo "123456789abcdefghjklmnopq" | cut -b 11-14

grep

1
2
-w 完全匹配
grep -w "cao"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
报错Binary file (standard input) matches:
解决:
cat mt.output-20180807|grep -a l129093


A -B -C 后面都跟阿拉伯数字
-A是显示匹配后和它后面的n行。
-B是显示匹配行和它前面的n行。
-C是匹配行和它前后各n行。
总体来说,-C覆盖面最大。用它保险些。哈哈。这3个开关都是关于匹配行的上下文的(context)。


#查找当前目录下包含关键字“checknetiflinkstat”的所有文件,并列出行号。
grep -nr "checknetiflinkstat" /home/zxcdn/ottcache/nginx/lua

find

1
2
3
4
5
6
7
8
删除多少天之前的文件
find /mnt/snbslog/snbs -type f -name '*' -mtime +1 -exec rm {} \;

基本思路是,find找到相应的文件,然后执行某个命令。这里是找到N天前的文件,然后执行删除指令。

-type f: 指定查找的为文件,而非文件夹或文件链接等
-name ‘*.txt’: 指定查找的文件名的模式
-mtime: 指定文件的修改时间,以天为单位。+NN天以前,-NN天以内,N是第N天。另外有,-mmin按分钟为单位指定文件的修改时间。还另外可以另外的参数指定文件上次使用的时间等。

rm删除文件不释放

1
2
3
解决linux删除文件后空间没有释放问题
https://www.cnblogs.com/mfryf/p/3334451.html
[root@ticketb ~]# lsof |grep deleted

shuf命令

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
shuf命令把输入行按随机顺序输出到标准输出。

用法
shuf [选项]... [文件]
或者
shuf -e [选项]... [参数]...
又或者
shuf -i LO-HI [选项]...

常用参数
-e, --echo
将每个参数视为输入行
-i, --input-range=LO-HI
将LO 到HI 的每个数字视为输入行
-n, --head-count=行数
最多输出指定的行数
-o, --output=文件
将结果输出到指定文件而非标准输出
--random-source=文件
从指定文件获得随机比特
-z, --zero-terminated
0 结束行而非新行
--help
显示此帮助信息并退出
--version
显示版本信息并退出
如果没有指定文件,或者文件为"-",则从标准输入读取。

我有一个名为 ostechnix.txt 的文件,内容如下:
$ cat ostechnix.txt
line1
line2
line3
line4
line5
line6
line7
line8
line9
line10
现在让我们以随机顺序显示上面的行。为此,请运行:
$ shuf ostechnix.txt
line2
line8
line5
line10
line7
line1
line4
line6
line9
line3
看到了吗?上面的命令将名为 ostechnix.txt 中的行随机排列并输出了结果。

你可能想将输出写入另一个文件。例如,我想将输出保存到 output.txt 中。为此,请先创建 output.txt:
$ touch output.txt
然后,像下面使用 -o 标志将输出写入该文件:
$ shuf ostechnix.txt -o output.txt
上面的命令将随机随机打乱 ostechnix.txt 的内容并将输出写入 output.txt。你可以使用命令查看 output.txt 的内容:
$ cat output.txt
line2
line8
line9
line10
line1
line3
line7
line6
line4
line5
我只想显示文件中的任意一行。我该怎么做?很简单!
$ shuf -n 1 ostechnix.txt
line6
同样,我们可以选择前 “n” 个随机条目。以下命令将只显示前五个随机条目:
$ shuf -n 5 ostechnix.txt
line10
line4
line5
line9
line3
如下所示,我们可以直接使用 -e 标志传入输入,而不是从文件中读取行:
$ shuf -e line1 line2 line3 line4 line5
line1
line3
line5
line4
line2
你也可以传入数字:
$ shuf -e 1 2 3 4 5
3
5
1
4
2
要快速在给定范围选择一个,请改用此命令:
$ shuf -n 1 -e 1 2 3 4 5
或者,选择下面的任意三个随机数字:
$ shuf -n 3 -e 1 2 3 4 5
3
5
1
我们也可以在特定范围内生成随机数。例如,要显示 110 之间的随机数,只需使用:
$ shuf -i 1-10
1
9
8
2
4
7
6
3
10
5

grep 和 awk的buffer

1
2
3
4
5
6
7
8
9
tail -f test.log | grep "mode" | awk '{print $5}'命令
或者 tail -f test.log | awk '/mode/ {print $5}'的时候,如果test.log中满足模式mode的数据很少,会发现即便是test.log中新出现了满足mode的行,但是上面两个命令都没有任何输出。

原因在于grep和awk处于效率的考量,会缓存一批数据再输出到标准输出。

grep的--line-buffered选项和awk的fflush(stdout)命令可以使得grep和awk不缓存数据。如:

tail -f test.log | grep --line-buffered "mode" | awk '{print $5}'
tail -f test.log | awk '/mode/ {print $5,$6; fflush(stdout)}''

sed

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
https://www.cnblogs.com/fiberhome/p/6898786.html

在每行的头添加字符,比如"HEAD",命令如下:
[root@localhost ~]# sed -i 's/^/HEAD&/' /tmp/input.txt 
[root@localhost ~]# cat /tmp/input.txt
HEADnull
HEAD000011112222
HEAD
HEADtest

#替换关键字的后面两位
sed -ri 's/(20230907..)/\110/g'
sed -ri 's/(20230907..)/\110/'

#在包含某个关键字的行上面插入一行文字,命令如下:
sed -i '/hello/i\\555555' testfile

#在包含某个关键字的行下面插入一行文字,命令如下:
sed -i '/hello/a\\66666' testfile

#替换第21次匹配的字符
sed -i 's/xxx/12344/21/'

#在文件的第一行插入字符串
sed -i '1i include /etc/cinder/volumes/*' /etc/tgt/targets .conf
其中i表示插入,而且是添加到当前行的上一行;而a是添加到当前行的后一行。
注意:在sed中没有第0行之说。

显示文件X行到Y行的内容:
#sed -n 'x,yp' filename

删除文件最后一行:
sed '$d'

对第十八行进行注释:sed '18s/^/#/' /etc/fstab

sed中支持变量的处理方法
1.eval sed ’s/$a/$b/’ filename
2.sed "s/$a/$b/" filename
3.sed ’s/’$a’/’$b’/’ filename 
4.sed s/$a/$b/ filename
第一种eval sed -i 's!gcomm://!gcomm://$IP_2!g' /etc/my.cnf.d/server.cnf
第二种sed -i "s/localhost-IP/$IP_2/g" /etc/my.cnf.d/server.cnf

sed删除含有某个字符的行
readzone1=12345
sed -i "/$readzone1/d" zone1.log zone2.log zone3.log

linux 删除文件里的标点符号
sed  -i 's /[,."]//g  filename

删除空行:
sed '/^\s*$/d'
注:d代表删除该行

行尾追加字符:
sed 's/$/ ABC/' file1

行首:
sed 's/^/xxx/'  filename >output:^符号代表行首

awk NF
注:NF代表当前行的字段数,空行的话字段数为0,被awk解释为假,因此不进行输出。

Sed 删除包含某些字符串的行
sed -i '/关键字符/d' 文件名

-------------------------------------------------------------------------
https://www.cnblogs.com/Berryxiong/p/6232283.html
sed 's/[ ][ ]*/,/g' 1.txt

脚本说明:
s代表替换指令;
每个[ ]都包含有一个空格;
*号代表0个或多个;
g代表替换每行的所有匹配;
-------------------------------------------------------------------------
linux 如何截取一段时间内log日志
sed -n '/2020-02-12 08:50/,/2020-02-12 09:00/'p server.INFO


shell替换一个或多个空格为逗号
sed 's/[ ][ ]*/,/g' 1.txt
脚本说明:
s代表替换指令;
每个[ ]都包含有一个空格;
*号代表0个或多个;
g代表替换每行的所有匹配;

awk

awk中执行Linux命令的两种方式

在使用awk处理内容时,有时会按行执行Linux命令,下面介绍两种执行Linux命令方式。

方式一用system():

1
2
[root@localhost shell_script]# awk 'BEGIN {system("pwd")}'
[root@localhost shell_script]#

test.log文件:

1
2
3
4
5
[root@localhost shell_script]# cat test.log 
pwd
ls
which sh
[root@localhost shell_script]#

按文件行作为输入执行:

$0 表示一行数据

1
2
3
4
5
6
7
8
9
10
11
[root@localhost shell_script]# awk '{print "执行命令:"$0; system($0); print "\r"}' test.log
执行命令:pwd
/root/shell_script

执行命令:ls
awk_system.sh test.log

执行命令:which sh
/usr/bin/sh

[root@localhost shell_script]#

拼接命令:

1
2
3
[root@localhost shell_script]# echo "sh601236" | awk '{cmd = "curl -X GET http://hq.sinajs.cn/list="$0; system(cmd);}'
var hq_str_sh601236="红塔证券,19.930,20.320,19.150,19.930,18.710,19.150,19.160,41190044,791608359.000,198000,19.150,53300,19.140,60100,19.130,74200,19.120,24100,19.110,50500,19.160,28500,19.170,18300,19.180,15500,19.190,59300,19.200,2020-06-29,15:00:00,00,";
[root@localhost shell_script]#

方式二:借助|和sh命令:

1
2
3
4
5
6
7
[root@localhost shell_script]# echo "pwd" | sh
/root/shell_script
[root@localhost shell_script]# cat test.log | sh
/root/shell_script
awk_system.sh test.log
/usr/bin/sh
[root@localhost shell_script]#

print

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost shell_script]# awk 'BEGIN {print "pwd" | "sh"}'
/root/shell_script
[root@localhost shell_script]#
[root@localhost shell_script]# echo "pwd" | awk '{print $0 | "sh"}'
/root/shell_script
[root@localhost shell_script]#
[root@localhost shell_script]# awk '{print "执行命令:"$0; print $0 | "sh"; print "\r"}' test.log
执行命令:pwd

执行命令:ls

执行命令:which sh

/root/shell_script
awk_system.sh test.log
/usr/bin/sh
[root@localhost shell_script]#
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
https://www.cnblogs.com/xudong-bupt/p/3721210.html
https://www.cnblogs.com/jackhub/p/3549091.html
http://www.mamicode.com/info-detail-1187091.html
http://www.voidcn.com/article/p-pycljjoj-btv.html

IF语句
必须用在{}中,且比较内容用()扩起来
awk -F: '{if($1~/mail/) print $1}' /etc/passwd //简写
awk -F: '{if($1~/mail/) {print $1}}' /etc/passwd //全写
awk -F: '{if($1~/mail/) {print $1} else {print $2}}' /etc/passwd //if...else...


条件表达式
== != > >=
awk -F":" '$1=="mysql"{print $3}' /etc/passwd
awk -F":" '{if($1=="mysql") print $3}' /etc/passwd //与上面相同
awk -F":" '$1!="mysql"{print $3}' /etc/passwd //不等于
awk -F":" '$3>1000{print $3}' /etc/passwd //大于
awk -F":" '$3>=100{print $3}' /etc/passwd //大于等于
awk -F":" '$3<1{print $3}' /etc/passwd //小于
awk -F":" '$3<=1{print $3}' /etc/passwd //小于等于


awk判断某字段为空
more aaa.txt | awk -F '|' '$11 ~/^$/{print $0}'

#在每一行插入字符
1. 如何在一个文本文件中的每一行头插入一个字符
awk '{print "X"$0}' urfile
2. 如何在一个文本文件中的每一行尾插入一个字符
awk '{print $0"X"}' urfile
3. 如何在一个文本文件中的每一行的指定列插入一串字符
awk '$O=$O" X"' urfile


awk匹配指定的字符串并打印该字符串所在的列 简书
df|awk '/%/ {for(i=1;i<=NF;i++) if ($i~/%/)print $i }'

【-----awk之行与列的count Chinaunix----】
1) 每行字段数
awk '{print NF}' file
5
1
4
2
4

2) 最大字段数
awk '{max=max
5

3) 总共字段个数
awk '{x+=NF}END{print x}' file
16

4) 所有字段的总和
awk '{for(i=1;i<=NF;i++)x+=$i}END{print x}' file
280

5) 各行的总和
awk '{x=0;for(i=1;i<=NF;i++){x+=$i};print x}' file
60
15
70
41
94

6) 各列的总和
awk '{for(i=1;i<=NF;i++)a[i]+=$i}END{l=length(a);for(j=1;j<=l;j++) printf a[j]" ";printf "\n"}' file
83 72 54 57 14

7) 行列交换
awk '{for(i=1;i<=NF;i++)a[NR,i]=$i;x=x10 15 16 20 22
11 17 21 23
12 18 24
13 19 25
14
或者以空格补齐空白处
awk '{for(i=1;i<=NF;i++)a[NR,i]=$i;x=x10 15 16 20 22
11 17 21 23
12 18 24
13 19 25
14

【----Shell获取字符串长度的多种方法总结---】
方法如下:
【方法一】:利用${#str}来获取字符串的长度
str="ABCDEF"
echo ${#str}

【方法二】:利用awk的length方法
str="ABCDEF"
echo ${str}|awk '{print length($0)}'

备注:
1) 最好用{}来放置变量
2) 也可以用length($0)来统计文件中每行的长度
awk '{print length($0)}' /etc/passwd
awk '{print length($NF)}' /etc/passwd #计算最后一个字段的长度

【方法三】:利用awk的NF项来获取字符串长度
str="ABCDEF"
echo ${str}|awk -F"" '{print NF}'

备注: -F为分隔符,NF为域的个数,即单行字符串的长度

【方法四】:利用wc的-L参数来获取字符串的长度
str="ABCDEF"
echo ${str}|wc -L
cat /etc/passwd |wc -L # 输出:82

备注: -L参数
1) 对多行文件来说,表示打印最长行的长度!82,表示/etc/passwd文件最长行的长度为82。
2) 对单行字符串而言,表示当前行字符串的长度!

【方法五】:利用wc的-l参数,结合echo -n参数
str="ABCDEF"
echo -n ${str}|wc -c
echo ${str} |wc -c

备注:
1) -c参数: 统计字符的个数
2) -n参数: 去除"\n"换行符,不去除的话,默认带换行符,字符个数就成了7

【方法六】:利用expr的length方法
str="ABCDEF"
expr length ${str}

【方法七】:利用expr的$str : ".*"技巧,变量带不带花括号无差别
str="ABCDEF"
expr ${str} : ".*"

备注: .*代表任意字符,即用任意字符来匹配字符串,结果是匹配到6个,即字符串的长度为6




awk输出前最多ip地址:
awk '{ip[$1]++} END {for (i in ip) print i,ip[i]}' /var/log/httpd/access_log




显示第一行和最后一行:
awk 'NF==1;END{print}'

【-------awk去掉某字符串前面所有字符 vOFS-----】
比如:
test 1
aaaaatest 2
test 3
tesbbbbbtest test 4

每行去掉test前面所有字符之后,输出:
test 1
test 2
test 3
test test 4

处理:
awk -F'test' -vOFS="test" '{$1="";$1=$1}1' file
awk '{match($0,"test");print substr($0,RSTART)}' file

解析:
这两种处理方法都很好,
第一种是利用test作为分隔符,然后把第一个字段赋值为空,也是就是第一个test前面的字符。同时,输出的字段的分隔符还必须是test字符串。
第二种方法的话首先查找到test字符串的位置,然后这时候RSTART的变量的值就是test的开始的位置,而后利用substr函数从此处开始到结束位置。



awk多个分隔符:
但是如果我想根据多个分隔符进行分割呢?一种办法是两次awk,但是我们可以一次告诉awk我们所有的分隔符,如-和|这两个,如
awk -F ‘[-|]’ ‘{print $3;}’ data

就这么简单,还有一个问题,如果我们想用[]作为分隔符怎么办?有办法,这样就行:
awk -F ‘[][]’ ‘{print $3;}’ data



去重命令(去除重复行):
awk '!a[$0]++' 42in.txt >42in-new.txt

awk打印出每一列
[root@block-storage04 wxttest]# cat snbs.conf |grep gateway|sed 's/gateway=//g'|awk -F ";" '{for(i=1;i<=NF;i++)printf("%s\n",$i);print}'
10.242.180.211:8585
10.242.180.210:8585
10.242.180.209:8585
10.242.180.211:8585;10.242.180.210:8585;10.242.180.209:8585

第一列求和:
awk -F ':' 'BEGIN{sum=0}{sum+=$1}END{print sum}'

删除第一列:
awk '{$1="";print $0}' text

awk 求平均:awk '{sum+=$1} END {print "$k = ", sum/NR}'

每一行行首加上行号:
awk '$0=NR","$0'

----------------------------------------------------------------
单行、多行转换
#一行数据分割成多行
awk 'BEGIN{i=1}{gsub(/,/,",\n");i++;print}' file.txt

#每两行数据合并成一行(这个可以作为每两行合为一行使用)
sed -n '{N;s/\n/ /p}' file.txt

#指定几行数据合并成一行(此为10行)
awk '{if (NR%10==0){print $0} else {printf"%s ",$0}}' file.txt

cat file.txt | awk '{if(NR%10!=0)ORS=" ";else ORS="\n";print}'

#多行数据合并成一行
awk BEGIN{RS=EOF}'{gsub(/\n/," ");print}' file.txt

sed ':a ; N;s/\n/ / ; t a ; ' file.txt

cat file.txt | xargs

cat file.txt | tr '\n' ' '

split

1
2
3
4
5
6
7
8
split -b 10k date.file -d -a 3
split -l 500000 -d -a 3 $1 value_
split -b 300m date.file -d -a 3 $1 value_
split -b 5m check-error.log -d -a 3 value_

split -l 10 date.file按行切割

split -l -d -a 3 value_

qemu-img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
qemu-img convert -S 8k -f qcow2  CentOS7U3_GLOBAL_64bit_75G_20180404_APP.qcow2 -O  raw /dev/sdc1   ----直接将qcow2文件转换并写入sdc1磁盘,记得设置-S 8k   ---这个参数指定稀疏拷贝,只写有效数据@王星童

qemu-img convert -S 8k -f qcow2 new_sdoss-50G-20190225.qcow2 -O raw /os_instance/cyq.raw
qemu-img convert -S 8k -f qcow2 new_sdoss-50G-20190225.qcow2 -O raw /dev/sdc

在centos7上可以安装这个qemu-img工具,以覆盖方安装。
rpm -ivh --force --nodeps qemu-img-ev-2.6.0-28.el7.centos.10.1.x86_64.rpm

----------------------------------------------------------------------------
1.yum install  qemu-img

2.qcw2镜像转化为raw镜像文件
qemu-img convert -f qcow2 CentOS7U3_GLOBAL_64bit_75G_20180404_APP.qcow2 -O raw CentOS7U3.raw

3.raw镜像转化为qcw2镜像文件
qemu-img convert -f qcow2  win7.raw  -O  raw  win7.qcow2

4.压测环境上传:
time qemu-img convert -S 8k -f qcow2 -O raw /os_data/RHEL6U3_GLOBAL_64bit_75G_20180109_APP.qcow2 /mnt/snbsfuse/snpool001/fusetest

dd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if是来源,of是目的。
生成一个5G的文件:
dd if=/dev/zero of=/tmp/test.txt bs=1M count=5120
dd if=/dev/zero of=/tmp/test.txt bs=1M count=5120
读:
dd if=/dev/sdb of=/dev/null bs=4k
dd if=/dev/sdb of=/testrw.dbf bs=4k

读磁盘io:
先dd一个5g的文件:
dd if=/dev/zero of=/tmp/test.txt bs=1M count=5120

dd if=/dev/zero oflag=direct of=./10GB bs=1M count=10240

dd iflag=direct,nonblock oflag=direct,nonblock if=./bigfile of=/dev/null
金泉洁 2019-01-24 10:20:12
dd if=./bigfile iflag=direct,nonblock of=/dev/null

tr:去除字母

1
cat file | tr -d "a-zA-Z">new_file

column :对齐

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
32
33
以将文本结果转换为整齐的表格,上下对齐
命令: Column
使用的参数:
-t :表格,默认以空格间隔
-s:需要配合-t使用,指定分隔符

-t举例:
[root@uyhd000225 ~]# mount
/dev/hda1 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/xvdb1 on /data type ext3 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
[root@uyhd000225 ~]# mount |column -t
/dev/hda1   on  /                         type  ext3         (rw)
proc        on  /proc                     type  proc         (rw)
sysfs       on  /sys                      type  sysfs        (rw)
devpts      on  /dev/pts                  type  devpts       (rw,gid=5,mode=620)
tmpfs       on  /dev/shm                  type  tmpfs        (rw)
/dev/xvdb1  on  /data                     type  ext3         (rw)
none        on  /proc/sys/fs/binfmt_misc  type  binfmt_misc  (rw)

-s举例:
[root@uyhd000225 testDir]# cat testcolumn
Jackie | 18 | male
Helen | 20 | female
Daniel Liu | 23 | male
[root@uyhd000225 testDir]# cat testcolumn | column -s '|' -t
Jackie        18    male
Helen         20    female
Daniel Liu    23    male

stat:文件的状态信息

1
2
3
4
5
6
7
8
9
10
11
12
13
stat命令文件权限属性设置
stat命令用于显示文件的状态信息。
stat命令的输出信息比ls命令的输出信息要更详细。
语法 stat(选项)(参数)
选项
-L:支持符号连接;
-f:显示文件系统状态而非文件状态;
-t:以简洁方式输出信息;
--help:显示指令的帮助信息;
--version:显示指令的版本信息。

参数
文件:指定要显示信息的普通文件或者文件系统对应的设备文件名。

paste -d,

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
[root@host102442549 ChunkServer]# cat /etc/snbs.conf.back|grep -E "VolDev"|awk -F = '{print $2}'|sed 's/,/\n/g'
sdb
sdc
sdd
sde
sdf
sdh
sdi
sdj
[root@host102442549 ChunkServer]# lsblk|grep "5.7G"|awk '{print $1}'|sed 's/├─//g'
sdg1
sdg2
sdg3
sdg4
sdg5
sdg6
sdg7
sdg8
[root@host102442549 ChunkServer]# cat /etc/snbs.conf.back|grep -E "VolDev"|awk -F = '{print $2}'|sed 's/,/\n/g' >> disk.txt;lsblk|grep "5.7G"|awk '{print $1}'|sed 's/├─//g' >> cache.sh
[root@host102442549 ChunkServer]#
[root@host102442549 ChunkServer]#
[root@host102442549 ChunkServer]# paste -d, disk.txt cache.sh
sdb,sdg1
sdc,sdg2
sdd,sdg3
sde,sdg4
sdf,sdg5
sdh,sdg6
sdi,sdg7
sdj,sdg8

sort:排序

1
2
3
4
去除重复行
sort -n partition_id.txt |uniq|sort -n
去重必须搭配sort -n使用
sort -n单独使用是按照数字排序
1
按数字排序:sort -n number.txt
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
32
33
34
35
[root@snbs161-201-instance opt]# head stat.log 
/opt/write/1 97792 192 81a4 0 0 fd05 655362 1 0 0 1573375690 1573375353 1573375353 4096
/opt/write/3 97792 192 81a4 0 0 fd05 655364 1 0 0 1573375832 1573375724 1573375724 4096
/opt/write/7 97792 192 81a4 0 0 fd05 655368 1 0 0 1573375835 1573375724 1573375724 4096
/opt/write/5 97792 192 81a4 0 0 fd05 655366 1 0 0 1573375832 1573375724 1573375724 4096
/opt/write/9 97792 192 81a4 0 0 fd05 655370 1 0 0 1573375838 1573375724 1573375724 4096
/opt/write/11 97792 192 81a4 0 0 fd05 655372 1 0 0 1573375832 1573375724 1573375724 4096
/opt/write/8 97792 192 81a4 0 0 fd05 655369 1 0 0 1573375828 1573375724 1573375724 4096
/opt/write/6 97792 192 81a4 0 0 fd05 655367 1 0 0 1573375830 1573375724 1573375724 4096
/opt/write/13 97792 192 81a4 0 0 fd05 655374 1 0 0 1573375832 1573375724 1573375724 4096
/opt/write/10 97792 192 81a4 0 0 fd05 655371 1 0 0 1573375829 1573375724 1573375724 4096
/opt/write/9992 97792 192 81a4 0 0 fd05 665353 1 0 0 1573375829 1573375737 1573375737 4096
/opt/write/9991 97792 192 81a4 0 0 fd05 665352 1 0 0 1573375833 1573375737 1573375737 4096
/opt/write/9993 97792 192 81a4 0 0 fd05 665354 1 0 0 1573375828 1573375737 1573375737 4096
/opt/write/9994 97792 192 81a4 0 0 fd05 665355 1 0 0 1573375832 1573375737 1573375737 4096
/opt/write/9995 97792 192 81a4 0 0 fd05 665356 1 0 0 1573375834 1573375737 1573375737 4096
/opt/write/10000 97792 192 81a4 0 0 fd05 665361 1 0 0 1573375831 1573375737 1573375737 4096
/opt/write/9996 97792 192 81a4 0 0 fd05 665357 1 0 0 1573375828 1573375737 1573375737 4096
/opt/write/9997 97792 192 81a4 0 0 fd05 665358 1 0 0 1573375830 1573375737 1573375737 4096
/opt/write/9998 97792 192 81a4 0 0 fd05 665359 1 0 0 1573375831 1573375737 1573375737 4096
/opt/write/9999 97792 192 81a4 0 0 fd05 665360 1 0 0 1573375838 1573375737 1573375737 4096

需求:/opt/write/数字,根据数字排序
命令:
sort -t "/" -n -k4 stat.log
注:以/为分隔,按数字进行排序,指定的排序列是4

sort:
1.-t 指定文本分隔符 
2.-k 指定排序列 
3.-n 按数字进行排序 
4.-r 翻转排序结果 
5.-g 科学记数法方式比较
6.-o 设置输出文件,与“>”相比可以设置输出到原文件,“>”会清空原文件
7.-u 删除相同行

map:键值

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
读文件放到map中:
https://blog.csdn.net/weixin_42651205/article/details/83624574
cat test.txt
000000000007a16000000088:0
000000000007a16000000089:0
000000000007a16300000087:0
000000000007a16800000088:0

-------------------------------------------------------------
#!/bin/bash
str=(`cat ./test.txt | awk -F ' ' '{print $1}'`)
declare -A mymap; #定义
for i in ${!str[@]}
do
eval $(echo ${str[i]} | awk '{split($0, filearray, ":");print "mymap["filearray[1]"]="filearray[2]}')
done
#输出所有key值
echo ${!mymap[@]}

#输出所有value值
echo ${mymap[@]}

#遍历
for key in ${!mymap[@]}
do
echo "${mymap[$key]}"
done

#查找和删除
findkey="keyx"
value="valuex"

# 查找
echo ${mymap[$findkey]}
#查找插入和删除,找到就删掉,没找到就插入
if [ ! -n "${mymap[$key]}" ]
then
mymap[$findkey]=$value
else
echo "find value"
unset mymap[$findkey]
fi

map详解:
https://www.cnblogs.com/yy3b2007com/p/11267237.html
在使用map时,需要先声明,否则结果可能与预期不同,array可以不声明
方式1:
[root@host102442549 Master]# cat 11.sh
declare -A myMap
myMap["my03"]="03"
echo ${myMap[my03]}
[root@host102442549 Master]# sh 11.sh
03

方式2:
[root@host102442549 Master]# cat 22.sh
declare -A myMap=(["my01"]="01" ["my02"]="02")
myMap["my03"]="03"
myMap["my04"]="04"

echo ${myMap[my01]}
echo ${myMap[my02]}
echo ${myMap[my03]}
echo ${myMap[my04]}
[root@host102442549 Master]# sh 22.sh
01
02
03
04

输出Map所有的key、value、长度:
# 1)输出所有的key
#若未使用declare声明map,则此处将输出0,与预期输出不符,此处输出语句格式比arry多了一个!
echo ${!myMap[@]}

#2)输出所有value
#与array输出格式相同
echo ${myMap[@]}

#3)输出map长度
#与array输出格式相同
echo ${#myMap[@]}

Map遍历:
#1)遍历,根据key找到对应的value
for key in ${!myMap[*]};do
echo $key
echo ${myMap[$key]}
done
#2)遍历所有的key
for key in ${!myMap[@]};do
echo $key
echo ${myMap[$key]}
done
#3)遍历所有的value
for val in ${myMap[@]};do
echo $val
done


测试:
[root@cdh-143 shell-test]# more map-test.sh
#!/bin/sh

echo "一、定义Map:declare -A myMap=([\"myMap00\"]=\"00\" [\"myMap01\"]=\"01\")"
declare -A myMap=(["my00"]="00" ["my01"]="01")
myMap["my02"]="02"
myMap["my03"]="03"

echo "二、输出所有的key:"
echo ${!myMap[@]}

echo "三、输出所有value:"
echo ${myMap[@]}

echo "四、输出map的长度:"
echo ${#myMap[@]}

echo "五、遍历,根据key找到对应的value:"
for key in ${!myMap[*]};do
echo "key:"$key
echo "value:"${myMap[$key]}
done

echo "六、遍历所有的key:"
for key in ${!myMap[@]};do
echo "key:"$key
echo "value:"${myMap[$key]}
done

echo "七、遍历所有value:"
for val in ${myMap[@]};do
echo "value:"$val
done

002-磁盘管理

查看磁盘分区UUID的四种方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1、使用/dev/disk/by-uuid目录
[root@server ~]# ls -l /dev/disk/by-uuid
总用量 0
lrwxrwxrwx. 1 root root 10 8月 19 00:45 bec50c5d-090c-47ad-83d5-25328b4ab7ec -> ../../sda1

2、使用blkid命令
[root@ server ~]# blkid -s UUID /dev/sda1
/dev/sda1: UUID="bec50c5d-090c-47ad-83d5-25328b4ab7ec"

3、使用tune2fs命令
[root@ server ~]# tune2fs -l /dev/sda1 |grep 'UUID'
Filesystem UUID: bec50c5d-090c-47ad-83d5-25328b4ab7ec

4、使用dumpe2fs命令
[root@ server ~]# dumpe2fs /dev/sda1 |grep 'UUID'
dumpe2fs 1.41.12 (17-May-2010)
Filesystem UUID: bec50c5d-090c-47ad-83d5-25328b4ab7ec

如何关闭硬盘写缓存(Write Cache)

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
http://ilinuxkernel.com/?p=897
如何关闭硬盘写缓存(Write Cache
AUG17
2011 1 COMMENT WRITTEN BY CHEN
在Linux中,有时我们希望打开或关闭硬盘写缓存(Write Cache),此时可以用hdparm命令来实现。

建议下载最新hdparm版本,网址为:
http://sourceforge.net/projects/hdparm/

查看当前硬盘写Cache状态
root@ubuntu:~/hdparm-9.37# hdparm -W /dev/sda

关闭硬盘的写Cache
root@ubuntu:~/hdparm-9.37# hdparm -W 0 /dev/sda

打开硬盘的写Cache
root@ubuntu:~/hdparm-9.37# hdparm -W 1 /dev/sda

hdparm其他参数详细说明如下:
root@ubuntu:~/hdparm-9.37# ./hdparm -h
hdparm – get/set hard disk parametersversion v9.37, by Mark Lord.
Usage: hdparm [options] [device …]
Options:
-a Get/set fs readahead
-A Get/set the drive look-ahead flag (0/1)
-b Get/set bus state (0 == off, 1 == on, 2 == tristate)
-B Set Advanced Power Management setting (1-255)
-c Get/set IDE 32-bit IO setting
-C Check drive power mode status
-d Get/set using_dma flag
-D Enable/disable drive defect management
-E Set cd/dvd drive speed
-f Flush buffer cache for device on exit
-F Flush drive write cache
-g Display drive geometry
-h Display terse usage information
-H Read temperature from drive (Hitachi only)
-i Display drive identification
-I Detailed/current information directly from drive
-k Get/set keep_settings_over_reset flag (0/1)
-K Set drive keep_features_over_reset flag (0/1)
-L Set drive doorlock (0/1) (removable harddisks only)
-m Get/set multiple sector count
-M Get/set acoustic management (0-254, 128: quiet, 254: fast)
-n Get/set ignore-write-errors flag (0/1)
-N Get/set max visible number of sectors (HPA) (VERY DANGEROUS)
-p Set PIO mode on IDE interface chipset (0,1,2,3,4,…)
-P Set drive prefetch count
-q Change next setting quietly
-Q Get/set DMA queue_depth (if supported)
-r Get/set device readonly flag (DANGEROUS to set)
-R Obsolete
-s Set power-up in standby flag (0/1) (DANGEROUS)
-S Set standby (spindown) timeout
-t Perform device read timings
-T Perform cache read timings
-u Get/set unmaskirq flag (0/1)
-U Obsolete
-v Use defaults; same as -acdgkmur for IDE drives
-V Display program version and exit immediately
-w Perform device reset (DANGEROUS)
-W Get/set drive write-caching flag (0/1)
-x Obsolete
-X Set IDE xfer mode (DANGEROUS)
-y Put drive in standby mode
-Y Put drive to sleep
-z Re-read partition table
-Z Disable Seagate auto-powersaving mode
–dco-freeze Freeze/lock current device configuration until next power cycle
–dco-identify Read/dump device configuration identify data
–dco-restore Reset device configuration back to factory defaults
–direct Use O_DIRECT to bypass page cache for timings
–drq-hsm-error Crash system with a “stuck DRQ” error (VERY DANGEROUS)
–fallocate Create a file without writing data to disk
–fibmap Show device extents (and fragmentation) for a file
–fwdownload Download firmware file to drive (EXTREMELY DANGEROUS)
–fwdownload-mode3 Download firmware using min-size segments (EXTREMELY DANGEROUS)
–fwdownload-mode3-max Download firmware using max-size segments (EXTREMELY DANGEROUS)
–fwdownload-mode7 Download firmware using a single segment (EXTREMELY DANGEROUS)
–idle-immediate Idle drive immediately
–idle-unload Idle immediately and unload heads
–Istdin Read identify data from stdin as ASCII hex
–Istdout Write identify data to stdout as ASCII hex
–make-bad-sector Deliberately corrupt a sector directly on the media (VERY DANGEROUS)
offset use with -t, to begin timings at given offset (in GiB) from start of drive
–prefer-ata12 Use 12-byte (instead of 16-byte) SAT commands when possible
read-sector Read and dump (in hex) a sector directly from the media
security-help Display help for ATA security commands
trim-sector-ranges Tell SSD firmware to discard unneeded data sectors: lba:count ..
trim-sector-ranges-stdin Same as above, but reads lba:count pairs from stdin
–verbose Display extra diagnostics from some commands
–write-sector Repair/overwrite a (possibly bad) sector directly on the media (VERY DANGEROUS)

root@ubuntu:~/hdparm-9.37#

Linux创建虚拟块设备并格式化为文件系统

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
https://blog.csdn.net/q1449516487/article/details/100518520
dd一个文件映射成一个盘
https://blog.csdn.net/q1449516487/article/details/100518520
https://www.cnblogs.com/xuyaowen/archive/2019/07/10/lustre-loop-device.html
https://www.cnblogs.com/MrVolleyball/p/9993137.html
环境
    为了方便学习文件系统的原理和原始数据的分析,需要创建虚拟块设备并格式化为ext4文件系统;
Linux创建虚拟块设备
    losetup命令
    -a 显示所有已经使用的回环设备状态
    -d 卸除回环设备
    -f 寻找第一个未使用的回环设备
    -e <加密选项> 启动加密编码

1.制作块文件 3
[root@localhost yaoxu]# dd if=/dev/zero of=loop.img bs=10M count=10000

2.创建回环设备
[root@localhost yaoxu]# losetup /dev/loop1 /home/yaoxu/loop.img
或者
[root@localhost yaoxu]#losetup -f /home/yaoxu/loop.img

[root@localhost yaoxu]# ls /dev/loo*
/dev/loop0 /dev/loop1 /dev/loop-control
[root@localhost yaoxu]# losetup -a
/dev/loop1: [64770]:3558 (/home/yaoxu/loop.img)

3. 创建lustre文件系统,并挂载
1
2
3
4
5
6
关于回环设备是什么可以参考如下解释:
回环设备( 'loopback device')允许用户以一个普通磁盘文件虚拟一个块设备。设想一个磁盘设备,对它的所有读写操作都将被重定向到读写一个名为 disk-image 的普通文件而非操作实际磁盘或分区的轨道和扇区。(当然,disk-image 必须存在于一个实际的磁盘上,而这个磁盘必须比虚拟的磁盘容量更大。)回环设备允许你这样使用一个普通文件。

回环设备以 /dev/loop0、/dev/loop1 等命名。每个设备可虚拟一个块设备。注意只有超级用户才有权限设置回环设备。

回环设备的使用与其它任何块设备相同。特别是,你可以在这个设备上创建文件系统并像普通的磁盘一样将它挂载在系统中。这样的一个将全部内容保存在一个普通文件中的文件系统,被称为虚拟文件系统(virtual file system)(译者注:这个用法并不常见。VFS 通常另有所指,如指代 Linux 内核中有关文件系统抽象的代码层次等)。
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
1. 什么是loop设备?

loop设备是一种伪设备,是使用文件来模拟块设备的一种技术,文件模拟成块设备后, 就像一个磁盘或光盘一样使用。在使用之前,一个 loop 设备必须要和一个文件进行连接。这种结合方式给用户提供了一个替代块特殊文件的接口。因此,如果这个文件包含有一个完整的文件系统,那么这个文件就可以像一个磁盘设备一样被 mount 起来。之所以叫loop设备(回环),其实是从文件系统这一层来考虑的,因为这种被 mount 起来的镜像文件它本身也包含有文件系统,通过loop设备把它mount起来,它就像是文件系统之上再绕了一圈的文件系统,所以称为 loop

2. loop设备的使用

一般在linux中会有8loop设备,一般是/dev/loop0~loop7,可用通过losetup -a查看所有的loop设备,如果命令没有输出就说明所有的loop设备都没有被占用,你可以按照以下步骤创建自己的loop设备。

1)创建一个文件
dd if=/dev/zero of=/var/loop.img bs=1M count=10240

2)使用losetup将文件转化为块设备
losetup /dev/loop0 /var/loop.img

3)通过lsblk查看刚刚创建的块设备
lsblk |grep loop0
losetup -a

4)当然,你也可以将这个块设备格式化并创建其他的文件系统,然后再mount到某个目录,有点多余啊,一般人不这么干。

5)要删除这个loop设备可以执行以下命令
losetup -d /dev/loop0
也能参考如下链接:
https://blog.csdn.net/baimafujinji/article/details/78810042
https://cocos.iteye.com/blog/1068619
https://blog.csdn.net/scaleqiao/article/details/46777811
https://www.cnblogs.com/zhanghaiyublog/p/3611507.html

lvm

1
2
raid卡是提高性能的
lvm是增加容量的
1
2
3
4
5
6
7
8
9
10
11
12
磁盘
[root@block-storage14 home]# vgs
VG #PV #LV #SN Attr VSize VFree
datavg 1 1 0 wz--n- 1.34t 1.24t
systemvg 1 7 0 wz--n- 74.51g 4.00m
注释:datavg是数据盘 systemvg是系统盘

lvcreate -L 80G -n metadatalv datavg

lvremove /dev/datavg/data-metadatalv

格式化:mkfs -t ext4 /dev/mapper/datavg-metadatalv
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
https://blog.csdn.net/qq_27721925/article/details/52403912
LVM ——Logical Volume Manager (逻辑卷管理)
逻辑卷管理是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,用来提高磁盘分区管理的灵活性。

一、优点
磁盘空间的动态划分和管理
实现分区的动态拉伸和回缩

二、逻辑卷管理的组成
1、物理卷(PV——Pvcreate Volume)
物理卷在逻辑卷管理中处于最底层,它可以是实际物理硬盘上的分区,也可以是整个物理硬盘。

2、卷组(VG——Vgcreate Group)
卷组建立在物理卷之上,一个卷组中至少要包括一个物理卷,在卷组建立之后可动态添加物理卷到卷组中。一个逻辑卷管理系统中可以只有一个卷组,也可以拥有多个卷组。

3、逻辑卷(LV——Lvcreate Volume)
逻辑卷建立在卷组之上,卷中的未分配空间可以用于建立新的逻辑卷,逻辑卷建立后可以动态地扩展和缩小空间。系统中的多个逻辑卷可以属于同一个卷组,也可以属于不同的多个卷组。

三、LV的创建步骤
LV的创建过程其实是一个先整合、再划分的过程
1)添加硬盘或者创建分区,通知内核
2)创建物理卷
3)创建卷组
4)创建逻辑卷
5)创建文件系统(mkfs.ext4)
6)挂载使用(mkdir;mount)

1、创建分区 划分3个分区,每个2G
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
linux环境下,假设有一个磁盘/dev/vdb(ssd磁盘可能是sda或者sdb),一共200G, 要将其分为3个逻辑分区,分别挂载在/mysql, /binlog, /bak三个目录下
环境:CentOS 7.3
一、创建磁盘分区
# 查看/dev/vdb信息
fdisk -l /dev/vdb
# 初始化磁盘
pvcreate /dev/vdb
# 查看物理磁盘卷
pvs
# 创建一个LVM卷组datavg
vgcreate datavg /dev/vdb
# 查看LVM卷组信息
vgs
# 创建逻辑分区
lvcreate -y -n datalv -L 50G datavg
lvcreate -y -n binloglv -L 50G datavg
lvcreate -y -n baklv -L 99G datavg
# 查看逻辑分区信息
lvs
# 格式化磁盘分区
mkfs.xfs  /dev/datavg/datalv
mkfs.xfs /dev/datavg/baklv
mkfs.xfs /dev/datavg/binloglv
# 挂载分区
mount /dev/datavg/datalv /mysql
mount /dev/datavg/binloglv /binlog
mount /dev/datavg/baklv /bak
# 磁盘分区创建完成,查看磁盘分区信息
df -h -T

二、删除磁盘分区
# 卸载分区
umount /mysql
umount /binlog
umount /bak
# 确认分区已卸载
df -h -T
# 查看逻辑分区
lvs
# 移除逻辑分区
lvremove -y /dev/datavg/datalv
lvremove -y /dev/datavg/binloglv
lvremove -y /dev/datavg/baklv
# 移除LVM卷组
vgremove datavg
# 移除物理磁盘卷
pvremove /dev/vdb

注意:
linux磁盘分区创建与删除会对磁盘上已有的数据造成损坏,谨慎操作。以上命令的详细信息请参考帮助文档,这里不再赘述。

part

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
https://blog.csdn.net/qq_32863631/article/details/76047133
https://www.cnblogs.com/kreo/p/11406217.html
https://blog.csdn.net/sfdst/article/details/81167080
https://blog.csdn.net/qq_32863631/article/details/76047133

创建分区:
[root@localhost ~]# parted /dev/sdb   
GNU Parted 1.8.1 Using /dev/sdb Welcome to GNU Parted! Type ‘help’ to view a list of commands.
(parted) mklabel gpt           # 将MBR磁盘格式化为GPT
(parted) print                       #打印当前分区
(parted) mkpart primary 0 4.5TB                # 分一个4.5T的主分区
(parted) mkpart primary 4.5TB 12TB      # 分一个7.5T的主分区
(parted) print                         #打印当前分区
(parted) quit 退出

或者
GNU Parted 1.8.1 Using /dev/sdb Welcome to GNU Parted! Type ‘help’ to view a list of commands.
(parted) mklabel gpt           # 将MBR磁盘格式化为GPT
(parted) mkpart primary 1 3072 #默认单位是M
(parted) mkpart primary 3072 6144
(parted) mkpart primary 6144 9216
(parted) mkpart primary 9216 12288
(parted) mkpart primary 12288 15360
(parted) mkpart primary 15360 18432
(parted) mkpart primary 18432 21504
(parted) mkpart primary 21504 24577
(parted) quit

mklabel gpt
mkpart primary 1 3072
mkpart primary 3072 6144
mkpart primary 6144 9216
mkpart primary 9216 12288
mkpart primary 12288 15360
mkpart primary 15360 18432
mkpart primary 18432 21504
mkpart primary 21504 24577
mkpart primary 24577 434177

disk=`lsblk|grep 2.9|sed 's/├─//g'|awk '{print $1}'|head -1|sed 's/[1-9]//g'`;parted /dev/${disk}

rm 1
rm 2
rm 3
rm 4
rm 5
rm 6
rm 7
rm 8
rm 9

磁盘开始的位置和磁盘结束的位置,默认单位是M,可以使用unit GB改变默认单位GB
for i in `seq 1 8`;do /home/snbs/ChunkServer/server format -dev=sda${i} -purpose=wcache;done

全闪环境:
mkpart primary 1 3072
mkpart primary 3072 6144
mkpart primary 6144 9216
mkpart primary 9216 12288
mkpart primary 12288 15360
mkpart primary 15360 18432
mkpart primary 18432 21504
mkpart primary 21504 763084

删除分区:
(parted) p
Model: AVAGO AVAGO (scsi)
Disk /dev/sdb: 18.0TB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1 17.4kB 4096GB 4096GB primary

(parted) rm 1
(parted) p
Model: AVAGO AVAGO (scsi)
Disk /dev/sdb: 18.0TB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags

(parted)

fdisk

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
[root@host102442553 ~]# fdisk /dev/sdc

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): d
Partition number (1,2, default 2): 1
Partition 1 is deleted

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

解决:操作完,执行partprobe(#.为了不reboot就能生效,强制内核重新读取分区表)
http://blog.itpub.net/22907091/viewspace-748118/
https://www.cnblogs.com/zsychanpin/p/6784655.html
partprobe包括在parted的rpm软件包中。partprobe能够改动kernel中分区表。使kernel又一次读取分区表。 因此。使用该命令就行创建分区而且在不又一次启动机器的情况下系统可以识别这些分区。
1
2
3
https://www.cnblogs.com/zishengY/p/7137671.html
一.  创建分区
先查看下是否有磁盘没有分区

1584950864092

1
输入p 查看当前硬盘分区,目前没有分区

1584950877483

1
输入n新建一个分区,输入p 建立分区,输入分区编号 1

1584950901855

1
然后会让你设置开始扇区,我填的是开始扇区2048,结束,20480

1584950916178

1
2
可以填“+100G”
最后输入w,回车保存

1584950933865

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
32
33
34
35
36
其实这个时候,建立好的分区还不能用,还需要挂载才可以用。但是挂载之前,必须要格式化,才行。。。

三. 格式化分区
mkfs.ext4   /dev/vdb

四. 挂载
4.1挂载分区
4.1.1 先创建挂载目录
mkdir /lutong
4.1.2 通知系统内核分区表的变化,不然内核不知道分区(或重启系统)
partprobe /dev/vdb
4.1.3 然后再挂载分区
mount /dev/vdb /lutong
4.1.4 最后查看挂载是否成功
df -h
补充:
使用工具partprobe让kernel读取分区信息
[root@db2 ~]# partprobe
使用fdisk工具只是将分区信息写到磁盘,如果需要mkfs磁盘分区则需要重启系统,
而使用partprobe则可以使kernel重新读取分区 信息,从而避免重启系统。

4.2 设置开机自动挂载
vim /etc/fstab
mount -a

五. 卸载及删除分区
5.1 卸载
umount /dev/vdb

5.2 删除分区
fdisk /dev/sdc
m
d
1   
d   #删除
w   #输入 w  保存,这个时候分区以及删除了,可以重新创建了

MBR和GPT

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
模拟磁盘损坏:
https://blog.51cto.com/jk6627/1957816
https://www.cnblogs.com/jenqz/p/3613829.html

目前对于硬盘的分区方式有两种:MBR和GPT。
【MBR的备份和恢复】
采用MBR分区的硬盘中一共有四个分区:扩展分区最多有一个,如果不需要再分逻辑分区,可以没有扩展分区。

我们都知道磁盘上有一个个的磁道,每个磁道上有很多的扇区,从磁盘的外围向内,从0开始逐渐增加磁道编号,每次磁道中的扇区也是从0开始进行编号,而MBR这个数据块就位于0磁道0扇区。

每个扇区的大小为512字节,所以磁盘上的MBR的大小就为512字节,而这512字节又分为:
*主引导程序(偏移地址0000H--0088H),它负责从活动分 区中装载,并运行系统引导程序。
*出错信息数据区(偏移地址0089H--00E1H为出错信息, 00E2H--01BDH全为0字节。)
*分区表(DPT,Disk Partition Table)含4个分区项,偏移地址01BEH--01FDH,每个分区表项长16个字节,共64字节为 分区项1、分区项2、分区项3、分区项4 v
*结束标志字,偏移地址01FE--01FF的2个字节值为结束标志 55AA

所以MBR存储的信息很重要,前446字节的启动引导信息,是当系统启动时由BIOS自举,进行首先查找的地方,根据启动引导中的内容到指定的位置进行加载西东启动文件,所以如果MBR损坏,则系统就启动不起来了。如果启动引导后面的64字节分区表位损坏了,则系统就不能正常识别磁盘中的分区,系统就会认为该磁盘没有分区,也不能正常加载分区,每16位字节标识一个分区,所以一个采用MBR分区方式的硬盘只能分四个分区(除逻辑分区),最后的两位结束为也是很重要的,如果没有结束为,系统就不认为这是一个MBR,就会认为这是一个空盘,结束位标志着分区表的结束,也是一个MBR数据区的结束。

在生产的过程中,我们需要对磁盘的MBR区进行一个备份,以备当MBR区损坏时能够恢复。
而且这个备份的文件是不能还放在这个硬盘下的,一定要备份到远程主机上。

我们在开始试验之前需要了解两个东西:
/dev/zero文件:这个是一个特殊的字符文件,会不断产生返回值0,
dd 这个命令:这个命令可以对块设备进行读写操作。


我们先来查看一下磁盘的MBR区数据,前512字节(我们以sda磁盘为例)
    hexdump -C -n 512 /dev/sda

对磁盘上的MBR区进行备份:(我们以sda盘为例)
    dd if=/dev/sda of=/app/mbr bs=1 count=512

这条命令将sda盘中的前512字节的数据读入到/app/mbr这个文件中了,即使没有这个文件,通过这条命令也会自动生成一个该文件,bs后面默认的是以字节为单位,我们也可以跟上单位自定义大小,count是表示有多少块该大小的数据。
备份完之后我们来查看一下是否备份成功,进入/app下进行查看是否生成了备份文件:

当然,这个备份的文件不能放到当前这个磁盘下,如果我们的MBR区域坏了,系统就启动不起来,而且磁盘就进不去,我们的备份文件就根本找不到。所以通常备份文件都是放到远程主机上的,我们将mbr文件远程拷贝到我的另一台Linux上:

好了,既然已经备份好了,我们就可以直接进行mbr的破坏了,同样我们通过dd 命令写入数据,将sda磁盘中的mbr区的数据给破坏掉:dd if=/dev/zero of=/dev/sda bs=1 count=512
我们之前也提到过了,/dev/zero是一个特殊的字符设备,不断的产生0值,我们将sda前512字节全部重置为0.

通过hexdump -C -n 512 /dev/sda 查看sda前面512都变成了0

现在,我们的系统就不能正常的加载启动了,我们需要把这块破坏的硬盘安装到另一台主机上,通过另一台主机进行修复。
在挂载之前我们要先查看一下我们用来添加磁盘的系统中的磁盘,以确定最后我们是否知道我们添加的是那一块磁盘。

首先,我们要知道被破坏的磁盘的磁盘名,否则我们怎么知道我们要把那一个磁盘安装到另一个主机上。打开虚拟机编辑,找到磁盘对应的磁盘文件名。这是为了方便我们接下来在虚拟机文件中找到这个磁盘文件。

按照步骤来:
    设备进行添加完成之后,我们进行入系统中查看有没有将此硬盘添加进来:

    通过查看,我们发现,虽然我们将磁盘进行了物理的添加,但是系统中,并没有真正的识别,所以我们需要运行echo '- - -' > /sys/class/scsi_host0/scan 这条命令进行系统的识别,有些时候需要向scsi_host2中添加。之后我们在来查看会发现多出来一个sde磁盘,这个磁盘的大小正是我们添加的那块磁盘的大小,所以确定这个就是我们需要修复的那一块磁盘。

   为了进一步的确认这就是我们需要恢复的磁盘,我们再来查看一次。下图中,我们发现磁盘的前512自己全部为0了。


 接下来我们将我们备份的文件,同样的使用dd命令将备份文件写入到被破坏的磁盘中,小编演示如下:

    恢复数据之后要进行查看确认,以确保万无一失。
这个时候我们进行查看磁盘分区情况,看是否会有所改变:

    恢复过MBR分区后,sde中的分区信息就显示出来了。说明我们恢复成功了。我们将磁盘卸载掉,重新挂回原来的系统上,测试一下看是否能够开机成功。
    

    小编这里显示已经成功的开机了!你那边怎么样了?
    一般当我们恢复过之后,其中的分区信息能够显示出来就表明恢复已经成功,我们这个实验是在虚拟机上进行的,现实中的磁盘跟我们的操作思想是一样的。只不过是我们要把磁盘拔下来,插到另一个主机上进行恢复,其思想是完全一样的。
    有时候我们没有备份磁盘的MBR区,但是只要我们有相同分区类型的磁盘(注意:是完全相同的分区类型,其中的数据可以不一样,我们需要的是恢复启动引导和分区表位以及结束位。)也是可以同过这个方法来恢复的。把小编上面演示中的备份文件换成完好的磁盘设备就可以了。

惰性初始化

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
mount的时候:
测试一:惰性初始化
$ time mke2fs -t ext4 /dev/sdm1 //惰性初始化(默认)
测试二:关闭惰性初始化
$ time mke2fs -t ext4 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdm1 //关闭惰性初始化
惰性初始化的好处就是能迅速的创建文件系统,尽量把初始化的工作推迟到挂载后进行。
不建议在benchmark的时候打开该选项,尤其是与其他文件系统做性能测试对比时,会影响测试结果的公允性。

惰性格式化磁盘:
mke2fs -t ext4 -E lazy_itable_init=0 /dev/vdb

块设备磁盘挂载报:wrong fs type,bad option,bad supe

解决:
fsck -y /dev/sdxxxx     最终执行的是这个修复命令

ext4系统调优:
mke2fs -t ext4 -m 0 -b 4096 -O bigalloc,dir_index,extent,extra_isize,flex_bg -E stride=4096,stripe-width=4096 /dev/sde
mount -t ext4 -o max_batch_time=0,discard,data=writeback,stripe=4096,commit=1,journal_async_commit,noatime,nodiratime,inode_readahead_blks=1024 /dev/sde /mnt/test
echo 256 > /sys/block/sde/queue/iosched/fifo_batch
echo 400 > /sys/block/sde/queue/iosched/read_expire
echo 800 > /sys/block/sde/queue/iosched/write_expire

echo 10 > /proc/sys/vm/swappiness
echo 60 > /proc/sys/vm/dirty_ratio
echo 500 > /proc/sys/vm/dirty_expire_centisecs
echo 20 > /proc/sys/vm/dirty_background_ratio
echo 300 > /proc/sys/vm/dirty_writeback_centisecs
浪潮EXT4下流量波动的说明 及调优的情况,@全体成员 ,看下参数调整是否可以用于实际应用

raid卡

1
2
3
参考博客:
https://www.cnblogs.com/luxiaodai/p/9878747.html
https://www.cnblogs.com/liuxing0007/p/10912444.html
1
2
raid卡是提高性能的
lvm是增加容量的
1
2
3
4
5
6
7
查看是否带raid卡:udevadm test-builtin blkid "$device" 2>/dev/null | grep -q "^ID_FS_USAGE=raid"

关于buffer,cache,wb,wt,clean,inv,flush,以及其他
1. 有时候需要区分buffer和cache:buffer解决CPU写的问题,比如将多次写操作buffer起来一次性更新;cache解决CPU读的问题,将数据cache起来在下次读的时候快速取用。
2. cache有两种更新策略:write back和write through。writeback是将待写入memory的数据先放在cache中,直到cache位置将被替换时writeback到memory;write through是将数据同时写入cache和memory。
3. invalidate:将cache数据设置为无效(即discard cache中的数据),不会将cache数据写入memory;clean(write back):将cache数据写进memory;flush:clean and invalidate。
4. 对于DMA From Device to Memory来说,invalidate range未必对其到cache line,这时需要首先将非对齐部分clean到memory,然后invalidate cache
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
/opt/zabbix/lldscripts/MegaRAID/MegaCli/MegaCli64 -AdpAllInfo -a0|grep Policy

1、查看某个盘是否是write through还是write back:【Raid设置直通还是非直通】
cat /sys/block/sdm/device/scsi_disk/0\:2\:0\:0/cache_type

2、lsscsi -s命令可以看出是否是直通模式:【查看系统设置直通还是非直通】
直通模式:原因:[0:0:30:0]是0:0:x:x开头的
[0:0:30:0]   disk    ATA      INTEL SSDSC2KB96 0100  /dev/sda    960GB
[0:0:31:0]   disk    ATA      INTEL SSDSC2KB96 0100  /dev/sdb    960GB
[0:0:32:0]   disk    ATA      ST4000NM0035-1V4 TN05  /dev/sdc   4.00TB
[0:0:33:0]   disk    ATA      ST4000NM0035-1V4 TN05  /dev/sdd   4.00TB
[0:0:34:0]   disk    ATA      ST4000NM0035-1V4 TN05  /dev/sde   4.00TB
[0:0:35:0]   disk    ATA      ST4000NM0035-1V4 TN05  /dev/sdf   4.00TB
[0:0:36:0]   disk    ATA      ST4000NM0035-1V4 TN05  /dev/sdg   4.00TB
[0:0:37:0]   disk    ATA      ST4000NM0035-1V4 TN05  /dev/sdh   4.00TB
[0:0:38:0]   disk    ATA      ST4000NM0035-1V4 TN05  /dev/sdi   4.00TB
[0:0:39:0]   disk    ATA      ST4000NM0035-1V4 TN05  /dev/sdj   4.00TB
[0:0:40:0]   disk    ATA      ST4000NM0035-1V4 TN05  /dev/sdk   4.00TB
[0:0:41:0]   disk    ATA      ST4000NM0035-1V4 TN05  /dev/sdl   4.00TB
[0:2:0:0]    disk    AVAGO    MR-SAS3316       4.74  /dev/sdm   53.6GB
[0:2:1:0]    disk    AVAGO    MR-SAS3316       4.74  /dev/sdn    545GB

非直通模式:原因:[0:2:0:0]是0:2:x:x开头的
[root@host102442549 ~]# lsscsi -s
[0:0:8:0]    enclosu PMCSIERA SXP 24Sx12G      RevB  -               -
[0:2:0:0]    disk    AVAGO    INSPUR           4.67  /dev/sda   53.6GB
[0:2:1:0]    disk    AVAGO    INSPUR           4.67  /dev/sdb    245GB
[0:2:2:0]    disk    AVAGO    INSPUR           4.67  /dev/sdc    959GB
[0:2:3:0]    disk    AVAGO    INSPUR           4.67  /dev/sdd   4.00TB
[0:2:4:0]    disk    AVAGO    INSPUR           4.67  /dev/sde   4.00TB
[0:2:5:0]    disk    AVAGO    INSPUR           4.67  /dev/sdf   4.00TB
[0:2:6:0]    disk    AVAGO    INSPUR           4.67  /dev/sdg   4.00TB
[0:2:7:0]    disk    AVAGO    INSPUR           4.67  /dev/sdh   4.00TB
[0:2:8:0]    disk    AVAGO    INSPUR           4.67  /dev/sdi   4.00TB
[0:2:9:0]    disk    AVAGO    INSPUR           4.67  /dev/sdj   4.00TB
[0:2:10:0]   disk    AVAGO    INSPUR           4.67  /dev/sdk   4.00TB


3、单盘的wt/wb模式:
这个应该是单盘raid0,wt/wb要用raid卡命令看:
/opt/MegaRAID/storcli/storcli64 /c0 show

[root@host10242491 ~]# /opt/MegaRAID/storcli/storcli64 /c0 show
Generating detailed summary of the adapter, it may take a while to complete.

Controller = 0
Status = Success
Description = None

Product Name = INSPUR 3108MR-2GB
Serial Number = RAH516GV0274A30
SAS Address =  56c92bf000697634
PCI Address = 00:04:00:00
System Time = 09/25/2019 09:39:19
Mfg. Date = 12/01/17
Controller Time = 09/25/2019 09:39:17
FW Package Build = 24.12.0-0025
BIOS Version = 6.30.03.0_4.17.08.00_0x06130200
FW Version = 4.620.00-6101
Driver Name = megaraid_sas
Driver Version = 06.803.01.00-rh1
Vendor Id = 0x1000
Device Id = 0x5D
SubVendor Id = 0x1BD4
SubDevice Id = 0x14
Host Interface = PCI-E
Device Interface = SAS-12G
Bus Number = 4
Device Number = 0
Function Number = 0
Drive Groups = 12

TOPOLOGY :
========

-----------------------------------------------------------------------------
DG Arr Row EID:Slot DID Type  State BT       Size PDC  PI SED DS3  FSpace TR
-----------------------------------------------------------------------------
0 -   -   -        -   RAID0 Optl  N    3.637 TB enbl N  N   dflt N      N  
0 0   -   -        -   RAID0 Optl  N    3.637 TB enbl N  N   dflt N      N  
0 0   0   45:0     46  DRIVE Onln  N    3.637 TB enbl N  N   dflt -      N  
1 -   -   -        -   RAID0 Optl  N    3.637 TB enbl N  N   dflt N      N  
1 0   -   -        -   RAID0 Optl  N    3.637 TB enbl N  N   dflt N      N  
1 0   0   45:1     54  DRIVE Onln  N    3.637 TB enbl N  N   dflt -      N  
2 -   -   -        -   RAID0 Optl  N  446.625 GB dflt N  N   dflt N      N  
2 0   -   -        -   RAID0 Optl  N  446.625 GB dflt N  N   dflt N      N  
2 0   0   45:2     47  DRIVE Onln  N  446.625 GB dflt N  N   dflt -      N  
3 -   -   -        -   RAID0 Optl  N  446.625 GB dflt N  N   dflt N      N  
3 0   -   -        -   RAID0 Optl  N  446.625 GB dflt N  N   dflt N      N  
3 0   0   45:3     56  DRIVE Onln  N  446.625 GB dflt N  N   dflt -      N  
4 -   -   -        -   RAID0 Optl  N    3.637 TB enbl N  N   dflt N      N  
4 0   -   -        -   RAID0 Optl  N    3.637 TB enbl N  N   dflt N      N  
4 0   0   45:4     48  DRIVE Onln  N    3.637 TB enbl N  N   dflt -      N  
5 -   -   -        -   RAID0 Optl  N    3.637 TB enbl N  N   dflt N      N  
5 0   -   -        -   RAID0 Optl  N    3.637 TB enbl N  N   dflt N      N  
5 0   0   45:5     55  DRIVE Onln  N    3.637 TB enbl N  N   dflt -      N  
6 -   -   -        -   RAID0 Optl  N    3.637 TB enbl N  N   dflt N      N  
6 0   -   -        -   RAID0 Optl  N    3.637 TB enbl N  N   dflt N      N  
6 0   0   45:6     49  DRIVE Onln  N    3.637 TB enbl N  N   dflt -      N  
7 -   -   -        -   RAID0 Optl  N    3.637 TB enbl N  N   dflt N      N  
7 0   -   -        -   RAID0 Optl  N    3.637 TB enbl N  N   dflt N      N  
7 0   0   45:7     52  DRIVE Onln  N    3.637 TB enbl N  N   dflt -      N  
8 -   -   -        -   RAID0 Optl  N    3.637 TB enbl N  N   dflt N      N  
8 0   -   -        -   RAID0 Optl  N    3.637 TB enbl N  N   dflt N      N  
8 0   0   45:8     50  DRIVE Onln  N    3.637 TB enbl N  N   dflt -      N  
9 -   -   -        -   RAID0 Optl  N    3.637 TB enbl N  N   dflt N      N  
9 0   -   -        -   RAID0 Optl  N    3.637 TB enbl N  N   dflt N      N  
9 0   0   45:9     57  DRIVE Onln  N    3.637 TB enbl N  N   dflt -      N  
10 -   -   -        -   RAID0 Optl  N    3.637 TB enbl N  N   dflt N      N  
10 0   -   -        -   RAID0 Optl  N    3.637 TB enbl N  N   dflt N      N  
10 0   0   45:10    53  DRIVE Onln  N    3.637 TB enbl N  N   dflt -      N  
11 -   -   -        -   RAID0 Optl  N    3.637 TB enbl N  N   dflt N      N  
11 0   -   -        -   RAID0 Optl  N    3.637 TB enbl N  N   dflt N      N  
11 0   0   45:11    51  DRIVE Onln  N    3.637 TB enbl N  N   dflt -      N  
-----------------------------------------------------------------------------

DG=Disk Group Index|Arr=Array Index|Row=Row Index|EID=Enclosure Device ID
DID=Device ID|Type=Drive Type|Onln=Online|Rbld=Rebuild|Dgrd=Degraded
Pdgd=Partially degraded|Offln=Offline|BT=Background Task Active
PDC=PD Cache|PI=Protection Info|SED=Self Encrypting Drive|Frgn=Foreign
DS3=Dimmer Switch 3|dflt=Default|Msng=Missing|FSpace=Free Space Present
TR=Transport Ready

Virtual Drives = 12

VD LIST :
=======

---------------------------------------------------------------
DG/VD TYPE  State Access Consist Cache Cac sCC       Size Name
---------------------------------------------------------------
0/0   RAID0 Optl  RW     Yes     RAWBC -   ON    3.637 TB      
1/1   RAID0 Optl  RW     Yes     RAWBC -   ON    3.637 TB      
2/2   RAID0 Optl  RW     Yes     RAWBC -   ON  446.625 GB      
3/3   RAID0 Optl  RW     Yes     RAWBD -   ON  446.625 GB      
4/4   RAID0 Optl  RW     Yes     RAWBC -   ON    3.637 TB      
5/5   RAID0 Optl  RW     Yes     RAWBC -   ON    3.637 TB      
6/6   RAID0 Optl  RW     Yes     RAWBC -   ON    3.637 TB      
7/7   RAID0 Optl  RW     Yes     RAWBC -   ON    3.637 TB      
8/8   RAID0 Optl  RW     Yes     RAWBC -   ON    3.637 TB      
9/9   RAID0 Optl  RW     Yes     RAWBC -   ON    3.637 TB      
10/10 RAID0 Optl  RW     Yes     RAWBC -   ON    3.637 TB      
11/11 RAID0 Optl  RW     Yes     RAWBC -   ON    3.637 TB      
---------------------------------------------------------------

Cac=CacheCade|Rec=Recovery|OfLn=OffLine|Pdgd=Partially Degraded|Dgrd=Degraded
Optl=Optimal|RO=Read Only|RW=Read Write|HD=Hidden|TRANS=TransportReady|B=Blocked|
Consist=Consistent|R=Read Ahead Always|NR=No Read Ahead|WB=WriteBack|
AWB=Always WriteBack|WT=WriteThrough|C=Cached IO|D=Direct IO|sCC=Scheduled
Check Consistency

#表示raid 是wb模式

Physical Drives = 12

PD LIST :
=======

---------------------------------------------------------------------------------
EID:Slt DID State DG       Size Intf Med SED PI SeSz Model               Sp Type
---------------------------------------------------------------------------------
45:0     46 Onln   0   3.637 TB SATA HDD N   N  512B ST4000NM0035-1V4107 U  -    
45:1     54 Onln   1   3.637 TB SATA HDD N   N  512B ST4000NM0035-1V4107 U  -    
45:2     47 Onln   2 446.625 GB SATA SSD N   N  512B INTEL SSDSC2BB480G6 U  -    
45:3     56 Onln   3 446.625 GB SATA SSD N   N  512B INTEL SSDSC2BB480G6 U  -    
45:4     48 Onln   4   3.637 TB SATA HDD N   N  512B ST4000NM0035-1V4107 U  -    
45:5     55 Onln   5   3.637 TB SATA HDD N   N  512B ST4000NM0035-1V4107 U  -    
45:6     49 Onln   6   3.637 TB SATA HDD N   N  512B ST4000NM0035-1V4107 U  -    
45:7     52 Onln   7   3.637 TB SATA HDD N   N  512B ST4000NM0035-1V4107 U  -    
45:8     50 Onln   8   3.637 TB SATA HDD N   N  512B ST4000NM0035-1V4107 U  -    
45:9     57 Onln   9   3.637 TB SATA HDD N   N  512B ST4000NM0035-1V4107 U  -    
45:10    53 Onln  10   3.637 TB SATA HDD N   N  512B ST4000NM0035-1V4107 U  -    
45:11    51 Onln  11   3.637 TB SATA HDD N   N  512B ST4000NM0035-1V4107 U  -    
---------------------------------------------------------------------------------

EID-Enclosure Device ID|Slt-Slot No.|DID-Device ID|DG-DriveGroup
DHS-Dedicated Hot Spare|UGood-Unconfigured Good|GHS-Global Hotspare
UBad-Unconfigured Bad|Onln-Online|Offln-Offline|Intf-Interface
Med-Media Type|SED-Self Encryptive Drive|PI-Protection Info
SeSz-Sector Size|Sp-Spun|U-Up|D-Down|T-Transition|F-Foreign
UGUnsp-Unsupported|UGShld-UnConfigured shielded|HSPShld-Hotspare shielded
CFShld-Configured shielded|Cpybck-CopyBack|CBShld-Copyback Shielded

http://ilinuxkernel.com/?p=897
如何关闭硬盘写缓存(Write Cache)

1584948682984

应该是内核开的,我记得以前默认都是关闭的,
厂家回复:

storcli64

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
1、简介(软件见附件)
MegaCli 是LSI公司官方提供的SCSI卡管理工具,由于LSI被收购变成了现在的Broadcom,所以现在想下载MegaCli,
需要去Broadcom官网查找Legacy产品支持,搜索MegaRAID即可。
 
现在官方有storcli,storcli已经基本代替了megacli,整合了LSI和3ware所有产品。
 
安装方面比较简单,megacli还要Lib_Utils的支持,而storcli只用一个rpm包就可以下载,
去Broadcom官网去找就行了:https://www.broadcom.com/site-search?q=storcli 【附件有】
 
storcli支持json格式输出,信息解析更加方便。
 
我个人推荐使用这个软件,因为megacli 工具需要安装额外的软件包,有些服务器客户不允许安装其他的软件包,所以比较麻烦。
这个工具直接安装了之后就可以用。
 
 
1.1服务器信息:
[root@xgto01n010244025044 v1]# dmidecode -t 1
# dmidecode 3.0
Getting SMBIOS data from sysfs.
SMBIOS 3.0 present.

Handle 0x0001, DMI type 1, 27 bytes
System Information
Manufacturer: Sugon
Product Name: I620-G20
Version: Grantley-EP
Serial Number: 6100655700926742
UUID: B409F860-C021-11D3-991D-107B44B05C08
Wake-up Type: Power Switch
SKU Number:
Family: Rack

1.2系统信息:
[root@localhost storcli]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.4 (Santiago)
 
1.3 安装storcli
rpm -ivh  storcli-1.03.11-1.noarch.rpm
目录: /opt/Mega/storcli
注意版本问题
我这台服务器是DELL  R720xd,2012年上线的,所以我用的是storcli.1.03.11版本。
我用的新版本安装之后,执行命令没有输出,所以这一点需要注意。
 
1.4一些参数定义:
/cx = Controller ID
/vx = Virtual Drive Number.
/ex = Enclosure ID
/sx = Slot ID
 
1.5为了管理方便,建立软连接
ln -s /opt/MegaRAID/storcli/storcli64 /bin/storcli
ln -s /opt/MegaRAID/storcli/storcli64    /sbin/storcli
 
如果不想建立软连接,就在/opt/MegaRAID/storcli 目录下 执行./storcli64 指令
 
2、查看当前设备raid控制器相关信息
[root@localhost storcli]# ./storcli64 show all    可以看到只有一个控制器
Status Code = 0
Status = Success
Description = None
 
Number of Controllers = 1
Host Name = localhost.localdomain
Operating System  = Linux2.6.32-358.el6.x86_64
 
System Overview :
===============
 
------------------------------------------------------------
Ctl Model Ports PDs DGs DNOpt VDs VNOpt BBU sPR DS EHS ASOs
------------------------------------------------------------
  0 Mini      8  14   3     0   3     0 Opt On  3  N      0      【只看到一个控制器】
------------------------------------------------------------
 
Ctl=Controller Index|DGs=Drive groups|VDs=Virtual drives|Fld=Failed
PDs=Physical drives|DNOpt=DG NotOptimal|VNOpt=VD NotOptimal|Opt=Optimal
Msng=Missing|Dgd=Degraded|NdAtn=Need Attention|Unkwn=Unknown
sPR=Scheduled Patrol Read|DS=DimmerSwitch|EHS=Emergency Hot Spare
Y=Yes|N=No|ASOs=Advanced Software Options|BBU=Battery backup unit
 
ASO :
===

----
Ctl
----
  0
----
 
Cl=Cluster|MD=Max Disks|WC=Wide Cache|SS=Safe Store|FP=Fast Path|Re=Recovery
CR=CacheCade(Read)|RF=Reduced Feature Set|CO=Cache Offload
CW=CacheCade(Read/Write)|X=Not Available/Not Installed|U=Unlimited|T=Trial
 
3、查看控制器c0的相关信息
[root@localhost storcli]# ./storcli64  /c0 show
Controller = 0
Status = Success
Description = None
 
Product Name = PERC H710P Mini【控制器型号】
Serial Number = 26300UP
SAS Address =  5d4ae520a6bcbc00
Mfg. Date = 06/04/12
System Time = 05/22/2019 16:22:28
Controller Time = 05/22/2019 08:22:28
FW Package Build = 21.0.2-0001
BIOS Version = 5.30.00_4.12.05.00_0x05110000
FW Version = 3.130.05-1587
Driver Name = megaraid_sas
Driver Version = 06.504.01.00-rh1
Controller Bus Type = N/A
PCI Slot = N/A
PCI Bus Number = 2
PCI Device Number = 0
PCI Function Number = 0
Drive Groups = 3
 
TOPOLOGY :
========
 
--------------------------------------------------------------------------
DG Arr Row EID:Slot DID Type  State BT       Size PDC  PI SED DS3  FSpace
--------------------------------------------------------------------------
0 -   -   -        -   RAID1 Optl  N  278.875 GB dflt N  N   dflt N      
0 0   -   -        -   RAID1 Optl  N  278.875 GB dflt N  N   dflt N      
0 0   0   32:24    24  DRIVE Onln  N  278.875 GB dflt N  N   dflt -      
0 0   1   32:25    25  DRIVE Onln  N  278.875 GB dflt N  N   dflt -      
1 -   -   -        -   RAID5 Optl  N    4.089 TB dflt N  N   dflt N      
1 0   -   -        -   RAID5 Optl  N    4.089 TB dflt N  N   dflt N      
1 0   0   32:0     0   DRIVE Onln  N   837.75 GB dflt N  N   dflt -      
1 0   1   32:1     1   DRIVE Onln  N   837.75 GB dflt N  N   dflt -      
1 0   2   32:2     2   DRIVE Onln  N   837.75 GB dflt N  N   dflt -      
1 0   3   32:3     3   DRIVE Onln  N   837.75 GB dflt N  N   dflt -      
1 0   4   32:4     4   DRIVE Onln  N   837.75 GB dflt N  N   dflt -      
1 0   5   32:5     5   DRIVE Onln  N   837.75 GB dflt N  N   dflt -      
2 -   -   -        -   RAID5 Optl  N    4.089 TB dflt N  N   dflt N      
2 0   -   -        -   RAID5 Optl  N    4.089 TB dflt N  N   dflt N      
2 0   0   32:6     6   DRIVE Onln  N   837.75 GB dflt N  N   dflt -      
2 0   1   32:7     7   DRIVE Onln  N   837.75 GB dflt N  N   dflt -      
2 0   2   32:8     8   DRIVE Onln  N   837.75 GB dflt N  N   dflt -      
2 0   3   32:9     9   DRIVE Onln  N   837.75 GB dflt N  N   dflt -      
2 0   4   32:10    10  DRIVE Onln  N   837.75 GB dflt N  N   dflt -      
2 0   5   32:11    11  DRIVE Onln  N   837.75 GB dflt N  N   dflt -      【可以看到服务器有几个RAID,每个RAID的级别和成员盘】
--------------------------------------------------------------------------
 
DG=Disk Group Index|Arr=Array Index|Row=Row Index|EID=Enclosure Device ID
DID=Device ID|Type=Drive Type|Onln=Online|Rbld=Rebuild|Dgrd=Degraded
Pdgd=Partially degraded|Offln=Offline|BT=Background Task Active
PDC=PD Cache|PI=Protection Info|SED=Self Encrypting Drive|Frgn=Foreign
DS3=Dimmer Switch 3|dflt=Default|Msng=Missing|FSpace=Free Space Present
 
Virtual Drives = 3【服务器有三个RAID,两个RAID5一个RAID1】
 
VD LIST :
=======
 
---------------------------------------------------------------
DG/VD TYPE  State Access Consist Cache Cac sCC       Size Name
---------------------------------------------------------------
0/0   RAID1 Optl  RW     Yes     RaWBD R   OFF 278.875 GB      
1/1   RAID5 Optl  RW     Yes     RaWBD R   OFF   4.089 TB      
2/2   RAID5 Optl  RW     Yes     RaWBD R   OFF   4.089 TB      
---------------------------------------------------------------
 
Cac=CacheCade|Rec=Recovery|OfLn=OffLine|Pdgd=Partially Degraded|dgrd=Degraded
Optl=Optimal|RO=Read Only|RW=Read Write|B=Blocked|Consist=Consistent|
Ra=Read Ahead Adaptive|R=Read Ahead Always|NR=No Read Ahead|WB=WriteBack|
AWB=Always WriteBack|WT=WriteThrough|C=Cached IO|D=Direct IO|sCC=Scheduled
Check Consistency
 
Physical Drives = 14【十四个物理磁盘】
 
PD LIST :
=======
 
-------------------------------------------------------------------------
EID:Slt DID State DG       Size Intf Med SED PI SeSz Model            Sp
-------------------------------------------------------------------------
32:0      0 Onln   1  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:1      1 Onln   1  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:2      2 Onln   1  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:3      3 Onln   1  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:4      4 Onln   1  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:5      5 Onln   1  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:6      6 Onln   2  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:7      7 Onln   2  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:8      8 Onln   2  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:9      9 Onln   2  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:10    10 Onln   2  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:11    11 Onln   2  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:24    24 Onln   0 278.875 GB SAS  HDD N   N  512B ST9300603SS      U  
32:25    25 Onln   0 278.875 GB SAS  HDD N   N  512B ST9300605SS      U  
-------------------------------------------------------------------------
 
EID-Enclosure Device ID|Slt-Slot No.|DID-Device ID|DG-DriveGroup
DHS-Dedicated Hot Spare|UGood-Unconfigured Good|GHS-Global Hotspare
UBad-Unconfigured Bad|Onln-Online|Offln-Offline|Intf-Interface
Med-Media Type|SED-Self Encryptive Drive|PI-Protection Info
SeSz-Sector Size|Sp-Spun|U-Up|D-Down|T-Transition|F-Foreign
 
BBU_Info :
========
 
------------------------------------------------------------
Model State   RetentionTime Temp Mode MfgDate    Next Learn
------------------------------------------------------------
BBU   Optimal 0 hour(s)     30C  0    2011/07/18 None       
------------------------------------------------------------
 
4、获取enclosure信息
硬盘大多是附在enclosure上不是直接附在controller上。
 
显示所有的enclosure信息,但是系统中只有一个enclosure ,EID:32.
[root@localhost storcli]# ./storcli64 /c0/eall show   
Controller = 0
Status = Success
Description = None
 
 
Properties :
==========
 
-----------------------------------------------------------------------------
EID State Slots PD PS Fans TSs Alms SIM Port#       ProdID    VendorSpecific
-----------------------------------------------------------------------------
32 OK       26 14  0    0   0    0   0 Unavailable BP12G+EXP                
-----------------------------------------------------------------------------
 
EID-Enclosure Device ID |PD-Physical drive count |PS-Power Supply count|
TSs-Temperature sensor count |Alms-Alarm count |SIM-SIM Count
 
获取单个enclosure  ,e32详细信息
[root@localhost storcli]# ./storcli64 /c0/e32 show all
Controller = 0
Status = Success
Description = None
 
Enclosure /c0/e32  :
==================
 
Information :
===========
Device ID = 32
Position = 1
Connector Name = Unavailable
Enclosure Type = SES
Status = OK
FRU Part Number = N/A
Enclosure Serial Number = N/A
ESM Serial Number = N/A
Enclosure Zoning Mode = N/A
Partner Device ID = 65535
 
 
Inquiry Data :
============
Vendor Identification = DP
Product Identification = BP12G+EXP
Product Revision Level = 1.07
 
 
Properties :
==========
 
-----------------------------------------------------------------------------
EID State Slots PD PS Fans TSs Alms SIM Port#       ProdID    VendorSpecific
-----------------------------------------------------------------------------
32 OK       26 14  0    0   0    0   0 Unavailable BP12G+EXP                
-----------------------------------------------------------------------------
 
 
EID-Enclosure Device ID |PD-Physical drive count |PS-Power Supply count|
TSs-Temperature sensor count |Alms-Alarm count |SIM-SIM Count
 
5、显示物理磁盘信息
语法:storcli64  /cx/eall/sall show  显示所有物理磁盘信息
 
[root@localhost storcli]# ./storcli64 /c0/e32/sall   show 【显示e32上的所有物理硬盘】 
 
[root@localhost storcli]# ./storcli64 /c0/eall/sall show【显示所有enclosure下的所有物理硬盘】
Controller = 0
Status = Success
Description = Show Drive Information Succeeded.
 
 
Drive Information :
=================
 
-------------------------------------------------------------------------
EID:Slt DID State DG       Size Intf Med SED PI SeSz Model            Sp
-------------------------------------------------------------------------
32:0      0 Onln   1  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:1      1 Onln   1  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:2      2 Onln   1  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:3      3 Onln   1  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:4      4 Onln   1  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:5      5 Onln   1  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:6      6 Onln   2  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:7      7 Onln   2  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:8      8 Onln   2  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:9      9 Onln   2  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:10    10 Onln   2  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:11    11 Onln   2  837.75 GB SAS  HDD N   N  512B WD9001BKHG       U  
32:24    24 Onln   0 278.875 GB SAS  HDD N   N  512B ST9300603SS      U  
32:25    25 Onln   0 278.875 GB SAS  HDD N   N  512B ST9300605SS      U  
-------------------------------------------------------------------------
 
EID-Enclosure Device ID|Slt-Slot No.|DID-Device ID|DG-DriveGroup
DHS-Dedicated Hot Spare|UGood-Unconfigured Good|GHS-Global Hotspare【表示有热备盘,DHS专有热备,GHS全局热备】
UBad-Unconfigured Bad|Onln-Online|Offln-Offline|Intf-Interface
Med-Media Type|SED-Self Encryptive Drive|PI-Protection Info
SeSz-Sector Size|Sp-Spun|U-Up|D-Down|T-Transition|F-Foreign
 
从上面信息,可以看出:

只有一个控制器,id 0

EID,Enclosure Device ID :32

Slot Number,能看到 0,1,2,3,4,5,6,7,8,9,10,11,24,25

DG:disk group,0,1,2

size:容量,磁盘容量

intf:接口,SAS

Med:介质,ssd hdd
 
 
 
6、查看raid组详细信息
 
查看系统里面有几个raid组:
[root@localhost storcli]# ./storcli64 /c0/vall  show 【查看c0控制下的所有RAID信息】
Controller = 0
Status = Success
Description = None
 
 
Virtual Drives :
==============
 
---------------------------------------------------------------
DG/VD TYPE  State Access Consist Cache Cac sCC       Size Name
---------------------------------------------------------------
0/0   RAID1 Optl  RW     Yes     RaWBD R   OFF 278.875 GB      
1/1   RAID5 Optl  RW     Yes     RaWBD R   OFF   4.089 TB      
2/2   RAID5 Optl  RW     Yes     RaWBD R   OFF   4.089 TB      【显示系统有三个raid组】
---------------------------------------------------------------
 
Cac=CacheCade|Rec=Recovery|OfLn=OffLine|Pdgd=Partially Degraded|dgrd=Degraded
Optl=Optimal|RO=Read Only|RW=Read Write|B=Blocked|Consist=Consistent|
Ra=Read Ahead Adaptive|R=Read Ahead Always|NR=No Read Ahead|WB=WriteBack|
AWB=Always WriteBack|WT=WriteThrough|C=Cached IO|D=Direct IO|sCC=Scheduled
Check Consistency
 
 
 
查看V0  (虚拟磁盘0) raid的详细信息
[root@localhost storcli]# ./storcli64 /c0/v0 show all
Controller = 0
Status = Success
Description = None
 
 
/c0/v0 :
======
 
---------------------------------------------------------------
DG/VD TYPE  State Access Consist Cache Cac sCC       Size Name
---------------------------------------------------------------
0/0   RAID1 Optl  RW     Yes     RaWBD R   OFF 278.875 GB      【V0为RAID1】
---------------------------------------------------------------
 
Cac=CacheCade|Rec=Recovery|OfLn=OffLine|Pdgd=Partially Degraded|dgrd=Degraded
Optl=Optimal|RO=Read Only|RW=Read Write|B=Blocked|Consist=Consistent|
Ra=Read Ahead Adaptive|R=Read Ahead Always|NR=No Read Ahead|WB=WriteBack|
AWB=Always WriteBack|WT=WriteThrough|C=Cached IO|D=Direct IO|sCC=Scheduled
Check Consistency
 
 
PDs for VD 0 :
============
 
-------------------------------------------------------------------------
EID:Slt DID State DG       Size Intf Med SED PI SeSz Model            Sp
-------------------------------------------------------------------------
32:24    24 Onln   0 278.875 GB SAS  HDD N   N  512B ST9300603SS      U  
32:25    25 Onln   0 278.875 GB SAS  HDD N   N  512B ST9300605SS      U  【可以看到24号和25号盘组成了raid1】
-------------------------------------------------------------------------
 
EID-Enclosure Device ID|Slt-Slot No.|DID-Device ID|DG-DriveGroup
DHS-Dedicated Hot Spare|UGood-Unconfigured Good|GHS-Global Hotspare
UBad-Unconfigured Bad|Onln-Online|Offln-Offline|Intf-Interface
Med-Media Type|SED-Self Encryptive Drive|PI-Protection Info
SeSz-Sector Size|Sp-Spun|U-Up|D-Down|T-Transition|F-Foreign
 
 
VD0 Properties :
==============
Strip Size = 64 KB
Span Depth = 1
Number of Drives Per Span = 2
Disk Cache Policy = Disk's Default
Encryption = None
Data Protection = None
Active Operations = None
Exposed to OS = Yes
Creation Date = 05-09-2012
Creation Time = 01:38:23 PM
Emulation type = None
 
7、磁盘状态设置
storcli64    /cx/ex/sx    set    good/offline/online/missing  设置某块磁盘的状态
good        空闲
online/offline       成员盘上下线
missing            设置磁盘为missing状态
 
 
磁盘热备
storcli64 /cx/ex/sx add hotsparedrive dgs=x  设置模块磁盘为diskgroup x 的热备盘
storcli64 /cx/ex/sx add hotsparedrive           设置全局热备
storcli64 /cx/ex/sx delete hotsparedrive
 
 
磁盘rebuild
storcli64 /cx/ex/sx show rebuild  查看rebild
storcli64 /cx/ex/sx start rebuild
storcli64 /cx/ex/sx stop rebuild
 
磁盘点灯
storcli64 /cx/ex/sx start locate
storcli64 /cx/ex/sx stop locate
 
磁盘擦除
快速擦除:
storcli64 /cx/ex/sx set good
storcli64 /cx/fall del|delete [securityKey = xxx]
 
 
完全擦除:
storcli /cx[/ex]/sx secureerase [force]
storcli /cx[/ex]/sx start erase [simple| normal| thorough | standard| threepass | crypto]
storcli /cx[/ex]/sx stop erase
storcli /cx[/ex]/sx show erase
 
8、获取rebuild速率
[root@localhost storcli]# ./storcli64  /c0 show rebuildrate
Controller = 0
Status = Success
Description = None
 
Controller Properties :
=====================

------------------
Ctrl_Prop   Value
------------------
Rebuildrate 30%   
------------------
 
storcli64   /c0  set  rebuildrate=60  设置rebuild速率
 
 
9、清除缓存
清除raid卡,物理磁盘cache
storcli64   /c0    flushcache
苦难并非乐事,但能者等闲视之,人生本来就是苦中作乐,切莫长吁短叹,虚度年华。

MegaCli

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
MegaCli使用参考文档(版本包见附件)
安装megacli
下载megacli时,同时包含了一个依赖包。安装megacli时需要安装该包。

[root@localhost ~]# rpm -ivh Lib_Utils-1.00-08.noarch.rpm
Preparing... ########################################### [100%]
Installing....
1:Lib_Utils ########################################### [100%]
[root@localhost ~]# cd /
[root@localhost /]# rpm -ivh MegaCli-8.00.23-1.i386.rpm
Preparing... ########################################### [100%]
1:MegaCli ########################################### [100%]
注:开机自检时,使用ctrl+y也可直接进入命令行配置界面。
megacli使用
安装megacli后,megacli程序自动安装到/opt/MegaRAID/MegaCli目录下。
[root@localhost MegaCli]# pwd
/opt/MegaRAID/MegaCli
[root@localhost MegaCli]# ls
install.log MegaCli64
查看MegaCli64是一个可以执行的程序,如不可以,使用chmod添加权限即可(chmod 755 Megacli64)。
注意,,ctrl|+y进入命令行后需要区分大小写,系统下megacli不需要区分大小写。

使用./MegaCli64 –help或者./Megacli64 –h查看命令帮助。
查看硬盘列表
[root@localhost MegaCli]# ./MegaCli64 -PDList -aALL
Adapter #0
Enclosure Device ID: 252----背板
Slot Number: 0-----硬盘位置
Device Id: 176
Sequence Number: 1
Media Error Count: 0
Other Error Count: 0
Predictive Failure Count: 0----上面三行查看硬盘是否有坏道以及smart报错。
Last Predictive Failure Event Seq Number: 0
PD Type: SATA
Raw Size: 931.512 GB [0x74706db0 Sectors]
Non Coerced Size: 931.012 GB [0x74606db0 Sectors]
Coerced Size: 930.390 GB [0x744c8000 Sectors]
Firmware state: Unconfigured(good), Spun Up---显示硬盘状态,单独硬盘还是raid中,Firmware state: Online, Spun Up(raid中)
SAS Address(0): 0x9281c06686c5355
Connected Port Number: 0(path0)
Inquiry Data: 9WK0CC10ST31000524NS SN11
FDE Capable: Not Capable
FDE Enable: Disable
Secured: Unsecured
Locked: Unlocked
Needs EKM Attention: No
Foreign State: None
Device Speed: 3.0Gb/s
Link Speed: 3.0Gb/s
Media Type: Hard Disk Device

创建raid
./MegaCli -CfgLdAdd -rX[E0:S0,E1:S1,...] [WT|WB] [NORA|RA|ADRA] [Direct|Cached]
[CachedBadBBU|NoCachedBadBBU] [-szXXX [-szYYY ...]]
[-strpszM] [-Hsp[E0:S0,...]] [-AfterLdX] [-Force]|[FDE|CtrlBased] –aN
非红色部分,如果不填写则使用默认配置,如背板显示不出来,则使用空格代替即可。
[-szXXX [-szYYY ...]] 直接写数字即可,后面省略M,本身代表M。

例如使用四块硬盘创建一个raid5
[root@localhost MegaCli]# ./MegaCli64 -CfgLdadd -r5[252:0,252:1,252:2, 252:3] -a0

Adapter 0: Created VD 0

Adapter 0: Configured the Adapter!!

Exit Code: 0x00
查看raid状态
[root@localhost MegaCli]# ./MegaCli64 -ldinfo -lall -a0

Adapter 0 -- Virtual Drive Information:
Virtual Drive: 0 (Target Id: 0)
Name :
RAID Level : Primary-5, Secondary-0, RAID Level Qualifier-3
Size : 2.725 TB
State : Optimal
Stripe Size : 64 KB
Number Of Drives : 4
Span Depth : 1
Default Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Current Cache Policy: WriteThrough, ReadAheadNone, Direct, No Write Cache if Bad BBU
Access Policy : Read/Write
Disk Cache Policy : Disk's Default
Encryption Type : None
Exit Code: 0x00
[root@localhost MegaCli]# ./MegaCli64 -ldinfo -l0 -a0

Adapter 0 -- Virtual Drive Information:
Virtual Drive: 0 (Target Id: 0)
Name :
RAID Level : Primary-1, Secondary-0, RAID Level Qualifier-0
Size : 930.390 GB
State : Optimal
Stripe Size : 64 KB
Number Of Drives : 2
Span Depth : 1
Default Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Current Cache Policy: WriteThrough, ReadAheadNone, Direct, No Write Cache if Bad BBU
Access Policy : Read/Write
Disk Cache Policy : Disk's Default
Encryption Type : None

[root@localhost MegaCli]# ./MegaCli64 -ldinfo -l0 -a0


Adapter 0 -- Virtual Drive Information:
Virtual Drive: 0 (Target Id: 0)
Name :
RAID Level : Primary-0, Secondary-0, RAID Level Qualifier-0
Size : 1.816 TB
State : Optimal
Stripe Size : 64 KB
Number Of Drives : 2
Span Depth : 1
Default Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Current Cache Policy: WriteThrough, ReadAheadNone, Direct, No Write Cache if Bad BBU
Access Policy : Read/Write
Disk Cache Policy : Disk's Default
Encryption Type : None

Raid状态以及raid中包含哪些硬盘
[root@localhost MegaCli]# ./MegaCli64 -ldpdinfo -a0



删除raid
[root@localhost MegaCli]# ./MegaCli64 -cfglddel -l0 -a0

Adapter 0: Deleted Virtual Drive-0(target id-0)
Exit Code: 0x00
做热备
【root@localhost MegaCli]# ./MegaCli64 -pdhsp -set -physdrv[252:3] -a0

Adapter: 0: Set Physical Drive at EnclId-252 SlotId-3 as Hot Spare Success.

Exit Code: 0x00
查看热备盘状态:Firmware state: Hotspare, Spun Up
热备盘删除
./MegaCli64 -PDHSP -Rmv -PhysDrv[Ex:Sx] –aALL

5、uncfgure bad硬盘改成uncfgure good硬盘
MegaCli -PDMakeGood -PhysDrv[E0:S0,E1:S1,...] | [-Force] -aN|-a0,1,2|-aALL
Uncfgure bad状态硬盘,无法对其进行操作。

6、删除foreign信息
MegaCli -CfgForeign -Scan | [-SecurityKey sssssssssss] -aN|-a0,1,2|-aALL
MegaCli -CfgForeign -Clear [x]|[-SecurityKey sssssssssss] -aN|-a0,1,2|-aALL
x - index of foreign configurations. Optional. All by default.
7、如何做rebuild
如有热备盘,硬盘掉线后,热备盘会自动rebuild。
热备盘自动rebuid
Enclosure Device ID: 252
Slot Number: 2
Device Id: 178
Sequence Number: 6
Media Error Count: 0
Other Error Count: 0
Predictive Failure Count: 0
Last Predictive Failure Event Seq Number: 0
PD Type: SATA
Raw Size: 931.512 GB [0x74706db0 Sectors]
Non Coerced Size: 931.012 GB [0x74606db0 Sectors]
Coerced Size: 930.390 GB [0x744c8000 Sectors]
Firmware state: Rebuild
SAS Address(0): 0x9281c0667817c71
Connected Port Number: 2(path0)
Inquiry Data: 9WK0BXZLST31000524NS SN11
FDE Capable: Not Capable
FDE Enable: Disable
Secured: Unsecured
Locked: Unlocked
Needs EKM Attention: No
Foreign State: None
Device Speed: 3.0Gb/s
Link Speed: 3.0Gb/s
Media Type: Hard Disk Device
使用MegaCli -PDRbld -ShowProg -PhysDrv [E0:S0,E1:S1,...] -aN|-a0,1,2|-aALL来查看硬盘rebuild进程。
Rebuid结束后,掉线槽位硬盘更换后,自动从热备拷回数据,原热备盘再次变成热备盘,
Enclosure Device ID: 252
Slot Number: 1
Device Id: 179
Sequence Number: 2
Media Error Count: 0
Other Error Count: 0
Predictive Failure Count: 0
Last Predictive Failure Event Seq Number: 0
PD Type: SATA
Raw Size: 931.512 GB [0x74706db0 Sectors]
Non Coerced Size: 931.012 GB [0x74606db0 Sectors]
Coerced Size: 930.390 GB [0x744c8000 Sectors]
Firmware state: Copyback
SAS Address(0): 0x9281c06595f6f7c
Connected Port Number: 1(path0)
Inquiry Data: 9WK046MWST31000524NS SN11
FDE Capable: Not Capable
FDE Enable: Disable
Secured: Unsecured
Locked: Unlocked
Needs EKM Attention: No
Foreign State: None
Device Speed: 3.0Gb/s
Link Speed: 3.0Gb/s
Media Type: Hard Disk Device

热备盘在rebuid过程中,更换掉线槽位硬盘,查看该硬盘是否有media error即可,确认硬盘为uncfgure good状态,一般RAID卡都可以copyback,后续硬盘会自动从原热备盘拷回数据。
但是考虑到存在无法copyback的情况,在热备盘rebuild完成后再更换硬盘。
无热备盘情况,更换新硬盘,如果自动rebuild,则正常结束即可,如不自动rebuild,可以配置成热备盘。

8、查看raid卡日志
#/opt/MegaRAID/MegaCli/MegaCli64 -FwTermLog -Dsply -aALL
9、显示Raid卡型号,Raid设置,Disk相关信息
#/opt/MegaRAID/MegaCli/MegaCli64 -cfgdsply -aALL
10、查看RAID阵列中掉线的盘
/opt/MegaRAID/MegaCli/MegaCli64 -pdgetmissing -a0

去除raid 0

1
2
1.BMC进入设备终端
2.执行reboot

3.启动过程中执行:ctrl+r 进入raid模式

1584948967541

4.选中RAID 0,按F2,选中Delete Drive Group,按enter选择YES,确认删除

1584948981764

1584948995283

5.按Ctrl+N进入下一页,TAB选择到JBOD,按空格勾选(x),下图是没勾选,选择apply提交

1584949016403

1584949025247

6.以及按Ctrl+p向前查看磁盘是否都做了jbod

查看磁盘型号

1
smartctl --all /dev/sda

003-网络

时间同步及设置ip

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
服务器时间同步:
ntpdate 对应的ip
添加定时任务:切换到root用户,crontab –e编辑定时任务,添加如下:
*/5 * * * * /usr/sbin/sntp -P no -r 30.30.100.12;hwclock –w(加黑ip为时间标准服务器)
有的时候平台zxuss会影响时间同步,需要先停掉平台:pkill -9 ZXUSS
有几个服务器设置不成功用的以下方法:
命令:yast:进设置,选择system>DATA and Time>选择时区

ip
[root@halo network-scripts]# more ifcfg-eth0
DEVICE=eth0
HWADDR=00:0C:29:B1:17:0F
TYPE=Ethernet
UUID=f109427a-2184-41f1-88e9-fc8e3143f80b
ONBOOT=yes
NM_CONTROLLED=yes
=none
BOOTPROTO=static
IPADDR=30.30.3.1
NETMASK=255.255.0.0
[root@halo network-scripts]# pwd
/etc/sysconfig/network-scripts
2017-02-23 10:07:49*[马正园10125555]说:
[root@halo sysconfig]# more network
NETWORKING=yes
HOSTNAME=halo
GATEWAY=30.30.30.254
[root@halo sysconfig]# pwd
/etc/sysconfig
vi /etc/sysconfig/network/ifcfg-eth0

centos关闭防火墙

1
2
3
4
5
CentOS7用firewall命令“替代”了iptables。
关闭firewall:
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)

ping

1
2
3
4
5
需要使用ping命令的-c参数和-s参数,其含义如下:
-c 数目:在发送指定数目的包后停止。
-s 字节数:指定发送的数据字节数,预设值是56,加上8字节的ICMP头,一共是64ICMP数据字节。
用法示例:
$ ping -c 4 -s 1500 192.168.1.1

telnet

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
情景
telnet命令是TELNET协议的用户接口,它支持两种模式:命令模式和会话模式。虽然telnet支持许多命令,但大部分情况下,我们只是使用它查看目标主机是否打开了某端口(默认是23)。
其执行结果有两种:
端口未打开
$ telnet 101.199.97.65 62715
Trying 101.199.97.65...
telnet: connect to address 101.199.97.65: Connection refused
此时,命令已退出。
端口已打开
$ telnet 101.199.97.65 62715
Trying 101.199.97.65...
Connected to 101.199.97.65.
Escape character is '^]'.
此时命令未退出。
根据提示Escape character is '^]'.可知退出字符为'^]'(CTRL+])。此时输入其它字符不能使其退出,CTRL+C都不行。输入CTRL+]后会自动执行,进入命令模式:
^]
telnet>
此时再运行quit才会真正退出。
telnet> quit
Connection closed.
其中,Escape character可以自定义,使用参数-e:
$ telnet -e p 101.199.97.65 62715
Telnet escape character is 'p'.
Trying 101.199.97.65...
Connected to 101.199.97.65.
Escape character is 'p'.
p
telnet> quit
Connection closed.
即便如此,退出telnet还是麻烦。那么,更进一步,如果出现在脚本中应该如何(优雅地)退出telnet呢?

方案
其实可以这样:
输出结果后立即退出
$ echo "" | telnet 101.199.97.65 62715
Trying 101.199.97.65...
Connected to 101.199.97.65.
Escape character is '^]'.
Connection closed by foreign host.
$ echo "" | telnet 101.199.97.65 62715
Trying 101.199.97.65...
telnet: connect to address 101.199.97.65: Connection refused
输出结果后延迟退出
sleep 2使得telnet输出结果后,停留2秒后退出命令模式。
$ sleep 2 | telnet 101.199.97.65 62715
Trying 101.199.97.65...
Connected to 101.199.97.65.
Escape character is '^]'.
Connection closed by foreign host.
使用这种方式可以将标准输出和标准错误重定向到文件中,通过分析文件的内容来判断端口打开状态。

ssh

1
2
3
4
vdbench免密拷机的时候,会无缘无故的退出,之后发现ssh超时,需要注释下面两行,重启sshd
[root@sdfspstapp01 mnt]# cat /etc/ssh/sshd_config |grep -E "ClientAliveInterval|ClientAliveCountMax"
#ClientAliveInterval 600
#ClientAliveCountMax 0
1
2
3
4
5
6
7
增加ssh连接数:
修改服务器上的这个文件:/etc/ssh/sshd_config,找到两行:
MaxSessions:最大允许链接数,默认10.
MaxStartups:最大允许保持多少个未认证链接(未输入登录密码),默认值是10.
把他们的数字改大,例如改成
MaxSessions 1000
MaxStartups 1000
1
2
远程到另外一台linux设备并执行命令:
ssh root@10.244.25.11 "cd /home;touch 4.19"

sshpass

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# yum -y install sshpass

实例1:本地执行远程机器的命令:
命令: sshpass -p xxx ssh root@192.168.11.11 "ethtool eth0"

实例2:远程连接指定ssh的端口:
命令:sshpass -p 123456 ssh -p 1000 root@192.168.11.11
(当远程主机不是默认的22端口时候)

实例3:从密码文件读取文件内容作为密码去远程连接主机
命令:sshpass -f xxx.txt ssh root@192.168.11.11

实例4:从远程主机上拉取文件到本地
命令: sshpass -p '123456' scp root@host_ip:/home/test/t ./tmp/

scp

1
2
3
远程拷贝:scp -r -P PORT /home/setup root@80.80.45.37:/home/setup(-P PORT为指定端口)
scp -r /home/zxcdn/*.tar.gz root@10.47.235.167:/home/zxcdn/
这边为要拷贝的内容 这边是目标地址(要拷到哪个目录下)

双网卡配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
9。双网卡配置:
ifcfg-br0
ifcfg-br0:1
[root@ceph-osd2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0:1
DEVICE=br0
BOOTPROTO=static
NM_CONTROLLED=yes
ONBOOT=yes
TYPE=Bridge
IPADDR=10.37.2.203
NETMASK=255.255.255.0
[root@ceph-osd2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
BOOTPROTO=static
NM_CONTROLLED=yes
ONBOOT=yes
TYPE=Bridge
IPADDR=10.37.2.17
NETMASK=255.255.255.0
GATEWAY=10.37.2.254
然后重启网卡

设备重启后网口变了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
压测环境:
eth1 千兆
eth2 万兆
eth3 千兆
eth4 万兆

问题:
eth2 eth4原来是万兆做的bond 1,重启设备后发现eth1变成了万兆eth2变成了千兆

解决:

1.修改/etc/udev/rules.d/70-persistent-net.rules【没有的话创建一个就行】放入下面内容

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="2c:4d:54:47:c6:71", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="2c:4d:54:47:c6:72", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="90:e2:ba:ef:22:b4", ATTR{type}=="1", KERNEL=="eth*", NAME="eth2"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="90:e2:ba:ef:22:b5", ATTR{type}=="1", KERNEL=="eth*", NAME="eth3"

2c:4d:54:47:c6:71 mac地址
修改mac地址变成对应网卡的就行【ip a可以查询,如果做了bond,mac会重复,建议使用cat /proc/net/bonding/bond0 |grep -E "Slave Interface|Permanent HW addr"

2.重启设备【reboot或者init 0】

路由

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
32
33
34
35
36
37
38
39
有的端口不是默认的
windows下添加路由
我的电脑:小网网关:172.18.100.254
大网网关:10.47.214.1
比如一个服务器的ip:30.30.3.4
route add 30.30.0.0 mask 255.255.0.0 172.18.100.254
linux下添加路由,内容下发,tomcat日志显示ftp不通
10.47.231.4310不与30的通,10的还有一个ip为80的,所以加80的网关)
route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.47.231.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
10.229.0.0 80.80.80.254 255.255.0.0 UG 0 0 0 eth0
80.80.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
0.0.0.0 10.47.231.1 0.0.0.0 UG 0 0 0 eth1
route add -net 30.1.0.0 netmask 255.255.0.0 gw 80.80.80.254 dev eth0
route add –net 30.1.170.130
linux添加永久路由
cd /etc/sysconfig/network-scripts
more route-eth0
vi route-eth0
10.229.0.0/16 via 80.80.80.254
70.0.0.0/8 via 80.80.80.254
172.0.0.0/8 via 80.80.80.254
~
~
~
~
/etc/init.d/network restart
more ifcfg-eth0
more ifcfg-eth1
172.0.0.0/8 via 80.80.80.254
网段/子网掩码 via 网关
问题:itool连接失败(rr:80.80.41.196
网段:IPv4 地址: 172.18.100.33
IPv4 子网掩码: 255.255.0.0
8:代表子网掩码
网关:route命令 查看80.80.41.196的网关(Gateway):80.80.80.254

004-调试命令

watch

1
watch "ls -lh snbs.bin"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
linux watch 命令使用;进行循环执行程序,并显示结果;https://www.cnblogs.com/xuyaowen/p/watch-proc.html

watch 能间歇地执行程序,并将输出结果以全屏的方式显示,默认时2s执行一次;
watch -n 5 ping -c 1 www.baidu.com # 进行循环5秒钟,发送一次ping包;
使用范例:
To watch for mail, you might do

watch -n 60 from

To watch the contents of a directory change, you could use

watch -d ls -l

If you're only interested in files owned by user joe, you might use

watch -d 'ls -l | fgrep joe'

To see the effects of quoting, try these out

watch echo $$
watch echo '$$'
watch echo "'"'$$'"'"

screen

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
5.4 会话分离与恢复
你可以不中断screen窗口中程序的运行而暂时断开(detach)screen会话,并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序。例如,我们打开一个screen窗口编辑/tmp/david.txt文件:
[root@TS-DEV ~]# screen vi /tmp/david.txt
之后我们想暂时退出做点别的事情,比如出去散散步,那么在screen窗口键入C-a d,Screen会给出detached提示:
暂时中断会话
半个小时之后回来了,找到该screen会话:
[root@TS-DEV ~]# screen -ls

重新连接会话:
[root@TS-DEV ~]# screen -r 12865
一切都在。
当然,如果你在另一台机器上没有分离一个Screen会话,就无从恢复会话了。
这时可以使用下面命令强制将这个会话从它所在的终端分离,转移到新的终端上来:

5.5 清除dead 会话
如果由于某种原因其中一个会话死掉了(例如人为杀掉该会话),这时screen -list会显示该会话为dead状态。使用screen -wipe命令清除该会话:

5.6 关闭或杀死窗口
正常情况下,当你退出一个窗口中最后一个程序(通常是bash)后,这个窗口就关闭了。另一个关闭窗口的方法是使用C-a k,这个快捷键杀死当前的窗口,同时也将杀死这个窗口中正在运行的进程。
如果一个Screen会话中最后一个窗口被关闭了,那么整个Screen会话也就退出了,screen进程会被终止。
除了依次退出/杀死当前Screen会话中所有窗口这种方法之外,还可以使用快捷键C-a :,然后输入quit命令退出Screen会话。需要注意的是,这样退出会杀死所有窗口并退出其中运行的所有程序。其实C-a :这个快捷键允许用户直接输入的命令有很多,包括分屏可以输入split等,这也是实现Screen功能的一个途径,不过个人认为还是快捷键比较方便些。

curl

1
2
3
shell脚本curl命令,会出现有些链接,链接不上的问题:
修改系统参数解决:
sysctl -a 查看系统参数
1
curl 带-w "%{http_code}"这个参数直接返回code

dmesg

1
命令:dmesg

tc命令

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
1 模拟延迟传输简介
netem tc: netem Linux 2.6 及以上内核版本提供的一个网络模拟功能模块。该功能模块可以用来在性能良好的局域网中,模拟出复杂的互联网传输性能,诸如低带宽、传输延迟、丢包等等情况。使用 Linux 2.6 (或以上) 版本内核的很多发行版 Linux 都开启了该内核功能,比如 Fedora、Ubuntu、Redhat、OpenSuse、CentOS、Debian 等等。 tc 是Linux 系统中的一个工具,全名为 traffic control(流量控制)。tc 可以用来控制 netem 的工作模式,也就是说,如果想使用 netem ,需要至少两个条件,一个是内核中的 netem 功能被包含,另一个是要有 tc
需要注意的是:本文介绍的流控只能控制发包动作,不能控制收包动作,同时,它直接对物理接口生效,如果控制了物理的 eth0,那么逻辑网卡(比如 eth0:1)也会受到影响,反之,如果您在逻辑网卡上做控制,该控制可能是无效的。(注:虚拟机中的多个网卡可以在虚拟机中视为多个物理网卡)。

# tc qdisc add dev eth0 root netem delay 100ms
该命令将 eth0 网卡的传输设置为延迟 100 毫秒发送。

更真实的情况下,延迟值不会这么精确,会有一定的波动,我们可以用下面的情况来模拟出
带有波动性的延迟值:
# tc qdisc add dev eth0 root netem delay 100ms 10ms
该命令将 eth0 网卡的传输设置为延迟 100ms ± 10ms (90 ~ 110 ms 之间的任意值)发送。
还可以更进一步加强这种波动的随机性:


# tc qdisc add dev eth0 root netem delay 100ms 10ms 30%
该命令将 eth0 网卡的传输设置为 100ms ,同时,大约有 30% 的包会延迟 ± 10ms 发送。示例:现在 ping 一下 216 机器:
易宝支付有限公司
可以看出数据明显的波动性。


3 模拟网络丢包:
# tc qdisc add dev eth0 root netem loss 1%
该命令将 eth0 网卡的传输设置为随机丢掉 1% 的数据包。示例:在 216 上执行
#tc qdisc add dev eth0 root netem loss 10%
显示 16 个包只有 13 个收到了。也可以设置丢包的成功率:
# tc qdisc add dev eth0 root netem loss 1% 30%
该命令将 eth0 网卡的传输设置为随机丢掉 1% 的数据包,成功率为 30% 
4.删除网卡上面的相关配置:将之前命令中的 add 改为 del 即可删除配置:
# tc qdisc del dev eth0 XXXXXXXXXXX(自己加的配置)该命令将 删除 eth0 网卡的相关传输配置
至此,我们已经可以通过 TC 在测试环境中模拟一定的网络延时和丢包的情况。下面是关于tc 更多的应用和介绍
5 模拟包重复:
# tc qdisc add dev eth0 root netem duplicate 1%
该命令将 eth0 网卡的传输设置为随机产生 1% 的重复数据包 。6 模拟数据包损坏:
# tc qdisc add dev eth0 root netem corrupt 0.2%
该命令将 eth0 网卡的传输设置为随机产生 0.2% 的损坏的数据包  (内核版本需在 2.6.16 以上)
7 模拟数据包乱序:
# tc qdisc change dev eth0 root netem delay 10ms reorder 25% 50%
该命令将 eth0 网卡的传输设置为:有 25% 的数据包(50%相关)会被立即发送,其他的延迟10 秒。
新版本中,如下命令也会在一定程度上打乱发包的次序:# tc qdisc add dev eth0 root netem delay 100ms 10ms
8 查看已经配置的网络条件:# tc qdisc show dev eth0



查看:
tc qdisc ls dev eth0





2、限制eth0网卡的带宽为50kbit:
/sbin/tc qdisc add dev eth0 root tbf rate 50kbit latency 50ms burst 1000 

3、限制带宽为50kbit后,在百兆局域网中wget下载一个大文件:
[root@localhost ~]# wget http://192.168.1.7/test.zip 
--19:40:27--  http://192.168.1.7/test.zip
Connecting to 192.168.1.7:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 23862312 (23M) [application/zip]
Saving to: `test.zip'

37% [=======>   ] 8,994,816     457K/s   eta 27s 
下载速度为457K/s,限制效果达到。

4、解除eth0网卡的带宽限制:
/sbin/tc qdisc del dev eth0 root tbf 

5、对比:未作带宽限制情况下,在百兆局域网中wget下载一个大文件:
[root@localhost ~]# wget http://192.168.1.7/test.zip    
--19:44:33--  http://192.168.1.7/test.zip
Connecting to 192.168.1.7:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 23862312 (23M) [application/zip]
Saving to: `test.zip'

100%[==========>] 23,862,312   6.14M/s   in 3.7s   

19:44:36 (6.16 MB/s) - `test.zip' saved [23862312/23862312] 
下载速度为6.16MB/s。



from blog.s135.com 张宴
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Linux 中模拟延时和丢包的实现
使用ifconfig命令查看网卡
Linux 中使用 tc 进行流量管理。具体命令的使用参考 tc 的 man 手册,这里简单记录一下使用 tc 模拟延时和丢包的命令。
ping出来的最小单位为1毫秒,在执行压测之前,最好用压力机ping一下服务器,如果延迟很高,就没必要测了,因为请求还没发出去都已经有一段时间的消耗了

 
1. 延时
1)设置延时:给 eth0 设备发包时添加 30ms 的延时(从网卡)。tc qdisc add dev eth0 root netem delay 30ms
2)显示延时的设置:tc qdisc show
ping一下,看结果
3) 修改延时:tc qdisc change dev eth0 root netem delay 40ms
4) 删除延时的配置:tc qdisc del dev eth0 root netem delay 40ms

2. 丢包
设置丢包命令如下:tc qdisc add dev eth0 root netem loss 10%(丢10%的包,这里可以按实际情况设置)
ping一下,每过一段时间就会有一次请求超时,出现概率就是上面设置的概率
如果是通过 SSH 登录设备进行配置丢包的话,配置完这条命令就会感觉到机器访问时有点一卡一卡的。这说明,设备已经开始丢包了,可以通过具体抓包查看。 
其他诸如修改、查看、删除的命令,都可以参考上面延时的设置。
 
不用了一定要删除设置,要不然会一直存在

长短链接

1
2
3
4
5
6
7
8
9
1、长短链接
以后要是推测长短连接的问题,可以直接netstat 看端口变化频率就好了,不用费这么大劲抓包。。。傻愣愣的抓了半个下午。。。-_-||
分域测试报500

ps:如何查看是否是长短链接??
比如查看volume的链接:
netstat -anpl|grep "10.244.76.84:8080"
下图中的红框子里面的端口如果是短链接,变化会很快;如果是长连接,可能30秒才变一次
注释:curl命令走的就是短链接

内存泄露

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@sdosspststorage10 my]# ps -ef|grep fuse|grep -v grep
root 10223 1 8 09:04 ? 00:53:40 /mnt/data2/ossfuse/sdoss/weed -v=4 -http=true -log_dir=/mnt/data2/ossfuse/log ossfuse -bucket=fusebucket -mountpoint=/mnt/data2/ossfuse/test -ossendpoint=osspstxg.cnsuning.com
[root@sdosspststorage10 my]# top -p 10223
top - 19:28:09 up 178 days, 23:46, 10 users, load average: 1.37, 1.23, 1.18
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.9%us, 6.1%sy, 0.0%ni, 92.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.1%st
Mem: 16334344k total, 15974360k used, 359984k free, 59644k buffers
Swap: 10485752k total, 5624620k used, 4861132k free, 3207248k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10223 root 20 0 3031m 456m 3564 S 0.0 2.9 53:40.33 weed

RES值:应该变化不是太大,如果有增长,之后还是会降下来的,不降就是内存泄露

005-字符串

1
2
echo是没有opone的
echo "sadnasjn" >> 1.txt

字符串大小写转换

1
2
3
4
5
6
7
8
9
10
11
12
13
https://www.cnblogs.com/loveyouyou616/p/10416507.html
#! /bin/bash
# 注意:脚本第一行一定要注明脚本解释器是bash.不能是sh,或dash
# 因为sh软连接有可能指向的是dash
var="Hello,Word"
# 把变量中的第一个字符换成大写
echo ${var^}
# 把变量中的所有小写字母,全部替换为大写
echo ${var^^}
# 把变量中的第一个字符换成小写
echo ${var,}
# 把变量中的所有大写字母,全部替换为小写
echo ${var,,}

shuf命令

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
shuf命令把输入行按随机顺序输出到标准输出。

用法
shuf [选项]... [文件]
或者
shuf -e [选项]... [参数]...
又或者
shuf -i LO-HI [选项]...

常用参数
-e, --echo
将每个参数视为输入行
-i, --input-range=LO-HI
将LO 到HI 的每个数字视为输入行
-n, --head-count=行数
最多输出指定的行数
-o, --output=文件
将结果输出到指定文件而非标准输出
--random-source=文件
从指定文件获得随机比特
-z, --zero-terminated
0 结束行而非新行
--help
显示此帮助信息并退出
--version
显示版本信息并退出
如果没有指定文件,或者文件为"-",则从标准输入读取。

我有一个名为 ostechnix.txt 的文件,内容如下:
$ cat ostechnix.txt
line1
line2
line3
line4
line5
line6
line7
line8
line9
line10
现在让我们以随机顺序显示上面的行。为此,请运行:
$ shuf ostechnix.txt
line2
line8
line5
line10
line7
line1
line4
line6
line9
line3
看到了吗?上面的命令将名为 ostechnix.txt 中的行随机排列并输出了结果。

你可能想将输出写入另一个文件。例如,我想将输出保存到 output.txt 中。为此,请先创建 output.txt:
$ touch output.txt
然后,像下面使用 -o 标志将输出写入该文件:
$ shuf ostechnix.txt -o output.txt
上面的命令将随机随机打乱 ostechnix.txt 的内容并将输出写入 output.txt。你可以使用命令查看 output.txt 的内容:
$ cat output.txt
line2
line8
line9
line10
line1
line3
line7
line6
line4
line5
我只想显示文件中的任意一行。我该怎么做?很简单!
$ shuf -n 1 ostechnix.txt
line6
同样,我们可以选择前 “n” 个随机条目。以下命令将只显示前五个随机条目:
$ shuf -n 5 ostechnix.txt
line10
line4
line5
line9
line3
如下所示,我们可以直接使用 -e 标志传入输入,而不是从文件中读取行:
$ shuf -e line1 line2 line3 line4 line5
line1
line3
line5
line4
line2
你也可以传入数字:
$ shuf -e 1 2 3 4 5
3
5
1
4
2
要快速在给定范围选择一个,请改用此命令:
$ shuf -n 1 -e 1 2 3 4 5
或者,选择下面的任意三个随机数字:
$ shuf -n 3 -e 1 2 3 4 5
3
5
1
我们也可以在特定范围内生成随机数。例如,要显示 110 之间的随机数,只需使用:
$ shuf -i 1-10
1
9
8
2
4
7
6
3
10
5

Linux 的字符串截取

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
https://www.cnblogs.com/shizhijie/p/8297840.html
假设有变量 var=http://www.aaa.com/123.htm

1. # 号截取,删除左边字符,保留右边字符。
echo ${var#*//}
其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符
即删除 http://
结果是 :www.aaa.com/123.htm

2. ## 号截取,删除左边字符,保留右边字符。
echo ${var##*/}
##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
即删除 http://www.aaa.com/
结果是 123.htm

3. %号截取,删除右边字符,保留左边字符
echo ${var%/*}
%/* 表示从右边开始,删除第一个 / 号及右边的字符
结果是:http://www.aaa.com

4. %% 号截取,删除右边字符,保留左边字符
echo ${var%%/*}
%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
结果是:http:

5. 从左边第几个字符开始,及字符的个数
echo ${var:0:5}
其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:

6. 从左边第几个字符开始,一直到结束。
echo ${var:7}
其中的 7 表示左边第8个字符开始,一直到结束。
结果是 :www.aaa.com/123.htm

7. 从右边第几个字符开始,及字符的个数
echo ${var:0-7:3}
其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。
结果是:123

8. 从右边第几个字符开始,一直到结束。
echo ${var:0-7}
表示从右边第七个字符开始,一直到结束。
结果是:123.htm

注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)

su226
su226

136***1939@qq.com

参考地址

9个月前 (04-23)
wenxin667

140***2918@qq.com

@su226

描述的有点儿不容易懂,看了好久才勉强明白 # ## % %%。

#、## 表示从左边开始删除。一个 # 表示从左边删除到第一个指定的字符;两个 # 表示从左边删除到最后一个指定的字符。

%、%% 表示从右边开始删除。一个 % 表示从右边删除到第一个指定的字符;两个 % 表示从左边删除到最后一个指定的字符。

删除包括了指定的字符本身。

wenxin667
wenxin667

140***2918@qq.com

5个月前 (08-24)
amau

1@1***t

#!bin/bash
#author:amau

var="http://www.runoob.com/linux/linux-shell-variable.html"

s1=${var%%t*}
s2=${var%t*}
s3=${var%%.*}
s4=${var#*/}
s5=${var##*/}
echo "关于字符串的截取%,#的使用方法"
echo "原字符串为:"${var}
echo "%%t*的效果:"${s1}
echo "%t*的效果:"${s2}
echo "%%.*的效果:"${s3}
echo "#*/的效果:"${s4}
echo "##*/的效果:"${s5}

运行结果:

关于字符串的截取%,#的使用方法
原字符串为:http://www.runoob.com/linux/linux-shell-variable.html
%%t*的效果:h
%t*的效果:http://www.runoob.com/linux/linux-shell-variable.h
%%.*的效果:http://www
#*/的效果:/www.runoob.com/linux/linux-shell-variable.html
##*/的效果:linux-shell-variable.html

006-数据库

mysql

1
select * from filemap limit 1\G
1
2
3
4
5
6
7
8.show slave status命令可以显示主从同步的状态
echo "show slave status\G"|/home/mysql/bin/mysql -uroot -p123321 -S /mysql/data/mysql.sock|grep "Slave_SQL_Running_State"
echo "show slave status\G"|mysql -uroot -p123321|grep "Slave_SQL_Running_State"
如何判断主从完全同步:
Master_Log_File和Relay_Master_Log_File所指向的文件必须一致
Relay_Log_Pos和Exec_Master_Log_Pos的为止也要一致才行
Slave_SQL_Running_State:显示为wait 意思是中继日志的sql语句已经全部执行完毕
1
2
.如何判断mysql是否有延迟:
tail -f /mysql/data/sdosspststorage10-slow.log
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
查看mysql连接数:
方法一:mysqladmin -uroot -p123321 status
Uptime: 4649444 Threads: 449(当前连接数) Questions: 166498580 Slow queries: 533 Opens: 3013585 Flush tables: 1 Open tables: 2048 Queries per second avg: 35.810

方法二:[root@sdosspststorage10 data]# mysql -uroot -p123321 -e 'show status' | grep -i Threads
mysql: [Warning] Using a password on the command line interface can be insecure.
Delayed_insert_threads 0
Slow_launch_threads 0
Threadpool_idle_threads 0
Threadpool_threads 0
Threads_cached 2
Threads_connected 447
Threads_created 12559
Threads_running 2 ##(当前连接数)

33.查看最大连接数
mysql -uroot -p123321 -e 'show variables' | grep max_connections
[root@sdosspststorage10 data]# mysql -uroot -p123321 -e 'show variables' | grep max_connections
mysql: [Warning] Using a password on the command line interface can be insecure.
extra_max_connections 1
max_connections 1000

mysql倒序:

1
select * from measure_ottcache_error_5minutes_data order by stattime desc limit 10;

redis

1
2
3
4
5
6
7
8
9
10
11
5.redis密码:
cat /etc/redis/6381.conf |grep requirepass
6.redis登录方式:
/usr/local/bin/redis-cli -h 127.0.0.1 -p 6381 -a go-redis
7.shell页面直接查看reids
echo "keys *"|/usr/local/bin/redis-cli -h 127.0.0.1 -p 6381 -a go-redis |grep wxt
16.redis配置文件目录:/etc/redis
redis内存上限:如
cat 6381.conf|grep "maxmemory"
17.redis重启
redis-server /etc/redis/6379.conf

007-系统

windows

1
2
3
4
cmd计算器:calc
tasklist
taskkill /pid 69595 /f
window+R mstsc

last

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
last 命令介绍
  功能说明:列出目前与过去登入系统的用户相关信息。
  语  法:last [-adRx][-f <记录文件>][-n <显示列数>][帐号名称...][终端机编号...]
  补充说明:单独执行last指令,它会读取位于/var/log目录下,名称为wtmp的文件,并把该给文件的内容记录的登入系统的用户名单全部显示出来。

  参  数:
  -a  把从何处登入系统的主机名称或IP地址,显示在最后一行。
  -d  将IP地址转换成主机名称。
  -f <记录文件>  指定记录文件。
  -n <显示列数>或-<显示列数>  设置列出名单的显示列数。
  -R  不显示登入系统的主机名称或IP地址。
  -x  显示系统关机,重新开机,以及执行等级的改变等信息。

last 命令:
功能说明:列出目前与过去登入系统的用户相关信息。
========测试环境: Fedora Core 6.0;内核:2.6.18========

#last用了显示用户登录情况。以下是直接显示固定行数的记录。kkk是新建的用户。
[kkk@localhost ~]$ last -6
kkk pts/2 :0.0 Thu Jul 26 20:48 still logged in
kkk pts/2 :0.0 Thu Jul 26 20:21 - 20:21 (00:00)
kkk :0 Thu Jul 26 20:21 still logged in
reboot system boot 2.6.18-1.2798.fc Thu Jul 26 20:20 (00:41)
kkk pts/2 :0.0 Thu Jul 26 11:16 - 11:46 (00:30)
kkk pts/2 :0.0 Thu Jul 26 10:18 - 10:18 (00:00)

wtmp begins Sun Jul 1 15:17:08 2007

#默认是显示wtmp的记录,btmp能显示的更详细,可以显示远程登录,例如ssh登录。
[root@localhost ~]# last -n 15 -f /var/log/btmp
kkk :0 Thu Jul 26 20:21 still logged in
klot tty1 Fri Jul 20 22:27 gone - no logout
np962e76 tty1 Fri Jul 20 22:26 - 22:27 (00:00)
klot tty1 Fri Jul 20 22:26 - 22:26 (00:00)
root :0 Fri Jul 20 22:22 - 20:21 (5+21:58)
klot :0 Fri Jul 20 22:22 - 22:22 (00:00)
root tty1 Fri Jul 20 20:58 - 22:26 (01:28)
klot tty1 Fri Jul 20 20:58 - 20:58 (00:00)
klot tty1 Fri Jul 20 20:57 - 20:58 (00:00)
klot tty1 Fri Jul 20 20:57 - 20:57 (00:00)
klot tty1 Fri Jul 20 20:57 - 20:57 (00:00)
klot tty1 Fri Jul 20 20:57 - 20:57 (00:00)
reboot tty1 Fri Jul 20 20:55 - 20:57 (00:02)
root tty1 Fri Jul 20 20:54 - 20:55 (00:00)
root tty1 Fri Jul 20 20:54 - 20:54 (00:00)
btmp begins Mon Apr 30 22:05:54 2007
#显示特定tty口的登录,1是tty1的登录情况,看的很清楚的。 np962e76 和 lkdjflkj 和klot其实都没有登
#录成功,我是把密码忘记了。前面两个用户,是根本不存在的,但是也有记录。
[root@localhost ~]# last -n 15 -f /var/log/btmp 1
klot tty1 Fri Jul 20 22:27 gone - no logout
np962e76 tty1 Fri Jul 20 22:26 - 22:27 (00:00)
klot tty1 Fri Jul 20 22:26 - 22:26 (00:00)
root tty1 Fri Jul 20 20:58 - 22:26 (01:28)
klot tty1 Fri Jul 20 20:58 - 20:58 (00:00)
klot tty1 Fri Jul 20 20:57 - 20:58 (00:00)
klot tty1 Fri Jul 20 20:57 - 20:57 (00:00)
klot tty1 Fri Jul 20 20:57 - 20:57 (00:00)
klot tty1 Fri Jul 20 20:57 - 20:57 (00:00)
reboot tty1 Fri Jul 20 20:55 - 20:57 (00:02)
root tty1 Fri Jul 20 20:54 - 20:55 (00:00)
root tty1 Fri Jul 20 20:54 - 20:54 (00:00)
root tty1 Fri Jul 20 20:54 - 20:54 (00:00)
lkdjflkj tty1 Fri Jul 20 20:54 - 20:54 (00:00)
klot tty1 Fri Jul 20 20:53 - 20:54 (00:00)

btmp begins Mon Apr 30 22:05:54 2007
#显示特定用户的登录情况。
[root@localhost ~]# last -n 15 -f /var/log/btmp klot
klot tty1 Fri Jul 20 22:27 gone - no logout
klot tty1 Fri Jul 20 22:26 - 22:26 (00:00)
klot :0 Fri Jul 20 22:22 - 22:22 (00:00)
klot tty1 Fri Jul 20 20:58 - 20:58 (00:00)
klot tty1 Fri Jul 20 20:57 - 20:58 (00:00)
klot tty1 Fri Jul 20 20:57 - 20:57 (00:00)
klot tty1 Fri Jul 20 20:57 - 20:57 (00:00)
klot tty1 Fri Jul 20 20:57 - 20:57 (00:00)
klot tty1 Fri Jul 20 20:53 - 20:54 (00:00)
klot tty1 Fri Jul 20 20:53 - 20:53 (00:00)
klot tty1 Fri Jul 20 20:53 - 20:53 (00:00)
klot tty1 Fri Jul 20 20:53 - 20:53 (00:00)
klot tty1 Fri Jul 20 20:52 - 20:53 (00:00)
klot tty1 Fri Jul 20 20:52 - 20:52 (00:00)
klot tty1 Fri Jul 20 20:52 - 20:52 (00:00)

btmp begins Mon Apr 30 22:05:54 2007
#显示登录登出的记录,-x。
[root@localhost ~]# last -n 15 -f /var/log/btmp klot -x
klot tty1 Fri Jul 20 22:27 gone - no logout
klot tty1 Fri Jul 20 22:26 - 22:26 (00:00)
klot :0 Fri Jul 20 22:22 - 22:22 (00:00)
klot tty1 Fri Jul 20 20:58 - 20:58 (00:00)
klot tty1 Fri Jul 20 20:57 - 20:58 (00:00)
klot tty1 Fri Jul 20 20:57 - 20:57 (00:00)
klot tty1 Fri Jul 20 20:57 - 20:57 (00:00)
klot tty1 Fri Jul 20 20:57 - 20:57 (00:00)
klot tty1 Fri Jul 20 20:53 - 20:54 (00:00)
klot tty1 Fri Jul 20 20:53 - 20:53 (00:00)
klot tty1 Fri Jul 20 20:53 - 20:53 (00:00)
klot tty1 Fri Jul 20 20:53 - 20:53 (00:00)
klot tty1 Fri Jul 20 20:52 - 20:53 (00:00)
klot tty1 Fri Jul 20 20:52 - 20:52 (00:00)
klot tty1 Fri Jul 20 20:52 - 20:52 (00:00)

btmp begins Mon Apr 30 22:05:54 2007
#-i显示特定ip登录的情况。跟踪用。
[root@localhost ~]# last -n 15 -i 127.0.0.1 -f /var/log/btmp klot
klot tty1 0.0.0.0 Fri Jul 20 22:27 gone - no logout
klot tty1 0.0.0.0 Fri Jul 20 22:26 - 22:26 (00:00)
klot :0 0.0.0.0 Fri Jul 20 22:22 - 22:22 (00:00)
klot tty1 0.0.0.0 Fri Jul 20 20:58 - 20:58 (00:00)
klot tty1 0.0.0.0 Fri Jul 20 20:57 - 20:58 (00:00)
klot tty1 0.0.0.0 Fri Jul 20 20:57 - 20:57 (00:00)
klot tty1 0.0.0.0 Fri Jul 20 20:57 - 20:57 (00:00)
klot tty1 0.0.0.0 Fri Jul 20 20:57 - 20:57 (00:00)
klot tty1 0.0.0.0 Fri Jul 20 20:53 - 20:54 (00:00)
klot tty1 0.0.0.0 Fri Jul 20 20:53 - 20:53 (00:00)
klot tty1 0.0.0.0 Fri Jul 20 20:53 - 20:53 (00:00)
klot tty1 0.0.0.0 Fri Jul 20 20:53 - 20:53 (00:00)
klot tty1 0.0.0.0 Fri Jul 20 20:52 - 20:53 (00:00)
klot tty1 0.0.0.0 Fri Jul 20 20:52 - 20:52 (00:00)
klot tty1 0.0.0.0 Fri Jul 20 20:52 - 20:52 (00:00)

btmp begins Mon Apr 30 22:05:54 2007

时间同步

1
chrond
1
ntpdate

自定义linux命令

1
2
6、linux命令:
将脚本放到 /usr/local/sbin/目录下可以作为命令使用

关闭swap

1
2
3
4
1.关闭swap
可以执行命令刷新一次SWAP(将SWAP里的数据转储回内存,并清空SWAP里的数据)
swapoff -a
sysctl -p  (执行这个使其生效,不用重启)

/etc/rc.local:开机执行

1
将脚本执行命令:/etc/rc.local里,开机自动执行

系统配置

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
一些常识背景:
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数
#
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数


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

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

#
# 查看逻辑CPU的个数

cat /proc/cpuinfo| grep "processor"| wc -l
 查看CPU信息(型号)
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

2.1 查看内存总数
#cat /proc/meminfo | grep MemTotal
MemTotal: 32941268 kB //内存32G

uname -a # 查看内核/操作系统/CPU信息的linux系统信息  
head -n l /etc/issue # 查看操作系统版本  
cat /proc/cpuinfo # 查看CPU信息  
hostname # 查看计算机名的linux系统信息命令  
lspci -tv # 列出所有PCI设备   
lsusb -tv # 列出所有USB设备的linux系统信息命令  
lsmod # 列出加载的内核模块   
env # 查看环境变量资源  
free -m # 查看内存使用量和交换区使用量   
df -h # 查看各分区使用情况  
du -sh # 查看指定目录的大小   
grep MemTotal /proc/meminfo # 查看内存总量  
grep MemFree /proc/meminfo # 查看空闲内存量   
uptime # 查看系统运行时间、用户数、负载  
cat /proc/loadavg # 查看系统负载磁盘和分区   
mount | column -t # 查看挂接的分区状态  
fdisk -l # 查看所有分区   
swapon -s # 查看所有交换分区  
hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)   
dmesg | grep IDE # 查看启动时IDE设备检测状况网络  
ifconfig # 查看所有网络接口的属性   
iptables -L # 查看防火墙设置  
route -n # 查看路由表   
netstat -lntp # 查看所有监听端口  
netstat -antp # 查看所有已经建立的连接   
netstat -s # 查看网络统计信息进程  
ps -ef # 查看所有进程   
top # 实时显示进程状态用户  
# 查看活动用户   
id # 查看指定用户信息  
last # 查看用户登录日志   
cut -d: -f1 /etc/passwd # 查看系统所有用户  
cut -d: -f1 /etc/group # 查看系统所有组   
crontab -l # 查看当前用户的计划任务服务  
chkconfig –list # 列出所有系统服务   
chkconfig –list | grep on # 列出所有启动的系统服务程序  
rpm -qa # 查看所有安装的软件包   
cat /proc/cpuinfo :查看CPU相关参数的linux系统命令  
cat /proc/partitions :查看linux硬盘和分区信息的系统信息命令   
cat /proc/meminfo :查看linux系统内存信息的linux系统命令  
cat /proc/version :查看版本,类似uname -r   
cat /proc/ioports :查看设备io端口  
cat /proc/interrupts :查看中断   
cat /proc/pci :查看pci设备的信息  
cat /proc/swaps :查看所有swap分区的信息

系统参数

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
[root@ceph1 limits.d]# cat /etc/security/limits.d/20-nproc.conf

* soft nofile 51200
* hard nofile 51200
* soft nproc 11000
root soft nproc unlimited

附件:
cd /etc/security/limits.d/
可能是20-nproc.conf等,直接改就是了,下面拿90举例
nprocfile=/etc/security/limits.d/20-nproc.conf
echo "" > $nproc.conf
echo "* soft nofile 51200" >> $nproc.conf
echo "* hard nofile 51200" >> $nproc.conf
echo "* soft nproc 11000" >> $nproc.conf
echo "root soft nproc unlimited" >> $nproc.conf

soft nproc: 可打开的文件描述符的最大数(软限制)
hard nproc: 可打开的文件描述符的最大数(硬限制)
soft nofile:单个用户可用的最大进程数量(软限制)
hard nofile:单个用户可用的最大进程数量(硬限制)

参数:
-a:显示目前资源限制的设定;

-c <core文件上限>:设定core文件的最大值,单位为区块;
-
-d <数据节区大小>:程序数据节区的最大值,单位为KB;
-
-f <文件大小>:shell所能建立的最大文件,单位为区块;
-
-H:设定资源的硬性限制,也就是管理员所设下的限制;
-
-m <内存大小>:指定可使用内存的上限,单位为KB;
-
-n <文件数目>:指定同一时间最多可开启的文件数;
-
-p <缓冲区大小>:指定管道缓冲区的大小,单位512字节;
-
-s <堆叠大小>:指定堆叠的上限,单位为KB;
-
-S:设定资源的弹性限制;
-
-t <CPU时间>:指定CPU使用时间的上限,单位为秒;
-
-u <程序数目>:用户最多可开启的程序数目;
-
-v <虚拟内存大小>:指定可使用的虚拟内存上限,单位为KB。

查看方式:
[root@localhost ~]# ulimit -a

core file size (blocks, -c) 0 #core文件的最大值为100 blocks。
d
data seg size (kbytes, -d) unlimited #进程的数据段可以任意大。
s
scheduling priority (-e) 0
f
file size (blocks, -f) unlimited #文件可以任意大。
p
pending signals (-i) 98304 #最多有98304个待处理的信号。
m
max locked memory (kbytes, -l) 32 #一个任务锁住的物理内存的最大值为32KB。
m
max memory size (kbytes, -m) unlimited #一个任务的常驻物理内存的最大值。
o
open files (-n) 1024 #一个任务最多可以同时打开1024的文件。
p
pipe size (512 bytes, -p) 8 #管道的最大空间为4096字节。
P
POSIX message queues (bytes, -q) 819200 #POSIX的消息队列的最大值为819200字节。
r
real-time priority (-r) 0
s
stack size (kbytes, -s) 10240 #进程的栈的最大值为10240字节。
c
cpu time (seconds, -t) unlimited #进程使用的CPU时间。
m
max user processes (-u) 98304 #当前用户同时打开的进程(包括线程)的最大个数为98304。
v
virtual memory (kbytes, -v) unlimited #没有限制进程的最大地址空间。
f
file locks (-x) unlimited #所能锁住的文件的最大个数没有限制。

dsa免密

1
2
3
4
5
6
7
8
9
10
使用dsa方式免密能解决:
在每台设备执行:
[root@sam ~]# rm -rf ~/.ssh
[root@sam ~]# mkdir ~/.ssh
[root@sam ~]# chmod 755 ~/.ssh
[root@sam .ssh]# /usr/bin/ssh-keygen -t dsa

将每个主机上的公共密钥文件id_dsa.pub的内容复制到~/.ssh/authorized_keys文件中。并把这个文件分别放到所有机器中。注意,当您第一次使用ssh访问远程主机时,其RSA密钥是未知的,所以提示确认一下,确认完毕后SSH将记录远程主机的RSA密钥,以后连接该主机就不用密码了。
[root@sam .ssh]# cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
将各个设备上的authorized_keys复制到其他设备上

免密登录脚本

1
2
3
4
5
6
7
8
9
10
11
12
serverlist.txt文件写具体的ip地址

current=`pwd`
serverlist=`cat $current/serverlist.txt`
mkdir -p /root/.ssh
ssh-keygen -t rsa -P ''
for ip in $serverlist
do
echo "#$ip no password."
ssh root@$ip 'mkdir -p /root/.ssh 2>/dev/null'
cat /root/.ssh/id_rsa.pub | ssh root@$ip 'cat >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys'
done

rsa免密登录

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
ssh-keygen -t rsa
ssh-copy-id root@10.238.161.1
#!/bin/bash
#ssh-keygen -t rsa   
#echo "按enter键3次即可"

current=`pwd`
serverlist=`cat $current/serverlist.txt`
PASSWORD=cloud@123   #需要配置的主机登录密码
auto_ssh_copy_id(){
        expect -c "set timeout -1;
        spawn ssh-copy-id $1;                                
        expect {
                *(yes/no)* {send -- yes\r;exp_continue;}
                *password:* {send -- $2\r;exp_continue;}  
                eof        {exit 0;}
        }";
}

ssh_copy_id_to_all(){
        for SERVER in  $serverlist #遍历要发送到各个主机的ip
        do
                auto_ssh_copy_id $SERVER $PASSWORD
        done
}

ssh_copy_id_to_all
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
serverlist.txt文件写具体的ip地址
current=`pwd`
serverlist=`cat $current/serverlist.txt`
mkdir -p /root/.ssh
ssh-keygen -t rsa -P ''
for ip in $serverlist
do
    echo "#$ip no password."
    ssh root@$ip 'mkdir -p /root/.ssh 2>/dev/null'
    cat /root/.ssh/id_rsa.pub | ssh root@$ip 'cat >> /root/.ssh/authorized_keys && chmod  600 /root/.ssh/authorized_keys'
done


或者
1.配置各个安装主机的ssh免密码登陆
①在每台设备上操作
ssh-keygen -t rsa
②在每台设备上操作
在设备上操作:
ssh-copy-id root@10.224.25.11serverlist.txt文件写具体的ip地址

current=`pwd`
serverlist=`cat $current/serverlist.txt`
mkdir -p /root/.ssh
ssh-keygen -t rsa -P ''
for ip in $serverlist
do
echo "#$ip no password."
ssh root@$ip 'mkdir -p /root/.ssh 2>/dev/null'
cat /root/.ssh/id_rsa.pub | ssh root@$ip 'cat >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys'
done
1
2
3
4
5
6
7
8
9
10
11
12
serverlist.txt文件写具体的ip地址

current=`pwd`
serverlist=`cat $current/serverlist.txt`
mkdir -p /root/.ssh
ssh-keygen -t rsa -P ''
for ip in $serverlist
do
    echo "#$ip no password."
    ssh root@$ip 'mkdir -p /root/.ssh 2>/dev/null'
    cat /root/.ssh/id_rsa.pub | ssh root@$ip 'cat >> /root/.ssh/authorized_keys && chmod  600 /root/.ssh/authorized_keys'
done

查看系统版本

1
2
3
4
5
cat /etc/redhat-release
uname -a
lsb_release -a
cat /etc/issue
cat /proc/version

虚机卡执行

1
echo 204800 > /proc/sys/vm/min_free_kbytes

fuser

1
2
查看哪个进程在写文件
fuser /mnt/sdfs/

isof

1
2
3
4
5
6
7
8
9
10
isof:
lsof 是 list open files 的缩写,功能是列出当前系统打开文件的工具
查看进程状态时用ps命令,常用ps -elf或者ps aux;查看系统打开的文件时用lsof命令,这里的“文件”包括/proc文件、磁盘文件、网络IO等。

lsof -i 用以显示符合条件的进程情况,lsof(list open files)是一个列出当前系统打开文件的工具。
加端口号,查看端口被谁占用
lsof -i:端口号

查看谁正在使用某个文件,也就是说查找某个文件相关的进程
[root@localhost omc]# lsof /var/log/messages

ulimit

1
2
3
ulimit -c
ulimit -c unlimited
生成core文件

date

1
获取前7天的日期:date +%Y%m%d --date="-7 day"

ntp

1
2
ntp:[root@ceph2 tool]# crontab -l
30 * * * * /usr/sbin/ntpdate 10.27.126.249

logrotate

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
1、关于日志切割
  日志文件包含了关于系统中发生的事件的有用信息,在排障过程中或者系统性能分析时经常被用到。对于忙碌的服务器,日志文件大小会增长极快,服务器会很快消耗磁盘空间,这成了个问题。除此之外,处理一个单个的庞大日志文件也常常是件十分棘手的事。
  logrotate是个十分有用的工具,它可以自动对日志进行截断(或轮循)、压缩以及删除旧的日志文件。例如,你可以设置logrotate,让/var/log/foo日志文件每30天轮循,并删除超过6个月的日志。配置完后,logrotate的运作完全自动化,不必进行任何进一步的人为干预。

2、安装logrotate
系统版本说明
[root@clsn6 ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@clsn6 ~]# uname -r
2.6.32-696.el6.x86_64

默认centos系统安装自带logrotate,安装方法如下
yum -y install logrotate crontabs

软件包信息说明
[root@clsn6 ~]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf # 主配置文件
/etc/logrotate.d # 配置目录
  logrotate的配置文件是/etc/logrotate.conf,通常不需要对它进行修改。日志文件的轮循设置在独立的配置文件中,它(们)放在/etc/logrotate.d/目录下。

3、实践配置logrotate
3.1 测试logrotate如何管理日志
  这里我们将创建一个10MB的日志文件/var/log/log-file。我们将展示怎样使用logrotate来管理该日志文件。

我们从创建一个日志文件开始吧,然后在其中填入一个10MB的随机比特流数据文件。
[root@clsn6 ~]# touch /var/log/log-file
[root@clsn6 ~]# head -c 10M < /dev/urandom > /var/log/log-file

  由于现在日志文件已经准备好,我们将配置logrotate来轮循该日志文件。让我们为该文件创建一个配置文件。
[root@clsn6 ~]# vim /etc/logrotate.d/log-file
/var/log/log-file {
monthly
rotate 5
compress
delaycompress
missingok
notifempty
create 644 root root
postrotate
/usr/bin/killall -HUP rsyslogd
endscript
}
  上面的模板是通用的,而配置参数则根据你的需求进行调整,不是所有的参数都是必要的。也可以通过man手册中的例子进行配置。
  
3.2配置文件说明
配置参数

说明
monthly 日志文件将按月轮循。其它可用值为'daily','weekly'或者'yearly'。
rotate 5 一次将存储5个归档日志。对于第六个归档,时间最久的归档将被删除。
compress 在轮循任务完成后,已轮循的归档将使用gzip进行压缩。
delaycompress 总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。
missingok 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。
notifempty 如果日志文件为空,轮循不会进行。
create 644 root root 以指定的权限创建全新的日志文件,同时logrotate也会重命名原始日志文件。
postrotate/endscript 在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。在这种情况下,rsyslogd 进程将立即再次读取其配置并继续运行。

3.3手动运行logrotate
  logrotate可以在任何时候从命令行手动调用。要调用为/etc/lograte.d/下配置的所有日志调用logrotate:

[root@clsn6 ~]# logrotate /etc/logrotate.conf
要为某个特定的配置调用logrotate,执行一次切割任务测试

[root@clsn6 ~]# ll /var/log/log-file
-rw-r--r-- 1 root root 10485760 Feb 7 18:50 /var/log/log-file
[root@clsn6 ~]# logrotate -vf /etc/logrotate.d/log-file
[root@clsn6 ~]# ll /var/log/log-file*
-rw-r--r-- 1 root root 0 Feb 7 19:17 /var/log/log-file
-rw-r--r-- 1 root root 10485760 Feb 7 18:50 /var/log/log-file.1
  即使轮循条件没有满足,我们也可以通过使用‘-f’选项来强制logrotate轮循日志文件,‘-v’参数提供了详细的输出

3.4Logrotate的记录日志
  logrotate自身的日志通常存放于/var/lib/logrotate/status目录。如果处于排障目的,我们想要logrotate记录到任何指定的文件,我们可以指定像下面这样从命令行指定。

[root@clsn6 ~]# logrotate -vf -s /var/log/logrotate-status /etc/logrotate.d/log-file
reading config file /etc/logrotate.d/log-file
reading config info for /var/log/log-file

Handling 1 logs

rotating pattern: /var/log/log-file forced from command line (5 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/log-file
log does not need rotating
not running postrotate script, since no logs were rotated

3.5 Logrotate定时任务
  logrotate需要的cron任务应该在安装时就自动创建了,我把cron文件的内容贴出来,以供大家参考。
[root@clsn6 ~]# cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

4、logrotate生产应用
4.1为nginx设置日志切割
  防止访问日志文件过大

[root@clsn nginx]# cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
rotate 5
missingok
notifempty
create 644 www www
postrotate
if [ -f /application/nginx/logs/nginx.pid ]; then
kill -USR1 `cat /application/nginx/logs/nginx.pid`
fi
endscript
}
  logrotate工具对于防止因庞大的日志文件而耗尽存储空间是十分有用的。配置完毕后,进程是全自动的,可以长时间在不需要人为干预下运行。本教程重点关注几个使用logrotate的几个基本样例,你也可以定制它以满足你的需求。

  对于其他服务日志切割后续补充

5、crontab
Logrotate是基于CRON运行的,所以这个时间是由CRON控制的,具体可以查询CRON的配置文件/etc/anacrontab(老版本的文件是/etc/crontab
[root@test ~]# cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45 //这个是随机的延迟时间,表示最大45分钟
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22 //这个是开始时间
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
第一个是 Recurrence period
第二个是延迟时间 所以cron.daily会在3:22+(5,45)这个时间段执行,/etc/cron.daily是个文件夹

通过默认/etc/anacrontab文件配置,会发现logrotate自动切割日志文件的默认时间是凌晨3点多。

-----------------------------------------------------------------------------------
现在需要将切割时间调整到每天的晚上12点,即每天切割的日志是前一天的0-24点之间的内容。
操作如下:
[root@kevin ~]# mv /etc/anacrontab /etc/anacrontab.bak //取消日志自动轮转的设置
[root@G6-bs02 logrotate.d]# cat nstc_nohup.out
/data/nstc/nohup.out {
rotate 30
dateext
daily
copytruncate
compress
notifempty
missingok
}

[root@G6-bs02 logrotate.d]# cat syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/history
{
sharedscripts
compress
rotate 30
daily
dateext
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}

结合crontab进行自定义的定时轮转操作
[root@kevin ~]# crontab -l
#log logrotate
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/syslog >/dev/null 2>&1
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nstc_nohup.out >/dev/null 2>&1

[root@G6-bs02 ~]# ll /data/nstc/nohup.out*
-rw------- 1 app app 33218 1月 25 09:43 /data/nstc/nohup.out
-rw------- 1 app app 67678 1月 25 23:59 /data/nstc/nohup.out-20180125.gz

举例:oss(redhat 6.3)
30 02 * * * /usr/sbin/logrotate -f /etc/logrotate.d/sdoss
[root@uimgprestorage221 ~]# cat /etc/logrotate.d/sdoss
/opt/log/sdoss/*/weed.*HTTP /opt/log/sdoss/*/weed.INFO /opt/log/sdoss/*/weed.WARNING /opt/log/sdoss/*/weed.ERROR /opt/log/sdoss/*/weed.FATAL /opt/log/sdoss/*/stackfile /opt/log/sdoss/*/core* {
notifempty
copytruncate
daily
rotate 7 #rotate 7(3表示:7天删除日志)
missingok
dateext
compress
sharedscripts
postrotate
pkill -USR1 weed
endscript
}

6、附录
6.1关于USR1信号解释
  摘自: http://www.xuebuyuan.com/323422.html

USR1亦通常被用来告知应用程序重载配置文件;例如,向Apache HTTP服务器发送一个USR1信号将导致以下步骤的发生:停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。内容摘自wiki:http://zh.wikipedia.org/wiki/SIGUSR1%E5%92%8CSIGUSR2  

  对于USR1和2都可以用户自定义的,在POSIX兼容的平台上,SIGUSR1和SIGUSR2是发送给一个进程的信号,它表示了用户定义的情况。它们的符号常量在头文件signal.h中定义。在不同的平台上,信号的编号可能发生变化,因此需要使用符号名称。

kill -HUP pid 或者 killall -HUP pName:
  其中pid是进程标识,pName是进程的名称。
  如果想要更改配置而不需停止并重新启动服务,可以使用上面两个命令。在对配置文件作必要的更改后,发出该命令以动态更新服务配置。根据约定,当你发送一个挂起信号(信号1或HUP)时,大多数服务器进程(所有常用的进程)都会进行复位操作并重新加载它们的配置文件。
  
6.2常见配置参数小结
配置参数
说明
compress 通过gzip压缩转储以后的日志
nocompress 不压缩
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate 备份日志文件但是不截断
create mode owner group 转储文件,使用指定的文件模式创建新的日志文件
nocreate 不建立新的日志文件
delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
errors address 专储时的错误信息发送到指定的Email 地址
ifempty 即使是空文件也转储,这个是 logrotate 的缺省选项。
notifempty 如果是空文件的话,不转储
mail address 把转储的日志文件发送到指定的E-mail 地址
nomail 转储时不发送日志文件
olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir 转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
daily 指定转储周期为每天
weekly 指定转储周期为每周
monthly 指定转储周期为每月
rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
tabooext [+] list让logrotate不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~
size size(如:size 20M) 当日志文件到达指定的大小时才转储,bytes(缺省)及KB(sizek)或MB(sizem)
missingok 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。

清理设备所有缓存

1
清理所有缓存:echo 3/proc/sys/vm/drop_caches

yum

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
32
33
34
35
36
37
38
39
40
41
执行yum install openjdk.x86_64 –y报错:
[root@dev-51 home]# yum install openjdk.x86_64 –y
Loaded plugins: product-id, security, subscription-manager
Updating certificate-based repositories.
Unable to read consumer identity
Setting up Install Process
No package openjdk.x86_64 available.
Error: Nothing to do

解决:
①清理yum
yum clean all
②确认yum是好的
yum makecache


yum list |grep jdk
vi /etc/yum.repos.d/stom.repo
stom.repo名字可以自定义
[root@dev-50 yum.repos.d]# cat stom.repo
[yum-cd]
name=cd rpm
baseurl=http://10.27.97.1/rh63/x86_64
gpgcheck=0
enabled=1

[root@dev-21 yum.repos.d]# cat cd.repo (这个yum源有xfs的包)
[local]
name=local
baseurl=http://192.168.86.5/centos/6.5/os/x86_64/Packages/
gpgcheck=0

10-1-3016

④将vsftp的rpm包下载到本地
yumdownloader vsftpd

强制安装yum包
yum install -y yum-downloadonly
yum install qemu-img-y --downloadonly --downloaddir=/opt
rpm -ivh --force --nodeps qemu-img.xxxx.rpm

执行jar包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
storm jar stormkafka-0.0.1.jar suning.oss.stat.RollingNginxTopWords 10.27.38.33
storm jar uimgStorm.jar com.suning.uimg.storm.StormKafkaConsumer 10.27.38.33
storm jar ngStorm-0.0.1.jar suning.oss.stat.NginxTop 10.27.38.33
storm jar accountStorm-0.0.1.jar suning.oss.stat.AccountTop 10.27.38.33
storm jar bucketStorm-0.0.1.jar suning.oss.stat.BucketTop 10.27.38.33
storm jar filerStorm-0.0.1.jar suning.oss.stat.FilerTop 10.27.38.33
storm jar masterStorm-0.0.1.jar suning.oss.stat.MasterTop 10.27.38.33
storm jar partitionStorm-0.0.1.jar suning.oss.stat.PartitionTop 10.27.38.33
storm jar volumeStorm-0.0.1.jar suning.oss.stat.VolumeTop 10.27.38.33
storm jar newImgStorm.jar suning.oss.stat.VolumeTop 10.27.38.33

2、解压jar包,windows可以本地7z解压

3、打包jar
进入C:\Program Files\Java\jdk-10.0.1\
cmd 之后执行
jar cvf D:\谷歌浏览器下载\ngStorm-0.0.1.jar D:\谷歌浏览器下载\ngStorm-0.0.

accountStorm-0.0.1.jar filerStorm-0.0.1.jar newImgStorm.jar partitionStorm-0.0.1.jar uimgStorm.jar
bucketStorm-0.0.1.jar masterStorm-0.0.1.jar ngStorm-0.0.1.jar stormkafka-0.0.1.jar volumeStorm-0.0.1.jar

重启nginx

1
2
3
/opt/tengine/sbin/nginx -s quit  停止nginx

启动nginx:/opt/tengine/sbin/nginx -c /opt/tengine/conf/nginx.conf

jdk

1
2
3
4
5
6
7
8
mkdir -p /usr/local/java/;tar -vzxf jdk-8u181-linux-x64.tar.gz -C /usr/local/java/

vi /etc/profile
export JAVA_HOME=/usr/local/java/jdk1.8.0_181
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

source /etc/profile

nmon

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
32
33
34
35
36
37
38
39
40
41
42
参考网址:
https://blog.csdn.net/liang_operations/article/details/81705266#4本地下载nmon-analyser


     我们监控我们的操作系统的时候如果可以把各个硬件的监控信息生成形象化的分析报表图对于我们来说是件太好的事情了,而通过nom和nmon_analyser两者的结合完全可以实现我们的要求。首先对nmon和nmon_analyser做一个大概介绍。Nmon 是一个分析aix和linux性能的免费工具(其主要是ibm为自己的aix操作系统开发的,但是也可以应用在linux操作系统上),而nmon_analyser是nmon的一个工具可以把nmon生成的报告转化成excel报表的形式供我们查看。下面先让看下nmon_analyser生成的报表。

数据采集
         运行带 -f 标志的 nmon 命令。有关详细信息,请参阅 nmon -h。但是作为示例,可以尝试运行下面的 nmon 命令来,告知 nmon 创建文件,并每隔 10 秒的时间进行一次数据收集,共采集 60 次(共计 10 分钟):
nmon -f -s 10 -c 60
-f 表示生成的数据文件名中有时间;
-s 10 表示每 10 秒采集一次数据;
-c 60 表示采集 60 次,10*60=600 秒,
刚好是 10分钟的数据,这样运行一次这个程序就会生成一个采集 10分钟数据的文件。该行命令将在当前目录中创建输出文件,其名称为:<hostname>_date_time.nmon", hostname" 是这台主机的主机名。
例如
[root@localhost source]# hostname
linux_test
[root@localhost source]# ./nmon -f -s 5 -c 60
[root@localhost source]# ps -ef | grep nmon
root 17815 1 0 08:22 pts/1 00:00:00 ./nmon -f -s 10 -c 60
root 17888 6977 0 08:22 pts/1 00:00:00 grep nmon
[root@localhost source]# ls linux_test_120724_0822.nmon
linux_test_120724_0822.nmon

./nmon -ft -s 10 -c 60 -m /root/nmon
# 参数说明
-f 监控结果以文件形式输出,默认机器名+日期.nmon格式
-F 指定输出的文件名,比如test.nmon
-s 指的是采样的频率,单位为秒
-c 指的是采样的次数,即以上面的采样频率采集多少次
-m 指定生成的文件目录

本地下载nmon analyser:https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/Power+Systems/page/nmon_analyser

4.2解压生成两个文件
NA_UserGuide v55.docx
nmon analyser v55.xlsm

4.3打开nmon analyser v52_1.xlsm
报错: 
运行时错误 13 类型不匹配”错误 
解决: 
修改本地系统时间,然后重新打开文件

ftp

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
32
33
34
35
36
37
38
39
1、yum install vsftpd

4.创建用户
(1)首先要启动服务
service vsftpd start
(2)创建用户
adduser -s /bin/bash -d /mnt/xufx/ftp xufx
passwd xufx

5.vsftpd的配置
安装完之后在/etc/vsftpd/路径下会存在三个配置文件。
vsftpd.conf: 主配置文件
ftpusers: 指定哪些用户不能访问FTP服务器,这里的用户包括root在内的一些重要用户。
user_list: 指定的用户是否可以访问ftp服务器,通过vsftpd.conf文件中的userlist_deny的配置来决定配置中的用户是否可以访问,userlist_enable=YESuserlist_deny=YESuserlist_file=/etc/vsftpd/user_list 这三个配置允许文件中的用户访问FTP。


(1)登录ftp后会发现,用户可以访问其他目录,并且具有mpsp组的权限,这样做是不允许的,我们需要将用户的访问范围控制在其主目录下。方法如下:
a. vi /etc/vsftpd/vsftpd.conf进入ftp配置文件目录并编辑此文件,
anonymous_enable=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
chroot_local_user=NO
userlist_enable=YES

最后加上:
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list

(2)
vi /etc/vsftpd/vsftpd.chroot_list
[root@dev-21 vsftpd]# vi vsftpd.chroot_list
xufx

(3)
vi /etc/vsftpd/user_list
最后加入xufx

(4)
ftp的ip+端口的登录方式:ftp 10.244.76.84 811

lrzsz

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
安装方法:
解压文件

[root@localhost develop]# tar zxvf lrzsz-0.12.20.tar.gz

进入文件夹
[root@localhost develop]# cd lrzsz-0.12.20

[root@localhost lrzsz-0.12.20]# ./configure --prefix=/usr/local/lrzsz
[root@localhost lrzsz-0.12.20]# make && make install

建立软链接
[root@localhost lrzsz-0.12.20]# cd /usr/bin/
[root@localhost bin]# ln -s /usr/local/lrzsz/bin/lrz rz; ln -s /usr/local/lrzsz/bin/lsz sz

#//如果文件存在则删除后在创建软连接
#ln -s -f /usr/local/lrzsz/bin/xxx xx
测试

运行 rz 弹出SecureCRT上传窗口。

清屏

1
2
cls 清屏
wmic cmd窗口最大化:wmic最大化后quit退出就能最大化

008-性能

top

1
top -p 4078 -n 1 只打印一次

iostat

1
2
3
4
io
手动执行:iostat -kx 2
脚本跑这条命令不准?
原因:iostat这类命令第一次打印不准,第二次才准确

查看当前占用最多的K个进程

1
2
3
4
5
6
7
8
9
10
https://www.cnblogs.com/nulige/p/8439231.html

一、可以使用以下命令查使用内存最多的K个进程
ps -aux | sort -k4nr | head -10
方法2:top (然后按下M,注意大写)

二、可以使用下面命令查使用CPU最多的K个进程
ps -aux | sort -k3nr | head -10
方法2:top (然后按下P,注意大写)
ps -T -p 2568    # 查看进程2568内线程情况

vmstat+iostat

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
监控cpu和内存--vmstat 2
[root@pptvtest244 ~]# vmstat 2
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
5 0 0 40344920 467976 15203748 0 0 17 73 0 0 7 3 89 0 0
2 0 0 40331148 467976 15203780 0 0 0 1012 45812 68325 17 5 78 0 0
2 0 0 40333584 467976 15203780 0 0 128 961 37678 63153 10 4 86 0 0


Memory(内存):
free: 空闲物理内存大小。

CPU(以百分比表示)
us: 用户进程执行时间百分比(user time) us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。
sy: 内核系统进程执行时间百分比(system time) sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。
id: 空闲时间百分比




[root@dev-23 ~]# iostat -kx 2
Linux 2.6.32-279.19.1.el6_sn.11.x86_64 (dev-23) 08/01/2018 _x86_64_ (2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
0.47 0.00 0.54 0.01 0.01 98.96

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
vda 0.00 0.06 0.00 0.17 0.02 0.80 9.70 0.00 3.58 1.46 0.02
vdb 0.00 0.13 0.00 0.03 0.00 0.65 38.44 0.00 86.46 1.25 0.00
dm-0 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0.00 0.32 0.23 0.00
dm-1 0.00 0.00 0.00 0.11 0.01 0.45 8.09 0.00 2.87 1.58 0.02
dm-2 0.00 0.00 0.00 0.00 0.00 0.00 7.85 0.00 1.31 1.25 0.00
dm-3 0.00 0.00 0.00 0.08 0.00 0.33 7.92 0.00 7.73 0.85 0.01
dm-4 0.00 0.00 0.00 0.00 0.00 0.00 7.98 0.00 8.13 1.92 0.00
dm-5 0.00 0.00 0.00 0.00 0.00 0.00 7.85 0.00 1.66 1.22 0.00
dm-6 0.00 0.00 0.00 0.00 0.01 0.02 10.90 0.00 16.02 1.06 0.00


r/s 每秒完成的读I/O设备次数。
w/s 每秒完成的写I/O设备次数。
%util 一秒中有百分之多少的时间用于I/O操作,或者说一秒中有多少时间I/O队列是非空的。



01:10:17 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
01:10:19 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
01:10:19 PM eth0 1298.39 851.61 374.60 215.24 0.00 0.00 0.00


rxpck/s:每秒钟接收的数据包
txpck/s:每秒钟发送的数据包
rxbyt/s:每秒钟接收的字节数
txbyt/s:每秒钟发送的字节数
rxcmp/s:每秒钟接收的压缩数据包
txcmp/s:每秒钟发送的压缩数据包
rxmcst/s:每秒钟接收的多播数据包

009-异常模拟

cpu模拟

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
[Linux运维]常用场景模拟 -- cpu使用率模拟
from http://www.cnblogs.com/zk47/p/4771105.html
1 单个核 100%:
代码 kill_cpu.c
#include <stdlib.h>

int main(){
{
while(1);
return 0;}
}
运行
$ gcc -o out kill_cpu.c
$ ./out
看top的结果:
$ top
top - 15:44:08 up 207 days, 21:29, 2 users, load average: 0.08, 0.13, 0.10
Tasks: 231 total, 2 running, 229 sleeping, 0 stopped, 0 zombie
Cpu0 : 1.0%us, 1.0%sy, 0.0%ni, 98.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu3 : 1.0%us, 1.0%sy, 0.0%ni, 98.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
看到某一个核的cpu已经达到了100%。这是由于这个进程被调度到了一个核上,没有使用多线程,所以自然就是一个核的cpu是100%。那么如何让所有的cpu都是100%呢。
2 让所有的核都是100%
$ for i in `seq 1 $(cat /proc/cpuinfo | grep "physical id" | wc -l)`; do ./out & done
[1] 5992
[2] 5993
[3] 5994
[4] 5995

$
$ top
top - 15:56:54 up 207 days, 21:42, 2 users, load average: 1.03, 0.35, 0.17
Tasks: 234 total, 5 running, 229 sleeping, 0 stopped, 0 zombie
Cpu0 : 98.0%us, 1.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 1.0%si, 0.0%st
Cpu1 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 : 99.0%us, 1.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu3 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
我们看到所有的核都是100%,cat /proc/cpuinfo | grep "physical id" | wc -l是获取到CPU的核数,逻辑核数。这样每一个cpu上都会调度到一个死循环的进程。
批量kill进程
$ ps aux | grep [.]/out | awk '{print $2}' | xargs sudo kill -9
3 让某个核 100%
$ top
top - 16:11:03 up 207 days, 21:56, 2 users, load average: 0.81, 0.47, 0.27
Tasks: 232 total, 2 running, 230 sleeping, 0 stopped, 0 zombie
Cpu0 : 1.0%us, 2.0%sy, 0.0%ni, 94.1%id, 0.0%wa, 2.0%hi, 1.0%si, 0.0%st
Cpu1 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu3 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
我们看到当前的进程在cpu2上,可以通过taskset 命令绑定cpu
# taskset -cp 0 7368
pid 7368's current affinity list: 0-3
pid 7368's new affinity list: 0
进程实际上四个核都是可以使用的,当时由于没有使用多线程,所以只调度到了一个核上。现在经过taskset设置后,现在我们再来看看top的输出:
$ top
top - 16:14:09 up 207 days, 21:59, 2 users, load average: 0.99, 0.71, 0.39
Tasks: 230 total, 3 running, 227 sleeping, 0 stopped, 0 zombie
Cpu0 : 98.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 1.0%hi, 1.0%si, 0.0%st
Cpu1 : 0.0%us, 1.0%sy, 0.0%ni, 99.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 : 1.0%us, 1.0%sy, 0.0%ni, 98.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu3 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
现在跑到了cpu0上了。
4 lookbusy
$ lookbusy -c 30
让所有的cpu使用率都是30%
$ lookbusy -c 75 -n 2
让两个cpu的使用率为30%
$ lookbusy --cpu-mode curve --cpu-curve-peak 14h -c 20-80
让cpu在20%-%80之间,周期为24H,在14点,即下午2点达到峰值
$ lookbusy -c 20-30 --cpu-mode curve --cpu-curve-period 60m --cpu-curve-peak 30m
让cpu以60分钟为周期,30分钟是峰值,使用率在20% - 30%之间。

网络异常

1
2
3
4
5
6
7
8
iptables -I INPUT -s 10.27.38.241 -j DROP
这个是断网

iptables -D INPUT -s 10.27.38.241 -j DROP
这个是恢复

iptables -F
清楚所有已有的条目

消耗内存

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
[root@ceph1 tool]# cat eatMem.c 
#include <stdio.h>
#include <stdlib.h>
void main()
{
int * a;
int i = 0;
char log[256] = {0};
system("> ./free.txt");
system("date >> ./free.txt");
system("free -m >> ./free.txt");
pid_t pid;
if ((pid = fork()) < 0 )
{
printf("fork error");
}
else if(pid == 0)
{
while(1)
{
i++;
a = (int *)malloc(1024*1024*100);
printf("allocation=%ldM a=%d \n",i*100,a);
}
}
else
{
while(1)
{
sleep(2);
system("date >> ./free.txt");
system("free -m >> ./free.txt");
}

}
}

执行:
编译#  gcc eatMem.c -o test_eatMem
运行#   ./test_eatMem

linux 系统查看物理内存使用率的命令,以百分比形式输出:free -m | sed -n '2p' | awk '{print "used mem is "$3"M,total mem is "$2"M,used percent is "$3/$2*100"%"}'

想监视系统内存?好像是没法直接得到现成的百分比的,自己取值计算一下吧
totalmem=`free -m | grep 'Mem' | awk '{print $3}'`
usedmem=`free -m | grep 'Mem' | awk '{print $2}'`
usage=$(bc<<EOF 
scale=4
($freemem/$totalmem)*100
EOF)
freeusage=`echo $free | awk -F. '{print $1}'`
echo "Free Memory Usage = $freeusage%"
以前Solaris里的改了改
只是个片段,需要什么判断之类自己填充到脚本里 一点点加吧 呵呵 希望对你有帮助
单要使用率的话二楼的更简练~~ 呵呵
free -m | sed -n '2p' | awk '{print "used mem is "$3"M,total mem is "$2"M,used percent is "$3/$2*100"%"}'

[root@dev-22 sdfs-test]# free -m(使用率拿红色的比较)
total used free shared buffers cached
Mem: 3831 3528 302 0 475 1002
-/+ buffers/cache: 2051 1779
Swap: 10239 78 10161

模拟丢包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat /proc/cpuinfo |grep "physical id" | wc -l 可以获得CPU的个数, 我们将其表示为N.
seq 1 N 用来生成1到N之间的数字
for i in `seq 1 N`; 就是循环执行命令,从1到N

dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
 /dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,就像临时交换文件
把/dev/null看作"黑洞", 它等价于一个只写文件,所有写入它的内容都会永远丢失.,而尝试从它那儿读取内容则什么也读不到。 
/dev/null对命令行和脚本都非常的有用.
dd if=/dev/zero of=/dev/null 执行dd命令, 输出到/dev/null, 实际上只占用CPU, 没有IO操作.
由于连续执行N个(N是CPU个数)的dd 命令, 且使用率为100%, 这时调度器会调度每个dd命令在不同的CPU上处理.
最终就实现所有CPU占用率100%
linux限制网络带宽 : http://blog.csdn.net/jacson_bai/article/details/46485725
1、tc qdisc add dev eth0 root netem loss 1% 模拟丢包命令
2、通过其他机子ping修改后的机子
3、tc qdisc del dev eth0 root  删除丢包命令

ASM磁盘头信息损坏和修复(kfed/dd)

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
https://blog.csdn.net/zhengwei125/article/details/50836329

KFED主要用来编辑和修复ASM metadata,可以在DiskGroup没有mount的情况下使用;因此在ASM无法启动、DiskGroup无法mount的时候可以尝试使用这个神器来修复。

kfed工具支持对于ASM信息的READ/WRITE/MERGE/NEW/ FORM/FIND/STRUCT等操作,11gR2之前需要手工编译. 

一、编译kfed工具

1.编译
[oracle@node1 ~]$ cd $ORACLE_HOME/rdbms/lib
[oracle@node1 lib]$ make -f ins_rdbms.mk ikfed

2.配置环境变量
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/rdbms/lib:$PATH

3.查看帮助
[oracle@node1 ~]$ kfed -help
as/mlibASM Library [asmlib='lib']
aun/umAU number to examine or update [AUNUM=number]
aus/zAllocation Unit size in bytes [AUSZ=number]
blkn/umBlock number to examine or update [BLKNUM=number]
blks/zMetadata block size in bytes [BLKSZ=number]
ch/ksumUpdate checksum before each write [CHKSUM=YES/NO]
cn/tCount of AUs to process [CNT=number]
de/vASM device to examine or update [DEV=string]
dm/pallDon't suppress repeated lines when dumping corrupt blocks [DMPALL=YES/NO]
o/p    KFED operation type [OP=READ/WRITE/MERGE/REPAIR/NEW/FORM/FIND/STRUCT]
p/rovnmName for provisioning purposes [PROVNM=string]
s/eekAU number to seek to [SEEK=number]
te/xtFile name for translated block text [TEXT=string]
ty/peASM metadata block type number [TYPE=number]

asm的每个磁盘上有存放有asm的元数据,元数据一般大小为4k。disk header一般在第0个au,第0个块上。 

二、模拟损坏磁盘头信息
 
1. 备份磁盘头信息:

[root@axj-rac1 backup]#dd if=/dev/raw/raw5 of=/backup/raw5.bak bs=1M count=2
[root@axj-rac1 backup]#dd if=/dev/raw/raw6 of=/backup/raw6.bak bs=1M count=2
[root@axj-rac1 backup]#dd if=/dev/raw/raw7 of=/backup/raw7.bak bs=1M count=2

备份成txt格式
kfed read /dev/raw/raw6 text=/home/oracle/asmdisk_raw6.txt  

2. 查看备份的磁盘头信息
[root@axj-rac1 oracle]# cat asmdisk_raw6.txt 
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            1 ; 0x002: KFBTYP_DISKHEAD
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       0 ; 0x004: blk=0
kfbh.block.obj:              2147483649 ; 0x008: disk=1
kfbh.check:                  3657275721 ; 0x00c: 0xd9fd9949
kfbh.fcn.base:                        0 ; 0x010: 0x00000000
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfdhdb.driver.provstr:         ORCLDISK ; 0x000: length=8
kfdhdb.driver.reserved[0]:            0 ; 0x008: 0x00000000
kfdhdb.driver.reserved[1]:            0 ; 0x00c: 0x00000000
kfdhdb.driver.reserved[2]:            0 ; 0x010: 0x00000000
kfdhdb.driver.reserved[3]:            0 ; 0x014: 0x00000000
kfdhdb.driver.reserved[4]:            0 ; 0x018: 0x00000000
kfdhdb.driver.reserved[5]:            0 ; 0x01c: 0x00000000
kfdhdb.compat:                186646528 ; 0x020: 0x0b200000
kfdhdb.dsknum:                        1 ; 0x024: 0x0001
kfdhdb.grptyp:                        1 ; 0x026: KFDGTP_EXTERNAL  --磁盘组冗余方式
kfdhdb.hdrsts:                        3 ; 0x027: KFDHDR_MEMBER    --磁盘组状态,3是可用状态
kfdhdb.dskname:           DATADG01_0001 ; 0x028: length=13
kfdhdb.grpname:                DATADG01 ; 0x048: length=8         --磁盘组名字
kfdhdb.fgname:            DATADG01_0001 ; 0x068: length=13
kfdhdb.capname:                         ; 0x088: length=0
kfdhdb.crestmp.hi:             33026093 ; 0x0a8: HOUR=0xd DAYS=0x1 MNTH=0xc YEAR=0x7df
kfdhdb.crestmp.lo:           2356159488 ; 0x0ac: USEC=0x0 MSEC=0x9 SECS=0x7 MINS=0x23
kfdhdb.mntstmp.hi:             33032273 ; 0x0b0: HOUR=0x11 DAYS=0x2 MNTH=0x2 YEAR=0x7e0
kfdhdb.mntstmp.lo:           3209038848 ; 0x0b4: USEC=0x0 MSEC=0x183 SECS=0x34 MINS=0x2f
kfdhdb.secsize:                     512 ; 0x0b8: 0x0200
kfdhdb.blksize:                    4096 ; 0x0ba: 0x1000
kfdhdb.ausize:                  1048576 ; 0x0bc: 0x00100000  --au的大小,单位是byte,大小是1M
kfdhdb.mfact:                    113792 ; 0x0c0: 0x0001bc80
kfdhdb.dsksize:                    4008 ; 0x0c4: 0x00000fa8  --该disk的大小,单位是au,默认au是1m,所以大小为4008M
kfdhdb.pmcnt:                         2 ; 0x0c8: 0x00000002
kfdhdb.fstlocn:                       1 ; 0x0cc: 0x00000001
kfdhdb.altlocn:                       2 ; 0x0d0: 0x00000002
kfdhdb.f1b1locn:                      0 ; 0x0d4: 0x00000000  --file directory所在的au位置
kfdhdb.redomirrors[0]:                0 ; 0x0d8: 0x0000
kfdhdb.redomirrors[1]:                0 ; 0x0da: 0x0000
kfdhdb.redomirrors[2]:                0 ; 0x0dc: 0x0000
kfdhdb.redomirrors[3]:                0 ; 0x0de: 0x0000
kfdhdb.dbcompat:              168820736 ; 0x0e0: 0x0a100000
kfdhdb.grpstmp.hi:             33024790 ; 0x0e4: HOUR=0x16 DAYS=0x18 MNTH=0xa YEAR=0x7df
kfdhdb.grpstmp.lo:            258378752 ; 0x0e8: USEC=0x0 MSEC=0x1a3 SECS=0x36 MINS=0x3
kfdhdb.vfstart:                       0 ; 0x0ec: 0x00000000
kfdhdb.vfend:                         0 ; 0x0f0: 0x00000000
kfdhdb.spfile:                        0 ; 0x0f4: 0x00000000
kfdhdb.spfflg:                        0 ; 0x0f8: 0x00000000
kfdhdb.ub4spare[0]:                   0 ; 0x0fc: 0x00000000
kfdhdb.ub4spare[1]:                   0 ; 0x100: 0x00000000
kfdhdb.ub4spare[2]:                   0 ; 0x104: 0x00000000
kfdhdb.ub4spare[3]:                   0 ; 0x108: 0x00000000
kfdhdb.ub4spare[4]:                   0 ; 0x10c: 0x00000000
kfdhdb.ub4spare[5]:                   0 ; 0x110: 0x00000000
kfdhdb.ub4spare[6]:                   0 ; 0x114: 0x00000000
kfdhdb.ub4spare[7]:                   0 ; 0x118: 0x00000000
kfdhdb.ub4spare[8]:                   0 ; 0x11c: 0x00000000
kfdhdb.ub4spare[9]:                   0 ; 0x120: 0x00000000
kfdhdb.ub4spare[10]:                  0 ; 0x124: 0x00000000
kfdhdb.ub4spare[11]:                  0 ; 0x128: 0x00000000
kfdhdb.ub4spare[12]:                  0 ; 0x12c: 0x00000000
kfdhdb.ub4spare[13]:                  0 ; 0x130: 0x00000000
kfdhdb.ub4spare[14]:                  0 ; 0x134: 0x00000000
kfdhdb.ub4spare[15]:                  0 ; 0x138: 0x00000000
kfdhdb.ub4spare[16]:                  0 ; 0x13c: 0x00000000
kfdhdb.ub4spare[17]:                  0 ; 0x140: 0x00000000
kfdhdb.ub4spare[18]:                  0 ; 0x144: 0x00000000
kfdhdb.ub4spare[19]:                  0 ; 0x148: 0x00000000
kfdhdb.ub4spare[20]:                  0 ; 0x14c: 0x00000000
kfdhdb.ub4spare[21]:                  0 ; 0x150: 0x00000000
kfdhdb.ub4spare[22]:                  0 ; 0x154: 0x00000000
kfdhdb.ub4spare[23]:                  0 ; 0x158: 0x00000000
kfdhdb.ub4spare[24]:                  0 ; 0x15c: 0x00000000
kfdhdb.ub4spare[25]:                  0 ; 0x160: 0x00000000
kfdhdb.ub4spare[26]:                  0 ; 0x164: 0x00000000
kfdhdb.ub4spare[27]:                  0 ; 0x168: 0x00000000
kfdhdb.ub4spare[28]:                  0 ; 0x16c: 0x00000000
kfdhdb.ub4spare[29]:                  0 ; 0x170: 0x00000000
kfdhdb.ub4spare[30]:                  0 ; 0x174: 0x00000000
kfdhdb.ub4spare[31]:                  0 ; 0x178: 0x00000000
kfdhdb.ub4spare[32]:                  0 ; 0x17c: 0x00000000
kfdhdb.ub4spare[33]:                  0 ; 0x180: 0x00000000
kfdhdb.ub4spare[34]:                  0 ; 0x184: 0x00000000
kfdhdb.ub4spare[35]:                  0 ; 0x188: 0x00000000
kfdhdb.ub4spare[36]:                  0 ; 0x18c: 0x00000000
kfdhdb.ub4spare[37]:                  0 ; 0x190: 0x00000000
kfdhdb.ub4spare[38]:                  0 ; 0x194: 0x00000000
kfdhdb.ub4spare[39]:                  0 ; 0x198: 0x00000000
kfdhdb.ub4spare[40]:                  0 ; 0x19c: 0x00000000
kfdhdb.ub4spare[41]:                  0 ; 0x1a0: 0x00000000
kfdhdb.ub4spare[42]:                  0 ; 0x1a4: 0x00000000
kfdhdb.ub4spare[43]:                  0 ; 0x1a8: 0x00000000
kfdhdb.ub4spare[44]:                  0 ; 0x1ac: 0x00000000
kfdhdb.ub4spare[45]:                  0 ; 0x1b0: 0x00000000
kfdhdb.ub4spare[46]:                  0 ; 0x1b4: 0x00000000
kfdhdb.ub4spare[47]:                  0 ; 0x1b8: 0x00000000
kfdhdb.ub4spare[48]:                  0 ; 0x1bc: 0x00000000
kfdhdb.ub4spare[49]:                  0 ; 0x1c0: 0x00000000
kfdhdb.ub4spare[50]:                  0 ; 0x1c4: 0x00000000
kfdhdb.ub4spare[51]:                  0 ; 0x1c8: 0x00000000
kfdhdb.ub4spare[52]:                  0 ; 0x1cc: 0x00000000
kfdhdb.ub4spare[53]:                  0 ; 0x1d0: 0x00000000
kfdhdb.acdb.aba.seq:                  0 ; 0x1d4: 0x00000000
kfdhdb.acdb.aba.blk:                  0 ; 0x1d8: 0x00000000
kfdhdb.acdb.ents:                     0 ; 0x1dc: 0x0000
kfdhdb.acdb.ub2spare:                 0 ; 0x1de: 0x0000


3.破坏磁盘头的元数据,这里我开始破坏了raw5,后来为达到效果又破坏了下面两个
[root@axj-rac1 backup]# dd if=/dev/zero of=/dev/raw/raw5 bs=4096 count=1 
[root@axj-rac1 backup]# dd if=/dev/zero of=/dev/raw/raw6 bs=4096 count=1 
[root@axj-rac1 backup]# dd if=/dev/zero of=/dev/raw/raw7 bs=4096 count=1 

4.查看一下磁盘头的状态

col group_number format a30
col disk_number format a30 
col name format a30
col header_status format a30
col path format a30
col group_number clear
col disk_number clear
set linesize 200 pagesize 2000 
SQL> select group_number,disk_number,name,header_status,path from v$asm_disk;

GROUP_NUMBER DISK_NUMBER NAMEHEADER_STATU PATH
---------------------- ---------------------------
   2       0 OCR_VOTE_0000MEMBER     /dev/raw/raw1
   1       1 DATADG01_0001MEMBER     /dev/raw/raw6
   2       1 OCR_VOTE_0001MEMBER     /dev/raw/raw2
   2       2 OCR_VOTE_0002MEMBER     /dev/raw/raw3
   1       0 DATADG01_0000MEMBER     /dev/raw/raw5
   1       2 DATADG01_0002MEMBER     /dev/raw/raw7
上面是正常的状态
   
SQL> select group_number,disk_number,name,header_status,path from v$asm_disk;

GROUP_NUMBER DISK_NUMBER NAMEHEADER_STATUS       PATH
------------ ---------------------------------------
   2       0 OCR_VOTE_0000MEMBER       /dev/raw/raw1
   1       1 DATADG01_0001MEMBER       /dev/raw/raw6
   2       1 OCR_VOTE_0001MEMBER       /dev/raw/raw2
   2       2 OCR_VOTE_0002MEMBER       /dev/raw/raw3
   1       0 DATADG01_0000CANDIDATE    /dev/raw/raw5
   1       2 DATADG01_0002MEMBER       /dev/raw/raw7

这里是破坏后的状态,raw状态为CANDIDATE       
   
   
5.破坏后查看用kfed查看raw5的磁盘头的信息
  
[root@axj-rac1 oracle]#  kfed read /dev/raw/raw5 aun=0 blkn=0
kfbh.endian:                          0 ; 0x000: 0x00
kfbh.hard:                            0 ; 0x001: 0x00
kfbh.type:                            0 ; 0x002: KFBTYP_INVALID
kfbh.datfmt:                          0 ; 0x003: 0x00
kfbh.block.blk:                       0 ; 0x004: blk=0
kfbh.block.obj:                       0 ; 0x008: file=0
kfbh.check:                           0 ; 0x00c: 0x00000000
kfbh.fcn.base:                        0 ; 0x010: 0x00000000
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
7F5595918400 00000000 00000000 00000000 00000000  [................]
  Repeat 255 times
KFED-00322: Invalid content encountered during block traversal: [kfbtTraverseBlock][Invalid OSM block type][][0]
可以看到已经报错了,跟上面的不一样了。

依次查看raw6和raw7的磁盘头信息
kfed read /backup/raw6.bak aun=1 blkn=254
kfed read /backup/raw7.bak aun=1 blkn=254  
 
[root@axj-rac1 backup]# kfed read /backup/raw5.bak aun=1 blkn=254|grep  kfbh.type
kfbh.type:                            1 ; 0x002: KFBTYP_DISKHEAD


从10.2.0.5开始之后的版本header信息是有额外保护和备份的,那么备份在哪个位置
也是在disk的特定位置,这对au=1MB的dg,备份信息是在第510blkn的位置,我们可以看下位置510的信息:

[root@axj-rac1 backup]#  kfed read /dev/raw/raw5 aun=0 blkn=510 | grep kfbh.type
kfbh.type:                            1 ; 0x002: KFBTYP_DISKHEAD

可以看到510确实也是HEAD信息把它读出来看看


[root@axj-rac1 backup]# kfed read /dev/raw/raw5 blkn=510
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            1 ; 0x002: KFBTYP_DISKHEAD
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                     254 ; 0x004: blk=254
kfbh.block.obj:              2147483648 ; 0x008: disk=0
kfbh.check:                   323429756 ; 0x00c: 0x1347257c
kfbh.fcn.base:                    16403 ; 0x010: 0x00004013
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfdhdb.driver.provstr:         ORCLDISK ; 0x000: length=8
kfdhdb.driver.reserved[0]:            0 ; 0x008: 0x00000000
kfdhdb.driver.reserved[1]:            0 ; 0x00c: 0x00000000
kfdhdb.driver.reserved[2]:            0 ; 0x010: 0x00000000
kfdhdb.driver.reserved[3]:            0 ; 0x014: 0x00000000
kfdhdb.driver.reserved[4]:            0 ; 0x018: 0x00000000
kfdhdb.driver.reserved[5]:            0 ; 0x01c: 0x00000000
kfdhdb.compat:                186646528 ; 0x020: 0x0b200000
kfdhdb.dsknum:                        0 ; 0x024: 0x0000
kfdhdb.grptyp:                        1 ; 0x026: KFDGTP_EXTERNAL
kfdhdb.hdrsts:                        3 ; 0x027: KFDHDR_MEMBER
kfdhdb.dskname:           DATADG01_0000 ; 0x028: length=13
kfdhdb.grpname:                DATADG01 ; 0x048: length=8
kfdhdb.fgname:            DATADG01_0000 ; 0x068: length=13
kfdhdb.capname:                         ; 0x088: length=0
kfdhdb.crestmp.hi:             33024790 ; 0x0a8: HOUR=0x16 DAYS=0x18 MNTH=0xa YEAR=0x7df
kfdhdb.crestmp.lo:            258502656 ; 0x0ac: USEC=0x0 MSEC=0x21c SECS=0x36 MINS=0x3
kfdhdb.mntstmp.hi:             33032273 ; 0x0b0: HOUR=0x11 DAYS=0x2 MNTH=0x2 YEAR=0x7e0
kfdhdb.mntstmp.lo:           3209038848 ; 0x0b4: USEC=0x0 MSEC=0x183 SECS=0x34 MINS=0x2f
kfdhdb.secsize:                     512 ; 0x0b8: 0x0200
kfdhdb.blksize:                    4096 ; 0x0ba: 0x1000
kfdhdb.ausize:                  1048576 ; 0x0bc: 0x00100000
kfdhdb.mfact:                    113792 ; 0x0c0: 0x0001bc80
kfdhdb.dsksize:                    2008 ; 0x0c4: 0x000007d8
kfdhdb.pmcnt:                         2 ; 0x0c8: 0x00000002
kfdhdb.fstlocn:                       1 ; 0x0cc: 0x00000001
kfdhdb.altlocn:                       2 ; 0x0d0: 0x00000002
kfdhdb.f1b1locn:                      2 ; 0x0d4: 0x00000002
kfdhdb.redomirrors[0]:                0 ; 0x0d8: 0x0000
kfdhdb.redomirrors[1]:            65535 ; 0x0da: 0xffff
kfdhdb.redomirrors[2]:            65535 ; 0x0dc: 0xffff
kfdhdb.redomirrors[3]:            65535 ; 0x0de: 0xffff
kfdhdb.dbcompat:              168820736 ; 0x0e0: 0x0a100000
kfdhdb.grpstmp.hi:             33024790 ; 0x0e4: HOUR=0x16 DAYS=0x18 MNTH=0xa YEAR=0x7df
kfdhdb.grpstmp.lo:            258378752 ; 0x0e8: USEC=0x0 MSEC=0x1a3 SECS=0x36 MINS=0x3
kfdhdb.vfstart:                       0 ; 0x0ec: 0x00000000
kfdhdb.vfend:                         0 ; 0x0f0: 0x00000000
kfdhdb.spfile:                        0 ; 0x0f4: 0x00000000
kfdhdb.spfflg:                        0 ; 0x0f8: 0x00000000
kfdhdb.ub4spare[0]:                   0 ; 0x0fc: 0x00000000
kfdhdb.ub4spare[1]:                   0 ; 0x100: 0x00000000
kfdhdb.ub4spare[2]:                   0 ; 0x104: 0x00000000
kfdhdb.ub4spare[3]:                   0 ; 0x108: 0x00000000
kfdhdb.ub4spare[4]:                   0 ; 0x10c: 0x00000000
kfdhdb.ub4spare[5]:                   0 ; 0x110: 0x00000000
kfdhdb.ub4spare[6]:                   0 ; 0x114: 0x00000000
kfdhdb.ub4spare[7]:                   0 ; 0x118: 0x00000000
kfdhdb.ub4spare[8]:                   0 ; 0x11c: 0x00000000
kfdhdb.ub4spare[9]:                   0 ; 0x120: 0x00000000
kfdhdb.ub4spare[10]:                  0 ; 0x124: 0x00000000
kfdhdb.ub4spare[11]:                  0 ; 0x128: 0x00000000
kfdhdb.ub4spare[12]:                  0 ; 0x12c: 0x00000000
kfdhdb.ub4spare[13]:                  0 ; 0x130: 0x00000000
kfdhdb.ub4spare[14]:                  0 ; 0x134: 0x00000000
kfdhdb.ub4spare[15]:                  0 ; 0x138: 0x00000000
kfdhdb.ub4spare[16]:                  0 ; 0x13c: 0x00000000
kfdhdb.ub4spare[17]:                  0 ; 0x140: 0x00000000
kfdhdb.ub4spare[18]:                  0 ; 0x144: 0x00000000
kfdhdb.ub4spare[19]:                  0 ; 0x148: 0x00000000
kfdhdb.ub4spare[20]:                  0 ; 0x14c: 0x00000000
kfdhdb.ub4spare[21]:                  0 ; 0x150: 0x00000000
kfdhdb.ub4spare[22]:                  0 ; 0x154: 0x00000000
kfdhdb.ub4spare[23]:                  0 ; 0x158: 0x00000000
kfdhdb.ub4spare[24]:                  0 ; 0x15c: 0x00000000
kfdhdb.ub4spare[25]:                  0 ; 0x160: 0x00000000
kfdhdb.ub4spare[26]:                  0 ; 0x164: 0x00000000
kfdhdb.ub4spare[27]:                  0 ; 0x168: 0x00000000
kfdhdb.ub4spare[28]:                  0 ; 0x16c: 0x00000000
kfdhdb.ub4spare[29]:                  0 ; 0x170: 0x00000000
kfdhdb.ub4spare[30]:                  0 ; 0x174: 0x00000000
kfdhdb.ub4spare[31]:                  0 ; 0x178: 0x00000000
kfdhdb.ub4spare[32]:                  0 ; 0x17c: 0x00000000
kfdhdb.ub4spare[33]:                  0 ; 0x180: 0x00000000
kfdhdb.ub4spare[34]:                  0 ; 0x184: 0x00000000
kfdhdb.ub4spare[35]:                  0 ; 0x188: 0x00000000
kfdhdb.ub4spare[36]:                  0 ; 0x18c: 0x00000000
kfdhdb.ub4spare[37]:                  0 ; 0x190: 0x00000000
kfdhdb.ub4spare[38]:                  0 ; 0x194: 0x00000000
kfdhdb.ub4spare[39]:                  0 ; 0x198: 0x00000000
kfdhdb.ub4spare[40]:                  0 ; 0x19c: 0x00000000
kfdhdb.ub4spare[41]:                  0 ; 0x1a0: 0x00000000
kfdhdb.ub4spare[42]:                  0 ; 0x1a4: 0x00000000
kfdhdb.ub4spare[43]:                  0 ; 0x1a8: 0x00000000
kfdhdb.ub4spare[44]:                  0 ; 0x1ac: 0x00000000
kfdhdb.ub4spare[45]:                  0 ; 0x1b0: 0x00000000
kfdhdb.ub4spare[46]:                  0 ; 0x1b4: 0x00000000
kfdhdb.ub4spare[47]:                  0 ; 0x1b8: 0x00000000
kfdhdb.ub4spare[48]:                  0 ; 0x1bc: 0x00000000
kfdhdb.ub4spare[49]:                  0 ; 0x1c0: 0x00000000
kfdhdb.ub4spare[50]:                  0 ; 0x1c4: 0x00000000
kfdhdb.ub4spare[51]:                  0 ; 0x1c8: 0x00000000
kfdhdb.ub4spare[52]:                  0 ; 0x1cc: 0x00000000
kfdhdb.ub4spare[53]:                  0 ; 0x1d0: 0x00000000
kfdhdb.acdb.aba.seq:                  0 ; 0x1d4: 0x00000000
kfdhdb.acdb.aba.blk:                  0 ; 0x1d8: 0x00000000
kfdhdb.acdb.ents:                     0 ; 0x1dc: 0x0000
kfdhdb.acdb.ub2spare:                 0 ; 0x1de: 0x0000

通过对比我们可以发现与之前的raw5磁盘头的内容是一摸一样的。

6.由于之前破坏掉了raw5磁盘头信息,看看有啥报错

[oracle@axj-rac1 ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Wed Mar 9 15:09:17 2016
Copyright (c) 1982, 2011, Oracle.  All rights reserved.
Connected to an idle instance.

SQL> startup  --重启数据库发现报错了
ORA-01078: failure in processing system parameters
ORA-01565: error in identifying file '+DATADG01/rac11g/spfilerac11g.ora'
ORA-17503: ksfdopn:2 Failed to open file +DATADG01/rac11g/spfilerac11g.ora
ORA-15077: could not locate ASM instance serving a required diskgroup

看看asm日志

SQL> ALTER DISKGROUP DATADG01 MOUNT  /* asm agent *//* {2:10674:2} */
NOTE: cache registered group DATADG01 number=1 incarn=0xbec84ee5
NOTE: cache began mount (first) of group DATADG01 number=1 incarn=0xbec84ee5
Wed Mar 09 15:10:28 2016
ERROR: no read quorum in group: required 2, found 0 disks
NOTE: cache dismounting (clean) group 1/0xBEC84EE5 (DATADG01)
NOTE: messaging CKPT to quiesce pins Unix process pid: 3711, image: oracle@axj-rac1 (TNS V1-V3)
NOTE: dbwr not being msg'd to dismount
NOTE: lgwr not being msg'd to dismount
NOTE: cache dismounted group 1/0xBEC84EE5 (DATADG01)
NOTE: cache ending mount (fail) of group DATADG01 number=1 incarn=0xbec84ee5
NOTE: cache deleting context for group DATADG01 1/0xbec84ee5
GMON dismounting group 1 at 7 for pid 29, osid 3711
ERROR: diskgroup DATADG01 was not mounted
ORA-15032: not all alterations performed
ORA-15017: diskgroup "DATADG01" cannot be mounted
ORA-15063: ASM discovered an insufficient number of disks for diskgroup "DATADG01"

可以看到的是datadg01无法mount

通过asmcmd查看,datadg01磁盘组都没了

[grid@axj-rac1 trace]$ asmcmd
ASMCMD> lsdg
State   Type   Rebal Sector Block    AU  Total_MB Free_MB Req_mir_free_MB Usable_file_MB  Offline_disks Voting_files  Name
MOUNTED EXTERN  N       512  4096  1048576   6024    5623             0         5623             0           Y   OCR_VOTE/

三、修复磁盘头



方法一:kfed修复磁盘头
[grid@s1-11g dev]$ 
kfed repair /dev/raw/raw5 
kfed repair /dev/raw/raw6  
kfed repair /dev/raw/raw7 

方法二: dd修复,用之前的备份
[grid@s1-11g dev]$
dd if=/backup/raw5 of=/dev/raw/raw5
dd if=/backup/raw6 of=/dev/raw/raw6
dd if=/backup/raw7 of=/dev/raw/raw7

方法三: 利用oracle的kfed工具来备份,格式是文本格式,恢复时使用kfed merge进去

备份:
kfed read /dev/raw/raw5    aunum=0 blknum=0 text=/home/oracle/raw5.txt
kfed read /dev/raw/raw6    aunum=0 blknum=0 text=/home/oracle/raw6.txt
kfed read /dev/raw/raw7    aunum=0 blknum=0 text=/home/oracle/raw7.txt
恢复:
kfed write /dev/raw/raw5    aunum=0 blknum=0 text=raw5.txt
kfed write /dev/raw/raw6    aunum=0 blknum=0 text=raw6.txt
kfed write /dev/raw/raw7    aunum=0 blknum=0 text=raw7.txt   
 
这里我用的是方法一修复的

1.恢复完成后查看磁盘头信息:
 
[root@axj-rac1 oracle]# kfed read /dev/raw/raw5 aun=0 blkn=0|grep kfbh.type
kfbh.type:                            1 ; 0x002: KFBTYP_DISKHEAD


2.然后成功mount磁盘组

3.查看dg状态可以看到是mounted状态
ASMCMD> lsdg
State   Type   Rebal Sector Block     AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files  Name
MOUNTED EXTERN N        512  4096 1048576   10024    6581              0          6581              0         N  DATADG01/
MOUNTED EXTERN N        512  4096 1048576    6024    5623              0          5623              0         Y  OCR_VOTE/
可以看到datadg02已结mount了

3.重新查询磁盘组以及磁盘信息
col group_number format a30
col disk_number format a30 
col name format a30
col header_status format a30
col path format a30
col group_number clear
col disk_number clear
set linesize 200 pagesize 2000 

SQL>select group_number,disk_number,name,header_status,path from v$asm_disk;

GROUP_NUMBER DISK_NUMBER NAMEHEADER_STATUS       PATH
------------ ----------- -----------------------------
   1       1 DATADG01_0001MEMBER       /dev/raw/raw6
   1       0 DATADG01_0000MEMBER       /dev/raw/raw5
   2       1 OCR_VOTE_0001MEMBER       /dev/raw/raw2
   2       0 OCR_VOTE_0000MEMBER       /dev/raw/raw1
   1       2 DATADG01_0002MEMBER       /dev/raw/raw7
   2       2 OCR_VOTE_0002MEMBER       /dev/raw/raw3

可以看到所有状态已经正常,数据库也正常启动。

010-其他

rz命令安装

1
rpm -ivh rzsz-0.12.20-934.22.x86_64.rpm

Wireshark

001-庖丁解牛

1
2
3
4
tcpdump -i any host 80.80.46.76   -w  target.cap
tcpdump -i any port 8080 -w target.cap
tcpdump -i eth0 -s 80 -w tcpdump.cap
只抓取eth0上每个包的前80字节,把结果存到tcpdum.cap中

1.只抓包头:

1
2
3
tcpdump -i eth0 -s 80 -w tcpdump.cap 
Capture--->Options
"Limit each packet to"正常设:80bytes;TCP层、网络层和数据链路层的信息可以包含在内。

image-20210623075924347

2.只抓必要的包

1
2
3
tcpdump -i eth0 host 10.32.200.131 -w tcpdump.cap
Capture-->Options
Capture Filter输入“host 10.30.200.131

image-20210623075933798

3.过滤

1
2
ip.addr eq 10.32.106.50 && tcp.port eq 8080
过滤出10.32.106.50,TCP端口为8080的包

image-20210623075945543

1
2
3
4
5
6
7
8
9
10
11
12
13
如果已知某个协议发生为题可以用协议名称过滤一下。
例如已知该域的验证协议Keberos
Filter:Keberos
用协议过滤时务必考虑协议间的依赖性:
Filter:portmap||mount。前提是要懂协议间的依赖
IP地址加port号是最常用的过滤方式。
手工输入Filter:ip.addreq<IP 地址>&&tcp.porteq<端口号>
右击感兴趣的包,选择”Follow TCP/UDP Stream(选择TCP还是UDP根据传输协议而定)
Wireshark是按照两端的IP加port过滤出一个TCP/UDP Stream
Statistics-->Conversations再单击TCP或者UDP标签就可以看到所以Stream
用鼠标帮助过滤
右击感兴趣的包,Prepare a Filter-->Selected自动在Filter中生成过滤表达式。还可以使用And、Or等选项
右击感兴趣的包,Apply as Filter-->Selected表示式生成后还会自动执行

4.让Wireshark自动分析

1
2
3
4
单击Wireshark的Analyze-->Expert Info Composite在分析网络性能和连接问题时,借助此功能
单击Statistics-->Service Response Time,再选定协议名称,可以得到响应时间的统计表
单击Statistics-->TCP Stream Graph生成统计图
Statisecs-->Summary,可以看到一些统计信息,比如平均流量等,有助于我们推测负载状况。

5.搜索功能

1
Ctrl+F后选中“String”单选按钮搜索关键字,在Filter中输入例如:error

011-SHELL

1
2
3
4
break(循环控制)
continue(循环控制)
exit(退出脚本)
return(退出函数)

小数和整数比较

1
2
3
4
5
6
7
https://www.cnblogs.com/shixun/p/6179642.html
shell脚本小数和整数比较
1.错误:
if [ $mya -le 4 ]; then echo "ok";else echo "fail"; fi
-bash: [: 5.7: integer expression expecte
2.正确:
if [ $(echo "$mya <= 4"|bc) = 1 ]; then echo "ok";else echo "fail";fi

read

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
情景
我们知道,read命令可以读取文件内容,并把内容赋值给变量。
以如下的数据文件为例。
$ cat data.txt
1 201623210021 wangzhiguo 25
2 201623210022 yangjiangbo 26
3 201623210023 yangzhen 24
4 201623210024 wangdong 23
5 201623210025 songdong 25

以上文件的四列分别为序号(index)、学号(number)、姓名(name)、年龄(age)。用shell脚本读取该文件并输出每行的值:
$ cat read_data.sh
#!/bin/bash
cat data.txt | while read index number name age
do
echo "index:${index}"
echo "number:${number}"
echo "name:${name}"
echo "age:${age}"
echo " "
done
执行脚本,查看结果:
$ sh read_data.sh
index:1
number:201623210021
name:wangzhiguo
age:25

index:2
number:201623210022
name:yangjiangbo
age:26

index:3
number:201623210023
name:yangzhen
age:24

index:4
number:201623210024
name:wangdong
age:23

index:5
number:201623210025
name:songdong
age:25

不知你发现没有,这样的实现方式有着明显的弊端:
列名(read index number name age)显式地在代码中指定,如果只是想弄清楚数据文件的每列含义,则需要阅读脚本;
该脚本中指明了每列的名称,如果希望修改各字段的英文名称(比如序号的英文名称希望改为NUMBER)则需要修改脚本,且修改多处;
该脚本按一定顺序读取数据文件,因此,如果数据文件中的列顺序发生了变化,则依然需要修改脚本;
如果有其他数据文件需要按此方式读取,则需要根据数据文件的实际情况再重写一个新脚本;
上述实现方式虽然看起来简单,但基于上述的弊端,我们还应对其进行优化。

方案
解决的根本应该是写尽可能通用的脚本,不依赖数据文件本身的列数、列顺序、列名称(含义)等。

可以将数据文件的各字段名称存于该数据文件的首行。当读取数据文件时,首先读取数据文件的首行,以获取各字段名称的列表;读取其它行时,将首行的值与非首行的值进行一一对应即可。

数据文件:
$ cat new_data.txt
index number name age
1 201623210021 wangzhiguo 25
2 201623210022 yangjiangbo 26
3 201623210023 yangzhen 24
4 201623210024 wangdong 23
5 201623210025 songdong 25
脚本

$ cat new_read_data.sh
#!/bin/bash

# 读取文件头行,存于一个数组中
tablehead=(`head -n 1 new_data.txt`)

# 从文件第二行开始读取,按上述数组顺序读取各字段
tail -n +2 new_data.txt | while read ${tablehead[*]}
do
# 遍历数组的下标,获取tablehead数组的对应值,以及以该值命名的变量的值
for i in `seq 0 $((${#tablehead[@]}-1))`
do
temp=${tablehead[$i]}
echo "${temp}:${!temp}"
done
echo ""
done
结果

$ sh new_read_data.sh
index:1
number:201623210021
name:wangzhiguo
age:25

index:2
number:201623210022
name:yangjiangbo
age:26

index:3
number:201623210023
name:yangzhen
age:24

index:4
number:201623210024
name:wangdong
age:23

index:5
number:201623210025
name:songdong
age:25
要写出更通用的脚本,还可以做一些判断和处理,比如:数据文件作为参数传入、检查数据文件的行数、检查数据文件的列数,等等。

EOT、EOF

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
EOT:EOT是“end of file”,表示文本结束符。即可避免使用多行echo命令的方式,并实现多行输出的结果。
function usage ()
{
cat <<- EOT
Usage : $0 [options] -p package -s script file1 file2 file3 ..

Options:
-h|help Display this message
-p|package The output package name
-j|jar file The jar file
EOT
}

usage

#EOT只是标识,不是固定的,可以写成EOF、HHH等


其它用法:
在某些场合,可能我们需要在脚本中生成一个临时文件,然后把该文件作为最终文件放入目录中。(可参考ntop.spec文件)这样有几个好处,其中之一就是临时文件不是唯一的,可以通过变量赋值,也可根据不同的判断生成不同的最终文件等等。

一、cat和EOF
cat命令是linux下的一个文本输出命令,通常是用于观看某个文件的内容的;
EOF是“end of file”,表示文本结束符。
结合这两个标识,即可避免使用多行echo命令的方式,并实现多行输出的结果。

二、使用
看例子是最快的熟悉方法:
# cat << EOF > test.sh
> #!/bin/bash
> #you Shell script writes here.
> EOF

结果:
引用
cat test.sh
#!/bin/bash
#you Shell script writes here.。

三、其他写法
1、追加文件
# cat << EOF >> test.sh
2、换一种写法
# cat > test.sh << EOF
3、非脚本中
如果不是在脚本中,我们可以用Ctrl-D输出EOF的标识
# cat > iii.txt
skldjfklj
sdkfjkl
kljkljklj
kljlk
Ctrl-D

结果:
引用
# cat iii.txt
skldjfklj
sdkfjkl
kljkljklj
kljlk

exec

1
2
3
4
5
6
懒的整理:http://xstarcd.github.io/wiki/shell/exec_redirect.html
简明说说exec使用,不深究:
1.作为日志打印重定向使用
SCRTIP_NAME="cp_image.sh" #脚本名
exec 5>>/tmp/${SCRTIP_NAME/.sh/}.log #带>&5都输出到这个日志
echolog "Error, Delete the image file failed!" >&5

$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$0: 脚本本身文件名称
$1: 命令行第一个参数,$2为第二个,以此类推
$*: 所有参数列表
$@: 所有参数列表
$#: 参数个数
$$: 脚本运行时的PID
$?: 脚本退出码

*与@的区别

当命令行为test.sh 1 2 3
"$*“表示"1 2 3
"$@“表示"1” “2” “3
二者没有被引号括起来时是一样的都为"1 2 3",只有当被引号括起来后才表现出差异

printf

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
printf
https://www.cnblogs.com/simadongyang/p/8228098.html

上一章节我们学习了Shell的echo命令,本章节我们来学习Shell的另一个输出命令printf.
printf命令模仿C程序库(library)里的printf()程序。
printf由POSIX标准多定义,因此使用printf 的脚本比使用echo 移值性好。
printf 使用引用文本或空格分隔的参数,外面可以在printf中使用格式化字符串,还可以制定字符串的宽度 左右对齐方式等。
默认printf不会向echo 自动添加换行符, 我们可以手动添加 \n.

printf 命令的语法:
printf format-string [arguments ...]
参数说明:
format-string:为格式控制字符串
arguments:为参数列表。
实例如下:
$ echo "Hello,Shell"
Hello,Shell
$ prinrf "Hello,Shell\n"
Hello,Shell
$
接下来,我来用一个脚本来体现printf的强大功能:
#!/binbash
# author:菜鸟教程
# url:www.runoob.com
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
执行脚本,输出结果如下所示:
姓名 性别 体重kg
郭靖  男  66.12
 
%s %c %d %都是格式替代符
%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4 2f 指格式化小数,其中,.2指保留2为小数。
更多实例:
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
# fotmat-sting为双引号
printf "%d %s\n" 1  "abc"
# 单引号与双引号效果一样
printf '%d %s\n' 1 "abc"
# 没有引号也可以输出
printf %s abcdef
# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出, format-string 被重用
printf %s abc def
printf "%s\n" abc def 
printf "%s %s %s\n" a b c e f g h 
# 如果没有 arguments,那么 %s 用HULL 代替, %d 用0 代替
printf "%s and %d \n"
执行脚本 ,输出结果如下所示:
printf的转义序列
序列  说明
\a  警告字符,通常为ASCII的BEL字符
\b 后退
\c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且, 任何留在参数里的字符,
任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
\f 换页(formfeed)
\n 换行
\r 回车(Carriage return)
\t  水平制表符
\v 垂直制表符
\\ 一个字面上的反斜杠字符
\ddd 表示13位数八进制的字符,仅在格式字符串中有效
\0ddd 表示13位的八进制值字符
笔记
%d %s %c %f  格式替代符详解
d:Decimal 十进制整数 对应位置参数必须是十进制整数,否则报错!
s:String 字符串 对应位置参数必须是字符串或者字符型 否则报错
c:Char 字符 对应位置参数必须是字符串或者字符型 否则报错
f: Float 浮点 对应位置参数必须是数字型 否则报错
如: 其中最后一个参数是 "def" %c 自动截取字符串的第一个字符作为结果输出。

shift:参数左移

1
2
3
4
5
6
shell脚本shfit
shift其实很简单的,就是左移参数列表,shift一次就将最左边的参数$1移出去了,然后
原来的$2现在就变成了$1

shift后面还可以带上一个数字,指明要移出多少个参数(默认只移出一个),比如说
shift 3 就是移出3个参数,之后原来的$4就变成了现在的$1
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理(常见于Linux中各种程序的启动脚本)。

示例1:依次读取输入的参数并打印参数个数:
run.sh:
#!/bin/bash
while [ $# != 0 ];do
echo "第一个参数为:$1,参数个数为:$#"
shift
done
输入如下命令运行:run.sh a b c d e f
结果显示如下:
第一个参数为:a,参数个数为:6
第一个参数为:b,参数个数为:5
第一个参数为:c,参数个数为:4
第一个参数为:d,参数个数为:3
第一个参数为:e,参数个数为:2
第一个参数为:f,参数个数为:1
从上可知 shift(shift 1) 命令每执行一次,变量的个数($#)减一(之前的$1变量被销毁,之后的$2就变成了$1),而变量值提前一位。

同理,shift n后,前n位参数都会被销毁,比如:
输入5个参数: abcde
那么$1=a,$2=b,$3=c,$4=d,$5=e,执行shift 3操作后,前3个参数a、b、c被销毁,就剩下了2个参数:d,e(这时d=$1,e=$2,其中d由$4—>$1,e由$5—>$2),参考示例如下:
示例2:
#!/bin/bash
echo "参数个数为:$#,其中:"
for i in $(seq 1 $#)
do
eval j=\$$i
echo "第$i个参数($"$i"):$j"
done

shift 3

echo "执行shift 3操作后:"
echo "参数个数为:$#,其中:"
for i in $(seq 1 $#)
do
#通过eval把i变量的值($i)作为变量j的名字
eval j=\$$i
echo "第$i个参数($"$i"):$j"
done
 
输出结果为:
参数个数为:5,其中:
第1个参数($1):a
第2个参数($2):b
第3个参数($3):c
第4个参数($4):d
第5个参数($5):e
执行shift 3操作后:
参数个数为:2,其中:
第1个参数($1):d
第2个参数($2):e
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
32
33
34
35
36
37
38
39
40
41
42
全路径文件名/dirname:文件所在的目录
dirname:文件所在的目录
dirname
直接从dirname返回的未必是绝对路径,取决于提供给dirname的参数是否是绝对路径。 
例子1
[root@ceph4 home]# dirname /home/1.sh
/home

例子2
SHELL_FOLDER=$(dirname "$0")
echo $SHELL_FOLDER
返回.

例子3
SHELL_FOLDER1=$(cd "$(dirname "$0")";pwd)
echo $SHELL_FOLDER1
返回:/home

SHELL_FOLDER=$(dirname "$0")

readlink :全路径文件名
[hadoopet2-centos6 codemgrs]$ readlink --help
用法: readlink [选项]...文件
输出符号链接值或权威文件名.
-f, --canonicalize 递归跟随给出文件名的所有符号链接以标准化,除最后一个外所有组件必须存在
-e, --canonicalize-existing 递归跟随给出文件名的所有符号链接以标准化,所有组件都必须存在
-m, --canonicalize-missing 递归跟随给出文件名的所有符号链接以标准化,但不对组件存在性作出要求
-n, --no-newline 不输出尾随的新行
-q, --quiet,
-S, --silent 缩减大多数的错误消息
-v, --verbose 报告所有错误消息
--help 显示此帮助信息并退出
--version 显示版本信息并退出
所以用readlink命令我们可以直接获取$0参数的全路径文件名,然后再用dirname获取其所在的绝对路径:
举例1
readlink -f "$0"
/home/6.sh

举例2
SHELL_FOLDER=$(dirname $(readlink -f "$0"))
echo $SHELL_FOLDER
/home

random:从数组中随机抽取元素

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
student=(1 DPL YPD LT ZZM HY CQW LSJ ybr)
a=$[RANDOM%4+3]
c=$[RANDOM%2+1]
echo -----------------------------------
echo $a${student[$a]}
echo $(($a+$c))号 ${student[$(($a+$c))]}
echo $(($a-$c))号 ${student[$(($a-$c))]}
echo -----------------------------------

#done

getopt

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
getopt(一个外部工具)
https://www.cnblogs.com/lidabo/p/5382617.html
具体用用法可以 man getopt
char*optstring = “ab:c::”;
#单个字符a 表示选项a没有参数 格式:-a即可,不加参数
#单字符加冒号b: 表示选项b有且必须加参数 格式:-b 100或-b100,但-b=100错
#单字符加2冒号c:: 表示选项c可以有,也可以无 格式:-c200,其它格式错误
#getopt处理以'-’开头的命令行参数,如optstring="ab:c::d::",命令行为getopt.exe -a -b host -ckeke -d haha
#在这个命令行参数中,-a是选项元素。host是b的参数,keke是c的参数。但haha并不是d的参数,因为它们中间有空格隔开。
#还要注意的是默认情况下getopt会重新排列命令行参数的顺序,所以到最后所有不包含选项的命令行参数都排到最后。
#-o表示短选项
#--long表示长选项
#"$@"在上面解释过
# -n:出错时的信息
# -- :举一个例子比较好理解:
我们要创建一个名字为 "-f"的目录你会怎么办?
mkdir -f #不成功,因为-f会被mkdir当作选项来解析,这时就可以使用
mkdir -- -f 这样-f就不会被作为选项。
#下面的例子都是使用的$2
举例:
!/bin/bash
TEMP=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \
-n 'example.bash' -- "$@"`

if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi

#set 会重新排列参数的顺序,也就是改变$1,$2...$n的值,这些值在getopt中重新排列过了
eval set -- "$TEMP"

#经过getopt的处理,下面处理具体选项。
while true ; do
case "$1" in
-a|--a-long) echo "Option a" ; shift ;;
-b|--b-long) echo "Option b, argument \`$2'" ; shift 2 ;;
-c|--c-long)
case "$2" in
"") echo "Option c, no argument"; shift 2 ;;
*) echo "Option c, argument \`$2'" ; shift 2 ;;
esac ;;
--) shift ; break ;;
*) echo "Internal error!" ; exit 1 ;;
esac
done
echo "Remaining arguments:"
for arg do
echo '--> '"\`$arg'" ;
done
运行命令:
./getopt.sh -b abc -a -c33 remain
Option b, argument `abc'
Option a
Option c, argument `33'
Remaining arguments:
--> `remain'

再举一个例子:(安装脚本里面的)
function parse()
{"
RET=`getopt -o ht:e: \
--long help,type:,env: \
-n "ERROR" -- "$@"`
if [ $? -ne 0 ]
then
usage
exit 0
fi
eval set -- "$RET"
while true
do
case "$1" in
-h|--help)
usage
exit 0
;;
-t|--type)
TYPE=$2
shift 2
;;
-e|--env)
ENV=$2
shift 2
;;
--)
shift
break
;;
*)
usage
exit 0
;;
esac
done
}

eval

1
2
3
4
5
6
https://www.cnblogs.com/f-ck-need-u/p/7426371.html
使用示例来说明:
[root@xuexi ~]# a=24;name='long$a' # 注意,使用的是单引号,禁止$a被扩展
如果直接执行 echo $name ,则结果为"long$a",但如果执行 eval echo $name ,结果将是"long24"
[root@xuexi ~]# eval echo $name
long24

exit

1
2
exit0):正常运行程序并退出程序;
exit1):非正常运行导致退出程序;

运算符

1
2
3
4
5
6
7
8
9
10
11
12
https://www.runoob.com/linux/linux-shell-basic-operators.html

%:整除
#!/bin/bash
sum=0
for a in `seq 1 300`
do
if [ $(($a%4)) = '0' ];then
let sum=$sum+$a
fi
done
echo $sum

nohup

1
nohup ./start.sh >output 2>&1 &
赞赏一下吧~