进程管理和shell脚本编程进阶

  • 1、列举常见的内核参数以及参数的意义
  • 2、通过/proc查看top中展示的进程状态
  • 3、分别用while、for循环检测10.0.0.1/24网段存活的IP地址
  • 4、initrd的作用

列举常见的内核参数以及参数的意义

/proc/sys:
  (1)sysctl命令用于查看或设定此目录中诸多参数
    sysctl -w path.to.parameter=VALUE
    sysctl -w kernel.hostname=mail.exchangeideas.cn
  (2)echo命令通过重定向方式也可以修改大多参数的值
    echo 'VALUE" >/proc/sys/path/to/parameter
    echo “websrv” >/proc/sys/kernel/hostname

查看内核里的参数

[root@centos6 /proc/sys]#sysctl -a |less
kernel.sched_child_runs_first = 0
kernel.sched_min_granularity_ns = 3000000
kernel.sched_latency_ns = 15000000
kernel.sched_wakeup_granularity_ns = 3000000
kernel.sched_tunable_scaling = 1
kernel.sched_features = 7279
kernel.sched_migration_cost = 500000
kernel.sched_nr_migrate = 32
kernel.sched_time_avg = 1000
kernel.sched_shares_window = 10000000
kernel.timer_migration = 1
kernel.sched_rt_period_us = 1000000
kernel.sched_rt_runtime_us = 950000
kernel.sched_compat_yield = 0
kernel.sched_rr_timeslice_ms = 100
kernel.sched_autogroup_enabled = 0
kernel.sched_cfs_bandwidth_slice_us = 5000
kernel.panic = 0
kernel.exec-shield = 1
kernel.core_uses_pid = 1
kernel.core_pattern = |/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e
kernel.core_pipe_limit = 4
kernel.tainted = 0
kernel.real-root-dev = 0
kernel.print-fatal-signals = 0
kernel.ctrl-alt-del = 0
kernel.ftrace_enabled = 1
kernel.stack_tracer_enabled = 0
kernel.ftrace_dump_on_oops = 0
kernel.modprobe = /sbin/modprobe
kernel.modules_disabled = 0
kernel.kexec_load_disabled = 0

常见参数:
  net.ipv4.ip_forward — 是否开启数据包转发
  net.ipv4.conf.default.rp_filter — 对从默认网卡进来的数据包进行反向路径校验
  net.ipv4.conf.default.accept_source_route — 是否接受含有源路由信息的ip包
  net.ipv4.tcp_max_tw_buckets — 处于time_wait状态的最大数值,超过则立刻被清除
  net.ipv4.ip_local_port_range — 允许系统打开的端口范围,值为两个数字,中间以空格隔开,分别表示最小端口号和最大端口号。
  net.ipv4.tcp_max_syn_backlog — SYN队列的长度
  fs.file-max — 系统打开的最大文件句柄数
  kernel.hostname — 主机名
  net.ipv4.icmp_echo_ignore_all — 忽略所有ping
  vm.drop_caches — 清空caches,释放内存占用。设置为1表示清空 pagecache,设置为2表示清空 entries 和 inodes,设置为3表示清空所有缓存(pagecache、dentries 和 inodes)

通过/proc查看top中展示的进程状态

/proc目录:
  内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出

参数:只读:输出信息
  可写:可接受用户指定"新值"来实现对内核某功能或特性的配置
/proc/sys:
  (1)sysctl命令用于查看或设定此目录中诸多参数
    sysctl -w path.to.parameter=VALUE
    sysctl -w kernel.hostname=mail.exchangeideas.cn
  (2)echo命令通过重定向方式也可以修改大多参数的值
    echo 'VALUE" >/proc/sys/path/to/parameter
    echo “websrv” >/proc/sys/kernel/hostname

进程管理工具top:
  top:有许多内置命令:
    排序:
     P:以占据的cpu百分比,%CPU
     M:占据内存百分比,%MEM
     T:累积占据CPU时长,TIME+
    首部信息显示:
     uptime信息:l命令
     tasks及cpu信息:t命令
     cpu分别显示:1(数字)
     memory(信息):m命令
    退出命令:q
    修改刷新时间间隔:s
    终止指定进程:k
    保存文件:W
可以动态跟踪,ps aux是快照机制,不能实时观察,top可以动态地观察cpu,内存情况

top命令:
  栏位信息简介
  us:用户空间
  sy:内核空间
  ni:调整nice时间
  id:空闲
  wa:等待IO时间
  hi:硬中断
  si:软中断(模式切换)
  st:虚拟机偷走的时间

top - 10:18:45 up 7 min,  2 users,  load average: 0.29, 0.12, 0.03
Tasks: 260 total,   1 running, 259 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.1%us,  0.1%sy,  0.0%ni, 99.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0
Mem:   2037260k total,   535264k used,  1501996k free,    33996k buffers
Swap:  2047996k total,        0k used,  2047996k free,   179296k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND      
    21 root      20   0     0    0    0 S  0.3  0.0   0:00.27 e

load average 平均负载情况,一分钟、五分钟、10分钟之内负载的情况,对应值越小,当前的负载情况越少(在一分钟之内有0.02个任务没有完成(没完成说明,cpu很忙)这个值不大于cpu个数的2倍)

可以动态跟踪,ps aux是快照机制,不能实时观察,top可以动态地观察cpu,内存情况

第一行(uptime)tasks 进程数量 138个 有4个在允许, 136个在可中断睡眠 0停止的 0个僵死的
第二行就是显示任务的数量情况,其中zombie要注意一下,这个是表示僵尸进程,出现了僵尸进程要注意下僵尸进程是如何产生的。如果不找到产生原因,即使杀死了,可能也会再次出现。
第三行属于cpu分配,13.7是给用户空间程序使用的,47。2是给系统空间占用的,0.0调整优先级的,id表示空闲(34.5)
wa等待的cpu,hi si(软中断(应用程序发生了,有个事件需要处理,让cpu响应),硬中断(键盘回馈cpu需要解决的事情))(中断是cpu实现进程响应时间发送的机制),si 软中断(中断都要消耗cpu,现在是软中断消耗的cpu时间更多一点,),st表示偷盗的意思(被盗取的时间),对于电脑来讲,cpu消耗都是在本机的进程里的,有可能电脑上跑 了一个虚拟机,虚拟机也有自己 进程消耗cpu,被虚拟机偷走了(虚拟机的进程,当前电脑看不到)

第4行表示内存memory的使用情况。,kb为单位,总的内存空间,剩余空间,正在使用的空间,缓存第5行,swap基本没有使用,说明内存够用
**进程默认是以cpu来排序的也可以按照内存排序,按M,大P又回到cpu排序
**
第五行表示交换空间swap的使用情况。

PID:进程编号
USER:进程所属用户
PR/NI:Priority/Nice value进程执行的优先顺序
VIRT:Virtual Image (kb) 虚拟内存使用总额
RES:Resident size (kb) 常驻内存
SHR:Shared Mem size (kb) 共享内存
S:Process Status 进程状态
%CPU:cpu使用率
%MEM:内存使用率
TIME+:进程开始运行时使用cpu的总时间
COMMAND:进程运行的命令
在top状态下按f可以查看表头字段说明。

一些命令运行时的快捷键说明:
  -l:隐藏显示uptime信息
  -t:换方式显示cpu
  -m:控制内存显示情况
  -s:修改刷新时间间隔
  -b:top命令只显示前面部分进程,-b显示所有进程
  -q:quit退出程序
  -M:Memory按照内存使用量排序
  -P:CPU按照cpu使用量排序
  -k:kill杀死PID的进程,不输入PID,直接按回车就会退出,可以知道kill掉某个进程
  -1:能显示CPU每个核心的情况,可以切换单,双cpu
  -h或者?:help 查看更多快捷键
  -f:fields查看进程表头字段含义
选项:
  d #:指定刷新时间间隔,默认为3秒
  -b:全部显示所有进程
  -n #:刷新多少次后退出
  ni:调整nice时间
  id:空闲
  wa:等待IO时间
  hi:硬中断
  si:软中断(模式切换)
  st:虚拟机偷走的时间

如何用proc查看top命令显示的

[root@centos6 /proc]#ls
1     2080  2525  3031  3362  3578  570  86           loadavg
10    2081  2526  3032  3370  36    572  87           locks
100   2082  2527  3037  3371  3627  575  9            mdstat
101   2083  2528  3063  34    3629  58   94           meminfo
102   2088  2532  3067  3443  3631  59   95           misc
11    21    2547  3068  3447  3634  6    96           modules
12    2109  2560  3069  3455  37    60   97           mounts
13    22    2563  3070  3458  3716  61   98           mpt
134   23    2584  3071  3468  3731  62   acpi         mtd
135   2366  26    3072  3474  3739  63   asound       mtrr
14    24    2600  3073  3481  3749  64   buddyinfo    net
15    2400  2652  3074  3482  3754  65   bus          pagetypeinfo
16    2434  2686  3084  3484  38    66   cgroups      partitions
1667  2459  2698  3099  3489  3821  67   cmdline      sched_debug
1687  2478  2699  31    3491  39    68   cpuinfo      schedstat
17    2492  27    3115  3496  4     69   crypto       scsi
1703  25    2739  3130  3497  40    7    devices      self
173   2505  2749  3139  3498  41    72   diskstats    slabinfo
18    2506  2757  3146  3499  42    720  dma          softirqs
1830  2507  2758  3153  35    43    721  driver       stat
1876  2508  2761  3156  3501  44    73   execdomains  swaps
1877  2509  2790  3162  3502  45    74   fb           sys
1878  2510  28    318   3504  46    75   filesystems  sysrq-trigger
1879  2511  2810  3184  3505  47    76   fs           sysvipc
19    2514  2845  3188  3516  48    77   interrupts   timer_list
1992  2515  2866  319   3518  49    78   iomem        timer_stats
2     2516  2887  32    3520  5     79   ioports      tty
20    2517  29    3206  3521  50    8    irq          uptime
2053  2518  2903  3276  3524  51    80   kallsyms     version
2058  2519  2921  3281  3526  52    81   kcore        vmallocinfo
2059  2520  2936  33    3528  53    817  keys         vmstat
2060  2521  2937  3327  3530  54    82   key-users    zoneinfo
2061  2522  3     3335  3534  55    83   kmsg
2070  2523  30    3341  3547  56    84   kpagecount
2075  2524  3023  3352  3573  57    85   kpageflags

常见的文件介绍
  apm — 高级电源管理(APM)版本信息及电池相关状态信息,通常由apm命令使用;
  buddyinfo — 用于诊断内存碎片问题的相关信息文件;

[root@centos6 /proc]#cat buddyinfo
Node 0, zone      DMA      0      4      3      2      1      1      0      0      1      1      3 
Node 0, zone    DMA32     77    430    288    145     94     26     12      4      4      3    354 

  cmdline — 在启动时传递至内核的相关参数信息,这些信息通常由lilo或grub等启动管理工具进行传递;

[root@centos6 /proc]#cat cmdline 
ro root=UUID=5a64692e-8e10-4a1f-a32d-0bddf8c4fcb8 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=129M@48M  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet max_loop=100

  cpuinfo — 处理器的相关信息的文件;

  devices — 系统已经加载的所有块设备和字符设备的信息,包含主设备号和设备组(与主设备号对应的设备类型)名;

[root@centos6 /proc]#cat devices 
Character devices:
  1 mem
  4 /dev/vc/0
  4 tty
  4 ttyS
  5 /dev/tty
  5 /dev/console
  5 /dev/ptmx
  7 vcs
 10 misc
 13 input
 14 sound
 21 sg
 29 fb
116 alsa
128 ptm

  diskstats — 每块磁盘设备的磁盘I/O统计信息列表;(内核2.5.69以后的版本支持此功能)

[root@centos6 /proc]#cat diskstats 
   1       0 ram0 0 0 0 0 0 0 0 0 0 0 0
   1       1 ram1 0 0 0 0 0 0 0 0 0 0 0
   1       2 ram2 0 0 0 0 0 0 0 0 0 0 0
   1       3 ram3 0 0 0 0 0 0 0 0 0 0 0
   1       4 ram4 0 0 0 0 0 0 0 0 0 0 0
   1       5 ram5 0 0 0 0 0 0 0 0 0 0 0
   1       6 ram6 0 0 0 0 0 0 0 0 0 0 0
   1       7 ram7 0 0 0 0 0 0 0 0 0 0 0

  dma — 每个正在使用且注册的ISA DMA通道的信息列表;
  execdomains — 内核当前支持的执行域(每种操作系统独特“个性”)信息列表;
  fb — 帧缓冲设备列表文件,包含帧缓冲设备的设备号和相关驱动信息;
  filesystems — 当前被内核支持的文件系统类型列表文件,被标示为nodev的文件系统表示不需要块设备的支持;通常mount一个设备时,如果没有指定文件系统类型将通过此文件来决定其所需文件系统的类型;

[root@centos6 /proc]#cat filesystems 
nodev   sysfs
nodev   rootfs
nodev   bdev
nodev   proc
nodev   cgroup
nodev   cpuset
nodev   tmpfs
nodev   devtmpfs
nodev   binfmt_misc
nodev   debugfs
nodev   securityfs
nodev   sockfs
nodev   usbfs
nodev   pipefs
nodev   anon_inodefs
nodev   inotifyfs

  interrupts — X86或X86_64体系架构系统上每个IRQ相关的中断号列表;多路处理器平台上每个CPU对于每个I/O设备均有自己的中断号;
  iomem — 每个物理设备上的记忆体(RAM或者ROM)在系统内存中的映射信息;
  ioports — 当前正在使用且已经注册过的与物理设备进行通讯的输入-输出端口范围信息列表;如下面所示,第一列表示注册的I/O端口范围,其后表示相关的设备;
  kallsyms — 模块管理工具用来动态链接或绑定可装载模块的符号定义,由内核输出;(内核2.5.71以后的版本支持此功能);通常这个文件中的信息量相当大;
  kcore — 模块管理工具用来动态链接或绑定可装载模块的符号定义,由内核输出;(内核2.5.71以后的版本支持此功能);通常这个文件中的信息量相当大;
  kmsg — 此文件用来保存由内核输出的信息,通常由/sbin/klogd或/bin/dmsg等程序使用,不要试图使用查看命令打开此文件;
  loadavg — 保存关于CPU和磁盘I/O的负载平均值,其前三列分别表示每1秒钟、每5秒钟及每15秒的负载平均值,类似于uptime命令输出的相关信息;第四列是由斜线隔开的两个数值,前者表示当前正由内核调度的实体(进程和线程)的数目,后者表示系统当前存活的内核调度实体的数目;第五列表示此文件被查看前最近一个由内核创建的进程的PID;

[root@centos6 /proc]#cat loadavg 
0.04 0.02 0.00 1/347 3954

  locks — 保存当前由内核锁定的文件的相关信息,包含内核内部的调试数据;每个锁定占据一行,且具有一个惟一的编号;如下输出信息中每行的第二列表示当前锁定使用的锁定类别,POSIX表示目前较新类型的文件锁,由lockf系统调用产生,FLOCK是传统的UNIX文件锁,由flock系统调用产生;第三列也通常由两种类型,ADVISORY表示不允许其他用户锁定此文件,但允许读取,MANDATORY表示此文件锁定期间不允许其他用户任何形式的访问;
  mdstat — 保存RAID相关的多块磁盘的当前状态信息,在没有使用RAID机器上,其显示为如下状态:
  meminfo — 系统中关于当前内存的利用状况等的信息,常由free命令使用;可以使用文件查看命令直接读取此文件,其内容显示为两列,前者为统计属性,后者为对应的值;

[root@centos6 /proc]#cat meminfo 
MemTotal:        2037260 kB
MemFree:         1503472 kB
Buffers:           34000 kB
Cached:           179340 kB
SwapCached:            0 kB
Active:           226576 kB
Inactive:         153612 kB
Active(anon):     167476 kB
Inactive(anon):     2160 kB
Active(file):      59100 kB
Inactive(file):   151452 kB

  mounts — 在内核2.4.29版本以前,此文件的内容为系统当前挂载的所有文件系统,在2.4.19以后的内核中引进了每个进程使用独立挂载名称空间的方式,此文件则随之变成了指向/proc/self/mounts(每个进程自身挂载名称空间中的所有挂载点列表)文件的符号链接;/proc/self是一个独特的目录,后文中会对此目录进行介绍;
  modules — 当前装入内核的所有模块名称列表,可以由lsmod命令使用,也可以直接查看;如下所示,其中第一列表示模块名,第二列表示此模块占用内存空间大小,第三列表示此模块有多少实例被装入,第四列表示此模块依赖于其它哪些模块,第五列表示此模块的装载状态(Live:已经装入;Loading:正在装入;Unloading:正在卸载),第六列表示此模块在内核内存(kernel memory)中的偏移量;
  partitions — 块设备每个分区的主设备号(major)和次设备号(minor)等信息,同时包括每个分区所包含的块(block)数目(如下面输出中第三列所示);

[root@centos6 /proc]#cat partitions 
major minor  #blocks  name

   8        0  209715200 sda
   8        1    2048000 sda1
   8        2   30720000 sda2
   8        3   30720000 sda3
   8        4          1 sda4
   8        5    2048000 sda5
   8       16   20971520 sdb
   8       64    1048576 sde
   8       32  104857600 sdc
   8       48   83886080 sdd
   8       49    1060258 sdd1
   8       50   10490445 sdd2

  pci — 内核初始化时发现的所有PCI设备及其配置信息列表,其配置信息多为某PCI设备相关IRQ信息,可读性不高,可以用“/sbin/lspci –vb”命令获得较易理解的相关信息;在2.6内核以后,此文件已为/proc/bus/pci目录及其下的文件代替;
  stat — 实时追踪自系统上次启动以来的多种统计信息;如下所示,其中,
“cpu”行后的八个值分别表示以1/100(jiffies)秒为单位的统计值(包括系统运行于用户模式、低优先级用户模式,运系统模式、空闲模式、I/O等待模式的时间等);
“intr”行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数;
“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。
“btime”给出了从系统启动到现在为止的时间,单位为秒;
“processes (total_forks) 自系统启动以来所创建的任务的个数目;
“procs_running”:当前运行队列的任务的数目;
“procs_blocked”:当前被阻塞的任务的数目;

    [root@centos6 /proc]#cat stat 
    cpu  1007 0 3180 1113578 521 43 248 0 0
    cpu0 311 0 924 278157 94 17 23 0 0
    cpu1 245 0 727 278376 114 0 130 0 0
    cpu2 207 0 866 278423 178 11 53 0 0
    cpu3 242 0 661 278621 134 12 40 0 0
    intr 229183 218 34 0 0 1 0 0 0 1 0 0 0 406 0 0 8423 809 18798 170 5838 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    ctxt 237457
btime 1553998262
processes 3967
procs_running 1
procs_blocked 0
softirq 382700 0 142072 557 5998 27799 0 111 39695 144 166324

  swaps— 当前系统上的交换分区及其空间利用信息,如果有多个交换分区的话,则会每个交换分区的信息分别存储于/proc/swap目录中的单独文件中,而其优先级数字越低,被使用到的可能性越大;下面是作者系统中只有一个交换分区时的输出信息;
  uptime — 系统上次启动以来的运行时间,如下所示,其第一个数字表示系统运行时间,第二个数字表示系统空闲时间,单位是秒;

[root@centos6 /proc]#cat uptime 
2839.97 11285.84

  version — 当前系统运行的内核版本号,在作者的RHEL5.3上还会显示系统安装的gcc版本,如下所示;
  vmstat — 当前系统虚拟内存的多种统计数据,信息量可能会比较大,这因系统而有所不同,可读性较好;下面为作者机器上输出信息的一个片段;(2.6以后的内核支持此文件)
  zoneinfo — 内存区域(zone)的详细信息列表,信息量较大,下面列出的是一个输出片段:

 [root@centos6 /proc]#cat zoneinfo 
Node 0, zone      DMA
  pages free     3924
        min      83
        low      103
        high     124
        scanned  0
        spanned  4080
        present  3825
    nr_free_pages 3924
    nr_inactive_anon 0
    nr_active_anon 0
    nr_inactive_file 0
    nr_active_file 0
    nr_unevictable 0

进入到一个3352进程,查看所包含内容

[root@centos6 /proc]#cd 3352
[root@centos6 /proc/3352]#ls
attr        coredump_filter  io         mountstats     pagemap      stack
autogroup   cpuset           limits     net            personality  stat
auxv        cwd              loginuid   ns             root         statm
cgroup      environ          maps       numa_maps      sched        status
clear_refs  exe              mem        oom_adj        schedstat    syscall
cmdline     fd               mountinfo  oom_score      sessionid    task
comm        fdinfo           mounts     oom_score_adj  smaps        wchan

其中文件夹的含义:
  cmdline — 启动当前进程的完整命令,但僵尸进程目录中的此文件不包含任何信息;
  environ — 当前进程的环境变量列表,彼此间用空字符(NULL)隔开;变量用大写字母表示,其值用小写字母表示;
  exe — 指向启动当前进程的可执行文件(完整路径)的符号链接,通过/proc/N/exe可以启动当前进程的一个拷贝;
  fd — 这是个目录,包含当前进程打开的每一个文件的文件描述符(file descriptor),这些文件描述符是指向实际文件的一个符号链接;
  limits — 当前进程所使用的每一个受限资源的软限制、硬限制和管理单元;此文件仅可由实际启动当前进程的UID用户读取;(2.6.24以后的内核版本支持此功能);
  root — 指向当前进程运行根目录的符号链接;在Unix和Linux系统上,通常采用chroot命令使每个进程运行于独立的根目录;
  stat — 当前进程的状态信息,包含一系统格式化后的数据列,可读性差,通常由ps命令使用;
  statm — 当前进程占用内存的状态信息,通常以“页面”(page)表示;
  status — 与stat所提供信息类似,但可读性较好,如下所示,每行表示一个属性信息;其详细介绍请参见 proc的man手册页;
  task — 目录文件,包含由当前进程所运行的每一个线程的相关信息,每个线程的相关信息文件均保存在一个由线程号(tid)命名的目录中,这类似于其内容类似于每个进程目录中的内容;(内核2.6版本以后支持此功能)

分别用while、for循环检测10.0.0.1/24网段存活的IP地址

for循环写法:

  #!/bin/bash
    read -p "please input ipaddt/netmask(such as 100.0.0.16/28):" ip
        if [ -z "$ip" ]
            then
            { echo $ip is empty;exit; }
        else
            echo $ip > /data/ss;
            hosts=32-`sed -r 's/.*\/(.*)/\1/' /data/ss`
            hosts2=`echo $hosts | bc`    #32位子网掩码减去实际子网掩码
            hotsss=`echo  $((2**$hosts2))` #主机数
            hostip=`sed -r 's/(.*)[0-9]\/.*/\1/' /data/ss` #ip地址前一段
            # echo 1 && echo  $hostip{1..$hotsss} > /data/hostip 
            for ((i=1;i<=$hotsss;i++));do #遍历ip地址
            ping -c 1 -w 1s $hostip$i &>/dev/null && echo  $hostip$i up ||echo  $hostip$i down               
            done
            echo $hotsss  #主机数量
            # echo 1 && echo  $hostip{1..$hotsss} > /data/hostip
        #   for ipaddr in `cat /data/hostip` ; do
        #   ping -c 1 -w 1s $ipaddr &>/dev/null && echo $ipaddr up ||echo $ipaddr down 
        #   done
        fi

while循环写法:

#!/bin/bash
read -p "please input ipaddt/netmask(such as 100.0.0.16/28):" ip
    if [ -z "$ip" ]
        then
        { echo $ip is empty;exit; }
    else
        echo $ip > /data/ss;
        hosts=32-`sed -r 's/.*\/(.*)/\1/' /data/ss`
        hosts2=`echo $hosts | bc`
        hotsss=`echo  $((2**$hosts2))`
        hostip=`sed -r 's/(.*)[0-9]\/.*/\1/' /data/ss`
        i=1
        while [ $i -le  $hotsss ] ;do                                        
        ping -c 1 -w 1s $hostip$i &>/dev/null && echo  $hostip$i up ||echo  $
hostip$i down
        i=`echo $i+1|bc`
        done
        hotsss=`echo  $((2**$hosts2))`
        echo $hotsss
        hostip=`sed -r 's/(.*)\/.*/\1/' /data/ss`
        # echo 1 && echo  $hostip{1..$hotsss} > /data/hostip
        echo $hostip
        echo $hostips
    #   for ipaddr in `cat /data/hostip` ; do
    #   ping -c 1 -w 1s $ipaddr &>/dev/null && echo $ipaddr up ||echo $ipaddr
 down 
    #   done
    fi

initrd的作用

initrd 是一个 ram disk 的 image. 一般是压缩过的.它存在的主要目的是在内核启动时加载它,安装其中的驱动.
1.内核启动时加载 initrd img, mount 为 /
2.依 /linuxrc 的指令执行, 一般有扫描系统硬件,从 当前文件系统中找到驱动安装之.
3.挂载系统中真正的 /

Linux组成:
Linux:kernel+rootfs
  kernel:进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
  rootfs:程序和glibc
  库:函数集合,function,调用接口(头文件负责描述)
    过程调用:procedure,无返回值
    函数调用:function
  程序:二进制文件
内核设计流派:
  单内核(monolithic kernel):Linux
    把所有功能集成于同一个程序
  微内核(micro kernel):Windows,Solaris
    每种功能使用一个单独子系统实现
linux的内核+相关工具rootfs(如gnu),gnu很多工具装在根目录下。内核对应系统里的内核包,这个包包含了内核的主要内容
内核对应linux操作系统的核心功能,进程,内存,网络的管理,都是内核完成的
而各种其他的软件gnu,各种工具是由各种软件和各种库组合而成的,ldd 可以查看系统中指定的命令包含的库,库大部分默认路径都在lib64里,只解决了程序本身的功能,而同用的公共功能是放在库里

内核:
Linux内核特点:
  支持模块化:.ko(内核对象)
    如:文件系统,硬件驱动,网络协议等
  支持内核模块动态装载和卸载
组成部分:
  核心文件:/boot/vmlinuz-VERSION-release
    ramdisk:辅助的伪跟系统
    CentOS 5:/boot/initrd-VERSION-release.img
    CentOS 6,7://boot/initramfs-VERSION-release.img
  :/lib/modules/VERSION-release
linux一些核心的功能是专门一个文件实现的,但是其他零散的,比如(文件系统,硬件驱动,网络协议)也是以一个个模块提供的,这种模块叫内核对象,表现为一个个ko文件,linux有各种各样的文件系统,典型的xfs,ext4,这些系统对应的需要加载的内核模块来支持这些文件系统,就表现为ko文件
和kernel相关里面 包大致分2个文件/boot,/lib
initrd对应initramfs,rd对应的虚拟的磁盘(ramdisk)模拟的一个磁盘
ramfs(ramfilesystem)模拟的一个文件系统
数据存放在磁盘上,用户去访问,并不是访问磁盘得到,而是访问文件系统,通过文件系统去访问磁盘,如果模拟一个磁盘,去访问数据,无形中多了一部操作,效率偏低,而直接模拟成文件系统,把数据模拟到这个文件系统,效率更高,相当于少了一层

启动流程:
POST: Power-On-Self-Test,加点自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测、
   ROM: BIOS,Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自检程序等。
   RAM: CMOS互补金属氧化物半导体,保存各项参数的设定;按次序查找引导设备,第一个有引导程序的设备为本次启动设备
bootloader: 引导加载器,引导程序
   windows: ntloader,仅是启动OS
   Linux: 功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核
   LILO: Linux LOade,只能启动系统, 早期的系统用,已经淘汰
   GRUB: GRand Unified Bootloader
      GRUB 0.X:GRUB Legacy,GRUB2
MBR:
   446: bootloader, 64: 分区表,2: 55AA
GRUB:
  primary boot loader: 1st stage,1.5stage
  secondary boot loader: 2nd stage,分区文件
kernel:
自身初始化:
  探测可识别到的所有硬件设备
  加载硬件驱动程序(借助于ramdisk加载驱动)
  以只读方式挂载跟文件系统
  运行用户空间的第一个应用程序:/sbin/init
ramdisk:
**内核中的特性之一:**使用缓冲和缓存来加速对磁盘上的文件访问,并加载相应的硬件驱动
  ramdisk–>ramfs提高速度
  CentOS 5:initrd
    工具程序:mkinitrd
  CentOS 6,7:initramfs
    工具程序:mkinitrd,dracut
系统初始化:
  POST–>BooySequence(BIOS)–> Bootloader(MBR)–> kernel(radmdisk)–>rootfs(只读)–> init(systemd)
GRUB第一阶段2进制的放在446字节里,这部分内容来引导系统,然后尝试找boot分区
boot存放了一些和内核相关的文件

grub第二阶段是在boot/grub,表现为分区下目录里的多个具体文件
访问一个文件系统必须加载驱动
1.5阶段很关键,因为446字节放不下ext4驱动文件,所以要放在后面的扇区,
通过446字节找后1.5的驱动,然后找ext4模块

读取这个文件就开始找/(告诉内核跟在哪里,有配置文件/boot/grub/grub.conf)
找到操作系统的跟目录,下面sbin目录,找到init程序,系统第一个程序运行
但是有可能boot和/的文件系统不一样,挂载的时候,挂载/的时候,这个文件就告诉你/在哪里
就是挂载/的时候就已经告诉你boot在哪里了
跟的文件系统是单独解决的,是依靠boot里的/initramfs

所以破坏了这个文件系统就找不到跟了,这个文件等于虚拟的文件系统,可以加载一些必要的驱动,是装系统的时候临时生成的
vmlinux跟这个文件是什么时候创建的,不是创建系统的时候有的,是在centos光盘里就有

initrd:
   Linux初始RAM磁盘(initrd)是在系统引导过程中挂载的一个临时根文件系统,用来支持两阶段的引导过程。initrd文件中包含了各种可执行程序和驱动程序,它们可以用来挂载实际的根文件系统,然后再将这个 initrd RAM磁盘卸载,并释放内存。在很多嵌入式Linux系统中,initrd 就是最终的根文件系统。
什么是初始 RAM 磁盘
  初始RAM磁盘(initrd)是在实际根文件系统可用之前挂载到系统中的一个初始根文件系统。initrd与内核绑定在一起,并作为内核引导过程的一部分进行加载。内核然后会将这个 initrd文件作为其两阶段引导过程的一部分来加载模块,这样才能稍后使用真正的文件系统,并挂载实际的根文件系统。
  nitrd 中包含了实现这个目标所需要的目录和可执行程序的最小集合,例如将内核模块加载到内核中所使用的 insmod 工具。
  在桌面或服务器Linux 系统中,initrd 是一个临时的文件系统。其生存周期很短,只会用作到真实文件系统的一个桥梁。在没有存储设备的嵌入式系统中,initrd 是永久的根文件系统。
initrd 剖析
  initrd 映像中包含了支持 Linux系统两阶段引导过程所需要的必要可执行程序和系统文件。
  根据我们运行的 Linux 的版本不同,创建初始 RAM磁盘的方法也可能会有所不同。在 Fedora Core 3 之前,initrd 是使用loop设备 来构建的。loop设备是一个设备驱动程序,利用它可以将文件作为一个块设备挂载到系统中,然后就可以查看这个文件系统中的内容了。在您的内核中可能并没有loop设备,不过这可以通过内核配置工具(make menuconfig)选择 Device Drivers > Block Devices> Loopback Device Support 来启用。我们可以按照下面的方法来查看loop设备的内容(initrd文件的名字可能会稍有不同):
1.查看 initrd 的内容(适用于 FC3 之前的版本)

    mkdir temp ; cd temp
    cp /boot/initrd.img.gz .
    gunzip initrd.img.gz
    mount -t ext -oloopinitrd.img /mnt/initrd
    ls -la /mnt/initrd

  这样我们就可以查看 /mnt/initrd 子目录中的内容了,这就代表了 initrd文件的内容。注意,即使您的 initrd映像文件不是以 .gz 结尾,它也可能是一个压缩文件,您可以给这个文件添加上 .gz后缀,然后再使用 gunzip 对其进行解压。
  从 Fedora Core 3 开始,默认的 initrd 映像变成了一个经过压缩的cpio 归档文件。我们不用再使用loop设备来将 initrd 作为压缩映像进行挂载,而是可以将其作为 cpio 归档文件来使用。要查看cpio 归档文件的内容,可以使用下面的命令:
2. 查看 initrd 的内容(适用于 FC3 及其以后的版本)

mkdir temp ; cd temp
cp /boot/initrd-2.6.14.2.img initrd-2.6.14.2.img.gz
gunzip initrd-2.6.14.2.img.gz
cpio -i -d < initrd-2.6.14.2.img

  结果会生成一个很小的根文件系统,如 3 所示。在 ./bin 目录中有一组很少但却非常必要的应用程序,包括 nash(即 not a shell,是一个脚本解释器)、insmod(用来加载内核模块)和 lvm(逻辑卷管理工具)。
3. 默认的 Linux initrd目录结构

ls -la
drwxr-xr-x 10 root root 4096 May 7 02:48 .
drwxr-x--- 15 root root 4096 May 7 00:54 ..
drwxr-xr-x 2 root root 4096 May 7 02:48 bin
drwxr-xr-x 2 root root 4096 May 7 02:48 dev
drwxr-xr-x 4 root root 4096 May 7 02:48 etc
-rwxr-xr-x 1 root root 812 May 7 02:48 init
-rw-r--r-- 1 root root 1723392 May 7 02:45 initrd-2.6.14.2.img
drwxr-xr-x 2 root root 4096 May 7 02:48 lib
drwxr-xr-x 2 root root 4096 May 7 02:48loopfs
drwxr-xr-x 2 root root 4096 May 7 02:48 proc
lrwxrwxrwx 1 root root 3 May 7 02:48 sbin -> bin
drwxr-xr-x 2 root root 4096 May 7 02:48 sys
drwxr-xr-x 2 root root 4096 May 7 02:48 sysroot
#

3 有趣的是 init 文件就在根目录中。与传统的 Linux 引导过程类似,这个文件也是在将 initrd 映像解压到 RAM磁盘中时被调用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值