shell 学习小记:

注意:多看系统脚本  多模仿   

su切换用户时需要输入目标用户密码,root(superuser)切换到任何用户都不需要输入密码,- 参数必须要是最后一个(su huhu -)
sudo需要输入当前用户密码,拥有sudo特权的用户可以执行 "sudo su -"命令,使用自己的密码切换到root用户 ,
所以应该在/etc/sudoers 文件中禁止 sudo 执行su命令

linux文件与颜色: /etc/DIR_COLORS   (命令dircolors,  man dir_colors)
suid: 需要提供给普通用户,但又需要root权限才能正确执行的命令基本都有suid权限(e.g passwd 、mount、su)
SBIT权限(t):仅对目录有效,若自己在该目录下创建了文件,则只有root与自己可以删除(/tmp目录权限) 


-------
linux中不用的内存会被缓存起来,所以总内存是“free” +“buffer” 之和
---------

~:代表家目录
-:代表上一个工作目录

搜索命令(5个):
1、whereis : 不是在磁盘中漫无目的找,而是在数据库(/var/lib/mlocate)中找,且只可以查找可执行文件、联机帮助及源码文件
    该数据库是系统自动创建的包含了本地的所有文件信息,并且每天执行updatedb命令进行更新,因此导致有时候查询不准,
    若想准确,可以在查找之前执行下updatedb,但不建议这样干。
2、locate:也是用mlocate数据库,但其算法复杂,匹配路径或者文件名中出现的目标:
    locate ls ——匹配非常之多
    locate -b "\ls" 
    注:locate与whereis机制相同,为了速度就损失了精确度
3、which:
    他只在$PATH环境变量定义的路径下查找可执行文件的位置;一般用于确认系统中是否安装了某款软件,如gcc
4、type:
    判断一条命令是否是系统内置的,若是非内置的,若使用了-p选项,则相当于which命令
5、find
    他呢无所不及,就是效率差,他是从磁盘中查找,可以设置非常精确的查询条件,他可以规范对找到的文件做啥操作
    find / -mtime -1 -exec ls -l {} \;   
    {}是占位符,他会不断被替换成被找到的文件
    ;:是exec的结束标志,但;在bash中有特殊含义,所以需要转义

打包压缩tar:
压缩比小到大: gzfilename
    解包: cpio -idc    >> <  << 等: < 表示经其右边的内容重定向到键盘输入
 流式处理:find /root   | cpio -ocB | gzip -9 > /tmp/boot.img   (三个命令同时运行,体现了多任务)
 
 前后台任务(jobs\fg\bg):
 将一个前台任务变为后天任务: ctrl+z    ;命令后加与符号(&)
 停止后台任务: kill -9  %任务号 :  kill后传递的是进程id,但这与任务号有冲突,所以加%
 linux下的任务是与操作者的终端相关联的,只要你退出了终端,所有与该终端相关的任务(jobs)都会停止,
 此时若想终端关闭而任务依旧需要利用nohup命令(nohup 命令  & ,任务输出到了nohup.out)
 
 计划任务(at\crontab ):注意命令尽量使用全路径
  一次性计划创建任务:  at 10:00 tomorrow  ,回车,输入需执行命令:echo "helloworld" ,ctrl + d 保存
                                                (linux中ctrl+d 表示EOF,说明输入完毕)
 周期性计划任务: crontab(5部分):
                分钟  小时  日  月  周 [用户名] 命令
计划任务并不是任何人都可以添加,他有四个黑白名单决定:
at.allow at.deny   cron.allow  cron.deny

守护进程:stand alone与xinetd

ps aux :查看系统所有进程信息
ps ux:查看当前用户进程信息
ps -l :查看与当前终端关联的进程
源码安装:
make clean (distclean)\configure\make\make install
软件包管理工具(君子善假于物):rpm  d
安装():
   rpm -ivh pkg (rpm安装环境一定要与打包时的环境一致才可以,如果两者不同则需要SRPM) |  dpkg -i  deb-pkg
查询:
    rpm -qa ,rmp -ql XXX(查询该软件向系统写入的文件列表)
    dpkg -l , dpk --listfiles
卸载:
 rpm -e  XX  | dpkg -e XX
 
线上升级工具: apt(advance packaging tool) 、yum(yellowdog updater modified)——python写的,所以升级时注意,否则yum可能不可用

linux文件系统格式:
extN(n=2、3、4)是基于iNode的文件系统,一个iNode数据结构(存储属性及权限)代表一个文件,数据则在data block,二者都有唯一编号
iNode会记录data block的引用,从而可以找到文件任意一段数据。(索引式文件系统)
而Fat32则是data block之间的引用,加载当前块,才可以知道后续块位置(ext则可以一次知道所有位置,然后安排合理的读取顺序)

linux磁盘管理
磁盘操作:du\df\dd\fsck\mount
每一块磁盘分区都是文件系统的一个具体实例(类与对象关系) ,/etc/fstab :决定分区的连接

逻辑卷:可以弹性的调整文件系统的容量,即在磁盘分区与文件系统之间增加的逻辑层
linux 卷、逻辑卷(容量可以任意缩放)、物理卷、卷组、物理扩展区(每个PV都会以PE为基本单位进行划分)
物理卷加入卷组中,创建逻辑卷相当于对卷组这个大磁盘进行分区
LVM三部曲pv、vg、lv,LVM使用步骤:
1、在物理分区(PP)上创建物理卷(PV)
    pvcreate /dev/sda1   //将传统分区变为LVM中的物理卷
2、在创建卷组(VG)
    vgcreate vg /dev/sda1   //将(1)中创建的物理卷加入卷组vg来完成卷组的创建
3、从 VG 中分配空间,创建逻辑卷(LV)
    lvcreate -L 20G -n data vg //从卷组vg中创建大小为20G,名称为data的逻辑卷分区
4、格式化新创建的LV为某种文件系统类型
    mke2fs -j /dev/vg/data     //将LV格式化为ext2文件系统类型
5、挂载LV
    mount -t reiserfs /dev/vg/data /mnt/

》》》》》》》》》》》》》》》》》》》》》》》》》》》》
shell :
注意:自由login shell才会读取系统的设置文件/etc/profile,每个用户登陆取得bash后一定会读取/etc/profile
     /etc/profile还会调用:
     /etc/inputrc :设置bash的热键
     /etc/profile.d/*.sh : bash操作界面、语义、公共的命令别名
     /etc/sysconfig/i18n 
登陆shell会首先读取系统环境设置文件:/etc/profile ,之后会读取个人配置文件,
个人配置文件主要是几个隐藏文件:~/.bash_profile ,/.bash_login,~/.profile,此三个文件可能不会同时存在,
会按从左到右顺序,找到一个后其他的就忽略,如果~/.bashrc存在,则~/.bash_profile还会调用该文件。
用户目录下还有俩个个人配置文件:~/.bash_history 、~/.bash_logout

文件内容查看: cat、more、less、head、tail

“cut -d' ' -f1 ~/.bash_history|sort -d|uniq -c|sort -nr|head”  :统计最常用的10条命令及其使用次数

==========================
1、注意shell的执行权限问题及逻辑依赖关系
 e.g  清除linux系统日志 /var/log/messages   ( 高版本的linux可能没有开放该文件)
    cd /var/log/
    cat /dev/null > /var/log/messages
    echo "logs cleaned up"
  该脚本存在很多问题:
   1、如果不是root,该shell就执行不了,但是该shell没有提示,不友好
   2、语句之间缺少逻辑:万一cd /var/log 失败,后面的就不应该开干啊
    logfile=/var/log
    rootuid=0
    if [ $uid -ne $rootuid ];
    then
        echo 'must be root to run this script'
        exit 1
    fi
    cd $logfile || {
        echo 'cant not change to the target directory' >&2
        exit 1
    }
    cat /dev/null > messages && echo 'logs cleand up'
    
    注意:这里大括号使用,一般如果if判断只有有多条语句可以考虑使用大括号,相当于if else
    
 2、清空日志方法3种方式:
    echo "" > test.log   || echo > test.log
    >test.log
    cat /dev/null > test.log
 3、shell脚本执行方式(推荐指定shell解释器方式)
    A、bash script-name 或  sh script-name(推荐使用)  ---- 当脚本本身没有可执行权限时
    B、path/script-name  或者 ./script-name(当前路径下执行脚本)  -- 脚本本身必须具备可执行权限
    C、source script-name 或 . script-name    ---- 
           此种方式执行后会将子shell中定义的变量传回到父shell
         (在一个shell中加载另外的shell,并想使用被加载的shell中的变量,后者export 子shell变量)
4、shell中中括号[]两边是要有空格的
5、shell变量
    全局变量(环境变量):可在其创建的shell及该shell派生的shell中使用。(在用户家目录.bash_profile文件或者全局/etc/profile文件)
                    环境变量在应用于用户进程之前需要利用 export 导出
        定义方法:
           export var_name=var_value
           var_name=var_value ;export var_name;
           declare -x var_name=var_value
    局部变量
    
6、单引号、双引号、反引号
    单引号里面的变量不会做解析,单引号里是啥就输出啥;
    双引号里的变量引用会做变量解析后输出,适合字符串中有变量的情况,但akw中正好相反
    习惯:数字不加引号,其他默认一般加双引号
  将命令定义为变量: uname=`pwd`   或者   uname=$( date +%F)
  变量引用: $变量名 或者  ${变量名}  或者  "$变量名" 或者  "${变量名}"
  
8、位置变量
    $0 : 当前脚本文件名,当执行的脚本时使用的是全路径时,则$0包含路径
            拆分路径与名字:dirname $0 ——路径   ; basename $0——获取名字
    $n : 获取传递给当前shell脚本的第n个参数  : n=1...9,如n大于9则需要用大括号: ${10}
    $* : 获取所有参数,将所有参数作为单个字符串
    $# :命令行参数个数
    $@ :将命令行每个参数视为独立的单个字符串
9、进程状态变量;
    $? : 取上一个命令执行结果——  0 :正确 ; 非零:错误
    $$ : 取当前shell进程号
10、read函数:
    read –d madfds value,读到有m的字符的时候就不在继续向后读,例如输入为 hello m,有效值为“hello”,请注意m前面的空格等会被删除。这种方式可以输入多个字符串,例如定义“.”作为结符号等等。
11、IFS:
     Shell 脚本中有个变量叫 IFS(Internal Field Seprator) ,内部域分隔符。完整定义是The shell uses the value stored in IFS, which is the space, tab, and newline characters by default,to delimit words for the read and set commands。
      Shell 的环境变量分为 set, env 两种,其中 set 变量可以通过 export 工具导入到 env 变量中。其中,set 是显示设置shell变量,仅在本 shell 中有效;env 是显示设置用户环境变量 ,仅在当前会话中有效。换句话说,set 变量里包含了 env 变量,但 set 变量不一定都是 env 变量。这两种变量不同之处在于变量的作用域不同。显然,env 变量的作用域要大些,它可以在 subshell 中使用。而 IFS 是一种 set 变量,当 shell 处理"命令替换"和"参数替换"时,shell 根据 IFS 的值,默认是 space, tab, newline 来拆解读入的变量,然后对特殊字符进行处理,最后重新组合赋值给该变量。
      
12、介绍下Shell中的${}、##和%%使用范例:
    注意:正则表达式的贪婪与非贪婪匹配

    ${#VALUE}:计算VALUE字符串的字符数量。
    ${VALUE%.*}或${VALUE%%.*}:删除VALUE字符串中以分隔符“.”匹配的右边字符,保留左边字符。
    ${VALUE#*.}或${VALUE##*.}:删除VALUE字符串中以分隔符“.”匹配的左边字符,保留右边字符。
    ${VALUE/OLD/NEW}或${VALUE//OLD/NEW}:用NEW子串替换VALUE字符串中匹配的OLD子串。
    补充:“*”表示通配符,用于匹配字符串将被删除的字串。“.”表示字符串中分隔符,可以为任意一个或多个字符。“%”表示从右向左匹配,“#”表示从左向右匹配,“\”表示替换,都属于非贪婪匹配,即匹配符合通配符的最短结果。与“%”、“#”和“/”类似的有“%%”、“##”和“//”,都属于贪婪匹配,即匹配符合通配符的最长结果。
    ${VALUE:OFFSET}或${VALUE:OFFSET:LENGTH}:从VALUE字符串的左边开始中截取子串。
    ${VALUE:0-OFFSET}或${VALUE:0-OFFSET:LENGTH}:从VALUE字符串的右边开始中截取子串。
    
    可以用${ }分别替换得到不同的值:
    ${file#*/}:删掉第一个/ 及其左边的字符串:dir1/dir2/dir3/my.file.txt
    ${file##*/}:删掉最后一个/ 及其左边的字符串:my.file.txt
    ${file#*.}:删掉第一个. 及其左边的字符串:file.txt
    ${file##*.}:删掉最后一个. 及其左边的字符串:txt
    ${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
    ${file%%/*}:删掉第一个/ 及其右边的字符串:(空值)
    ${file%.*}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
    ${file%%.*}:删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
13、Here Document
    Here document以 << 开头,后面接上一个字符串,这个字符串还必须出现在here document的末尾
    cmd << delimiter
    Here Document Content
    delimiter(结束符要顶格写)
    它的作用就是将两个 delimiter 之间的内容(Here Document Content 部分) 传递给cmd 作为输入参数。

14、shell基本规范
        a、头行写shell解释器,接着几行加时间、作者、联系方式、版本等信息,这些信息可以在~/.vimrc中模板化
        b、书写时成对的符号先写完(括号,引号),防止遗漏(如[]两边有空格)
        c、流程语句的格式一次完成(if、for、case、while等)
15、shell常用内部命令:
    echo、eval、exec、export、readonly、read、shift、wait、exit、点(.)    
16、变量子串的常用操作:
    %: 从后面开始    # :从前面开始
    ${#string}  —— 返回$string的长度
    ${string:position} ——从position位置开始截取子串(position为偏移量)
    ${string:position:length} ——截取指定长度的串
    ${string#substring}  ——从string开始删除最短匹配substing
    ${string/substring/replace}——使用$replace替换第一个匹配的$substring
    ${string/#substring/replace}——如果string的前缀匹配substring,则用replace替换
    ${string%substring}  ——从string结尾开始删除最短匹配substing
变量替换:
    ${vlaue:-word}   ——变量未定义(不存在或为null),则返回默认值
    ${value:=word}    |  ${value:?"not defined"} | ${value:+word}

17、产生序列:
      “seq -s"," 100”   —— 以逗号为分割,从1打印到100
18、计算变量长度方法:
      ${#string} 或  echo ${string} | wc -m   或  echo $(expr length "$string")
    验证时间(第一种效率最好):
      time for i in (seq 11111);do count=${#chars};done;  
 bash对变量的处理可以通过man bash来查看(看一手资料)
 19、变量的数值计算
     (())——常用,效率高、let、expr、bc——支持浮点运算、$[]
     e.g :   ((a=1+2**3));echo $a   或  a=$((1+2**3))  或 echo $((1+2**3))
           判断:  echo $((3>2))  ——》输出1
     bc是unix下的计算器,在命令行可以直接敲bc进到bc环境做运算,bc常用做法是拼接字符串表达式然后管道给bc;进制转换
     “seq -s"+" 10 | bc”  ——计算1——10的和
     echo "scale=2;5.23/3.21"|bc
20、shell变量的输入
    read [param] [var] 
    常用: -p :设置提示信息 ,-t 设置超时时间(秒)
21、条件测试:
    test <测试表达式>  或 [测试表达式]或[[测试表达式]]
    test -f align.sh.swp && echo 1 || echo 0
    test ! -f align.sh.swp && echo 1 || echo 0  (非)
    双中括号中间支持&& ||操作
    [[ -f file && -d folder ]] && echo 1 || echo 0   : 单中括号实现同样功能需要跟 -a参数
    [ -f file -a -d folder ] && echo 1 || echo 0  (-a、-o、!)
    文件测试操作符:
    -f  文件: 文件存在且为普通文件则真
    -d 文件:文件存在且为目录则真
    -s  文件 : 文件存在且不为空(文件大小不为零)
    -e :文件存在则为真
    -r:文件存在且可读则真
    -w:文件存在且可写则真
    -x:文件存在且可执行则真
    f1 -nt f2 :若文件f1比文件f2新则真
    f1 -ot f2 :若文件f1比f2旧则真
    字符串测试操作符:
    `=` 单等于号与双等于号功能相同`==`  : 比较字符串是否相等(对于$a这样变量比较,最好用双引号括起来)
    -z 字符串 :  字符串长度为零则真
    -n 字符串:字符串长度不为零则真
    整数二元比较操作: 
    在单中括号中(这些操作符不需转义):-ne、-eq、-gt、-lt、-ge    、-le
    在双中括号中可以使用:==、> 、< 、!= 、<= (如果在单中括号中使用则需转义)
    逻辑运算:-a、-o、 !
22、判断字符串是否是数字
    方法1、sed正则表达式
    方法2、变量子串替换加正则表达式
23、监控mysql服务
    1、根据mysql端口(假设默认端口3306)(思路不好,有可能取不到,导致脚本后很多容易bug)
        netstat -lnt|grep 3306 | awk -F '[ :]' '{print $5}'
        或
       利用wc命令统计(将端口或进程转成数字然后进行判断)
        netstat -lnt|grep 3306 | wc -l     
    2、MySql进程及端口同时存在则认为mysql服务正常
        ps -ef | grep mysqld | grep -v grep | wc -l        (-v grep 排除grep自己)    
        中间启动后,可能需要暂停几十秒(sleep 10) ,在继续判断mysql是否启动成功
        有时候杀进程失败,为了方便可以在while中不断杀进程(killall mysqld),killall杀死同一进程组内的所有进程
    3、利用mysql命令连接mysql,并做相关语句操作以确认mysql确实在运行(判断上述语句是否执行成功):
        mysql -uroot -p'P@ssw0rd' -S  /home/data/3306/mysql.sock  -e "select version();" >/dev/null
    4、利用编程语言写程序连接判断
24、case语句:
     范围中括号:[1-9]  ;  选择或:“|”  ——例如不区分大小写(red|RED)
25、数组
    定义: 利用小括号做边界,元素之间使用空格隔开: array=(1 2 3)
    数组长度:echo ${#array[@]}  | echo ${#array[*]}  (类似字符串长度取法:a=123  len=${#a})
    打印整个数组(去掉#) : echo ${array[*]}
    删除元素: unset 数组[下标],不带下标则删除整个数组
    截取:类似之前的变量截取操作(数组也是一种变量)操作
26、shell调试
    a、dos2unix 处理脚本(存在一个相对的unix2dos) 
        (在windows下写的脚本到linux下后存在编码问题)(此问题可以通过vi脚本来设置脚本的ff属性)
    b、利用echo调试,echo需要调试内容。然后exit 退出脚本,循环往复
    c、使用bash命令参数:sh [-nvx] XX.sh   (-n:做语法检查而不执行;常用是-x参数) (此种方式调试作用域是整个脚本)
        利用set (+)-x 限制需要调试的代码的范围,在set-x 与set +x之间的代码才会被调试
27、shell开发环境配置调优
    .vimrc 文件: 

28、linux系统信号处理
    a、不希望脚本执行时被打断(如 ctrl + c 终止脚本),利用 kill -l(或trap -l)查看系统信号(在signal.h 头文件中)
        信号在之前linux中使用数字表示,但后续新的脚本使用信号名字,使用信号名字时需要省略SIG前缀
    b、trap命令: 表示在接收到信号后的操作
29、日志与ReiserFS
        
    文件系统是项目,类型(ext2、3等)是方案,驱动程序是执行人
    
    fsck :确保文件系统的驱动程序要用的元数据是干净的——是文件系统驱动程序的保姆。
        工作原理:在linux每次启动时,还没有挂接任何文件系统的时候,都会启动fsck扫描下/etc/fstab 中列出的所有本地文件系统;系统关闭时需要做清理工作。
    日志:(韩局长的日记)文件系统的日志记录了他对元数据都干了些什么,fsck对日志放行。
        元数据出现问题后,fsck遇到有日志的文件系统就放行,接下来由文件系统驱动负责按照日志里面的记载去恢复元数据。
        
    ReiserFS :
        1、小文件性能 : 对于小文件而言应该采用数据库或者其他方式存储,对文件系统而言可能存储性能极地(文件太小了)
            Reiserfs在处理小于1k的文件的速率比ext2快8到15倍(将文件信息与索引信息存储在一块)
        2、ReiserFS :
               采用 B*树结构来组织元数据;Reiserfs不适用固定大小的数据块来分配存储空间,采用精确分配(不会浪费磁盘空间)。
            (基于内存介质的二分查找算法中红黑树是最稳定的,而基于磁盘介质的查找算法就是B树——多叉平衡查找树)
        
30、进程文件系统procfs
    他是一个伪文件系统(启动时动态生成的),通常被挂接到/proc 目录
    
    手工释放内存(伪解决内存泄漏):
        a、使用free查看内存   b、执行sync命令(将所有未写的系统缓存写到磁盘)  c、echo 3 > /proc/sys/vm/drop_caches
    
31、tmpfs
        类似ramdisk,他使用虚拟内存,一个简单的mount命令就可以创建tmpfs,是按需分配,动态的增减,可能hi耗尽虚拟内存。
        
32、网络与路由
    ifconfig 输出信息
    UP BROADCAST RUNNING MULTICAST 该行表示: 
        up - 该接口是开放的(down则表示该接口是关闭的),可以为主机发送接收数据
        BROADCAST : 该接口支持广播地址
        MULTICAST : 支持多路传送地址
        RUNNING : 该接口已被系统识别
    RX、TX : 表示该网卡从启动到目前的封包的收发情况,RX是收,TX是发
    
    虚拟网络接口:在网络接口后面加冒号及数字,可以看做该网络接口的别名。如 :eth0:1 、eth0:2 
        ifconfig eth0:1 192.168.19.126 netmask 255.255.255.0 
    
    采用虚拟网络接口配置的ip并没有与该台计算机绑定,换句话说就是不同计算机上的虚拟网络接口可以配置相同的ip地址;
    这时候的ip有一个专用的名字叫 VIP-虚拟ip。
   
    路由:是不同网络进行通信的信使,是桥梁;route命令用于查询和设置路由表
        查看本机路由表: route -n ,其输出信息中各个字段含义:
            Destination与Genmask :二者共同组合成一个完整的子网
            Gateway :定义从哪个gateway连接出去,如果是0.0.0.0则表示该路由是直接由本机传送,如果显示为其他IP,则
                        表示必须要该ip帮忙才可以传送出去
            Flags : 可能的值为  U-route is up :路由是启动的 
                                 H- target is a host : 目标是一台主机而不是一个网域
                                 G - use gateway :需要通过外部的主机(gateway)来通信
                                 !- reject route :该条路由不被接受,用于阻挡不安全的网域
            metrix : 路由的跃点数,数字越低优先级越高
            use : 该路由被使用的次数,可以粗略估计通往指定网络的网络流量
            iface : 数据传送出去的硬件接口
            
        可以使用traceroute 来跟踪发往目标主机的路由路径。
        增加路由:route add -net 192.168.19.126 netmask 255.255.255.0 dev eth0
        
    DNS两把刀:    host与nslookup
        查看主机名字: hostname
        设置主机名字:/etc/sysconfig/network 文件
        DNS配置文件: /etc/resolv.conf
        host文件: /etc/hosts 该文件是主机名静态查询表
    Tcpdump :抓包工具
        例如:监控apache 80端口的数据包 (将数据保存为.pcap方便利用图形界面工具分析(wireshark之类))
            tcpdump tcp port 80 -s 0 -w http.pcap
            
    netfilter/iptables - ip包过滤系统:
        netfilter是内核模块的实现,iptables是上层的操作工具。
        netfilter由一些信息包过滤表组成,每个表由若干链组成,而每条链中可以有多条规则。
        iptables通过socket接口对netfilter进行操作,
VFS : 虚拟文件交换系统
MMAP : linux进行虚拟内存管理的核心机制,虚拟内存是cpu的硬件特性,是开发多任务os的关键
select/EPOOL : 
UDEV :
LVS : lvs与nginx及haproxy不同,他是在linux内核中实现的,工作在传输层(仅仅做分发,所以没有流量产生)是linux专享的负载均衡系统,
        LVS只是一个约定俗成的名字而已,在内核中有一个工专业名字 IP Virtual Server ,简称IPVS,
        源代码在net/netfilter/ipvs 目录下,lvs就是IPVS,以至于用于配置管理lvs的软件叫ivpsadm 。
     lvs的包转发策略:nat、ip隧道和直接路由。
     ***就是利用IP隧道实现的(对于tcp而言,只要客户端请求的ip地址和应答的ip地址一致,就可以建立一个连接)
     IP隧道技术: 是一种将ip报文封装在另一个ip报文的技术,所以该技术也称为IP封装技术。只不过×××的IP隧道是静态的,两端的ip是固定的。
     但在lvs中却不能这样,因为需要将报文发送给一群RS(real server),所以采用动态,选中一个rs就建立一个隧道,
     并且,RS的VIP与LB所使用的ip一致,这样lb的应答与rs的应答就没有啥区别,客户端看到的是一样的ip。
     
X-Window:
    c/s 结构,他不是一个直接的图形操作环境,是作为图形环境与内核之间交流的桥梁,任何厂商都可以在x window的基础上开发出GUI。
    他从逻辑上分为3层:
            x server(最底层的服务器)、
            x client(处在最外层,负责与用户直接交互,如KDE、GONME等)
            x 协议 : x通信协议
    linux厂商都是用相同的x window,但由于客户端不同,所以各大厂商发行的linux的GUI看起来各不相同。
    x window支持本地和远程两种模式(x server是否与x client在同一台机器)
    x client与具体的硬件无关,不关心什么显示器、键盘之类的,这些都交给x server。
    xorg基金会
    GTK+ 与QT 做图形开发
视频 :
    音频: amarok  视频: MPlayer、xine、VCL、KMplayer(Konqueror Media Player)
    Audacity-音频处理软件    GIMP-图像处理软件     、FFMPEG 、 inkscape(illustrator)
    
LSB组织- Linux Standards Base   - 为推进linux的二进制的兼容性,LBS发布了最小支持的API集合。
        LSB制定了应用程序与运行环境之间的二进制接口。
POSIX - Portable Operation System Interface for Unix  :为了兼容不同unix的变种版本的API规范 
     
Linux分支,主要分:RedHat、Slackware(它坚持KISS原则)、Debian,
            每个分支都有一个商业服务器级别的发行版,RHEL、 SUSE Linux Enterprise、Ubuntu Server