overlay文件系统

Overlayfs是一种类似aufs的一种堆叠文件系统,于2014年正式合入Linux-3.18主线内核,是一种覆盖式的文件系统。它依赖并建立在其它的文件系统之上(例如ext4fs和xfs等等),并不直接参与磁盘空间结构的划分,仅仅将原来底层文件系统中不同的目录进行“合并”,然后向用户呈现。因此对于用户来说,它所见到的overlay文件系统根目录下的内容就来自挂载时所指定的不同目录的“合集”。

RAID 磁盘阵列介绍

磁盘阵列(Redundant Arrays of Independent Disks,RAID)

  1. 存储的数据一定分片;

  2. 分基于软件的软RAID(如mdadm)和基于硬件的硬RAID(如RAID卡);

  3. RAID卡如同网卡一样有集成板载的也有独立的(PCI-e),一般独立RAID卡性能相对较好,淘宝一搜便可看到他们的原形;

  4. 现在基本上服务器都原生硬件支持几种常用的RAID;

  5. 当然还有更加高大上的专用于存储的磁盘阵列柜产品,有专用存储技术,规格有如12/24/48盘一柜等,盘可选机械/固态,3.5/2.5寸等。

epoll多路复用介绍

epoll是开发linux高性能服务器的必备技术至,epoll本质,是服务端程序员的必须掌握的知识。

最大TCP连接数

linux 的TCP最大连接

最大理论连接数

接受端口:65535
发送端口:65535
那么 ip A –> ipB,组合起来有 65535*65535

Shell技巧

入参和默认变量

对于shell脚本而言,有些内容是专门用于处理参数的,他们都有特定的含义 ,例如:

1
2
3
4
5
6
7
8
9
/root/test.sh arg1 arg2
$0 # 脚本名
$1 # 第一个参数
$2 # 第二个参数
$# # 脚本后面跟的参数个数
$@ # 所有参数,并且可以被遍历
$* # 所有参数,且作为整体,和$*很像,但是有区别
$$ # 当前脚本的进程ID
$? # 上一条命令的退出状态

变量

给变量赋值,使用等号即可,但是等号两边千万不要有空格,等号右边有空格的字符串也必须用引号引起来:

1
2
3
4
arg1="hello world"  # 直接赋值
unset arg1 # 取消赋值
echo "para1 is $arg1" # 调用变量
echo "para1 is ${arg1}" #调用变量

执行命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
a=`ls`  # 直接执行
# 或
a=$(a)

# 计算
echo "1+1=$((1+1))"

# 引用单条执行结果
a="ls"
echo "$($a)"

# 引用多个执行结果
a="ls;pwd"
echo "$(eval $a)" # 使用了eval,将a的内容都作为命令来执行。

条件分支

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
if [ $? -eq 0 ];
then
eho "success"
elif [ $? -eq 1 ];
then
echo "failed,code is 1"
else
echo "other code"
fi


name="aa"
case $name in
"aa")
echo "name is aa"
;;
"")
echo "name is null"
;;
"bb")
echo "name is bb"
;;
*)
echo "name is other"
;;
esac

# 多条件
# -o或者||表示或。这里也有一些常见的条件判定。
if [ 10 -gt 5 -o 10 -gt 4 ];then
echo "10>5 or 10>4"
fi

if [ 10 -gt 5 ] || [ 10 -gt 4 ];then
echo "10>5 or 10>4"
fi

条件

-o or 或者,同||
-a and 与,同&&
! 非

整数判断

-eq 两数是否相等
-ne 两数是否不等
-gt 前者是否大于后者(greater then)
-lt 前面是否小于后者(less than)
-ge 前者是否大于等于后者(greater then or equal)
-le 前者是否小于等于后者(less than or equal)

字符串判断str1 exp str2

-z “$str1” str1是否为空字符串
-n “$str1” str1是否不是空字符串
“$str1” == “$str2” str1是否与str2相等
“$str1” != “$str2” str1是否与str2不等
“$str1” =~ “str2” str1是否包含str2

文件目录判断:filename

-f $filename 是否为文件
-e $filename 是否存在
-d $filename 是否为目录
-s $filename 文件存在且不为空
! -s $filename 文件是否为空

循环

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
#遍历输出脚本的参数
for i in $@;do
echo $i
done


for ((i = 0 ; i < 10 ; i++ ));do
echo $i
done


for i in {1..5};do
echo "Welcome $i"
done


while["$ans"!="yes"]
do
read -p "please input yes to exit loop:" ans
done


ans=yes
until[ $ans !="yes"]
do
read -p "please input yes to exit loop:" ans
done


for i in{5..15..3};do
echo "number is $i"
done

函数

1
2
3
4
5
6
7
8
myfunc(){
echo "hello world $1"
}


function myfunc(){
echo "hello world $1"
}

返回值

通常函数的return返回值只支持0-255

1
2
3
4
5
function myfunc(){
local myresult='some value'
echo $myresult
}
val=$(myfunc) #val的值为some value

通过return的方式适用于判断函数的执行是否成功

1
2
3
4
5
6
7
8
9
function myfunc(){
#do something
return0
}
if myfunc;then
echo "success"
else
echo "failed"
fi

注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
# 这是一行注释
:'
这是
多行
注释
'
ls
:<<EOF
这也可以
达到
多行注释
的目的
EOF

日志保存

方式一,将标准输出保存到文件中,打印标准错误:

./test.sh > log.dat
这种情况下,如果命令执行出错,错误将会打印到控制台。所以如果你在程序中调用,这样将不会讲错误信息保存在日志中。

方式二,标准输出和标准错误都保存到日志文件中:

./test.sh > log.dat 2>&1

方式三,保存日志文件的同时,也输出到控制台:

./test.sh |tee log.dat

脚本执行

./test.sh 直接执行
sh test.sh 在子进程中执行
sh -x test.sh debug模式,会在终端打印执行到命令,适合调试
source test.sh test.sh在父进程中执行
. test.sh 不需要赋予执行权限,临时执行

脚本退出码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
function myfun(){
if[ $# -lt 2 ]
then
echo "para num error"
exit 1
fi
echo "ok"
exit 2
}

if[ $# -lt 1 ]
then
echo "para num error"
exit 1
fi

returnVal=`myfun aa`
echo "end shell"
exit 0

这里需要特别注意的一点是,使用 returnVal=`myfun aa`

这样的句子执行函数,即便函数里面有exit,它也不会退出脚本执行,而只是会退出该函数,这是因为exit是退出当前进程,而这种方式执行函数,相当于fork了一个子进程,因此不会退出当前脚本。最终结果就会看到,无论你的函数参数是什么最后end shell都会打印。

rsync同步工具的使用

Linux 命令行中rsync 介绍

rsync 因其切割算法,及增量对比的优势,在文件同步中应用极为广泛

linux 使用 shadowsocket 翻墙

linux 使用 shadowsocket 翻墙

ss-local 是 shadowsocks 的本地 socks5 服务器,如果需要使用 ss-local 提供的 socks5 代理,必须让应用程序使用 socks5 协议与之通信。但是很可惜,除了部分浏览器、软件直接支持 socks5 协议外,其它的都只支持 http 代理。因此,我们需要借助 privoxy 来将 http 代理协议转换为 socks5 代理协议,与后端的 ss-local 进行通信,与此同时我们还可以进行 gfwlist 分流操作。

Git

Git常用命令集合,Fork于tips项目

Git是一个 “分布式版本管理工具”,简单的理解版本管理工具:大家在写东西的时候都用过 “回撤” 这个功能,但是回撤只能回撤几步,假如想要找回我三天之前的修改,光用 “回撤” 是找不回来的。而 “版本管理工具” 能记录每次的修改,只要提交到版本仓库,你就可以找到之前任何时刻的状态(文本状态)。

下面的内容就是列举了常用的 Git 命令和一些小技巧,可以通过 “页面内查找” 的方式进行快速查询:Ctrl/Command+f

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×