一:计算机基础
1.计算机系统:硬件系统和软件系统组成
2.计算机体系结构:
(1)程序:指令和数据组成
(2)计算机体系结构:运算器,控制器,存储器,输入和输出设备
运算器:实现运算(如加法器)
控制器:控制运算器到内存的什么位置读取数据,又将数据存储到什么位置
存储器:内存
输入设备:键盘鼠标等
输出设备:屏幕
硬盘既是输入也是输出
3.操作系统:
(1)Linux操作系统基本原则
- 由目的单一的小程序组成;小程序组合起来完成复杂任务
- 一切皆文件
- 尽量避免捕获用户接口
- 配置文件保存问纯文本格式
(2)操作系统结构
CPU和内存是计算机最核心的硬件设备,是计算机得以运行的基础,因此我们将CPU和内存抽象为计算机硬件;硬件之上是内核,内核将CPU的计算功能抽象为系统调用,由于系统调用太过底层(底层:如Word和excel都需要一个打印的功能,那么需要给Word和excel都开发一个打印模块,而通过库调用就只需要开发一个打印模块),因此将系统调用进行封装为库,向外提供KPI接口供程序员调用。当然也可以直接通过系统进行调用。计算机顶端就是程序,最基本的程序就是shell,shell是人家接口界面。
shell:人机接口
GUI:图形用户接口
CLI:命令行接口
二:常用命令
1.学习命令
命令格式:命令 选项 参数
短选项:- ;多个选项可以组合:-a -b = -ab
长选项:--
参数:命令作用对象
(1)显示命令类型(type)
内置命令(shell内置)
外部命令:文件系统中某个路径有一个与命令名称相应的可执行文件
(2)显示命令manual pages(man)
内部命令:help COMMAND
外部命令:COMMAND --help
命令手册:man COMMAND
在线文档:info COMMAND
(3)查看日历(cal)
cal 2021:查看2021年日历
cal 8 2021:查看2021nian8月日历
(4)确定文件格式(file)
window:PE
Linux:ELF
2.常见目录操作
根目录下的目录:
/bin:可执行文件,用户命令
/sbin:管理命令
/dev:设备文件----块设备(随机访问,数据块),字符设备(线性访问,按字符为单位),设备号(主设备号和次设备号)))
/home:用户的家目录,每个用户家目录通常默认为/home/USERNAME
/lib:库文件----静态库(.a),动态库(.dll,.so),/lib/modules(内核模块文件)
/mnt:挂载点目录,额外的临时文件系统
/proc:伪文件系统,内核映射文件
/tmp:临时文件
/var:可变化文件
/boot:系统启用相关文件,如内核,initrd,grub
/etc:配置文件
/media:挂载点目录,移动设备
/opt:可选目录,第三方程序的目录文件
/root:管理员的家目录
/sys:伪文件系统,跟硬件设备相关的属性映射文件
(1)展示所有的目录列表ls(list)
ls 展示当前目录下的可见文件
ls -a 显示当前文件下所有文件,包含隐藏文件
ls -l 显示文件详细信息
ll 显示当前目录下所有目录
ll -a 展示当前目录下所有目录的详细信息
符号含义
第一个字符:文件类型
-:普通文件(f)
d:目录文件
b:块设备文件
l:符号链接文件
p:命令管道文件
s:套接字文件
9位字符:文件权限
每3位一组,每一组rwx(读,写,执行)
第一组代表文件拥有者权限,第二组文件所属组权限,第三组其他用户权限
数字:硬链接次数
文件属主(owner)
文件属组(group)
文件大小(size),单位字节
时间戳(timestamp):最近一次被修改时间
(2)切换目录cd(change directory)
cd 目录名字:切换到指定目录
cd ..:返回上一级目录
cd /:切换到系统根目录
cd ~:切换到当前用户的根目录
cd ~chen:切换到指定用户家目录
(3)目录的创建(mkdir)和目录的删除(rmdir)
mkdir 目录名:在指定目录下创建一个目录
mkdir -p 目录名/a/b:在指定目录下的a目录创建一个b目录,如上一级目录(父目录)不存在,则一起创建
rmdir 目录名:删除指定目录
(4)文件的创建(touch)和删除(rm)
touch a.txt:在你所在的目录下创建一个文件
rm a.txt:删除指定的文件(会提示,需要y确定)
rm -f a.txt:直接删除指定文件(不提示)
rm -r 目录名:递归删除,删除指定目录下的所有子目录(会提示,需y确认)
rm -rf 目录名:递归删除,直接删除你指定目录下的所有子目录(不提示)
(5)文件的打包和解压tar
-c:创建一个新的tar文件
-v:显示运行过程中的解压或打包信息
-f:指定文件名
-z:调用gzip命令进行压缩文件
-t:查看压缩文件的内容
-x:解压tar文件
具体操作命令:
tar -cvf test.tar test:将当前目录下的test打包成 .tar的文件
tar -zcvf test.tar.gz test:将当前目录下的test目录打包并压缩成 .tar.gz文件
tar -xvf test.tar -C 目录名:将test.tar解压到指定目录,不知道则解压到当前目录
(6)文件的移动(mv)和复制(cd)
mv test1.txt test2.txt:将test1.txt重命名为test2.txt
mv test1.txt test/test2.txt:将文件test1.txt移动到test目录下并重命名为test2.txt
cp test1.txt 目录名:复制test1.txt到指定目录
cp test1.txt test2.txt:复制test1.txt并粘贴到当前目录下,然后重命名为test2.txt
(7)文件的查看(cat,more,less,tail工作中通常用来查看日志)
cat test.txt:查看test.txt文件的内容,如果内容过多后面的内容将无法显示
more test.txt:分页查看test.txt文件的内容,空格翻页,回车键下一行,翻页后无法查看上一页内容
less test.txt:分页查看test.txt文件的内容,PGUP键查看上一页,PGDN键查看下一页
tail test.txt:查看文件的尾部内容
tail -10 test.txt:查看文件的后十行内容
tail -f test.log:动态查看日志
ctrl +c 退出
(8)按例抽取文本内容cut
cut -c1-3 test.txt:打印每行的第1到3个字符
cut -c-2 test.txt:打印每行前2个字符
cut -f1,3 -d“ ” test.txt:打印每行第1和第3个字符组(-d“ ”表示以空格为分隔符)
(9)文本排序sort
sort -n:数值排序
sort -r:降序
sort -k:以哪个字段为关键字进行排序
sort -f:排序时忽略大小xie
以第四个字段为关键字对数字进行降序排列
(10)去掉重复的行uniq(必须相邻)
uniq -c:显示文件中行重复的次数
uniq -d:只显示重复的行
(11)文本统计WC
wc -l:只显示行数
wc -w:显示字段数
wc -c:显示文件大小,bytes
wc -L:最长的一行的长度
(12)查找目录grep及正则表达式
grep abc test.txt:在test.txt文件中查找abc
grep abc test.txt --color:在test.txt文件中查找abc,并高亮显示
通配符:
*:匹配任意长度的任意字符,a*表示以a开头的文件
?:匹配任意单个字符,
[]:匹配规定范围内的任意单个字符,a[1-9]表示a1-a9
[^]:^ 非
.:任意字符
^:指定行的开头, ‘^a’表示以a开头
$:指定行的末尾,'2$'
^$:表示空行
{}:限定连续重复字符范围,{2,5}连续二到五个重复字符({}在shell中有其他特殊含义,所以需用\转移)
(13)其他命令
pwd:显示当前所在目录
wget http://nginx.org/download/nginx-1.9.12.tar.gz 下载资料
(14)重定向输出>和>>
cat test.txt > test1.txt:将text.txt查处的内容输出到test1.txt中,如果之前test1.txt中有数据将覆盖,没有该文件将会创建。此时将不再命令行输出
cat test.txt >> test1.txt:将test.txt查出的内容输出到test1.txt中,如果之前test1.txt中有数据将会在原有数据后面追加查出的数据
set +C:禁止对已存在文件进行覆盖
set -C:解除禁止
(15)管道 |
该命令的作用是将一个命令的输出作为另一个命令的输入
cat index.xml | more:分页查询index.xml的内容
ps -ef | grep aio:查询名称中包含aio的进程
(16)&&命令执行控制
当我们需要同时执行多个命令时可以使用&&符号
mkdir test && cd test:创建test目录并且打开该目录(注意:只有在&&符号前的命令执行成功,后面的命令才会执行)
(17)vim编辑器
vim test.txt:打开test.txt文件
进入编辑模式后按i或o或a键进入插入模式,此时文件为编辑状态,编辑完成之后按esc键退出编辑模式,然后按:进入底行模式,输入wq是保存退出,输入q是不保存退出,输入q!是强制退出。
(18)tee保存文档输出到屏幕
(19)sed文本流编辑器
sed 【option】 'address command' filename
option:
-n:只打印匹配行
-r:使用扩展正则表达式
-i:直接对内容进行修改
-n:取消默认输出
address:
startline,endline:1,100;1,$(第一行到最后一行)
/RegExp/:正则表达式,/^root/
/pattern1/,/pattern2/:第一个被pattern1匹配到的行开始,至第一个被pattern2匹配到的行结束
linenumber:指定行,&
startline,+N:从startline开始,向后N+1行
command:
a:追加 向匹配行后面插入内容
c:更改匹配行内容
d:删除符合条件的行
p:显示符合条件的行
a \string:在指定行后面追加新行,内容为string;\n可以换行
i\string:在指定行前面添加新行,内容为string
r FILE:将指定的文件的内容添加至符合条件的行处
w FILE:将地址指定的范围内的行另存至指定的文件中
s/pattern/string/修饰符:查找并替换,默认只替换每行中第一次被模式匹配的字符串
匹配多个字符串,需要加修饰符:
g:全局替换
i:忽略字符大小号
s///:也可以使用其他字符做分隔符,s###,s@@@
实例:
3.网络通讯命令
(1)ifconfig显示或设置网络设备
ifconfig eth0 up:启用eth0网卡
ifconfig eth0 down:禁用eth0网卡
(2)ping探测网络是否通畅
(3)netstat查看网络端口
netstat -an | grep 3306:查询3306端口的占用情况
4.系统管理命令
(1)date显示或设置系统时间
date:显示系统时间
date -s “2014-01-01 10:10:10”:设置系统时间
(2)df显示磁盘信息
df -h:可读性高的显示大小
(3)free显示内存状态
free -m:以mb单位显示内存组大小
(4)clear(ctrl+l)清屏
(5)ps正在运行的某个进程的状态
ps -ef:查看所有的进程
ps -ef | grep 2868:查看pid为2868的进程
ps aux | grep pid:查看该pid的进程(显示进程用户和拥有者以及不依附于终端的进程)
(6)kill结束某一进程
kill 2868:结束pid为2868的进程
kill -9 2868:强制结束pid为2868的进程
(7)du显示目录或文件的大小
du -h:显示当前目录大小
(8)who显示当前用户信息
(9)hostname显示当前主机名
(10)uname显示系统信息
uname -a:显示本机详细信息
5.用户和权限管理
(1)基础理论
权限:
在文件中:
r:可读,可以使用类似cat等命令查看文件内容
w:可写,可以编辑或删除文件
x:可执行,可以命令提示符下当作命令提交给内核运行
在目录中:
r:可以对此目录执行ls以列出内部所有文件
w:可以在此目录创建文件
x:可以使用cd切换进此目录,也可以使用ls -l查看内部文件的详细信息
数字表示:
1 001 --x: 执行
2 010 -w-: 写
4 100 r--: 只读
755:rwxr-xr-x:属主 属组 其他
用户:UID,/etc/passwd
组:GID,/etc/group
影子口令:
用户:/etc/shadow
组:/etc/gshadow
符号意义(从左到右):
account:登录名
password:密码
UID:
GID:基本组ID
comment:注释
HOME DIR:家目录
SHELL:用户的默认shell,cat /etc/shells查看合法shell
account:登录名
encrypted password:加密密码,两个!表示锁定,不允许登录。格式:$1位$8位$密码,1位是加密方法;8位是杂质
用户类别:
管理员:0
普通用户:1-65535
系统用户:1-499,不需要登录系统,只用来运行后台服务
一般用户:500-60000
用户组类别
第一种分类方式:
管理员组:
普通组:
系统组:
一般组:
第二种分类方式:
私有组:创建用户时,如果没有为其指定所属组,系统会自动为其创建一个用户组
基本组:用户的默认组
附加组,额外组:默认组以外的其它组
(2)useradd添加用户
useradd 【options】 username
-u UID:指定新增用户的UID
-g GID:指定新增用户的GID(基本组)
-G GID,...:附加组,一个用户可以属于多个附加组
-c “COMMENT”:添加注释
-d /path/to/directory:指定家目录
-s SHELL;在/etc/shells中有指定当前系统可用的安全shell
-m -k:创建家目录,并负责SKEL_DIR(default:/etc/skel)下的文件到家目录
-M:不创建用户主目录,即使系统在/etc/login,defs中的设置(CREATE_HOME)为yes)
-r:添加系统用户
(3)userdel删除用户
userdel -r USERNAME:同时删除用户的家目录
(4)id查看用户账号属性信息
(5)figer查看用户账号信息
(6)usermod修改用户账号属性
-u UID:指定新增用户的UID
-g GID:指定新增用户的GID(基本组)
-a -G GID,...:附加组,不使用-a选项会覆盖此前的附加组
-c “COMMENT”:添加注释
-d /path/to/directory:指定家目录
-s SHELL;在/etc/shells中有指定当前系统可用的安全shell
-m -k:创建家目录,并负责SKEL_DIR(default:/etc/skel)下的文件到家目录
-M:不创建用户主目录,即使系统在/etc/login,defs中的设置(CREATE_HOME)为yes)
-r:添加系统用户
(7)passwd 【USERNAME】:密码管理
--stdin:从标准输入接收密码,echo “redhat” | passwd --stdin root
-l:锁定
-u:解锁
-d:删除用户密码
(8)groupadd:创建组
-g GID
-r:添加为系统组
(9)groupmod:修改组属性
-g GID
-n GRPNAME
(10)groupdel:删除组属性
(11)gpasswd:为组设定密码
(12)newgrp GRPNAME<-->exit(退出临时组):临时切换为其他组,需用组密码(切换到自己的附加组不需要)
(13)chown:改变文件属主(只有管理员可以使用此命令)
chown USERNAME file,...
-R:修改目录及其内部文件的属主
(14)chgrp:改变文件属组
chgrp GRPNAME file,...
-R:修改目录及其内部文件的属主
(15)chmod:修改文件权限
u,g,o,a
r,w,x
修改某类用户或某些类用户权限:
chmod u=rwx,o=x test.txt
修改某类用户的某位或某些权限:
chmod u-w test.txt
(16)umask:遮罩码(产生的文件或目录的权限会自动减去遮罩码)
文件:666-umask
目录:777-umask
umask:查看umask值
umask 022:修改umask值为022
6.bash脚本编程
变量:
本地变量:<set> VARNAME=VALUE;作用域为整个bash进程;set可以省略
局部变量:local VARNAME=VALUE;作用域为当前代码段
环境变量:作用域为当前shell进程及其子进程
位置变量:$1,$2
特殊变量:$?:上一个命令的执行状态返回值
/dev/null:软件设备,bit bucket,数据黑洞
查看当前shell中的变量:
包含本地变量和环境变量:set
查看环境变量:printenv,env,export
(1)特殊标记及编辑脚本
#!/bin/bash
编辑一个文档,首行为特殊标记#!/bin/bash
添加对该文件的执行权限,然后执行
(2)条件测试
条件测试类型:整数测试,字符测试,文件测试
条件测试表达式:[ expression ];[[ expression ]];test expression
整数比较:
-eq:测试两个整数是否相等;$a -eq $b
-ne:测试两个整数是否不等;不等,为真;相等,为假
-gt:测试一个数是否大于另一个数;大于,为真;否则,为假
-lt:测试一个数是否小于另一个数;小于,为真;否则,为假
-ge:大于或等于
-le:小于或等于
字符串测试:符号两段要有空格
==:测试是否相等,相等为真,不等为假
!=:测试是否不等,不等为真,相等为假
>:一般不用
<:一般不用
-z string:测试指定字符串是否为空,空则真,不空则假
-n string:测试指定字符串是否为空,不空则真,空则假
文件测试:
-e FILE:测试文件是否存在,exist的简写
-f FILE:测试文件是否为普通文件
-d FILE:测试指定路径是否为目录
-r FILE:测试当前用户对指定文件是否有读取权限
-w FILE:~写权限
-x FILE:~执行
(3)条件判断
命令间的逻辑关系:
逻辑与:&&
第一个条件为假,直接返回结果,第二个条件不做判断
第一个条件为真,继续判断第二个条件
逻辑或:||
第一个条件为假,继续判断第二个条件
第二个条件为真,直接返回结果,第二个条件不做判断
实例:如果一个文件/etc/inittab文件的行数大于100,就显示好大的文件
条件判断控制结构:
if 判断语句;then
statement1
statement2
......
else
statement3
statement4
...
fi
实例:
给定一个用户:
1、如果其UID为0,就显示此为管理员;
2、否则,就显示其为普通用户;
(4)shell中的算术运算
A=3
B=6
let算术运算表达式:let C=$A+$B
$[算术运算表达式]:C=[$A+$B]
$((算术运算表达式)):C=(($A+$B))
expr 算术表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用:C=`expr $A + $B`
(5)for循环语句
for 变量 in 列表;do
循环体
done
生成整数列表:
{1...100}
`seq 起始数 步进长度 结束数`
实例:计算1到100的和
(6)case语句
case SWITCH in
value1)
statement
...
value2)
statement
...
esac
实例:写一个脚本,实现功能:添加删除用户,显示详细信息
#!/bin/bash
#
DEBUG=0
ADD=0
DEL=0
for I in `seq 0 $#`; do //$#表示该脚本后面接的参数个数
if [ $# -gt 0 ]; then //当参数个数大于0
case $1 in //第一个参数进行匹配
-v|--verbose)
DEBUG=1
shift ;; //如果第一个参数为-v或--verbose,将DEBUG赋值为1
-h|--help)
echo "Usage: `basename $0` --add USER_LIST --del USER_LIST -v|--verbose -h|--help"
exit 0 ;;
--add)
ADD=1
ADDUSERS=$2
shift 2;; //如果第一个参数为--add,将ADD赋值为1,并且将第二个参数赋值给ADDUSERS
--del)
DEL=1
DELUSERS=$2
shift 2;;
*)
echo "Usage: `basename $0` --add USER_LIST --del USER_LIST -v|--verbose -h|--help"
exit 7;;
esac
fi
done
if [ $ADD -eq 1 ]; then //当ADD为1之后(既)
for USER in `echo $ADDUSERS | sed 's@,@ @g'`; do //将ADDUSERS的赋值参数(既用户名)读取出来
if id $USER &> /dev/null; then //查看该用户是否存在
[ $DEBUG -eq 1 ] && echo "$USER exists."
else
useradd $USER
[ $DEBUG -eq 1 ] && echo "Add user $USER finished."
fi
done
fi
if [ $DEL -eq 1 ]; then
for USER in `echo $DELUSERS | sed 's@,@ @g'`; do
if id $USER &> /dev/null; then
userdel -r $USER
[ $DEBUG -eq 1 ] && echo "Delete $USER finished."
else
[ $DEBUG -eq 1 ] && echo "$USER not exist."
fi
done
fi
(7)while循环
while CONDITION;do
statement
....
done
实例:实现1到100的累加
7.raid:独立冗余磁盘阵列
各种接口速率:
IDE:133Mbps
SATA:300Mbps,600Mbps,6Gbps
USB 3.0:480Mbps
SCSI:Small Computer Syetem Interface,UltraSCSI,320Mbps,并行
raid的意义:单一磁盘存储量及传输速率达到上限,如果还需进一步提示只能通过多个磁盘上同时存储和读取数据。
RAID级别:
0:条带,将数据平均分片按序存储在各个磁盘上,并且存储的位置等高
性能提升:读,写
冗余能力(容错能力):无
空间利用率:百分之百
至少2块盘
1:镜像,将数据在每一个磁盘上都存一份
性能提升:写性能下降,读性能提升
冗余能力:有
空间利用率:1/2
至少2块盘
4:校验码,将数据存储在3个盘中,另外1个盘存储校验数据,当存储的3块盘其中一块坏了之后,依然能通过校验还原数据。弊端在于在还原数据的过程中会同时调用余下所以好的磁盘,大大增加了磁盘复核,这个时期很容易出错。并且不能出现2块以上的盘坏掉
性能表现:读,写提升
冗余能力:有
空间利用率:(n-1)/n
至少3块盘
5:校验码plus,每个盘轮流存储校验码
10:先镜像再条带,当其中一个盘坏了之后,只需要将同组的磁盘数据复制到新盘中。
性能表现:读,写提升
冗余能力:有
空间利用率:1/2
至少4块盘
01:先条带再镜像,当一块盘down掉后,如果想挂一个新盘上去,需要调用另一组的磁盘,既一块盘坏掉,会影响整个阵列
性能表现:读,写提升
冗余能力:有
空间利用率:1/2
至少4块盘
50:校验并条带
性能表现:读,写提升
冗余能力:有
空间利用率:(n-2)/n
至少6块盘
jbod:简单磁盘捆绑,简单的将多个小的磁盘合成一个逻辑的大磁盘
性能表现:无提升
冗余能力:无
空间利用率:百分之百
至少2块盘
创建一个RAID:
md:multidisks,是一个内核模块
mdadm命令:将任何块设备做成RAID
创建模式:-C
-l:级别
-n:设备个数
-a{yes|no}:是否自动为其创建设备文件
-c:CHUNK大小,2^n,默认为64k
-x:指定空闲盘个数
管理模式:--add/-a,--remove/-r,--fail / -f
mdadm /dev/md0 -f /dev/sdb3
监控模式:-F
增长模式:-G
装配模式:-A
通过磁盘分区建立raid
<1>在添加的磁盘中新建分区,并且修改分区类型为fd
fdisk /dev/sdb
块数为2,RAID级别1,将sdb2,sdb3部署为整列md0
查看全部整列信息:
格式化阵列:
挂载阵列:
查看磁盘阵列信息:mdadm -D /dev/md0
模拟挂掉某个磁盘:mdadm /dev/md0 -f /dev/sdb3
移除阵列中的磁盘:mdadm /dev/md0 -r /dev/sdb3
添加磁盘(新增磁盘必须为相同大小和trunk块大小):mdadm /dev/md0 -a /dev/sdb3
停止阵列:mdadm -S /dev/md0