一.了解内核的理论知识
  1.目前,内核有两种,分别是:微内核,单内核
    微内核:从理论上来讲比较先进,它是把内核做成n个组件,内核仅包括最核心的东西,所以,内核可以非常小。
           目前的的微内核设计不够精良,所以,它的优点并没完全体现出来,windows是使用微内核的

    单内核:就是把内核所需要的功能统统做进内核,使内核的体积非常庞大。
           linux是单内核,但是,它引用了微内核的模块化,把需要的东西做成模块,在需要的时候加载模块
  
  2.在/lib/modules/2.6.18-164.el5/目录里有内核编译的所有模块,在/lib/modules/2.6.18-164.el5/kernel/drivers放的是驱动模块。

  3.CPU的多路复用:就是让CPU的可运行时间切成片,给每个进程运行时间段,运行完了,就让它一边歇着,去运行另一个进程                    我们的linux系统有CPU时钟中断,就是让一些进程(优先级高的进程)插队,

  4.内核的内存管理:有物理内存,线性内存,逻辑内存
            线性内存跟CPU的位长有关,一般的CPU是32位的,在linux上只是用48位来管理,

  5.内核的安全性:如:管理SElinux,iptables等

  6.因为CPU的运行速度很快,所以需要缓冲;因为从磁盘读数据很慢,所以我们需要缓存;

  7.内核的组件:有三部分组成,分别是,kenel,initrd,/lib/modules/(该目录放的是模块)
 
  8.32位和64位的内核对内存的支持限制,(101页)
    32位的:
         kernel:最多支持32颗CPU,最大支持4GB 内存(这是标准的)
         kernel-PAE:如果启用了PAE功能,我们的内存扩展32位的地址空间到36位,所以它的寻址能力是64GB的内存,而redhat linux值支持16GB。
         PAE:物理地址扩展
         kernel-xen:这是运用在xen虚拟机上面的,也是最多支持32颗CPU,16GB的内存

    64位的:
        kernel:最多支持64颗CPU,512GB的内存

  9.在32位CPU上,我们的系统可以识别4GB内存,但是每个进程最大只能使用3GB内存,1GB被内核使用

二.我们的内存是用来管理进程的,那么,我们有哪些监控进程的状态呢?
   1.工具:(在102页)
     uname,
     uptime:查看系统的运行时长
     tload:这是一个基于文本的图形化系统负载查看工具

     ps:进程管理工具
     gnome-system-monitor:这是图形化的进程管理工具

     free:查看内存的使用情况
     vmstat:查看内存的情况;eg:vmstat -d 2
     swapon:启用虚拟内存的,-s显示所有交换内存的使用情况
     pmap:显示某一个进程的在物理内存中使用的空间的
           pmap 进程号    --->这是pmap的使用方法
     df:
     iostat:这个命令是靠sysstat工具提供的,我们可能需要装这个软件;用于报告cpu的是用情况的
       eg:iostat -d 2
    
      lsof:显示所打开的文件的,
      sosreport:生成报告信息格式的文档信息

三.内核映射和如何配置内核的
  1./proc     这个目录里放的是正在工作的内核的映射输出目录
    在/proc目录里有许多以数字命名的目录,这些数字就是进程号,该目录里放的是与该进程有关的东西

  2.在/proc/sys/net/ipv4目录里,改变icmp_echo_ignore_all文件的值可以让其忽略其他主机的ping
    eg:# echo "1" > icmp_echo_ignore_all      --->忽略其它主机的ping
       # echo "0" > icmp_echo_ignore_all

    如果有两块网卡,我们是否允许从一个网卡进来,然后从另一个网卡出去,是由ip_forward 文件定义的,默认值是0,
    eg:# echo "1" > ip_forward    --->让其主机有路由功能,

  3.在/proc/sys/vm目录中,有一个drop_caches 文件,默认值是0,如果设置成1,就是释放缓存
    eg:# echo "1" > drop_caches

  4.修改所有在/porc/sys/目录里的文件值可以用sysctl命令,用点(.)隔开
    eg:sysctl -w net.ipv4.ip_forward=1       ----->这里的sysctl就是指向/proc/sys/目录,所以前面的路径可以省略

  5.sysctl -a      --->可以显示系统正在使用默认值的文件

  6.我们手动设定的值在重启系统之后都会失效,因此,我们需要写在/etc/sysctl.conf 配置文件中,重启之后才不会失效
    我们在启动系统的时候,/etc/rc.d/rc.sysinit脚本会读取/etc/sysctl.conf文件,来配置内核参数/etc/sysctl.conf
    如果我们修改了/etc/sysctl.conf配置文件,需要用sysctl -p来重新读取一下该配置文件,才立即生效
 
  7.x86info    --->这是个命令可以查看更详细的CPU信息,
         这个命令系统默认是没有装的,我们需要手动安装,# yum install x86info

四.一些设备文件和内核模块的加载和卸载
   1./dev/md0     --->表示第一个软read设备
     /dev/md1     --->表示第二个软read设备

   2.字符设备,下面是两个逻辑设备,并不存在
     /dev/null     --->数据黑洞
     /dev/zero     --->这个设备只是吐出0,可以用来初始化设备

   3.下面是用来生成随机数的设备
     /dev/random       
     /dev/urandom

   4.字符设备一般是线性设备
     块设备一般是随机设备

   5.lsmod      ----->查看当前内核加载那些模块
   eg:# lsmod
    显示信息:
    Module                  Size  Used by
    autofs4                29253  3
    模块名称               模块大小  模块被哪些模块依赖

   6.显示某个模块的详细信息,包括路径,作者等
     # modinfo ipv6
  
   7.装载和卸载模块:modprobe,这个命令加载模块时,会自动找到与内核版本相同的目录(uname -r),加载到这个目录中
     eg:modprobe -r floppy     --->卸载模块,-r表示卸载模块
     eg:modprobe floppy        --->表示卸载模块
     eg:# lsmod | grep floppy    --->查看一下是否卸载成功

     # vim modprobe.conf
      这里定义网卡别名,和一些设备别名
      alias eth0 pcnet32       --->这里给网卡起个别名叫eth0

     insmod  也可以加载模块,但是需要制定全路径


   8.depmod     --->生成模块间列表的依赖关系的
  
   9.rmmod   从内核中移除模块,

   10.mkinitrd创建initrd文件,
    eg:mkinitrd /boot/init-$(uname -r).img  $(uname -r)                    ---->就是封装initrd
                 指定创建路径,放在哪里     为哪个内核创建initrd文件

   11.这里有一个重要的知识点,$和``一样,可以是命令替换
    eg:mkinitrd /boot/init-$(uname -r).img $(uname -r)

五.linux的网络概念:linux network concepts
  1.路由条目:
     静态的,动态的
      OSPF
      RIP
      EIGRP
      BGP:边际网关协议
    主机路由
    网络路由
    默认路由
 
  2.ip命令的常用组合命令
    ip addr show
    ip link show
    ip link dev eth0 down        ---->禁用设备
    ifdown eth0                 --->这也是禁用网卡命令

  3.ethtool 命令的用法
    ethtool -i eth0    --->可以查看网卡的驱动,版本号,固件信息等
   
    我们在网卡的配置文件中设定网卡的工作模式,速率等
    如:我们将ETHTOOL_OPTS="autoneg off speed 100 duplex full" 这一句话写入网卡的配置文件/etc/sysconfig/network-scripts/ifcfg-eth0中时,再重启网卡后就会生效。(125页)

  4.当我们的主机使用DHCP模式下分配地址时候,但是dhcp服务器down机了,系统会自动获得自动专有地址:169.254网段的地址
    自动专用地址只能实现本地的网络通信
   
    我们可以禁用此选项,可以在网卡配置文件中禁用
    NOZEROCONF=yes              ---->这样就禁止了网卡自动获得自动专有地址了。

  5.网卡别名:
    eg:eth0:0
    我们使我们定义的别名网卡能用,做以下步骤
    cp /etc/sysconfig/network-scripts/ifcfg-eth0  /etc/sysconfig/network-scripts/ifcfg-eth0:0
    然后该在该配置文件中的网卡名字、地址等相关信息。

  6.# route -n           --->查看路由信息
    # netstat -rn        --->查看路由信息
   
  7.为某个网段指定网关:
    -net:是添加到目标网络的路由
       route add -net TARGET/mask gw
       eg:route add -net 172.15.0.0/24 gw 172.16.0.2    -->为172.15.0.0网段的地址指定网关为172.16.0.2
       解释:这就是一个静态路由条目的,凡是发送到172.15.0.0网段的数据包都通过172.16.0.2进行转发
 
    -host:添加到目标主机的路由
      route add -host 10.10.10.10 gw 172.0.16.0.3     --->为主机10.10.10.10添加网关172.16.0.3

   如果我们不想让我们的配置在重启之后就消失了,就需要写入配置文件(127页)
     我们需要建一个与网卡相关的配置文件
    eg:# vim  /etc/sysconfig/network-scripts/route-eth0       --->这是建一个与网卡eth0有关的路由配置文件
        内容如下:
        ADDRESS0=172.15.0.0
        NETMASK0=255.255.255.0
        GATWAY0=172.16.0.2

        ADDRESS1=10.3.3.0
        NETMASK1=255.255.255.0
        GATWAY1=172.16.0.3

     解释:ADDRESS:表示目标地址
           ADDRESS0:这里的0表示第一组
           GATWAY:表示网关

    注意:这里我们必须有一个网卡的地址是172.16.0.0网段的地址,这是为了保证我们的主机可以和这个网段通信,可以给我们的网卡取个别名

  
   8.如何验证两台主机的连接性
     ping
     traceroute     -->探测两台主机通信经过的路径
     mtr           --->是上面的结合

   9.配置主机名
     /etc/sysconfig/network
         HOSTNAME=

    要想立即生效,有三种:
    hostname=
    sysctl -w kernel.hostname=
    echo "hostname" > /proc/sys/kernel/hostname

  10.要想主机名转换成ip地址,有两种方式:
     第一种:需该hosts文件
      /etc/hosts文件的格式:IP       hostname         alias
                          ip地址     主机名称         主机别名

     这时候就可以使用 ping 主机名 来ping某台主机了,它自动通过hosts文件来会解析的

  11.如果我们的主机接入到网络中去了,想让自己的主机配置成DNS客户端的方法:
     # vim  /etc/resolv.conf     --->修改该文件中的nameserver就可以了,nameserver后面跟的是NDS服务器的ip地址
      注意:nameserver可以同时出现三个
   
     # gethostip instructor.example.com       ---->可以探测主机的ip地址是多少
     # dig -t A instructor.example.com        ---->探测主机的A记录

     为了不让DHCP提供的DNS覆盖我们在/etc/resolv.conf中定义的DNS,我们可以在/etc/sysconfig/network-scripts/ifcfg-eth0文件中,添加如下内容:

       PEERDNS=no
          
  12.netstat
        -t     查看所有的tcp连接
        -u     查看所有的udp连接
        -r     查看路由信息
        -n     以数字的形式显示,而不是主机名
        -l     显示正在监听的地址
        -p     显示用哪个进程在监听

  13.nmap     是一个监听工具
     需要安装:yum install nmap

  14.抓包工具
     eg:tcpdump -i eth0
     eg:wireshark     --->这个工具需要安装,系统默认没有带,# yum install wireshark
     eg:# yum install wireshark-gnome    ---->这是安装wireshark的图形界面下的抓包工具
     eg:# wireshark      ---->这个命令可以打开图形化的抓包工具,

    netcat   --->这是一个被称为瑞士×××的抓包工具

  15.当我们的一块网卡带宽满足不了服务时,我们可以将两块网卡绑定起来,就像路由与交换的trunk
     在linux上也可以实现将两个网卡绑定在一块,
     这样可以实现负载均衡和单点故障    (133页)

     当我们的两块网卡处在同一个网络中是,即:用两根网线将两块网卡连接在同一个网络中的时候,才可以绑定两块网卡
     步骤:
       1)我们需要加载模块
         # modprobe bonding
         注意:这样加载模块在开机之后,不会自动加载的。我们需要写入modprobe的配置文件中区
       2)# vim /etc/modprobe.conf          ---->将上面加载的模块写入配置文件中去
         内容如下:
           alias dond0 bonding       ---->注意:这里的bond0是接口的名字;在以后重启之后就会自动加载这个模块了

六.文件共享系统:nfs
   1.在我们的linux内核中默认对NFS的支持,是因为NFS模块被内置到内核中去了,所以它是一个内核线程在工作
     NFS:Network FileSystem     文件共享系统

   2.我们作为一个客户端去访问别人共享的NFS文件,首先确保我们的系统是否开启了rpc服务
      RPC:Remote Procedure Call     远程过程调用
      RPC是工作在五层,ospf协议下的,不同进程之间的通信,基于二进制实现通信的

     # service portmap status     --->查看这个服务是否运行着,如果运行,则说明rpc是可以工作的,portmap提供rpc服务
     # rpcinfo -p 192.168.0.254   --->查看远程服务的rpc是否运行着,看:nfs portmapper是否运行
     # rpcinfo -p localhost       --->查看本机的

  3.查看对方的服务器是否共享了什么给我
    # showmount -e 192.168.0.254

  4.别人通过NFS共享的文件必须挂在到本地磁盘才可以用,挂在方法如下:
   模板:mount IP:/var/ftp/pub  /mount_point
    eg:mount 192.168.0.254:/var/ftp/pub /pub             ---->挂载之后,就可以直接访问了,不用再登陆了。

     这种挂载方式是临时挂载,重启之后就会失效,我们先要永久挂载(有两种方式),就需要写在配置文件中去
    # vim /etc/fstab
     在最后面添加:192.168.0.254:/var/ftp/pub  /pub                nfs     defaults        0 0

     注意:这种挂载存在问题,就是在开机的时候,服务器没开机,系统就会卡在那里,知道验证好长时间之后,才会启动
 
    第二种永久挂载方式:使用automount自动挂载,自动挂载是指当用户要访问的时候,就会挂载,当用户过一段时间不访问了,就会自动卸载掉。
     1)automount是以后台进程的方式运行的。
         启动这个进程的服务叫:autofs

       autofs有两种挂载方式:直接挂载,间接挂载
         直接挂载:就是明确指定关在位置
          eg:192.168.0.254:/var/ftp/pub /pub    --->就是指这里的/pub目录必须存在的
         间接挂载:就是将nfs挂载一个事先并不存在的目录下
         eg:192.168.0.254:/var/ftp/pub netfs   ---->netfs这个目录可以事先不存在,在挂载的时候它会自动创建这个目录
        eg:192.168.0.254:/var/ftp/pub /share/pub
          解释:我们这里的/share目录是存在的,但是,/pub目录可以不存挂在的创建的

     2)实现自动挂载的间接挂载步骤:
        在客户端,所有的挂载配置都在/etc/auto.master中定义的
         # vim /etc/auto.master    --->我们可以在这个文件中定义挂载目录
          写入内容:/share /etc/auto.pub  --->意思:我们要在/share目录下创建一个挂载,这里不需要指定挂载到哪里去,而是在/etc/auto.pub文件中指定了挂载位置,这个文件是自己手动创建的。

      下面我们要编写我们上面指定的挂在路径的配置文件/etc/auto.pub。
        # vim /etc/auto.pub
          内容如下:
            pub -rw192.168.0.254:/var/ftp:/pub      --->解释:就是将192.168.0.254:/var/ftp:/pub挂载到pub目录下,这里的pub目录使用的是相对路径,这里pub目录是指/share目录下,挂在时候自动创建的目录,-rw是指读写挂载

       做了这些之后,重启服务:service autofs restart 就好了

     3)总结上面得自动挂载的直接挂载步骤
        直接挂载:
         vim /etc/auto.master        ---->编写这个自动挂载的配置文件
           内容如下:
           /- /etc/auto.pub     ---->这就是表示直接挂载

        vim /etc/atuo.pub     ---->这里创建我们上面定义的配置文件
         内容如下:
          /pub -rw,soft 192.168.0.254:/var/ftp/pub      --->我们这里可以看到,直接挂载前面有/,而间接没有

      4)直接挂载本地设备
        vim /etc/auto.master
         内容:
          /-   /etc/auto.cdrom

         vim /etc/auto.cdrom
          内容:
           /mnt/cdrom  -fstype=9660,ro,soft :/dev/cdrom     --->这里:是指挂载本地设备

        重启服务就ok了

      5)间接挂载服务器某路径下的所有子目录
       下面的是单独挂载,就是不会像上面的那样,把所有的目录都挂载到目录下

       vim /etc/auto.master              --->定义我们要挂载设备的地方
       内容:
        /home/jun   /etc/auto.home        ---->这里就是定义我们要在/home/jun目录下挂载很多文件

      vim /etc/auto.home
       *  -rw,soft 192.168.0.254:/home/guests/&    -->这里*表示挂载后面192.168.0.254:/home/guests/里的每一个同名的子目录,&表示将192.168.0.254:/home/guests/目录下的所有子目录挂载到*里面去,*就是与192.168.0.254:/home/guests/里同名的目录,