0%

查看目录命令pwd

pwd命令的作用是查看当前目录,没有参数,输入后回车即可显示当前绝对路径。

官方定义为:

pwd - print name of current/working directory

所以pwdPrint Working Directory第一个字的缩写。

唯二需要了解的参数如下:

  • -L, --logical:打印逻辑路径,与pwd一致
  • -P, --physical:打印物理路径,这里可以从超级链接直达原处

实例展示

此时比如我们进入一个目录,然后在打印出来,如下:

1
2
3
4
$ cd /etc/sysconfig/network-scripts/

$ pwd
/etc/sysconfig/network-scripts

可以看到pwd将输出完全路径

逻辑与物理路径

比如如下:

1
2
3
4
5
6
7
$ pwd
/opt/test

$ ls -l
总用量 1
lrwxrwxrwx 1 root root 14 Jan 15 2012 dir -> source/dir
drwxrwxrwx 1 root root 14 Jan 15 2012 source

可以看到此时的路径在/opt/test/里面有两个目录sourcedir,其中dir链接到source里面的dir。

接下来对比一下-L和-P的区别。

1
2
3
4
5
6
7
8
9
10
$ cd dir

$ pwd
/opt/test/dir

$ pwd -L
/opt/test/dir

$ pwd -P
/opt/test/source/dir

从上面的输出可以发现,-P参数会显示文件最原始的路径;而-L则是逻辑上的路径。

查看目录命令pwd

pwd命令的作用是查看当前目录,没有参数,输入后回车即可显示当前绝对路径。

官方定义为:

pwd - print name of current/working directory

所有pwdPrint Working Directory第一个字的缩写。

唯二需要了解的参数如下:

  • -L, --logical:打印逻辑路径,与pwd一致
  • -P, --physical:打印物理路径,这里可以从超级链接直达原处

实例展示

此时比如我们进入一个目录,然后在打印出来,如下:

1
2
3
4
$ cd /etc/sysconfig/network-scripts/

$ pwd
/etc/sysconfig/network-scripts

可以看到pwd将输出完全路径

逻辑与物理路径

比如如下:

1
2
3
4
5
6
7
$ pwd
/opt/test

$ ls -l
总用量 1
lrwxrwxrwx 1 root root 14 Jan 15 2012 dir -> source/dir
drwxrwxrwx 1 root root 14 Jan 15 2012 source

可以看到此时的路径在/opt/test/里面有两个目录sourcedir,其中dir链接到source里面的dir。

接下来对比一下-L和-P的区别。

1
2
3
4
5
6
7
8
9
10
$ cd dir

$ pwd
/opt/test/dir

$ pwd -L
/opt/test/dir

$ pwd -P
/opt/test/source/dir

从上面的输出可以发现,-P参数会显示文件最原始的路径;而-L则是逻辑上的路径。

监视系统统计信息

功能:监视磁盘空间,并在超过预定值以后发送邮件

  1. df输出
  2. 提取出根目录所在的行,也就是以/结尾的行:使用$df | sed –n ‘//$/p’
  3. 分离出此行上的百分比:$ df | sed –n ‘//$/p’ | gawk ‘{print $5}’
  4. 删除掉%,$ df | sed –n ‘//$/p’ | gawk ‘{print $5}’|sed ‘s/%//‘

所以我们可以创建一个脚本:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

#monitor available disk space

SPACE=`df | sed -n '/\/$/p' | gawk '{print $5}'|sed 's/%//'`

if [ $SPACE -ge 90 ]
then
echo "Disk space on root at $SPACE% used" | mail -s "Disk Warning" leo
fi

echo "Disk space on root at $SPACE% used"

然后我们就可以在cron中写入这个脚本的一些信息,保证每天或者每个月统计一下信息来查看是否已经超过了预警值而发送信息到邮箱。

谁在霸占资源

如果我们负责Linux服务器上的许多用户,需要经常查看谁在使用所有的磁盘空间。

第一步:使用du -s /home/命令,来列出各个文件和目录的磁盘使用情况。
第二部:其中的test不是我们需要的内容,则使用du -s /home/
|grep –v test
第三步,为了查看用户名,我们去掉路径:du -s /home/* |grep –v test |sed ‘//home///p’

接下来,如果有多个用户,可以使用du -s /home/* |grep –v test |sed ‘//home///p’|sort –g –r来排序,确定那个用户占用了较多的空间。

监视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
#!/bin/bash

#script to capture system statistics



OUTFILE=/home/leo/capstats.csv

DATE=`date +%Y/%m/%d`

TIME=`date +%k:%M:%S`



TIMEOUT=`uptime`

VMOUT=`vmstat 1 2`



USERS=`echo $TIMEOUT | gawk ‘{print $4}’`

LOAD=`echo $TIMEOUT | gawk ‘{print $9}’ | sed ‘s/,//’`

FREE=`echo $VMOUT | sed -n ‘/[0-9]/p’ |sed -n ‘2p’ | gawk ‘{print $4}’`

IDLE=`echo $VMOUT | sed -n ‘/[0-9]/p’ |sed -n ‘2p’ | gawk ‘{print $15}’`



echo "$DATE,$TIME,$USER,$LOAD,$FREE,$IDLE" >> $OUTFILE

从这个脚本,我们就可以设置一些定期运行来查看系统状态的信息,然后我们就可以使用HTML的格式生成一些比较优雅好看的文档格式。这同样可以使用echo命令生成HTML头部的代码,使用gawk命令生成HTML代码数据,然后再次使用echo命令关闭表。

生成的报告,可以使用Mutt命令轻松发送到电子邮件。

小结
当你负责管理Linux系统时,不管是大型的多用户系统,还是自己的系统,都有许多需要监视的内容。与其大量搜索日志文件和手动运行命令,不如创建shell脚本来完成这些任务。

Happy New Year. Buddies

For now, I’v book my train ticket to my hometown on 18th Jan.

As it’s near to the traditional New Year of Chinese so there are more tasks for me. That’s why it’s a long time I haven’t update my website.

I’m glad that there are so many buddies love my blog, especailly the post about the pgplot & c programming.(This post is also some technical article I’v search and summerise , not write by myself. haha).

So thank U so much who have leave a reply to me.

使用结构化命令

原因:许多程序在脚本命令之间需要某种逻辑流控制。

使用if-then语句

最基本的结构化命令类型为if-then语句,格式为:

1
2
3
4
5
6
7
if command

then

command

fi

这里有一些困惑,如果if后面的命令运行成功(即返回的是0值),就会执行then后面的command的,相反,就会跳过。

比如,你可以搜索你的名字是否在passwd中

1
2
3
4
5
6
7
if grep leo /etc/passwd

then

echo “yeah , you are in the /etc/passwd file”

fi

if-then-else语句

上面的if-then只有一个选择,而这个可以有多个选择。

格式为:

1
2
3
4
5
6
7
8
9
10
11
if command

then

command

else

command

fi

嵌套if语句

使用else部分的另一种版本,成为elif

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if command

then

command

elif command

then

command

elif command

then

command

……

fi

test命令

test命令提供了一种检测if-then语句中不同条件的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if test condition

then

commands

fi

或者

if [condition]

then

commands

fi

test命令能够评估以下3类条件:

  • 数值比较
  • 字符串比较
  • 文件比较

数值比较

test命令最常用于比较两个数值。

  • test int1 -eq int2 判断是否相等
  • test int1 -ne int2 判断是否不等
  • test int1 -lt int2 判断是否小于
  • test int1 -le int2 判断是否不小于
  • test int1 -gt int2 判断是否大于
  • test int1 -ge int2 判断是否不大于

字符串比较

test也允许对字符串进行比较,执行字符串比较可能有点复杂。

  • test –n 字符串 字符串的长度非零
  • test –z 字符串 字符串的长度为零
  • test 字符串1=字符串2 字符串相等
  • test 字符串1!=字符串2 字符串不等
  • test 字符串1>字符串2 字符串1大于字符串2
  • test 字符串1<字符串2字符串1小于字符串2

字符串比较:

  • 大于和小于符号一定要转义,否则shell会将他们当做重定向符号,将字符串值看做文件名;
  • 大于和小于顺序与在sort命令中的顺序不同

文件比较

Shell脚本中最强大和最常用的一类比较。test命令能够测试linux文件系统上的文件状态和路径。

文件比较:-

  • -d file 检查file是否存在并且是一个目录
  • -e file 检查file是否存在
  • -f file 检查file是否存在并且是一个文件
  • -r file 检查file是否存在并且可读
  • -s file 检查file是否存在并且不为空
  • -w file 检查file是否存在并且可写
  • -x file 检查file是否存在并且可执行
  • -0 file 检查file是否存在并且被当前用户拥有
  • -G file 检查file是否存在并且默认组是否为当前用户组
  • file1 -nt file2 检查file1是否比file2新
  • file1 -ot file2 检查file1是否比file2旧

复合条件检查

if-then语句可以使用布尔逻辑来合并检查条件,可以使用两个布尔操作符:

  • [condition1] && [condition2]
  • [condition1] || [condition2]

if-then的高级特征

Bash shell中最近增加了两个比较新的功能,它们提供了可以在if-then语句中使用的高级功能:

  • 双圆括号表示数学表达式
  • 双方括号表示高级字符串处理函数

使用双圆括号

双圆括号命令允许在比较中包含高级数学公式。双圆括号命令提供更多的数学符号,这些符号是其他语言程序员习惯使用的符号。格式为:

((expression))

双圆括号命令符号

  • val++ 后增量
  • val– 前减量
  • ++val 前增量
  • –val 后减量
  • ! 逻辑否定
  • ~ 逐位取反
  • ** 取幂
  • << 逐位左移
  • 逐位右移

  • & 逐位布尔逻辑与
  • | 逐位布尔逻辑或
  • && 逻辑与
  • || 逻辑或

使用双方括号

双方括号命令为字符串比较提供了高级功能,它提供了test命令没有的另一个功能,即模式匹配。例如

1
2
3
4
5
6
7
8
9
10
11
if [[ $USER == r*]]

then

echo “hello $USER

else

echo “Sorry, I do not know you”

fi

case命令

替代if-then-elif,提供了一种为每个可能的变量值指定不同选项的更清楚的方法。

格式为:

1
2
3
4
5
6
7
8
9
10
11
12
13
case variable in

pattern1 | pattern2) command1;

pattern3) command2;

……

patternN) commandN;

*) default commands;

esac

关于NTP

对于执行ntpdate而没有这个命令的,估计是ntp的相关包没有安装,在fedora下,使用下述命令即可将ntp和ntpdate安装上

1
yum install ntp

同步

不过,注意使用它ntpdate的时候需要在root账户下。

1
2
3
[root@localhost]# ntpdate 129.7.1.66

29 Aug 21:38:13 ntpdate[822]: adjust time server 129.7.1.66 offset0.011426 sec

看来偶的机器与国家授时中心的就差了11ms,看来哥也是一个授时的人,哈哈。

NTP时间服务器

下面是几个通用的NTP时间服务器:

  • 129.7.1.66ntp-sop.inria.frserver 210.72.145.44(中国国家授时中心服务器IP地址)
  • ntp.sjtu.edu.cn (上海交通大学网络中心NTP服务器地址)
  • 202.120.2.101 (上海交通大学网络中心NTP服务器地址)
  • time.nist.gov
  • ntp.fudan.edu.cn (复旦)
  • timekeeper.isi.edu
  • subitaneous.cpsc.ucalgary.ca
  • usno.pa-x.dec.com
  • time.twc.weather.com
  • swisstime.ethz.ch
  • ntp0.fau.de
  • ntp3.fau.de
  • time-a.nist.gov
  • time-b.nist.gov
  • time-nw.nist.gov
  • nist1-sj.glassey.com
  • ntp.aliyun.com

具体的操作步骤就是ntpdate 加上上面的随笔一个NTP时间服务器就OK了。

Linux时间简介

在Windwos中,系统时间的设置很简单,界面操作,通俗易懂。而且设置后,重启,关机都没关系。系统时间会自动保存在Bios的时钟里面,启动计算机的时候,系统会自动在Bios里面取硬件时间,以保证时间的不间断。

但在Linux下,默认情况下,系统时间和硬件时间,并不会自动同步。在Linux运行过程中,系统时间和硬件时间以异步的方式运行,互不干扰。硬件时间的运行,是靠Bios电池来维持,而系统时间,是用CPU tick来维持的。

在系统开机的时候,会自动从Bios中取得硬件时间,设置为系统时间。

为了将系统时间写入BIOS,可以使用hwclock或者clock命令。其中,clock和hwclock用法相近,只用一个就行,只不过clock命令除了支持x86硬件体系外,还支持Alpha硬件体系。

系统时间和硬件时间的同步

1
2
3
4
5
6
7
//以系统时间为基准,修改硬件时间
[root@localhost ~]# hwclock –systohc <== sys(系统时间)to(写到)hc(Hard Clock)
[root@localhost ~]# hwclock -w

//以硬件时间为基准,修改系统时间
[root@localhost ~]# hwclock –hctosys
[root@localhost ~]# hwclock -s

ntpd和ntpdate的区别

为了避免主机时间因为长期运作下所导致的时间偏差,进行时间同步(synchronize)的工作是非常必要的。Linux系统下,一般使用ntp服务器来同步不同机器的时间。一台机器,可以同时是ntp服务器和ntp客户机。在网络中,推荐使用像DNS服务器一样分层的时间服务器来同步时间。

同步时间,可以使用ntpdate命令,也可以使用ntpd服务。

使用ntpdate比较简单。格式如下:

1
2
3
[root@linux ~]# ntpdate [-nv] [NTP IP/hostname]
[root@linux ~]# ntpdate 192.168.0.2
[root@linux ~]# ntpdate time.ntp.org

但这样的同步,只是强制性的将系统时间设置为ntp服务器时间。如果cpu tick有问题,只是治标不治本。所以,一般配合cron命令,来进行定期同步设置

比如,在crontab中添加:

1
0 12 * * * * /usr/sbin/ntpdate 192.168.0.1

这样,会在每天的12点整,同步一次时间。ntp服务器为192.168.0.1。

使用ntpd服务,要好于ntpdate加cron的组合。因为,ntpdate同步时间,会造成时间的跳跃,对一些依赖时间的程序和服务会造成影响。比如sleep,timer等。而且,ntpd服务可以在修正时间的同时,修正cpu tick。理想的做法为,在开机的时候,使用ntpdate强制同步时间,在其他时候使用ntpd服务来同步时间

要注意的是,ntpd 有一个自我保护设置: 如果本机与上源时间相差太大, ntpd 不运行. 所以新设置的时间服务器一定要先 ntpdate 从上源取得时间初值, 然后启动 ntpd服务。ntpd服务 运行后, 先是每64秒与上源服务器同步一次, 根据每次同步时测得的误差值经复杂计算逐步调整自己的时间, 随着误差减小, 逐步增加同步的间隔. 每次跳动, 都会重复这个调整的过程.

所以:ntpd不仅仅是时间同步服务器,他还可以做客户端与标准时间服务器进行同步时间,而且是平滑同步,并非ntpdate立即同步,在生产环境中慎用ntpdate,也正如此两者不可同时运行。

时钟的跃变,对于某些程序会导致很严重的问题。许多应用程序依赖连续的时钟——毕竟,这是一项常见的假定,即,取得的时间是线性的,一些操作,例如数据库事务,通常会地依赖这样的事实:时间不会往回跳跃。不幸的是,ntpdate调整时间的方式就是我们所说的”跃变“:在获得一个时间之后,ntpdate使用settimeofday(2)设置系统时间,这有几个非常明显的问题:

  • 这样做不安全。ntpdate的设置依赖于ntp服务器的安全性,攻击者可以利用一些软件设计上的缺陷,拿下ntp服务器并令与其同步的服务器执行某些消耗性的任务。由于ntpdate采用的方式是跳变,跟随它的服务器无法知道是否发生了异常(时间不一样的时候,唯一的办法是以服务器为准)。
  • 这样做不精确。一旦ntp服务器宕机,跟随它的服务器也就会无法同步时间。与此不同,ntpd不仅能够校准计算机的时间,而且能够校准计算机的时钟。
  • 这样做不够优雅。由于是跳变,而不是使时间变快或变慢,依赖时序的程序会出错(例如,如果ntpdate发现你的时间快了,则可能会经历两个相同的时刻,对某些应用而言,这是致命的)。

因而,唯一一个可以令时间发生跳变的点,是计算机刚刚启动,但还没有启动很多服务的那个时候。其余的时候,理想的做法是使用ntpd来校准时钟,而不是调整计算机时钟上的时间。

NTPD 在和时间服务器的同步过程中,会把 BIOS 计时器的振荡频率偏差——或者说 Local Clock 的自然漂移(drift)——记录下来。这样即使网络有问题,本机仍然能维持一个相当精确的走时。

使用Linux环境变量

什么是环境变量

bash shell使用一种称为环境变量的特性来存储关于shell会话和工作环境的信息(环境变量的名称由此而来)。该特性还允许你将数据存储在内存中,以便于在shell中运行的程序和脚本访问它们。这是一种便捷的、用于存储持久性数据的方式,这些数据可以标示用户账户、系统、shell或任何需要存储的内容的特性。

bash shell中共有两种类型的环境变量:

  • 全局变量;
  • 本地变量;

全局环境变量

要查看全局变量,可以使用printenv命令。

通过该命令的输出,我们可以看到bash shell已经设置了许多全局环境变量,其中大多数由系统在登录过程中设置。

本地环境变量

本地环境变量只在定义它们的本地进程中可见。可以通过set命令显示特定进程的所有环境变量集。这其中包含了全局环境变量和本地环境变量。

设置环境变量

设置本地环境变量

为环境变量分配一个数值或者字符串,方法是使用等号将变量指定为具体值。

例如

1
$ test=hello,

那么我们使用

1
$ echo $test

就可以输出hello。

当然如果赋值为一个字符串,需要用单引号括起来,否则空格后的字符会被认为是命令而出错。

如果创建新环境变量,建议(但不要求)使用小写字母。这用助于区分个人环境变量与系统环境变量。

设置全局环境变量

创建全局变量的方法是创建一个本地环境变量,然后使用export将它导出到全局环境中。

移除环境变量

可以使用unset命令来移除环境变量,在unset命令中引用环境变量时,不要使用美元符号。

默认的shell环境变量

  1. BASH :记录当前bash shell的路径。
1
2
[root@localhost awK]# echo $BASH
/bin/bash
  1. BASH_SUBSHELL :记录当前子shell的层次。BASH_SUBSHELL是从0开始计数的整数。
  2. BASH_VERSINFO :是一个数组包含六个元素,这六个元素显示bash的版本信息。
  3. BASH_VERSION :显示shell版本的信息。
  4. DIRSTACK :记录了栈顶的目录值,初值为空。
  5. GLOBLGNORE :是由冒号分割的模式列表,表示通配时忽略的文件名集合。
  6. GROUPS :记录当前用户所属的组。
  7. HOME :记录当前用户的家目录,由/etc/passwd的倒数第二个域决定。
  8. HOSTNAME :记录主机名。
  9. HOSTTYPE和MACHTYPE :都是记录系统的硬件架构。
  10. IFS :用于设置指定shell域分隔符,默认情况下为空格。
1
2
3
[root@localhost awK]# export IFS=:
[root@localhost awK]# echo $PATH
/usr/local/sbin /usr/local/bin /sbin /bin/usr/sbin /usr/bin /root/bin
  1. OLDPWD :记录旧的工作目录。
  2. OSTYPE :记录操作系统类型。
  3. PATH :环境变量,显示当前PATH环境变量的内容。
  4. PPID :是创建当前进程的进程号,即当前进程的父进程号
  5. PS1 :提示符变量,用于设置提示符格式,用于设置一级shell提示符环境变量。
  6. PS2 :用于设置二级shell提示符环境变量。
  7. PWD :记录当前路径
  8. REPLY :REPLY变量与read和select有关。
  9. SECONDS:记录脚本从开始到结束耗费的时间。
  10. SHELL :显示当前所用的shell
  11. SHELLOPTS :记录了处于“开”状态的shell选项列表,它只是一个只读变量。
  12. SHLVL :记录了bash嵌套的层次,一般来说,我们启动第一个Shell时。 $SHLVL=1。如果在这个Shell中执行脚本,脚本中的$SHLVL=2 。
  13. TMOUT :用来设置脚本过期的时间,比如TMOUT=3,表示该脚本3秒后过期。
  14. UID : 已登用户的ID
  15. USER :显示当前用户名字

注意:使用set命令时,并非所有的默认环境变量都会显示出来,因为有些默认的环境变量时不需要赋值的。

设置PATH环境变量

增加环境变量的方法为export PATH=$PTAH:/the/path/you/want/to/add;

有时我们可以使用PATH=$PATH:. 临时让当前目录添加到PATH变量中,可以执行当前目录的程序而不用添加./。 ,不错哟。

定位系统环境变量

Bash shell将查找下面的文件用来处理登录shell的设置:

  • /etc/profile : 是系统上的主默认启动文件,系统上的每一个用户在登录时都将执行此启动文件,比如安装了什么软件,需要每个人都使用,那么需要将环境变量设置在该文件。
  • $HOME/.bash_profile
  • $HOME/.bash_login
  • $HOME/.profile 上面的3个启动文件主要特定于各个用户,这应该叫井水不犯河水。
  • $HOME/.bashrc 该文件为交互式shell启动时处理的。

变量数组

可以使用

1
$ mytest=(one two three four five)

为某个环境变量设置多个值,但是在显示的时候,如果使用

1
$echo $mytest

那么只会出现one,而是用$echo ${mytest[1]},则显示two,可以使用 $echo ${mytest[*]}显示所有的值。

使用命令别名

命名别名允许您为公共命令以及它们的参数创建别名,以尽可能减少录入工作。

因为我们知道,在启动新的交互式的shell时,bash shell始终会读取.bashrc启动文件,所以我们可以把别名放在该文件中。

用C语言开发图形界面

在浏览linuxquestions的时候,看到一篇关于Graphics Programming on linux using C的帖子,感觉不错,特来分享一下。

现在关于图形开发的VC,C#,java,QT等IDE大行其道。不过还是有一部分默默无闻的人偏爱着用pure代码来描绘着自己的世界。

我这里推荐几个,大家可以search一下相关的内容,下面即为keyword。

  • OpenGL
  • PGPLOT
  • GTK
  • KDE
  • GLUT
  • FLTK
  • ncurses
  • xlib
  • QT
  • SDL等

更多信息

SDL

SDL is a good library and used by game developers.

##OpenGL

You can also use OpenGL for 3d stuff, but be warned that performance will be poor unless X use 3d accelerated drivers. Otherwise it will use Mesa indirect.

svgalib

svgalib is easy to use, but people tend to overlook it because it doesn’t fit in well with the modern X graphics paradigm. I have a program (experix project in sourceforge) that plots graphs and writes text using a svgalib-based graphics server.

GTK+

GTK+: can be a little overwelming but I was able to understand it a lot better than xlib. It is slower tho i will admit.

never tried svgalib before but thanks for the link ill have to check that out.

GTK+: will confuse you on all its diffrent versions as well and for larger apps it can get a little confusing on what does what or how this is related to that.

ncurses

ncurses: is cool but can be a freekin nightmare. i still dont understand colums
and rows

Qt

Qt: dont know anything about this think i made a program with it before i Knew anything about C

xlib

xlib: Try if you dare you might find it more understandable then me. Never could get my hello world program to display.

RAID 冗余磁盘阵列

RAID就是廉价冗余磁盘阵列,比LVM简单多了 ,常用的级别是:

  • RAID0 提高读写速度
  • RAID1 数据安全考虑
  • RAID5 存储性能、数据安全和存储成本兼顾

RAID 0又称为Stripe或Striping,中文译为集带工作方式。它是将要存取的数据以条带状形式尽量平均分配到多个硬盘上,读写时多个硬盘同时进行读写,从而提高数据的读写速度。RAID 0另一目的是获得更大的“单个”磁盘容量从而提高数据的读写速度。这是他的优点,我觉得最重要是提高读写速度

RAID 1又称为Mirror或Mirroring,中文译为镜像方式。这种工作方式的出现完全是为了数据安全考虑的,它是把用户写入硬盘的数据百分之百地自动复制到另外一个硬盘上或硬盘的不同地方(镜像)。当读取数据时,系统先从RAID 1的源盘读取数据,如果读取数据成功,则系统不去管备份盘上的数据;如果读取源盘数据失败,则系统自动转而读取备份盘上的数据,不会造成用户工作任务的中 断。由于对存储的数据进行百分之百的备份,在所有RAID级别中,RAID 1提供最高的数据安全保障。同样,由于数据的百分之百备份,备份数据占了总存储空间的一半,因而,Mirror的磁盘空间利用率低,存储成本高。

RAID 5是一种存储性能、数据安全和存储成本兼顾的存储解决方案,也是目前应用最广泛的RAID技术。各块独立硬盘进行条带化分割,相同的条带区进行奇偶校验 (异或运算),校验数据平均分布在每块硬盘上。以n块硬盘构建的RAID 5阵列可以有2/3块硬盘的容量,存储空间利用率非常高。RAID 5不对存储的数据进行备份,而是把数据和相对应的奇偶校验信息存储到组成RAID5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘 上。当RAID 5的任何一块硬盘上的数据丢失,均可以通过校验数据推算出来

具体算法就让学存储的技术搞吧,我们知道RAID5有这个功能就行了

RAID分为软RAID和硬件RAID

软件RAID是基于系统的软件工作
优点:廉价
缺点:不稳定,如果系统坏了,RAID整列也就损坏,容易造成数据丢失

硬件RAID,这就是各大厂商提供的,存储解决方案。有专门的设备负责处理磁盘间的数据流。
相对于软件RAID
优点:可靠性高,易管理。稳定
缺点:成本过高

基于LINUX系统的软件RAID

在LINUX下管理RAID阵列的工具是mdadm工具

mdadm程序是一个独立的程序,能完成所有的软RAID管理功能

主要有7种使用模式:

Create 使用空闲的设备创建一个新的阵列,每个设备具有元数据块

Assemble 将原来属于一个阵列的每个块设备组装为阵列

Build 创建或组装不需要元数据的阵列,每个设备没有元数据块

Manage 管理已经存储阵列中的设备,比如增加热备磁盘或者设置某个磁盘失效,然后从阵列中删除这个磁盘

Misc 报告或者修改阵列中相关设备的信息,比如查询阵列或者设备的状态信息

Grow 改变阵列中每个设备被使用的容量或阵列中的设备的数目

Monitor 监控一个或多个阵列,上报指定的事件

由于这个工具太强大,不能一一为大家讲解

题目:建立一个RAID5 级别的分区使用一个分区给这个RAID做热备份,并挂在到本地的/mnt/raid 目录,

第一步创建物理分区

因为RAID5至少需要3个或者更多的硬盘,我们就要分3个分区,然后再加一个热备份的分区,就是4个分区

1
2
3
4
5
$ fdisk /dev/sda
$ fdisk -l
$ fdisk /dev/sda
$ partprobe
$partprobe

我们还是要使用#partprobe 使分区马上生效

第二步:创建阵列设备

系统默认有个md0可以给我们用,如果我要多个raid的话,就需要自己创建设备了,所以在这里我教大家怎么创建raid设备

#mknod /dev/md1 b 9 1

创建md1这个raid设备

mknod是命令

/dev/md1 是设备名字,设备必须是/dev/md开始的

后面的b代表创建的是块设备

9是主设备号,1代表从设备号

主设备号不能改,从设备号在系统内唯一

创建好以后,可以使用ls /dev/md1 看看有没有这个设备了

第三步:创建RAID阵列

使用MDADM工具

#mdadm -C /dev/md1 -l 5 -n 3 -x 1 /dev/sda7 /dev/sda8 /dev/sda9 /dev/sda10

OK以后,可以使用命令
#mdadm –detail /dev/md1
查看RAID状态

[root@rhel5 ~]# mdadm -C /dev/md1 -l 5 -n 3 -x 1 /dev/sda7 /dev/sda8 /dev/sda9 /dev/sda10

[root@rhel5 ~]# mdadm –detail /dev/md1

[root@rhel5 ~]# mdadm -C /dev/md1 -l 5 -n 3 -x 1 /dev/sda7 /dev/sda8 /dev/sda9 /dev/sda10

-C 代表创建

-l 代表创建的级别

-n 代表活动的分区,也就是你要给这个级别多少个分区

-x 就是热备份的分区

后面就跟设备就OK了

软RAID就可以使用分区来替代硬盘,如果你有真实的硬盘,这里也可以跟上硬盘

第四步:格式化raid设备

#mkfs.ext3 /dev/md1

第五步:创建目录并挂载

#mkdir /mnt/raid
#mount -t ext3 /dev/md1 /mnt/raid

文件内容搜索利器 - grep

Linux grep 命令用于查找文件里符合条件的字符串。

官方定义为:

grep, egrep, fgrep - print lines matching a pattern

grep支持正则表达式,是一个强大的文本搜索工具。

语法

语法也挺复杂,因为功能确实很强大。

1
2
3
$ grep [OPTION...] PATTERNS [FILE...]
$ grep [OPTION...] -e PATTERNS ... [FILE...] # 使用egrep
$ grep [OPTION...] -f PATTERN_FILE ... [FILE...] # 使用fgrep

常用的参数为:

  • -r 或 –recursive : 此参数的效果和指定”-d recurse”参数相同
  • -v 或 –invert-match : 显示不包含匹配文本的所有行
  • -i 或 –ignore-case : 忽略字符大小写的差别
  • -n 或 –line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。

假定有如下3个文件,1个文件夹,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
a
This is a
Hello a

b
this is b
Hello b
c
This is c
Hello c

d/d
This is d
Hello d

默认无参数

在当前目录搜索包含is字符串,可以看到**a/b/c**三个文件均有输出,而d因为是目录,暂时无输出。

1
2
3
4
5
$ grep is *
a:This is a
b:this is b
c:This is c
grep: d: Is a directory

增加文件夹

与其他命令类似,增加-r参数,递归搜索

1
2
3
4
5
$ grep -r is *
a:This is a
b:this is b
c:This is c
d/d:This is d

反向查找

在某些情况下,或许正想找到不包含某些字符串的内容,如下:

1
2
3
4
5
$ grep -rv is *
a:Hello a
b:Hello b
c:Hello c
d/d:Hello d

此时可以看到,不包含is的内容显示了出来。

不区分大小写

而某些情况下,或许我们希望找到不区分大小写的内容,比如对于This/this而言:

1
2
3
4
5
6
7
8
9
10
$ grep -r This *
a:This is a
c:This is c
d/d:This is d

$ grep -ri This *
a:This is a
b:this is b
c:This is c
d/d:This is d

可以看到此时有可能笔误,或者其他原因的b文件已经被找到了。

显示行数,精准定位

如果文件内容比较多,此时显示内容在哪一行,是很重要的,加上-n参数既可解决。

1
2
3
4
$ grep -rn This *
a:1:This is a
c:1:This is c
d/d:1:This is d