Showing posts with label Linux. Show all posts
Showing posts with label Linux. Show all posts

Saturday, March 28, 2009

介绍Linux内核是如何工作的

本文发表于Linux Format magazine杂志,作者从技术深度上解释了Linux Kernel是如何工作的。相信对Linux开发者来说有不小的帮助。
http://news.csdn.net/n/20090327/124513.html

Sunday, March 22, 2009

bash编程

bash编程

bash脚本编写教程

说明,这部教程是我在网上找到比较经典的BASH中文教程,对新手学习bash脚本,bash编程的好文章。

建立一个脚本

   Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的并且很容易使用。所以在本文中笔者所提供的脚本都是使用bash(但是在大多数情况下,这些脚本同样可以在 bash的大姐,bourne shell中运行)。
  如同其他语言一样,通过我们使用任意一种文字编辑器,比如nedit、kedit、emacs、vi
  等来编写我们的shell程序。
  程序必须以下面的行开始(必须方在文件的第一行):
#!/bin/sh
  符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。
  当编辑好脚本时,如果要执行该脚本,还必须使其可执行。
  要使脚本可执行:
chmod +x filename
  然后,您可以通过输入: ./filename 来执行您的脚本。
注释
  在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。
变量
  在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:
变量名=值
  取出变量值可以加一个美元符号($)在变量前面:
#!/bin/sh
#对变量赋值:
a="hello world"
# 现在打印变量a的内容:
echo "A is:"
echo $a
  在您的编辑器中输入以上内容,然后将其保存为一个文件first。之后执行chmod +x first
  使其可执行,最后输入./first执行该脚本。
  这个脚本将会输出:
A is:
hello world
  有时候变量名很容易与其他文字混淆,比如:
num=2
echo "this is the $numnd"
  这并不会打印出"this is the 2nd",而仅仅打印"this is the ",因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量:
num=2
echo "this is the ${num}nd"
  这将打印: this is the 2nd
  有许多变量是系统自动设定的,这将在后面使用这些变量时进行讨论。
  如果您需要处理数学表达式,那么您需要使用诸如expr等程序(见下面)。
  除了一般的仅在程序内有效的shell变量以外,还有环境变量。由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,因为通常情况下仅仅在登录脚本中使用环境变量。
Shell命令和流程控制
  在shell脚本中可以使用三类命令:
1)Unix 命令:
  虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。
常用命令语法及功能
  echo "some text": 将文字内容打印在屏幕上
  ls: 文件列表
  wc –l filewc -w filewc -c file: 计算文件行数计算文件中的单词数计算文件中的字符数
  cp sourcefile destfile: 文件拷贝
  mv oldname newname : 重命名文件或移动文件
  rm file: 删除文件
  grep 'pattern' file: 在文件内搜索字符串比如:grep 'searchstring' file.txt
  cut -b colnum file: 指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第5个到第9个字符cut -b5-9 file.txt千万不要和cat命令混淆,这是两个完全不同的命令
  cat file.txt: 输出文件内容到标准输出设备(屏幕)上
  file somefile: 得到文件类型
  read var: 提示用户输入,并将输入赋值给变量
  sort file.txt: 对file.txt文件中的行进行排序
  uniq: 删除文本文件中出现的行列比如: sort file.txt | uniq
  expr: 进行数学运算Example: add 2 and 3expr 2 "+" 3
  find: 搜索文件比如:根据文件名搜索find . -name filename -print
  tee: 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile
  basename file: 返回不包含路径的文件名比如: basename /bin/tux将返回 tux
  dirname file: 返回文件所在路径比如:dirname /bin/tux将返回 /bin
  head file: 打印文本文件开头几行
  tail file : 打印文本文件末尾几行
   sed: Sed是一个基本的查找替换程序。可以从标准输入(比如命令管道)读入文本,并将结果输出到标准输出(屏幕)。该命令采用正则表达式(见参考)进行搜索。 不要和shell中的通配符相混淆。比如:将linuxfocus 替换为 LinuxFocus :cat text.file | sed 's/linuxfocus/LinuxFocus/' > newtext.file
  awk: awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。cat file.txt | awk -F, '{print $1 "," $3 }'这里我们使用,作为字段分割符,同时打印第一个和第三个字段。如果该文件内容如下: Adam Bor, 34, IndiaKerry Miller, 22, USA命令输出结果为:Adam Bor, IndiaKerry Miller, USA
2) 概念: 管道, 重定向和 backtick
  这些不是系统命令,但是他们真的很重要。
  管道 (|) 将一个命令的输出作为另外一个命令的输入。
grep "hello" file.txt | wc -l
  在file.txt中搜索包含有”hello”的行并计算其行数。
  在这里grep命令的输出作为wc命令的输入。当然您可以使用多个命令。
  重定向:将命令的结果输出到文件,而不是标准输出(屏幕)。
  > 写入文件并覆盖旧文件
  >> 加到文件的尾部,保留旧文件内容。
反短斜线
 使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。
  命令:
find . -mtime -1 -type f -print
  用来查找过去24小时(-mtime –2则表示过去48小时)内修改过的文件。如果您想将所有查找到的文件打一个包,则可以使用以下脚本:
#!/bin/sh
# The ticks are backticks (`) not normal quotes ('):
tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`
  3) 流程控制
  "if" 表达式 如果条件为真则执行then后面的部分:
if ....; then
  ....
elif ....; then
  ....
else
  ....
fi
  大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等…
  通常用" [ ] "来表示条件测试。注意这里的空格很重要。要确保方括号的空格。
[ -f "somefile" ] :判断是否是一个文件
[ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限
[ -n "$var" ] :判断$var变量是否有值
[ "$a" = "$b" ] :判断$a和$b是否相等
  执行man test可以查看所有测试表达式可以比较和判断的类型。
  直接执行以下脚本:
#!/bin/sh
if [ "$SHELL" = "/bin/bash" ]; then
 echo "your login shell is the bash (bourne again shell)"
else
 echo "your login shell is not bash but $SHELL"
fi
  变量$SHELL包含了登录shell的名称,我们和/bin/bash进行了比较。
快捷操作符
  熟悉C语言的朋友可能会很喜欢下面的表达式:
[ -f "/etc/shadow" ] && echo "This computer uses shadow passwors"
   这里 && 就是一个快捷操作符,如果左边的表达式为真则执行右边的语句。您也可以认为是逻辑运算中的与操作。上例中表示如果/etc/shadow文件存在则打印” This computer uses shadow passwors”。同样或操作(||)在shell编程中也是可用的。这里有个例子:
#!/bin/sh
mailfolder=/var/spool/mail/james
[ -r "$mailfolder" ]' '{ echo "Can not read $mailfolder" ; exit 1; }
echo "$mailfolder has mail from:"
grep "^From " $mailfolder
  该脚本首先判断mailfolder是否可读。如果可读则打印该文件中的"From" 一行。如果不可读则或操作生效,打印错误信息后脚本退出。这里有个问题,那就是我们必须有两个命令:
  -打印错误信息
  -退出程序
  我们使用花括号以匿名函数的形式将两个命令放到一起作为一个命令使用。一般函数将在下文提及。
  不用与和或操作符,我们也可以用if表达式作任何事情,但是使用与或操作符会更便利很多。
  case表达式可以用来匹配一个给定的字符串,而不是数字。
case ... in
...) do something here ;;
esac
  让我们看一个例子。 file命令可以辨别出一个给定文件的文件类型,比如:
file lf.gz
  这将返回:
lf.gz: gzip compressed data, deflated, original filename,
last modified: Mon Aug 27 23:09:18 2001, os: Unix
 我们利用这一点写了一个叫做smartzip的脚本,该脚本可以自动解压bzip2, gzip 和zip 类型的压缩文件:
#!/bin/sh
ftype=`file "$1"`
case "$ftype" in
"$1: Zip archive"*)
  unzip "$1" ;;
"$1: gzip compressed"*)
  gunzip "$1" ;;
"$1: bzip2 compressed"*)
  bunzip2 "$1" ;;
*) error "File $1 can not be uncompressed with smartzip";;
esac
  您可能注意到我们在这里使用了一个特殊的变量$1。该变量包含了传递给该程序的第一个参数值。也就是说,当我们运行:
smartzip articles.zip
$1 就是字符串 articles.zip
  select 表达式是一种bash的扩展应用,尤其擅长于交互式使用。用户可以从一组不同的值中进行选择。
select var in ... ; do
 break
done
.... now $var can be used ....
下面是一个例子:
#!/bin/sh
echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
    break
done
echo "You have selected $var"
  下面是该脚本运行的结果:
What is your favourite OS?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#? 1
You have selected Linux
  您也可以在shell中使用如下的loop表达式:
while ...; do
....
done
   while-loop 将运行直到表达式测试为真。will run while the expression that we test for is true. 关键字"break" 用来跳出循环。而关键字”continue”用来不执行余下的部分而直接跳到下一个循环。
  for-loop表达式查看一个字符串列表 (字符串用空格分隔) 然后将其赋给一个变量:
for var in ....; do
 ....
done
  在下面的例子中,将分别打印ABC到屏幕上:
#!/bin/sh
for var in A B C ; do
 echo "var is $var"
done
  下面是一个更为有用的脚本showrpm,其功能是打印一些RPM包的统计信息:
#!/bin/sh
# list a content summary of a number of RPM packages
# USAGE: showrpm rpmfile1 rpmfile2 ...
# EXAMPLE: showrpm /cdrom/RedHat/RPMS/*.rpm
for rpmpackage in $*; do
 if [ -r "$rpmpackage" ];then
  echo "=============== $rpmpackage =============="
  rpm -qi -p $rpmpackage
 else
  echo "ERROR: cannot read file $rpmpackage"
 fi
done
  这里出现了第二个特殊的变量$*,该变量包含了所有输入的命令行参数值。如果您运行showrpm openssh.rpm w3m.rpm webgrep.rpm
  此时 $* 包含了 3 个字符串,即openssh.rpm, w3m.rpm and webgrep.rpm.
引号
   在向程序传递任何参数之前,程序会扩展通配符和变量。这里所谓扩展的意思是程序会把通配符(比如*)替换成合适的文件名,它变量替换成变量值。为了防 止程序作这种替换,您可以使用引号:让我们来看一个例子,假设在当前目录下有一些文件,两个jpg文件, mail.jpg 和tux.jpg。

#!/bin/sh
echo *.jpg
  这将打印出"mail.jpg tux.jpg"的结果。
  引号 (单引号和双引号) 将防止这种通配符扩展:
#!/bin/sh
echo "*.jpg"
echo '*.jpg'
  这将打印"*.jpg" 两次。
  单引号更严格一些。它可以防止任何变量扩展。双引号可以防止通配符扩展但允许变量扩展。
#!/bin/sh
echo $SHELL
echo "$SHELL"
echo '$SHELL'
  运行结果为:
/bin/bash
/bin/bash
$SHELL
  最后,还有一种防止这种扩展的方法,那就是使用转义字符——反斜杆:
echo *.jpg
echo $SHELL
  这将输出:
*.jpg
$SHELL
Here documents
   当要将几行文字传递给一个命令时,here documents(译者注:目前还没有见到过对该词适合的翻译)一种不错的方法。对每个脚本写一段帮助性的文字是很有用的,此时如果我们四有那个 here documents就不必用echo函数一行行输出。 一个 "Here document" 以 << 开头,后面接上一个字符串,这个字符串还必须出现在here document的末尾。下面是一个例子,在该例子中,我们对多个文件进行重命名,并且使用here documents打印帮助:
#!/bin/sh
# we have less than 3 arguments. Print the help text:
if [ $# -lt 3 ] ; then
cat <
ren -- renames a number of files using sed regular expressions
USAGE: ren 'regexp' 'replacement' files...
EXAMPLE: rename all *.HTM files in *.html:
 ren 'HTM$' 'html' *.HTM
HELP
 exit 0
fi
OLD="$1"
NEW="$2"
# The shift command removes one argument from the list of
# command line arguments.
shift
shift
# $* contains now all the files:
for file in $*; do
  if [ -f "$file" ] ; then
   newfile=`echo "$file" | sed "s/${OLD}/${NEW}/g"`
   if [ -f "$newfile" ]; then
    echo "ERROR: $newfile exists already"
   else
    echo "renaming $file to $newfile ..."
    mv "$file" "$newfile"
   fi
  fi
done
   这是一个复杂一些的例子。让我们详细讨论一下。第一个if表达式判断输入命令行参数是否小于3个 (特殊变量$# 表示包含参数的个数) 。如果输入参数小于3个,则将帮助文字传递给cat命令,然后由cat命令将其打印在屏幕上。打印帮助文字后程序退出。如果输入参数等于或大于3个,我们 就将第一个参数赋值给变量OLD,第二个参数赋值给变量NEW。下一步,我们使用shift命令将第一个和第二个参数从参数列表中删除,这样原来的第三个 参数就成为参数列表$*的第一个参数。然后我们开始循环,命令行参数列表被一个接一个地被赋值给变量$file。接着我们判断该文件是否存在,如果存在则 通过sed命令搜索和替换来产生新的文件名。然后将反短斜线内命令结果赋值给newfile。这样我们就达到了我们的目的:得到了旧文件名和新文件名。然 后使用mv命令进行重命名。
函数
  如果您写了一些稍微复杂一些的程序,您就会发现在程序中可能在几个地方使用了相同的代码,并且您也会发现,如果我们使用了函数,会方便很多。一个函数是这个样子的:
functionname()
{
# inside the body $1 is the first argument given to the function
# $2 the second ...
body
}
  您需要在每个程序的开始对函数进行声明。

  下面是一个叫做xtitlebar的脚本,使用这个脚本您可以改变终端窗口的名称。这里使用了一个叫做help的函数。正如您可以看到的那样,这个定义的函数被使用了两次。
#!/bin/sh
# vim: set sw=4 ts=4 et:
help()
{
  cat <
xtitlebar -- change the name of an xterm, gnome-terminal or kde konsole
USAGE: xtitlebar [-h] "string_for_titelbar"
OPTIONS: -h help text
EXAMPLE: xtitlebar "cvs"
HELP
  exit 0
}
# in case of error or if -h is given we call the function help:
[ -z "$1" ] && help
[ "$1" = "-h" ] && help
# send the escape sequence to change the xterm titelbar:
echo -e "33]0;$107"
#
  在脚本中提供帮助是一种很好的编程习惯,这样方便其他用户(和您)使用和理解脚本。
命令行参数
   我们已经见过$* 和 $1, $2 ... $9 等特殊变量,这些特殊变量包含了用户从命令行输入的参数。迄今为止,我们仅仅了解了一些简单的命令行语法(比如一些强制性的参数和查看帮助的-h选项)。 但是在编写更复杂的程序时,您可能会发现您需要更多的自定义的选项。通常的惯例是在所有可选的参数之前加一个减号,后面再加上参数值 (比如文件名)。
  有好多方法可以实现对输入参数的分析,但是下面的使用case表达式的例子无遗是一个不错的方法。
#!/bin/sh
help()
{
 cat <
This is a generic command line parser demo.
USAGE EXAMPLE: cmdparser -l hello -f -- -somefile1 somefile2
HELP
 exit 0
}
while [ -n "$1" ]; do
case $1 in
  -h) help;shift 1;; # function help is called
  -f) opt_f=1;shift 1;; # variable opt_f is set
  -l) opt_l=$2;shift 2;; # -l takes an argument -> shift by 2
  --) shift;break;; # end of options
  -*) echo "error: no such option $1. -h for help";exit 1;;
  *) break;;
esac
done

echo "opt_f is $opt_f"
echo "opt_l is $opt_l"
echo "first arg is $1"
echo "2nd arg is $2"
  您可以这样运行该脚本:
cmdparser -l hello -f -- -somefile1 somefile2
  返回的结果是:
opt_f is 1
opt_l is hello
first arg is -somefile1
2nd arg is somefile2
  这个脚本是如何工作的呢?脚本首先在所有输入命令行参数中进行循环,将输入参数与case表达式进行比较,如果匹配则设置一个变量并且移除该参数。根据unix系统的惯例,首先输入的应该是包含减号的参数。
实例
  一般编程步骤
  现在我们来讨论编写一个脚本的一般步骤。任何优秀的脚本都应该具有帮助和输入参数。并且写一个伪脚本(framework.sh),该脚本包含了大多数脚本都需要的框架结构,是一个非常不错的主意。这时候,在写一个新的脚本时我们只需要执行一下copy命令:
cp framework.sh myscript
 然后再插入自己的函数。
  让我们再看两个例子:
  二进制到十进制的转换
  脚本 b2d 将二进制数 (比如 1101) 转换为相应的十进制数。这也是一个用expr命令进行数学运算的例子:
#!/bin/sh
# vim: set sw=4 ts=4 et:
help()
{
 cat <
b2h -- convert binary to decimal
USAGE: b2h [-h] binarynum
OPTIONS: -h help text
EXAMPLE: b2h 111010
will return 58
HELP
 exit 0
}
error()
{
  # print an error and exit
  echo "$1"
  exit 1
}
lastchar()
{
  # return the last character of a string in $rval
  if [ -z "$1" ]; then
    # empty string
    rval=""
    return
  fi
  # wc puts some space behind the output this is why we need sed:
  numofchar=`echo -n "$1" | wc -c | sed 's/ //g' `
  # now cut out the last char
  rval=`echo -n "$1" | cut -b $numofchar`
}

chop()
{
  # remove the last character in string and return it in $rval
  if [ -z "$1" ]; then
    # empty string
    rval=""
    return
  fi
  # wc puts some space behind the output this is why we need sed:
  numofchar=`echo -n "$1" | wc -c | sed 's/ //g' `
  if [ "$numofchar" = "1" ]; then
    # only one char in string
    rval=""
    return
  fi
  numofcharminus1=`expr $numofchar "-" 1`
  # now cut all but the last char:
  rval=`echo -n "$1" | cut -b 0-${numofcharminus1}`
}
while [ -n "$1" ]; do
case $1 in
  -h) help;shift 1;; # function help is called
  --) shift;break;; # end of options
  -*) error "error: no such option $1. -h for help";;
  *) break;;
esac
done
# The main program
sum=0
weight=1
# one arg must be given:
[ -z "$1" ] && help
binnum="$1"
binnumorig="$1"

while [ -n "$binnum" ]; do
  lastchar "$binnum"
  if [ "$rval" = "1" ]; then
    sum=`expr "$weight" "+" "$sum"`
  fi
  # remove the last position in $binnum
  chop "$binnum"
  binnum="$rval"
  weight=`expr "$weight" "*" 2`
done
echo "binary $binnumorig is decimal $sum"
#
  该脚本使用的算法是利用十进制和二进制数权值 (1,2,4,8,16,..),比如二进制"10"可以这样转换成十进制:
0 * 1 + 1 * 2 = 2
  为了得到单个的二进制数我们是用了lastchar 函数。该函数使用wc –c计算字符个数,然后使用cut命令取出末尾一个字符。Chop函数的功能则是移除最后一个字符。
  文件循环程序
   或许您是想将所有发出的邮件保存到一个文件中的人们中的一员,但是在过了几个月以后,这个文件可能会变得很大以至于使对该文件的访问速度变慢。下面的脚 本rotatefile 可以解决这个问题。这个脚本可以重命名邮件保存文件(假设为outmail)为outmail.1,而对于outmail.1就变成了outmail.2 等等等等...
#!/bin/sh
# vim: set sw=4 ts=4 et:
ver="0.1"
help()
{
  cat <
rotatefile -- rotate the file name

USAGE: rotatefile [-h] filename

OPTIONS: -h help text
EXAMPLE: rotatefile out
This will e.g rename out.2 to out.3, out.1 to out.2, out to out.1
and create an empty out-file
The max number is 10
version $ver
HELP
  exit 0
}

error()
{
  echo "$1"
  exit 1
}
while [ -n "$1" ]; do
case $1 in
  -h) help;shift 1;;
  --) break;;
  -*) echo "error: no such option $1. -h for help";exit 1;;
  *) break;;
esac
done
# input check:
if [ -z "$1" ] ; then
error "ERROR: you must specify a file, use -h for help"
fi
filen="$1"
# rename any .1 , .2 etc file:
for n in 9 8 7 6 5 4 3 2 1; do
  if [ -f "$filen.$n" ]; then
    p=`expr $n + 1`
    echo "mv $filen.$n $filen.$p"
    mv $filen.$n $filen.$p
  fi
done
# rename the original file:
if [ -f "$filen" ]; then
  echo "mv $filen $filen.1"
  mv $filen $filen.1
fi
echo touch $filen
touch $filen
  这个脚本是如何工作的呢?在检测用户提供了一个文件名以后,我们进行一个9到1的循环。文件9被命名为10,文件8重命名为9等等。循环完成之后,我们将原始文件命名为文件1同时建立一个与原始文件同名的空文件。
调试
  最简单的调试命令当然是使用echo命令。您可以使用echo在任何怀疑出错的地方打印任何变量值。这也是绝大多数的shell程序员要花费80%的时间来调试程序的原因。Shell程序的好处在于不需要重新编译,插入一个echo命令也不需要多少时间。
  shell也有一个真实的调试模式。如果在脚本"strangescript" 中有错误,您可以这样来进行调试:
sh -x strangescript
  这将执行该脚本并显示所有变量的值。
  shell还有一个不需要执行脚本只是检查语法的模式。可以这样使用:
sh -n your_script
  这将返回所有语法错误。
源地址:http://www.opensourceproject.org.cn/article.php?id=355

Wednesday, March 18, 2009

[转]常用校验码

http://hi.baidu.com/topasstem8/blog/item/bde149f38f24dd57342acce8.html

计算机系统运行时,各个部之间要进行数据交换. 为确保数据在传送过程正确无误,常使用检验码. 我们常使用的检验码有三种. 分别是奇偶校验码、海明校验码和循环冗余校验码(CRC) 。

奇偶校验码

奇偶校验码最简单,但只能检测出奇数位出错. 如果发生偶数位错误就无法检测. 但经研究是奇数位发生错误的概率大很多. 而且奇偶校验码无法检测出哪位出错.所以属于无法矫正错误的校验码。奇偶校验码是奇校验码和偶校验码的统称. 它们都是通过在要校验的编码上加一位校验位组成. 如果是奇校验加上校验位后,编码中1的个数为奇数个。如果是偶校验加上校验位后,编码中1的个数为偶数个。

例:
原编码 奇校验 偶校验
0000 0000 1 0000 0
0010 0010 0 0010 1
1100 1100 1 1100 0
1010 1010 1 1010 0

如果发生奇数个位传输出错,那么编码中1的个数就会发生变化. 从而校验出错误,要求从新传输数据。目前应用的奇偶校验码有3种.

水平奇偶校验码对每一个数据的编码添加校验位,使信息位与校验位处于同一行.

垂直奇偶校验码把数据分成若干组,一组数据排成一行,再加一行校验码. 针对每一行列采用奇校验 或 偶校验
例: 有32位数据10100101 00110110 11001100 10101011
垂直奇校验 垂直偶校验
数据10100101 10100101
00110110 00110110
11001100 11001100
10101011 10101011
校验00001011 11110100

水平垂直奇偶校验码就是同时用水平校验和垂直校验
例:
奇校验 奇水平 偶校验 偶水平
数据 10100101 1 10100101 0
00110110 1 00110110 0
11001100 1 11001100 0
10101011 0 10101011 1
校验 00001011 0 11110100 1

海明校验码


海明码也是利用奇偶性来校验数据的. 它是一种多重奇偶校验检错系统,它通过在数据位之间插入k个校验位,来扩大码距,从而实现检错和纠错.

设原来数据有n位,要加入k位校验码.怎么确定k的大小呢? k个校验位可以有pow(2,k) (代表2的k次方) 个编码,其中有一个代表是否出错. 剩下pow(2,k)-1个编码则用来表示到底是哪一位出错. 因为n个数据位和k个校验位都可能出错,所以k满足pow(2,k)-1 >= n+k。


①海明校验的基本思想
将有效信息按某种规律分成若干组,每组安排一个校验位,做奇偶测试,就能提供多位检错信息,以指出最大可能是哪位出错,从而将其纠正。实质上,海明校验是一种多重校验。

②海明校验的特点
它不仅具有检测错误的能力,同时还具有给出错误所在准确位置的能力。

一.校验位的位数 校验位的位数与有效信息的长度有关


设:N--为校验码的位数 K--是有效信息位 r--校验位(分成r组作奇偶校验,能产生r位检错信息)
海明码应满足 N=K+r≤2r-1 若r=3 则N=K+r≤7 所以K≤4

MySpace博客图片-讲述我的故事~

二.分组原则`

在海明码中, 位号数(1、2、3、……、n)为2的权值的那些位,即:
1(20)、2(21)、4(22)、8(23)、…2r-1位,作为奇偶校验位
并记作: P1、P2、P3 、P4、…Pr,余下各位则为有效信息位。
例如: N=11 K=7 r=4 相应海明码可示意为

位号 1 2 3 4 5 6 7 8 9 10 11
P占位 P1 P2 × P3 × × × P4 × × ×
其中×均为有效信息,海明码中的每一位分别被P1P2P3P4… Pr 中的一至若干位所校验,其规律是:
第i位由校验位位号之和等于i的那些校验位所校验
如:海明码的位号为3,它被P1P2(位号分别为1,2)所校验
海明码的位号为5,它被P1P3(位号分别为1,4)所校验
归并起来: 形成了4个小组,每个小组一个校验位,校验位的取值,仍采用奇偶校验方式确定。

如表 2·6 、表2·7所示:
MySpace博客图片-讲述我的故事~

MySpace博客图片-讲述我的故事~

三.编码、查错、纠错原理
以4位有效信息(b1、b2、b3、b4)和3位校验位(P1、P2、P3)为例: K=4 r=3
海明序号 1 2 3 4 5 6 7
海明码 P1 P2 b1 P3 b2 b3 b4
根据表2-8可以看到
(1)每个小组只有一位校验位,第一组是P1、第二组是P2、第三组是P3。
(2)每个校验位校验着它本身和它后面的一些确定位。

MySpace博客图片-讲述我的故事~


1.编码原理(采用偶校验)


1)若有效信息b1b2b3b4=1011 先将它们分别填入第3、5、6、7位
2)再分组进行奇偶统计,分别填入校验位P1、P2、P3的值
如:第一组有:P1b1b2b4 因b1b2b4含偶数个1,故P1应取值为0
第二组有:P2b1b3b4
因b1b3b4含奇数个1,故P2应取值为1
第三组有:P3b2b3b4 因b2b3b4含偶数个1,故P3应取值为0
海明编码为:P1P2b1P3b2b3b4=0110011

2.查错与纠错


因为分三组校验,每组产生一位检错信息、3组共3位检错信息,便构成一个指误字,上例指误字由G1G2G3组成。
其中:
G3=P3⊕b2⊕b3⊕b4 P3b2b3b4=0011
G2=P2⊕b1⊕b3⊕b4 P2b1b3b4=1111
G1=P1⊕b1⊕b2⊕b4 P1b1b2b4=0101
采用偶校验,在没有出错情况下G1G2G3=000。由于在分组时,就确定了每一位参加校验的组别,所以指误字能准确地指出错误所在位。

如:若第3位b1出错,由于b1参加了第一组和第二组的校验,必然破坏了第一组和第二组的偶性,从而使G1和G2为1。 因为b1未参加第三组校验,故G3=0,所以构成的指误字G3G2G1=011它指出第3位出错。
反之:若G3G2G1=111 则说明海明码第7位b4出错。因为只有第7位b4参加了3个小组的校验,破坏了三个小组的偶性。
假定:
源部件发送海明码为:0110011 接收端接收海明码为:0110011
则: 三个小组都满足偶校验要求,这时G3G2G1=000,表明收到信息正确,可以从中提出有效信息1011参与运算处理。
纠错:若接收端收到的海明码为0110111,分组检测后指误字G3G2G1=101,它指出第5位出错,则只须将第5位变反,就可还原成正确的数码0110011。

循环冗余校验码


CRC码利用生成多项式为k个数据位产生r个校验位进行编码,其编码长度为n=k+r所以又称 (n,k)码. CRC码广泛应用于数据通信领域和磁介质存储系统中. CRC理论非常复杂,一般书就给个例题,讲讲方法.现在简单介绍下它的原理:

在k位信息码后接r位校验码,对于一个给定的(n,k)码。可以证明(数学高手自己琢磨证明过程)存在一个最高次幂为 n-k=r 的多项式g(x),根据g(x)可以生成k位信息的校验码,g(x)被称为 生成多项式

用C(x)=C(k-1)C(k-2)...C0表示k个信息位,把C(x)左移r位,就是相当于 C(x)*pow(2,r) 给校验位空出r个位来了.给定一个 生成多项式g(x),可以求出一个校验位表达式r(x) 。C(x)*pow(2,r) / g(x) = q(x) + r(x)/g(x) 用C(x)*pow(2,r)去除生成多项式g(x)商为q(x)余数是r(x)。所以有C(x)*pow(2,r) = q(x)*g(x) + r(x)


C(x)*pow(2,r) + r(x)就是所求的n位CRC码,由上式可以看出它是生成多项式g(x)的倍式.所以如果用得到的n位CRC码去除g(x)如果余数是0,就证明数据正确. 否则可以根据余数知道出错位.
在CRC运算过程中,四则运算采用 mod 2运算(后面介绍),即不考虑进位和借位. 所以上式等价于C(x)*pow(2,r) + r(x) = q(x)*g(x)

继续前先说下基本概念吧.
1.多项式和二进制编码
x的最高次幂位对应二进制数的最高位.以下各位对应多项式的各幂次. 有此幂次项为1,无为0. x的最高幂次为r时, 对应的二进制数有r+1位 例如g(x)=pow(x,4) + pow(x,3) + x + 1 对应二进制编码是 11011

2.生成多项式 是发送方和接受方的一个约定,也是一个二进制数,在整个传输过程中,这个数不会变.
在发送方利用 生成多项式 对信息多项式做 模2运算 生成校验码.
在接受方利用 生成多项式 对收到的 编码多项式 做 模2运算 校验和纠错.

生成多项式应满足:
a.生成多项式的最高位和最低位必须为1
b.当信息任何一位发生错误时,被生成多项式模2运算后应该使余数不为0
c.不同位发生错误时,应该使余数不同.
d.对余数继续做模2除,应使余数循环.

生成多项式很复杂,不过不用我们生成。

下面给出一些常用的生成多项式表
n k 二进制码(自己根据 多项式和二进制编码 的介绍转)
7 4 1011 或 1101
7 3 11011 或 10111
15 11 1011
31 26 100101


3.模2运算
a.加减法法则
0 +/- 0 = 0
0 +/- 1 = 1
1 +/- 0 = 1
1 +/- 1 = 0
注意:没有进位和借位

b.乘法法则
利用模2加求部分积之和,没有进位

c.除法法则
利用模2减求部分余数,没有借位,每商1位则部分余数减1位,余数最高位是1就商1,不是就商0, 当部分余数的位数小于余数时,该余数就是最后余数.

例 1110
1011)1100000
1011
1110
1011
1010
1011
0010(每商1位则部分余数减1位,所以前两个0写出)
0000
010(当部分余数的位数小于余数时,该余数就是最后余数)
最后商是1110余数是010

好了说了那么多没用的理论.下面讲下CRC的实际应用.例: 给定的生成多项式g(x)=1011, 用(7,4)CRC码对C(x)=1010进行编码.
由题目可以知道下列的信息:
C(x)=1010,n=7,k=4,r=3,g(x)=1011 C(x)*pow(2,3)=1010000 C(x)*pow(2,3) / g(x) = 1001 + 11/1011 所以r(x)=011.所以要求的编码为1010011
例2: 上题中,数据传输后变为1000011,试用纠错机制纠错. 1000011 / g(x) = 1011 + 110/1011

不能整除,所以出错了. 因为余数是110.查1011出错位表可以知道是第5位出错.对其求反即可.

Redundant Array of Independent Disks

http://en.wikipedia.org/wiki/Redundant_array_of_independent_disks

独立冗余磁盘阵列

Principles

RAID combines two or more physical hard disks into a single logical unit by using either special hardware or software. Hardware solutions often are designed to present themselves to the attached system as a single hard drive, so that the operating system would be unaware of the technical workings. For example, you might configure a 1TB RAID 5 array using three 500GB hard drives in hardware RAID, the operating system would simply be presented with a "single" 1TB disk. Software solutions are typically implemented in the operating system and would present the RAID drive as a single drive to applications running upon the operating system.

There are three key concepts in RAID: mirroring, the copying of data to more than one disk; striping, the splitting of data across more than one disk; and error correction, where redundant data is stored to allow problems to be detected and possibly fixed (known as fault tolerance). Different RAID levels use one or more of these techniques, depending on the system requirements. RAID's main aim can be either to improve reliability and availability of data, ensuring that important data is available more often than not (e.g. a database of customer orders), or merely to improve the access speed to files (e.g. for a system that delivers video on demand TV programs to many viewers).

The configuration affects reliability and performance in different ways. The problem with using more disks is that it is more likely that one will go wrong, but by using error checking the total system can be made more reliable by being able to survive and repair the failure. Basic mirroring can speed up reading data as a system can read different data from both the disks, but it may be slow for writing if the configuration requires that both disks must confirm that the data is correctly written. Striping is often used for performance, where it allows sequences of data to be read from multiple disks at the same time. Error checking typically will slow the system down as data needs to be read from several places and compared. The design of RAID systems is therefore a compromise and understanding the requirements of a system is important. Modern disk arrays typically provide the facility to select the appropriate RAID configuration.

Standard levels

A number of standard schemes have evolved which are referred to as levels. There were five RAID levels originally conceived, but many more variations have evolved, notably several nested levels and many non-standard levels (mostly proprietary).

Following is a brief summary of the most commonly used RAID levels.[3] Space efficiency is given as amount of storage space available in an array of n disks, in multiples of the capacity of a single drive. For example if an array holds n=5 drives of 250GB and efficiency is n-1 then available space is 4 times 250GB or roughly 1TB.

Level Description Minimum # of disks Space Efficiency Image
RAID 0 "Striped set without parity" or "Striping". Provides improved performance and additional storage but no fault tolerance. Any disk failure destroys the array, which becomes more likely with more disks in the array. A single disk failure destroys the entire array because when data is written to a RAID 0 drive, the data is broken into fragments. The number of fragments is dictated by the number of disks in the array. The fragments are written to their respective disks simultaneously on the same sector. This allows smaller sections of the entire chunk of data to be read off the drive in parallel, giving this type of arrangement huge bandwidth. RAID 0 does not implement error checking so any error is unrecoverable. More disks in the array means higher bandwidth, but greater risk of data loss. 2 n RAID Level 0
RAID 1 'Mirrored set without parity' or 'Mirroring'. Provides fault tolerance from disk errors and failure of all but one of the drives. Increased read performance occurs when using a multi-threaded operating system that supports split seeks, very small performance reduction when writing. Array continues to operate so long as at least one drive is functioning. Using RAID 1 with a separate controller for each disk is sometimes called duplexing. 2 1 RAID Level 1
RAID 2 Hamming code parity. Disks are synchronised and striped in very small stripes, often in single bytes/words. Hamming codes error correction is calculated across corresponding bits on disks, and is stored on multiple parity disks. 3

RAID 3 Striped set with dedicated parity or bit interleaved parity or byte level parity. This mechanism provides an improved performance and fault tolerance similar to RAID 5, but with a dedicated parity disk rather than rotated parity stripes. The single parity disk is a bottle-neck for writing since every write requires updating the parity data. One minor benefit is the dedicated parity disk allows the parity drive to fail and operation will continue without parity or performance penalty. 3 n-1 RAID Level 3
RAID 4 Block level parity. Identical to RAID 3, but does block-level striping instead of byte-level striping. In this setup, files can be distributed between multiple disks. Each disk operates independently which allows I/O requests to be performed in parallel, though data transfer speeds can suffer due to the type of parity. The error detection is achieved through dedicated parity and is stored in a separate, single disk unit. 3 n-1 RAID Level 4
RAID 5 Striped set with distributed parity or interleave parity. Distributed parity requires all drives but one to be present to operate; drive failure requires replacement, but the array is not destroyed by a single drive failure. Upon drive failure, any subsequent reads can be calculated from the distributed parity such that the drive failure is masked from the end user. The array will have data loss in the event of a second drive failure and is vulnerable until the data that was on the failed drive is rebuilt onto a replacement drive. A single drive failure in the set will result in reduced performance of the entire set until the failed drive has been replaced and rebuilt. 3 n-1 RAID Level 5
RAID 6 Striped set with dual distributed parity. Provides fault tolerance from two drive failures; array continues to operate with up to two failed drives. This makes larger RAID groups more practical, especially for high availability systems. This becomes increasingly important because large-capacity drives lengthen the time needed to recover from the failure of a single drive. Single parity RAID levels are vulnerable to data loss until the failed drive is rebuilt: the larger the drive, the longer the rebuild will take. Dual parity gives time to rebuild the array without the data being at risk if one drive, but no more, fails before the rebuild is complete. RAID 6 is sometimes referred to as Advanced Data Guarding (ADG). 4 n-2 RAID Level 6

Thursday, February 19, 2009

route 笔记(续)

转自:http://www.hziter.com/bbs6/dispbbs.asp?boardid=7&id=541

Active Routes:活动的路由
network destination 目的网段
netmask 子网掩码
gateway 下一跳路由器入口的ip
interface 到达该目的地的本路由器的出口ip
路由器通过interface和gateway定义一条到下一个路由器的链路,通常情况下,interface和gateway是同一网段的,特殊情况下gateway可以不在当前interface的网段上,比如配置递归寻路的情况下metric 跳数,该条路由记录的质量,一般情况下,如果有多条到达相同目的地的路由记录,路由器会采用metric值小的那条路由,如果同时连接了有线和无线网络,一般有线是20,无线是30 Persistent Routes:手工配置的静态固化路由,即时重启也不会消失


第一条:

Network destinationNetmask Gateway Interface Metric

0.0.0.0 0.0.0.0 192.168.2.1 192.168.2.6 20

缺省路由:意思就是说,当一个数据包的目的网段不在你的路由记录中,那么,你的路由器该把那个数据包发送到那里!缺省路由的网关是由你的连接上的default gateway决定的.
该路由记录的意思是:当我接收到一个数据包的目的网段不在我的路由记录中,我会将该数据包通
过 192.168.2.6 这个接口发送到 192.168.2.1 这个地址,这个地址是下一个路由器的一个接口,这
样这个数据包就可以交付给下一个路由器处理,与我无关。该路由记录的线路质量: 20.

第二条

Network destination Netmask Gateway Interface Metric

127.0.0.1 255.0.0.0 127.0.0.1 127.0.0.1 1
本地环路:127.0.0.0这个网段内所有地址都指向自己机器,如果收到这样一个数据,应该
发向哪里 该路由记录的线路质量 1

第三条

Network destination Netmask Gateway Interface Metric

192.168.2.0 255.255.255.0 192.168.2.6 192.168.2.6 20
直联网段的路由记录:当路由器收到发往直联网段的数据包时该如何处理,这种情况,
路由记录的 Interface 和 Gateway 是同一个。
当我接收到一个数据包的目的网段是 192.168.2.0 时,我会将该数据包通过
192.168.2.6 这个接口直接发送出去,因为这个端口直接连接着192.168.2.0这个网段,
该路由记录的线路质量 20

第四条

Network destination Netmask Gateway Interface Metric

192.168.2.6 255.255.255.255 127.0.0.1 127.0.0.1 20
本地主机路由:当路由器收到发送给自己的数据包时将如何处理。
当我接收到一个数据包的目的网段是 192.168.2.6 时,我会将该数据包收下,因为这个数
据包是发送给我自己的,该路由记录的线路质量 20

第五条

Network destination Netmask Gateway Interface Metric

192.168.2.255 255.255.255.255 192.168.2.6 192.168.2.6 20
本地广播路由:当路由器收到发送给直联网段的本地广播时如何处理。
当我接收到广播数据包的目的网段是 192.168.2.255 时,我会将该数据从
192.168.2.6 接口以广播的形势发送出去,该路由记录的线路质量 20

第六条

Network destination Netmask Gateway Interface Metric

224.0.0.0 224.0.0.0 192.168.2.6 192.168.2.6 20

组播路由:当路由器收到一个组播数据包时该如何处理。
当我接收到组播数据包时,我会将该数据从 192.168.2.6 接口以组播的形势发送出去,
该路由记录的线路质量 20。

第七条

Network destination Netmask Gateway Interface Metric

255.255.255.255 255.255.255.255 192.168.2.6 192.168.2.6 1

广播路由:当路由器收到一个绝对广播时该如何处理。
当我接收到绝对广播数据包时,将该数据包通过 192.168.2.6 发出去

Thursday, January 8, 2009

route 笔记1

关于添加网关的一些汇总

  • Linux 部分
  • 网络环境:
  • 有两个 Class C 网络:
    有线Lan : 192.168.1.0/24
    无线Lan : 192.168.2.0/24

    主机中有两块网卡:
    网卡1: eth0 , 拥有一个 global IP 221.xxx.xxx.xxx
    网卡1: eth1 , 拥有一个 local IP 192.168.1.xxx

  • 设置目标
  • 设置主机使得:
    1) 从 global IP 来的 access 通过 default GW (Global IP GW) 返回 package
    2) 从 local IP 来的 access 通过 192.168.1.10 返回 package

    由于在 route add 命令中需要使用网关的 hostname,所以首先在 /etc/hosts 中定义 gateway 的名称。例如:

    192.168.1.10 gw8f
    查看现有的设置:
    # route
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    221.12.345.56 * 255.255.255.240 U 0 0 0 eth0
    192.168.1.0 * 255.255.255.0 U 0 0 0 eth1
    169.254.0.0 * 255.255.0.0 U 0 0 0 eth1
    default 221x114x249x193 0.0.0.0 UG 0 0 0 eth0
    然后添加route并确认:
    # route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.1.10 dev eth1
    #说明:来自192.168.2.0/24的package通过192.168.1.10网关返回package。
    # route
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    221.12.345.56 * 255.255.255.240 U 0 0 0 eth0
    192.168.2.0 gw8f 255.255.255.0 UG 0 0 0 eth1
    192.168.1.0 * 255.255.255.0 U 0 0 0 eth1
    169.254.0.0 * 255.255.0.0 U 0 0 0 eth1
    default 221x114x249x193 0.0.0.0 UG 0 0 0 eth0

    保存设置在静态文件中:

    # vi /etc/sysconfig/network-scripts/route-eth1
    添加以下一行即可:
    192.168.2.0/24 via 192.168.1.10

    Windows

    route add 202.126.225.0 mask 255.255.255.0 192.168.1.5 metric 1 if eth1
    其他:
    如果有防火墙设置,需要修改一些设置。比如通过 Easy Firewall Generator 制作的 firewall 中需要添加:
    LOCAL_NET2="192.168.2.0/24"

    # Drop packets received on the external interface
    # claiming a source of the local network
    $IPT -A bad_packets -p ALL -i $INET_IFACE -s $LOCAL_NET2 -j LOG \
    --log-prefix "Illegal source: "

    $IPT -A bad_packets -p ALL -i $INET_IFACE -s $LOCAL_NET2 -j DROP

    # Rules for the private network (accessing gateway system itself)
    $IPT -A INPUT -p ALL -i $LOCAL_IFACE -s $LOCAL_NET2 -j ACCEPT

    参考资料:
    http://www.akadia.com/services/redhat_static_routes.html

    Linux文件权限详解

    Linux文件权限详解
    一、文件和目录权限概述
    在linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录。

    通过设定权限可以从以下三种访问方式限制访问权限:只允许用户自己访问;允许一个预先指定的用户组中的用户访问;允许系统中的任何用户访问。同时,用户能 够控制一个给定的文件或目录的访问程度。一个文件活目录可能有读、写及执行权限。当创建一个文件时,系统会自动地赋予文件所有者读和写的权限,这样可以允 许所有者能够显示文件内容和修改文件。文件所有者可以将这些权限改变为任何他想指定的权限。一个文件也许只有读权限,禁止任何修改。文件也可能只有执行权 限,允许它想一个程序一样执行。

    三种不同的用户类型能够访问一个目录或者文件:所有着、用户组或其他用户。所有者就是创建文件的用户,用户是所有用户所创建的文件的所有者,用户可以允许 所在的用户组能访问用户的文件。通常,用户都组合成用户组,例如,某一类或某一项目中的所有用户都能够被系统管理员归为一个用户组,一个用户能够授予所在 用户组的其他成员的文件访问权限。最后,用户也将自己的文件向系统内的所有用户开放,在这种情况下,系统内的所有用户都能够访问用户的目录或文件。在这种 意义上,系统内的其他所有用户就是other用户类。

    每一个用户都有它自身的读、写和执行权限。第一套权限控制访问自己的文件权限,即所有者权限。第二套权限控制用户组访问其中一个用户的文件的权限。第三套 权限控制其他所有用户访问一个用户的文件的权限,这三套权限赋予用户不同类型(即所有者、用户组和其他用户)的读、写及执行权限就构成了一个有9种类型的 权限组。

    我们可以用-l参数的ls命令显示文件的详细信息,其中包括权限。如下所示:

    yekai@kebao:/media/sda5/软件压缩/Linux$ ls -lh
    总用量 191M
    -rwxrwx--- 1 root plugdev 18M 2007-02-28 18:05 ActionCube_v0.92.tar.bz2
    -rwxrwx--- 1 root plugdev 60M 2007-04-30 22:52 nexuiz-223.zip
    -rwxrwx--- 1 root plugdev 7.4M 2007-04-25 02:16 stardict-oxford-gb-2.4.2.tar.bz2
    -rwxrwx--- 1 root plugdev 102M 2007-05-01 18:22 tremulous-1.1.0-installer.x86.run
    -rwxrwx--- 1 root plugdev 4.9M 2007-04-30 14:32 wqy-bitmapfont-0.8.1-7_all.deb.bin

    当执行ls -l 或 ls -al 命令后显示的结果中,最前面的第2~10个字符是用来表示权限。第一个字符一般用来区分文件和目录:

    d:表示是一个目录,事实上在ext2fs中,目录是一个特殊的文件。

    -:表示这是一个普通的文件。

    l: 表示这是一个符号链接文件,实际上它指向另一个文件。

    b、c:分别表示区块设备和其他的外围设备,是特殊类型的文件。

    s、p:这些文件关系到系统的数据结构和管道,通常很少见到。

    下面详细介绍一下权限的种类和设置权限的方法。

    二、一般权限
    第2~10个字符当中的每3个为一组,左边三个字符表示所有者权限,中间3个字符表示与所有者同一组的用户的权限,右边3个字符是其他用户的权限。这三个一组共9个字符,代表的意义如下:
    r(Read,读取):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限。
    w(Write,写入):对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。
    x(eXecute,执行):对文件而言,具有执行文件的权限;对目录了来说该用户具有进入目录的权限。

    -:表示不具有该项权限。
    下面举例说明:
    -rwx------: 文件所有者对文件具有读取、写入和执行的权限。
    -rwxr―r--: 文件所有者具有读、写与执行的权限,其他用户则具有读取的权限。
    -rw-rw-r-x: 文件所有者与同组用户对文件具有读写的权限,而其他用户仅具有读取和执行的权限。
    drwx--x--x: 目录所有者具有读写与进入目录的权限,其他用户近能进入该目录,却无法读取任何数据。
    Drwx------: 除了目录所有者具有完整的权限之外,其他用户对该目录完全没有任何权限。

    每个用户都拥有自己的专属目录,通常集中放置在/home目录下,这些专属目录的默认权限为rwx------:

    表示目录所有者本身具有所有权限,其他用户无法进入该目录。执行mkdir命令所创建的目录,其默认权限为rwxr-xr-x,用户可以根据需要修改目录的权限。

    此外,默认的权限可用umask命令修改,用法非常简单,只需执行umask 777 命令,便代表屏蔽所有的权限,因而之后建立的文件或目录,其权限都变成000,依次类推。通常root帐号搭配umask命令的数值为022、027和 077,普通用户则是采用002,这样所产生的权限依次为755、750、700、775。有关权限的数字表示法,后面将会详细说明。

    用户登录系统时,用户环境就会自动执行rmask命令来决定文件、目录的默认权限。

    三、特殊权限
    其实文件与目录设置不止这些,还有所谓的特殊权限。由于特殊权限会拥有一些“特权”,因而用户若无特殊需求,不应该启用这些权限,避免安全方面出现严重漏洞,造成黑客入侵,甚至摧毁系统!!!

    s或S(SUID,Set UID):可执行的文件搭配这个权限,便能得到特权,任意存取该文件的所有者能使用的全部系统资源。请注意具备SUID权限的文件,黑客经常利用这种权限,以SUID配上root帐号拥有者,无声无息地在系统中开扇后门,供日后进出使用。

    s或S(SGID,Set GID):设置在文件上面,其效果与SUID相同,只不过将文件所有者换成用户组,该文件就可以任意存取整个用户组所能使用的系统资源。

    T或T(Sticky):/tmp和 /var/tmp目录供所有用户暂时存取文件,亦即每位用户皆拥有完整的权限进入该目录,去浏览、删除和移动文件。

    因为SUID、SGID、Sticky占用x的位置来表示,所以在表示上会有大小写之分。加入同时开启执行权限和SUID、SGID、Sticky,则权限表示字符是小写的:

    -rwsr-sr-t 1 root root 4096 6月 23 08:17 conf

    如果关闭执行权限,则表示字符会变成大写:

    -rwSr-Sr-T 1 root root 4096 6月 23 08:17 conf

    四、使用文件管理器来改变文件或目录的权限:
    如果用户要改变一个文件目录的权限,右击要改变权限的文件或者目录,在弹出的快捷菜单中选择“属性”,系统将打开属性对话框

    在“属性”对话框中,单击“权限”标签,就会打开“权限”选项卡。

    在这里你可以修改文件或者目录的所有者、组群和其他用户的权限,而且可以设置特殊权限

    对于特殊权限,最好不要设置,不然会带来很严重的安全问题。

    当然,在这里你也可以改变文件和目录的所有者和所属组。

    五、使用chmod和数字改变文件或目录的访问权限

    文件和目录的权限表示,是用rwx这三个字符来代表所有者、用户组和其他用户的权限。有时候,字符似乎过于麻烦,因此还有另外一种方法是以数字来表示权限,而且仅需三个数字。

    r: 对应数值4

    w: 对应数值2

    x:对应数值1

    -:对应数值0

    数字设定的关键是mode的取值,一开始许多初学者会被搞糊涂,其实很简单,我们将rwx看成二进制数,如果有则有1表示,没有则有0表示,那么rwx r-x r- -则可以表示成为:



    111 101 100

    再将其每三位转换成为一个十进制数,就是754。

    例如,我们想让a.txt这个文件的权限为:

    自己 同组用户 其他用户

    可读 是 是 是

    可写 是 是

    可执行

    那么,我们先根据上表得到权限串为:rw-rw-r--,那么转换成二进制数就是110 110 100,再每三位转换成为一个十进制数,就得到664,因此我 们执行命令:

    [root@localhost ~]# chmod 664 a.txt

    按照上面的规则,rwx合起来就是4+2+1=7,一个rwxrwxrwx权限全开放的文件,数值表示为777;而完全不开放权限的文件“---------”其数字表示为000。下面举几个例子:

    -rwx------:等于数字表示700。

    -rwxr―r--:等于数字表示744。

    -rw-rw-r-x:等于数字表示665。

    drwx―x―x:等于数字表示711。

    drwx------:等于数字表示700。

    在文本模式下,可执行chmod命令去改变文件和目录的权限。我们先执行ls -l 看看目录内的情况:


    [root@localhost ~]# ls -l

    总用量 368

    -rw-r--r-- 1 root root 12172 8月 15 23:18 conkyrc.sample

    drwxr-xr-x 2 root root 48 9月 4 16:32 Desktop

    -r--r--r-- 1 root root 331844 10月 22 21:08 libfreetype.so.6

    drwxr-xr-x 2 root root 48 8月 12 22:25 MyMusic

    -rwxr-xr-x 1 root root 9776 11月 5 08:08 net.eth0

    -rwxr-xr-x 1 root root 9776 11月 5 08:08 net.eth1

    -rwxr-xr-x 1 root root 512 11月 5 08:08 net.lo

    drwxr-xr-x 2 root root 48 9月 6 13:06 vmware

    可以看到当然文件conkyrc.sample文件的权限是644,然后把这个文件的权限改成777。执行下面命令

    [root@localhost ~]# chmod 777 conkyrc.sample

    然后ls -l看一下执行后的结果:

    [root@localhost ~]# ls -l

    总用量 368

    -rwxrwxrwx 1 root root 12172 8月 15 23:18 conkyrc.sample

    drwxr-xr-x 2 root root 48 9月 4 16:32 Desktop

    -r--r--r-- 1 root root 331844 10月 22 21:08 libfreetype.so.6

    drwxr-xr-x 2 root root 48 8月 12 22:25 MyMusic

    -rwxr-xr-x 1 root root 9776 11月 5 08:08 net.eth0

    -rwxr-xr-x 1 root root 9776 11月 5 08:08 net.eth1

    -rwxr-xr-x 1 root root 512 11月 5 08:08 net.lo

    drwxr-xr-x 2 root root 48 9月 6 13:06 vmware

    可以看到conkyrc.sample文件的权限已经修改为rwxrwxrwx

    如果要加上特殊权限,就必须使用4位数字才能表示。特殊权限的对应数值为:

    s或 S (SUID):对应数值4。

    s或 S (SGID):对应数值2。

    t或 T :对应数值1。

    用同样的方法修改文件权限就可以了

    例如:

    [root@localhost ~]# chmod 7600 conkyrc.sample

    [root@localhost ~]# ls -l

    总用量 368

    -rwS--S--T 1 root root 12172 8月 15 23:18 conkyrc.sample

    drwxr-xr-x 2 root root 48 9月 4 16:32 Desktop

    -r--r--r-- 1 root root 331844 10月 22 21:08 libfreetype.so.6

    drwxr-xr-x 2 root root 48 8月 12 22:25 MyMusic

    -rwxr-xr-x 1 root root 9776 11月 5 08:08 net.eth0

    -rwxr-xr-x 1 root root 9776 11月 5 08:08 net.eth1

    -rwxr-xr-x 1 root root 512 11月 5 08:08 net.lo

    drwxr-xr-x 2 root root 48 9月 6 13:06 vmware

    加入想一次修改某个目录下所有文件的权限,包括子目录中的文件权限也要修改,要使用参数-R表示启动递归处理。

    例如:

    [root@localhost ~]# chmod 777 /home/user 注:仅把/home/user目录的权限设置为rwxrwxrwx

    [root@localhost ~]# chmod -R 777 /home/user 注:表示将整个/home/user目录与其中的文件和子目录的权限都设置为rwxrwxrwx

    六、使用命令chown改变目录或文件的所有权

    文件与目录不仅可以改变权限,其所有权及所属用户组也能修改,和设置权限类似,用户可以通过图形界面来设置,或执行chown命令来修改。

    我们先执行ls -l看看目录情况:

    [root@localhost ~]# ls -l

    总用量 368

    -rwxrwxrwx 1 root root 12172 8月 15 23:18 conkyrc.sample

    drwxr-xr-x 2 root root 48 9月 4 16:32 Desktop

    -r--r--r-- 1 root root 331844 10月 22 21:08 libfreetype.so.6

    drwxr-xr-x 2 root root 48 8月 12 22:25 MyMusic

    -rwxr-xr-x 1 root root 9776 11月 5 08:08 net.eth0

    -rwxr-xr-x 1 root root 9776 11月 5 08:08 net.eth1

    -rwxr-xr-x 1 root root 512 11月 5 08:08 net.lo

    drwxr-xr-x 2 root root 48 9月 6 13:06 vmware

    可以看到conkyrc.sample文件的所属用户组为root,所有者为root。

    执行下面命令,把conkyrc.sample文件的所有权转移到用户user:

    [root@localhost ~]# chown user conkyrc.sample

    [root@localhost ~]# ls -l

    总用量 368

    -rwxrwxrwx 1 user root 12172 8月 15 23:18 conkyrc.sample

    drwxr-xr-x 2 root root 48 9月 4 16:32 Desktop

    -r--r--r-- 1 root root 331844 10月 22 21:08 libfreetype.so.6

    drwxr-xr-x 2 root root 48 8月 12 22:25 MyMusic

    -rwxr-xr-x 1 root root 9776 11月 5 08:08 net.eth0

    -rwxr-xr-x 1 root root 9776 11月 5 08:08 net.eth1

    -rwxr-xr-x 1 root root 512 11月 5 08:08 net.lo

    drwxr-xr-x 2 root root 48 9月 6 13:06 vmware

    要改变所属组,可使用下面命令:

    [root@localhost ~]# chown :users conkyrc.sample

    [root@localhost ~]# ls -l

    总用量 368

    -rwxrwxrwx 1 user users 12172 8月 15 23:18 conkyrc.sample

    drwxr-xr-x 2 root root 48 9月 4 16:32 Desktop

    -r--r--r-- 1 root root 331844 10月 22 21:08 libfreetype.so.6

    drwxr-xr-x 2 root root 48 8月 12 22:25 MyMusic

    -rwxr-xr-x 1 root root 9776 11月 5 08:08 net.eth0

    -rwxr-xr-x 1 root root 9776 11月 5 08:08 net.eth1

    -rwxr-xr-x 1 root root 512 11月 5 08:08 net.lo

    drwxr-xr-x 2 root root 48 9月 6 13:06 vmware

    要修改目录的权限,使用-R参数就可以了,方法和前面一样。

    原文地址 http://hi.baidu.com/skyforum/blog/item/4219b72699f160168a82a1db.html

    Wednesday, January 7, 2009

    Linux 笔记

    linux目录架构
    / 根目录
    /bin 常用的命令 binary file 的目錄
    /boot 存放系统启动时必须读取的档案,包括核心 (kernel) 在内
    /boot/grub/menu.lst GRUB设置
    /boot/vmlinuz 内核
    /boot/initrd 核心解壓縮所需 RAM Disk
    /dev 系统周边设备
    /etc 系统相关设定文件
    /etc/DIR_COLORS 设定颜色
    /etc/HOSTNAME 设定用户的节点名
    /etc/NETWORKING 只有YES标明网络存在
    /etc/host.conf 文件说明用户的系统如何查询节点名
    /etc/hosts 设定用户自已的IP与名字的对应表
    /etc/hosts.allow 设置允许使用inetd的机器使用
    /etc/hosts.deny 设置不允许使用inetd的机器使用
    /etc/hosts.equiv 设置远端机不用密码
    /etc/inetd.conf 设定系统网络守护进程inetd的配置
    /etc/gateways 设定路由器
    /etc/protocols 设定系统支持的协议
    /etc/named.boot 设定本机为名字服务器的配置文件
    /etc/sysconfig/network-scripts/ifcfg-eth0 设置IP
    /etc/resolv.conf 设置DNS
    /etc/X11 X Window的配置文件,xorg.conf 或 XF86Config 這兩個 X Server 的設定檔
    /etc/fstab 记录开机要mount的文件系统
    /etc/inittab 设定系统启动时init进程将把系统设置成什么样的runlevel
    /etc/issue 记录用户登录前显示的信息
    /etc/group 设定用户的组名与相关信息
    /etc/passwd 帐号信息
    /etc/shadow 密码信息
    /etc/sudoers 可以sudo命令的配置文件
    /etc/securetty 设定哪些终端可以让root登录
    /etc/login.defs 所有用户登录时的缺省配置
    /etc/exports 设定NFS系统用的
    /etc/init.d/ 所有服務的預設啟動 script 都是放在這裡的,例如要啟動或者關閉
    /etc/xinetd.d/ 這就是所謂的 super daemon 管理的各項服務的設定檔目錄
    /etc/modprobe.conf 内核模块额外参数设定
    /etc/syslog.conf 日志设置文件
    /home 使用者家目录
    /lib 系统会使用到的函数库
    /lib/modules kernel 的相关模块
    /var/lib/rpm rpm套件安装处
    /lost+found 系統不正常產生錯誤時,會將一些遺失的片段放置於此目錄下
    /mnt 外设的挂载点
    /media 与/mnt类似
    /opt 主机额外安装的软件
    /proc 虚拟目录,是内存的映射
    /proc/version 内核版本
    /proc/sys/kernel 系统内核功能
    /root 系统管理员的家目录
    /sbin 系统管理员才能执行的指令
    /srv 一些服務啟動之後,這些服務所需要取用的資料目錄
    /tmp 一般使用者或者是正在執行的程序暫時放置檔案的地方
    /usr 最大的目录,存许应用程序和文件
    /usr/X11R6: X-Window目录
    /usr/src: Linux源代码
    /usr/include:系统头文件
    /usr/openwin 存放SUN的OpenWin
    /usr/man 在线使用手册
    /usr/bin 使用者可執行的 binary file 的目錄
    /usr/local/bin 使用者可執行的 binary file 的目錄
    /usr/lib 系统会使用到的函数库
    /usr/local/lib 系统会使用到的函数库
    /usr/sbin 系统管理员才能执行的指令
    /usr/local/sbin 系统管理员才能执行的指令
    /var 日志文件
    /var/log/secure 記錄登入系統存取資料的檔案,例如 pop3, ssh, telnet, ftp 等都會記錄在此檔案中
    /var/log/wtmp 記錄登入者的訊息資料, last
    /var/log/messages 幾乎系統發生的錯誤訊息
    /var/log/boot.log 記錄開機或者是一些服務啟動的時候,所顯示的啟動或關閉訊息
    /var/log/maillog 紀錄郵件存取或往來( sendmail 與 pop3 )的使用者記錄
    /var/log/cron 記錄 crontab 這個例行性服務的內容
    /var/log/httpd, /var/log/news, /var/log/mysqld.log, /var/log/samba, /var/log/procmail.log:
    分別是幾個不同的網路服務的記錄檔
    一些常用的基本命令:
    uname -a 查看内核版本
    ls -al 显示所有文件的属性
    pwd 显示当前路径
    cd - 返回上一次目录 cd ~ 返回主目录
    date s 设置时间、日期
    cal 显示日历 cal 2006
    bc 计算器具
    man & info 帮助手册
    locale 显示当前字体 locale -a 所有可用字体 /etc/sysconfig/i18n设置文件
    LANG=en 使用英文字体
    sync 将数据同步写入硬盘
    shutdonw -h now & half & poweroff 关机
    reboot 重启
    startx & init 5 进入图形介面
    /work & ?work 向上、下查找文档内容
    chgrp 改变档案群组 chgrp testing install.log
    chown 改变所属人 chown root:root install.log
    chmod 改变属性 chmod 777 install.log read=4 write=2 execute=1
    cp 复制 cp filename
    rm 删除文件 rm -rf filename 强制删除文件
    rmdir 删除文件夹
    mv 移动 mv 123.txt 222.txt 重命名
    mkdir 创建文件夹
    touch 创建文件 更新当前时间
    cat 由第一行开始显示 cat |more 分页
    nl 在内容前加行号
    more & less 一面一面翻动
    head -n filename 显示第N行内容
    tail -n filename 显示后N行内容
    od 显示非纯文档
    df -h 显示分区空间
    du 显示目录或文件的大小
    fdisk 分区设置 fdisk -l /dev/hda 显示硬盘分区状态
    mkfs 建立各种文件系统 mkfs -t ext3 /dev/ram15
    fsck 检查和修复LINUX档案
    ln 硬链接 ln -s 软件链接
    whereis 查找命令
    locate 查找
    find 查找 find / -name "***.*** "
    which 查看工具
    whoami 显示当前用户
    gcc -v 查看GCC版本
    chattr +i filename 禁止删除 chattr -i filename 取消禁止
    lsattr 显示隐藏档属性
    updatedb 更新资料库
    mke2fs 格式化 mkfs -t ext3
    dd if=/etc/passwd of=/tmp/passwd.bak 备份
    mount 列出系统所有的分区
    mount -t iso9660 /dev/cdrom /mnt/cdrom 挂载光盘
    mount -t vfat /dev/fd0 /mnt/floppy 挂载软盘
    mount -t vfat -o iocharset=utf8,umask=000 /dev/hda2 /mnt/hda2 挂载fat32分区
    mount -t ntfs -o nls=utf8,umask=000 /dev/hda3 /mnt/hda3 挂载ntfs分区
    Linux-NTFS Project: http://linux-ntfs.sourceforge.net/
    umount /mnt/hda3 缷载
    ifconfig 显示或设置网络设备
    service network restart 重启网卡
    ifdown eth0 关闭网卡
    ifup eth0 开启网卡
    clear 清屏
    history 历史记录 !55 执行第55个指令
    stty 设置终端 stty -a
    fdisk /mbr 删除GRUB
    at 僅進行一次的工作排程
    crontab 循環執行的例行性命令 [e]编辑,[l]显示,[r]删除任务
    & 后台运行程序 tar -zxvf 123.tar.gz & ---------> 后台运行
    jobs 观看后台暂停的程序 jobs -l
    fg 将后台程序调到前台 fg n ------> n是数字,可以指定进行那个程序
    bg 让工作在后台运行
    kill 结束进程 kill -9 PID [9]强制结束,[15]正常结束,[l]列出可用的kill信号
    ps aux 查看后台程序
    top 查看后台程序 top -d 2 每两秒更新一次 top -d 2 -p10604 观看某个PID
    top -b -n 2 > /tmp/top.txt -----> 將 top 的資訊進行 2 次,然後將結果輸出到 /tmp/top.txt
    pstree 以树状图显示程序 [A]以 ASCII 來連接, [u]列出PID, [p]列出帐号
    killall 要刪除某個服務 killall -9 httpd
    free 显示内存状态 free -m --------> 以M为单位显示
    uptime 显示目前系统开机时间
    netstat 显示网络状态 netstat -tulnp------> 找出目前系統上已在監聽的網路連線及其 PID
    dmesg 显示开机信息 demsg | more
    nice 设置优先权 nice -n -5 vi & -----> 用 root 給一個 nice 植為 -5 ,用於執行 vi
    renice 调整已存在优先权
    runlevel 显示目前的runlevel
    depmod 分析可载入模块的相依性
    lsmod 显示已载入系统的模块
    modinfo 显示kernel模块的信息
    insmod 载入模块
    modprobe 自动处理可载入模块
    rmmod 删除模块
    chkconfig 检查,设置系统的各种服务 chkconfig --list -----> 列出各项服务状态
    ntsysv 设置系统的各种服务
    cpio 备份文件
    压缩命令:
    *.Z compress 程式壓縮的檔案;
    *.bz2 bzip2 程式壓縮的檔案;
    *.gz gzip 程式壓縮的檔案;
    *.tar tar 程式打包的資料,並沒有壓縮過;
    *.tar.gz tar 程式打包的檔案,其中並且經過 gzip 的壓縮
    compress filename 压缩文件 加[-d]解压 uncompress
    gzip filename 压缩 加[-d]解压 zcat 123.gz 查看压缩文件内容
    bzip2 -z filename 压缩 加[-d]解压 bzcat filename.bz2 查看压缩文件内容
    tar -cvf /home/123.tar /etc 打包,不压缩
    tar -xvf 123.tar 解开包
    tar -zxvf /home/123.tar.gz 以gzip解压
    tar -jxvf /home/123.tar.bz2 以bzip2解压
    tar -ztvf /tmp/etc.tar.gz 查看tar内容
    cpio -covB > [file|device] 份份
    cpio -icduv < [file|device] 还原

    vi一般用法
    一般模式 编辑模式 指令模式
    h 左 a,i,r,o,A,I,R,O :w 保存
    j 下 进入编辑模式 :w! 强制保存
    k 上 dd 删除光标当前行 :q! 不保存离开
    l 右 ndd 删除n行 :wq! 保存后离开
    0 移动到行首 yy 复制当前行 :e! 还原原始档
    $ 移动到行尾 nyy 复制n行 :w filename 另存为
    H 屏幕最上 p,P 粘贴 :set nu 设置行号
    M 屏幕中央 u 撤消 :set nonu 取消行号
    L 屏幕最下 [Ctrl]+r 重做上一个动作 ZZ 保存离开
    G 档案最后一行 [ctrl]+z 暂停退出 :set nohlsearch 永久地关闭高亮显示
    /work 向下搜索 :sp 同时打开两个文档
    ?work 向上搜索 [Ctrl]+w 两个文档设换
    gg 移动到档案第一行 :nohlsearch 暂时关闭高亮显示

    认识SHELL
    alias 显示当前所有的命令别名 alias lm= "ls -al " 命令别名 unalias lm 取消命令别名
    type 类似which
    exprot 设置或显示环境变量
    exprot PATH= "$PATH ":/sbin 添加/sbin入PATH路径
    echo $PATH 显示PATH路径
    bash 进入子程序
    name=yang 设定变量
    unset name 取消变量
    echo $name 显示变量的内容
    myname= "$name its me " & myname= '$name its me ' 单引号时$name失去变量内容
    ciw=/etc/sysconfig/network-scripts/ 设置路径
    env 列出所有环境变量
    echo $RANDOM 显示随意产生的数
    set 设置SHELL
    PS1= '[\u@\h \w \A #\#]\$ ' 提示字元的設定
    [root@linux ~]# read [-pt] variable -----------读取键盘输入的变量
    參數:
    -p :後面可以接提示字元!
    -t :後面可以接等待的『秒數!』
    declare 声明 shell 变量
    ulimit -a 显示所有限制资料
    ls /tmp/yang && echo "exist " || echo "not exist "
    意思是說,當 ls /tmp/yang 執行後,若正確,就執行echo "exist " ,若有問題,就執行echo "not exist "
    echo $PATH | cut -d ': ' -f 5 以:为分隔符,读取第5段内容
    export | cut -c 10-20 读取第10到20个字节的内容
    last | grep 'root ' 搜索有root的一行,加[-v]反向搜索
    cat /etc/passwd | sort 排序显示
    cat /etc/passwd | wc 显示『行、字数、字节数』
    正规表示法
    [root@test root]# grep [-acinv] '搜尋字串 ' filename
    參數說明:
    -a :將 binary 檔案以 text 檔案的方式搜尋資料
    -c :計算找到 '搜尋字串 ' 的次數
    -i :忽略大小寫的不同,所以大小寫視為相同
    -n :順便輸出行號
    -v :反向選擇,亦即顯示出沒有 '搜尋字串 ' 內容的那一行!
    grep -n 'the ' 123.txt 搜索the字符 -----------搜尋特定字串
    grep -n 't[ea]st ' 123.txt 搜索test或taste两个字符---------利用 [] 來搜尋集合字元
    grep -n '[^g]oo ' 123.txt 搜索前面不为g的oo-----------向選擇 [^]
    grep -n '[0-9] ' 123.txt 搜索有0-9的数字
    grep -n '^the ' 123.txt 搜索以the为行首-----------行首搜索^
    grep -n '^[^a-zA-Z] ' 123.txt 搜索不以英文字母开头
    grep -n '[a-z]$ ' 123.txt 搜索以a-z结尾的行---------- 行尾搜索$
    grep -n 'g..d ' 123.txt 搜索开头g结尾d字符----------任意一個字元 .
    grep -n 'ooo* ' 123.txt 搜索至少有两个oo的字符---------重複字元 *
    sed 文本流编辑器 利用脚本命令来处理文本文件
    awd 模式扫描和处理语言
    nl 123.txt | sed '2,5d ' 删除第二到第五行的内容
    diff 比较文件的差异
    cmp 比较两个文件是否有差异
    patch 修补文件
    pr 要打印的文件格式化
    帐号管理
    /etc/passwd 系统帐号信息
    /etc/shadow 帐号密码信息 经MD5 32位加密
    在密码栏前面加『 * 』『 ! 』禁止使用某帐号
    /etc/group 系统群组信息
    /etc/gshadow
    newgrp 改变登陆组
    useradd & adduser 建立新用户 ---------> useradd -m test 自动建立用户的登入目录
    useradd -m -g pgroup test ---------> 指定所属级
    /etc/default/useradd 相关设定
    /etc/login.defs UID/GID 有關的設定
    passwd 更改密码 -----------> passwd test
    usermod 修改用户帐号
    userdel 删除帐号 -----------> userdel -r test
    chsh 更换登陆系统时使用的SHELL [-l]显示可用的SHELL;[-s]修改自己的SHELL
    chfn 改变finger指令显示的信息
    finger 查找并显示用户信息
    id 显示用户的ID -----------> id test
    groupadd 添加组
    groupmod 与usermod类似
    groupdel 删除组
    su test 更改用户 su - 进入root,且使用root的环境变量
    sudo 以其他身份来执行指令
    visudo 编辑/etc/sudoers 加入一行『 test ALL=(ALL) ALL 』
    %wheel ALL = (ALL) ALL 系统里所有wheel群组的用户都可用sudo
    %wheel ALL = (ALL) NOPASSWD: ALL wheel群组所有用户都不用密码NOPASSWD
    User_Alias ADMPW = vbird, dmtsai, vbird1, vbird3 加入ADMPW组
    ADMPW ALL = NOPASSWD: !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, \
    !/usr/bin/passwd root 可以更改使用者密码,但不能更改root密码 (在指令前面加入 ! 代表不可)
    PAM (Pluggable Authentication Modules, 嵌入式模組)
    who & w 看谁在线
    last 最近登陆主机的信息
    lastlog 最近登入的時間 读取 /var/log/lastlog
    talk 与其他用户交谈
    write 发送信息 write test [ctrl]+d 发送
    mesg 设置终端机的写入权限 mesg n 禁止接收 mesg y
    wall 向所有用户发送信息 wall this is q test
    mail 写mail
    /etc/default/useradd 家目录默认设置
    quota 显示磁盘已使用的空间与限制 quota -guvs -----> 秀出目前 root 自己的 quota 限制值
    quota -vu 查询
    quotacheck 检查磁盘的使用空间与限制 quotacheck -avug -----> 將所有的在 /etc/mtab 內,含有 quota 支援的 partition 進行掃瞄
    [-m] 强制扫描
    quota一定要是独立的分区,要有quota.user和quota.group两件文件,在/etc/fstab添加一句:
    /dev/hda3 /home ext3 defaults,usrquota,grpquota 1 2
    chmod 600 quota* 设置完成,重启生效
    edquota 编辑用户或群组的quota [u]用户,[g]群组,[p]复制,[t]设置宽限期限
    edquota -a yang edquota -p yang -u young -----> 复制
    quotaon 开启磁盘空间限制 quotaon -auvg --------> 啟動所有的具有 quota 的 filesystem
    quotaoff 关闭磁盘空间限制 quotaoff -a --------> 關閉了 quota 的限制
    repquota -av 查閱系統內所有的具有 quota 的 filesystem 的限值狀態
    Quota 從開始準備 filesystem 的支援到整個設定結束的主要的步驟大概是:
    1、設定 partition 的 filesystem 支援 quota 參數:
    由於 quota 必須要讓 partition 上面的 filesystem 支援才行,一般來說, 支援度最好的是 ext2/ext3 ,
    其他的 filesystem 類型鳥哥我是沒有試過啦! 啟動 filesystem 支援 quota 最簡單就是編輯 /etc/fstab ,
    使得準備要開放的 quota 磁碟可以支援 quota 囉;
    2、建立 quota 記錄檔:
    剛剛前面講過,整個 quota 進行磁碟限制值記錄的檔案是 aquota.user/aquota.group,
    要建立這兩個檔案就必須要先利用 quotacheck 掃瞄才行喔!
    3、編輯 quota 限制值資料:
    再來就是使用 edquota 來編輯每個使用者或群組的可使用空間囉;
    4、重新掃瞄與啟動 quota :
    設定好 quota 之後,建議可以再進行一次 quotacheck ,然後再以 quotaon 來啟動吧!

    开机流程简介
    1、載入 BIOS 的硬體資訊,並取得第一個開機裝置的代號;
    2、讀取第一個開機裝置的 MBR 的 boot Loader (亦即是 lilo, grub, spfdisk 等等) 的開機資訊;
    3、載入 Kernel 作業系統核心資訊, Kernel 開始解壓縮,並且嘗試驅動所有硬體裝置;
    4、Kernel 執行 init 程式並取得 run-level 資訊;
    5、init 執行 /etc/rc.d/rc.sysinit 檔案;
    6、啟動核心的外掛模組 (/etc/modprobe.conf);
    7、init 執行 run-level 的各個批次檔( Scripts );
    8、init 執行 /etc/rc.d/rc.local 檔案;
    9、執行 /bin/login 程式,並等待使用者登入;
    10、登入之後開始以 Shell 控管主機。
    在/etc/rc.d/rc3.d內,以S开头的为开机启动,以K开头的为关闭,接着的数字代表执行顺序
    GRUB vga设定
    彩度\解析度 640x480 800x600 1024x768 1280x1024 bit
    256 769 771 773 775 8 bit
    32768 784 787 790 793 15 bit
    65536 785 788 791 794 16 bit
    16.8M 786 789 792 795 32 bit

    ./configure 检查系统信息 ./configure --help | more 帮助信息
    make clean 清除之前留下的文件
    make 编译
    make install 安装
    rpm -q -----> 查询是否安装 rpm -ql ------> 查询该套件所有的目录
    rpm -qi -----> 查询套件的说明资料 rpm -qc[d] -----> 设定档与说明档
    rpm -ivh ----> 安装 rpm -V --------> 查看套件有否更动过
    rpm -e ------> 删除 rpm -Uvh -------> 升级安装
    --nodeps -----> 强行安装 --test -----> 测试安装


    转http://blog.chinaunix.net/u/30619/showart.php?id=249558