系统启动和内核管理

Linux组成

  • Linux:kernel+rootfs

    • kernel:进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
    • rootfs:程序和glibc

      • 库:函数集合,function,调用接口(头文件负责描述)

        • 过程调用:procedure,无返回值;
        • 函数调用:function;有返回值,可以赋值于变量中;
      • 程序:二进制执行文件

    包括根目录以及包含/ boot,/ dev,/ etc,/ bin,/ sbin和some / tmp(用于临时文件)的最小的子目录和文件集。

  • 内核设计流派

    • 单内核(monoli kernel):Linux
      把所有功能集成于同一个程序
    • 微内核:(micro kernel):Windows,Solaris
      每种功能使用一个单独的子系统实现
  • 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

CentOS 5和6的启动流程

POST:Power-On-Self-Test

  • 加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测。
  • ROM:BIOS,Basic Input and Output System,保存着有关计
    算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等。

  • RAM:CMOS互补金属氧化物半导体,保存各项参数的设定

Boot Sequence

按次序查找引导设备,第一个有引导程序的设备为本次启动设备

  • bootloader: 引导加载器,引导程序

    • windows: ntloader,仅是启动OS

    • Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核;

      • LILO:LInux LOader;当时针对于的硬盘较小,故现在PC机上大多不适用,手机上使用较多;
      • GRUB: GRand Unified Bootloader

        1. GRUB 0.X: GRUB Legacy;
        2. GRUB 1.X:GRUB2;

      bootloader代码量很小,为了简化;使得其无法驱动软设备,也就无法访问设备上的文件;
      故内核文件不能放在逻辑卷上,只能放在基本的磁盘分区

  • MBR
    512bytes

    • 446: bootloader;
      64: 分区表;
      2: 55AA;
      查看二进制文件:hexdump -C /dev/sda -n 512
  • GRUB:

    • stage 1:mbr
    • stage 1.5:mbr之后的扇区,
      让stage 1中的bootloader能识别stage2所在的分区上的文件系统
    • stage 2:磁盘分区(/etc/grub/)
      配置文件:/boot/grub/grub.conf <– /etc/grub.conf
  • kernel:

    自身初始化:

    1. 探测可识别到的所有硬件设备;
    2. 加载硬件驱动程序(借助于ramdisk加载真正的根文件系统);
    3. 只读方式挂载根文件系统(rootfs);
      避免内核和操作系统有bug,故采用只读模式;
      当完成挂载后根所在的设备的bin、sbin、boot…;就是/bin、/sbin、/boot…
    4. 运行用户空间的第一个应用程序:/sbin/init
    • ramdisk:加载真正的根文件设备驱动程序
      内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问,并加载相应的硬件驱动

      • ramdisk –> ramfs 一种提速机制
      • CentOS 5: initrd
        工具程序:mkinitrd
        CentOS 6,7: initramfs
        工具程序:mkinitrd, dracut
      • ramdisk文件的制作:

        1. mkinitrd命令;为当前正在使用的内核重新制作ramdisk文件

          • –with=:除了默认的模块之外需要装载至initramfs中的模块;
          • –preload=:initramfs所提供的的模块需要预先装载的模块;

          mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)

        2. dracut命令;为当前正在使用的内核重新制作ramdisk文件
          dracut /boot/initramfs-$(uname -r).img $(uname -r)
    • init程序的类型:运行的第一个应用程序

      • SysV: init, CentOS 5之前
        配置文件:/etc/inittab

      • Upstart: init,CentOS 6
        配置文件:/etc/inittab;为了兼容centos5
        /etc/init/*.conf

      • Systemd:systemd, CentOS 7
        配置文件:/usr/lib/systemd/system
        /etc/systemd/system

系统初始化(内核级别)

  • POST –> 读取BIOS中的BootSequence,确定引导加载设备–>读取此设备的Bootloader(MBR中) –> kernel(ramdisk) –> rootfs(只读) –> /sbin/init(systemd)

CentOS 5:SysV init


  • 运行级别:为系统运行或维护等目的而设定;0-6:7个级别
    0:关机;init 0;不能设置为默认级别
    1:单用户模式(root自动登录), single, 维护模式
    2: 多用户模式,启动网络功能,但不会启动NFS(网络文件系统);维护模式
    3:多用户模式,完全功能模式;文本界面;
    4:预留级别;目前无特别使用目的,可同3级别
    5:多用户模式,完全功能模式;图形界面
    6:重启;init 6;不能设置为默认级别

    • 默认级别: 3, 5
      切换级别:init #
      查看级别:runlevel ; who -r
  • 配置文件:/etc/inittab
    每一行定义一种action以及与之对应的process
    id : runlevel : action : process

    • id:一个任务的标识符
    • runlevels:在哪些级别启动此任务;#,###,也可以为空,表示所有级别;
    • action:在什么条件下启动此任务

      • wait: 等待切换至此任务所在的级别时运行一次;
        respawn:一旦此process终止,就重新启动之;
        initdefault:设定默认运行级别;process省略
        sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit(centos 7 没有此脚本);
    • process:任务

init启动流程

  • 设定默认级别:/etc/inittab

    id:3:initdefault:
  • 设定系统初始化脚本:CentOS 5中是在/etc/inittab,CentOS 6中没有此信息,但脚本依旧在/etc/rc.d/rc.sysinit;

    si::sysinit:/etc/rc.d/rc.sysinit
    • 设置主机名;

      [root@centos6 rc.d]# grep network /etc/rc.d/rc.sysinit 
      if [ -f /etc/sysconfig/network ]; then
       . /etc/sysconfig/network
       # In theory there should be no more than one network interface active
       # Use the network address to set the hostname of the client.  This
       if [ -x /usr/sbin/system-config-network-tui ]; then
       /usr/sbin/system-config-network-tui
       # Reread in network configuration data.
       if [ -f /etc/sysconfig/network ]; then
       . /etc/sysconfig/network
      if [ -x /usr/sbin/system-config-network-cmd ]; then
           /usr/sbin/system-config-network-cmd --profile ${arg##netprofile=}
      
      [root@centos6 rc.d]# cat /etc/sysconfig/network
      NETWORKING=yes
      HOSTNAME=centos6.8
    • 设置欢迎信息;
    • 激活udev和selinux;
    • 挂载/etc/fstab文件中定义的所有文件系统;

      [root@centos6 rc.d]# grep /etc/fstab /etc/rc.d/rc.sysinit 
         # First try to mount scratch storage from /etc/fstab, then any
         # First try to mount persistent data from /etc/fstab, then any
         restorecon $(awk '!/^#/ && $4 !~ /noauto/ && $2 ~ /^\// { print $2 }' /etc/fstab) >/dev/null 2>&1
      action $"Enabling /etc/fstab swaps: " swapon -a -e
    • 检测根文件系统,并以读写方式重新挂载根文件系统

      [root@centos6 rc.d]# grep rw /etc/rc.d/rc.sysinit 
         rw_mount_dev=$(blkid -t LABEL="$RW_LABEL" -l -o device)
         elif [ x$rw_mount_dev != x ] && mount $rw_mount_dev $mountopts "$RW_MOUNT" > /dev/null 2>&1; then
         for file in /etc/rwtab /etc/rwtab.d/* /dev/.initramfs/rwtab ; do
             mount -t nfs $CLIENTSTATE/$HOSTNAME $STATE_MOUNT -o rw,nolock
         if [ "$opt" = "rw" ]; then
       action $"Remounting root filesystem in read-write mode: " mount -n -o remount,rw /
      
      其中:mount -n -o remount,rw
    • 设置时钟;
    • 根据/etc/sysctl.conf文件来设置内核参数;
    • 激活lvm及软raid设备;

      [root@centos6 rc.d]# grep change /etc/rc.d/rc.sysinit 
             action $"Setting up Logical Volume Management:" /sbin/lvm vgchange -a ay --sysinit --ignoreskippedcluster
    • 激活swap设备;
    • 加载额外设备的驱动程序;
    • 清理操作;
  • 启动对应级别的服务:

    在CentOS 5中的/etc/inittab文件中  
    
    l0:0:wait:/etc/rc.d/rc 0
    l1:1:wait:/etc/rc.d/rc 1
    ... ...
    l6:6:wait:/etc/rc.d/rc 6
    
    rc N -->意味着读取/etc/rc.d/rcN.d
    • /etc/rc.d/rcN.d/目录下的服务脚本控制服务(守护进程);
      这些目录下的K*或S*是/etc/rc.d/init.d/下对应的脚本的链接;

      CentOS 5或6:都在/etc/rc.d/rc
      
      for srv in /etc/rc.d/rcN.d/K*; do
           $srv stop
      done
      for srv in /etc/rc.d/rcN.d/S*; do
            $srv start
      done
      运行时:先执行K,再执行S;
         K*:要停止的服务; K##*:##运行次序;数字越小,越先关闭;数字越小的服务,通常为依赖别的服务的服务;
         S*:要启动的服务; S##*:##运行次序;数字越小,越先启动;数字越小的服务,通常为被依赖的服务
    • /etc/rc.d/init.d/*(/etc/init.d/*)服务脚本

      1. /etc/rc.d/init.d/*(/etc/init.d/*)服务脚本编写
        最好学习/etc/rc.d/init.d/*(/etc/init.d/*)系统脚本
        示例:

        #!/bin/bash
        #
        #chkconfig:35 98 01
        #description:test service
        case $1 in
        start)
            echo testsrv is stsrting
            touch /root/testsrv
            ;;
        stop)
            echo testsrv is stop
            rm -f /root/testsrv
            ;;
        status)
            [ -f /root/testsrv ] && echo testsrv is starting || echo testsrv is stoped
            ;;
        *)
            echo "testsrv usage:start|stop|status"
        esac
      2. /etc/rc.d/init.d/*(/etc/init.d/*)服务脚本执行方式

        /etc/init.d/SRV_SCRIPT{start|stop|restart|status}
        or
        service SRV_SCRIPT{start|stop|restart|status}
        
        [root@centos6 rc.d]# ll /etc/init.d /etc/rc.d/init.d -d
        lrwxrwxrwx. 1 root root   11 May 10 22:57 /etc/init.d -> rc.d/init.d
        drwxr-xr-x. 2 root root 4096 May 11 07:36 /etc/rc.d/init.d  
        
        直接运行/etc/init.d下的脚本 == service 
        例如:/etc/init.d/httpd status == service httpd status
      3. /etc/rc.d/init.d/*(/etc/init.d/*)服务脚本的删除
        chkconfig –del name
        rm -rf name
        chkconfig –list:查看是否删除
    • chkconfig命令:管控/etc/rc.d/init.d(/etc/init.d/)每个服务脚本在各级别下的启动或关闭状态;

      • 查看服务在所有级别的启动或关闭设定情形:
        chkconfig [–list] [name]
      • 添加:
        SysV的服务脚本放置于/etc/rc.d/init.d (/etc/init.d)
        chkconfig –add name

        1. 能被添加的服务的脚本定义格式之一:

          #!/bin/bash
          #LLLL 表示初始在哪个级别下启动,-表示都不启动
          # chkconfig: LLLL nn nn
          # description:
        2. 能被添加的服务的脚本定义格式之二:
          查看/etc/init.d/crond
      • 删除:
        chkconfig –del name
      • 修改指定的链接类型
        chkconfig [–level levels] name <on|off|reset>
        –level LLLL: 指定要设置的级别;省略时默认为2345
        仅下次开机时改变,目前不改变;
    • ntsysv命令:图形界面管理服务
    • service命令:手动管理服务

      • service 服务 start|stoprestart
      • service –status-all 查看当前所有服务状态
    • 瞬态(Transient)服务被xinetd进程所管理

      • 进入的请求首先被xinetd代理
        配置文件:/etc/xinetd.conf、/etc/xinetd.d/<service>
        与libwrap.so文件链接
        用chkconfig控制的服务:chkconfig tftp on
    • 注意:

      • 正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本
      • 不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中
      • /etc/rc.d/rc.local在指定运行级别脚本后运行
      • 可以根据情况,进行自定义修改
      • 当某个服务无法启动,导致系统无法启动,进入单用户模式下进行修改模,进行修复;
        但是,当单用户模式也无法启动时,进入菜单(a);

        1. 可将启动模式修改:init=/bin/bash;进入命令行操作
        2. 因为当第一次挂载根文件系统时是只读模式,修改为读写模式;mount -o remount,rm /
        3. 进行修复
  • 打印各启动终端:

    tty1:2345:respawn:/usr/sbin/mingetty tty1
    tty2:2345:respawn:/usr/sbin/mingetty tty2
    ...
    tty6:2345:respawn:/usr/sbin/mingetty tty6
    • mingetty会自动调用login程序
    • 打开虚拟终端的程序除了mingetty之外,还有诸如getty等
  • 如果默认级别是5级别的话会运行图形界面的启动:
    x:5:respawn:/etc/X11/prefdm -nodaemon

启动流程(用户空间):/sbin/init(/etc/inittab)

  • 设置默认运行级别 –> 运行系统初始化脚本,完成系统初始化 –> 关闭对应级别下需要关闭的服务,启动对应级别下需要启动服务 –> 设置登录终端 [–>启动图形终端]

启动流程(内核空间+用户空间)

  • POST –> Boot Sequence(BIOS) –> Boot Loader –>Kernel(ramdisk) –> rootfs –> switchroot –> /sbin/init –>(/etc/inittab, /etc/init/*.conf) –> 设定默认运行级别 –> 系统初始化脚本rc.sysinit –> 关闭或启动对应级别的服务 –> 启动终端(先是启动字符终端;如果运行级别是5,则启动图形界面)

CentOS 6


  • init程序:upstart,但依然为/sbin/init,其配置文件:

    • /etc/inittab(仅用于定义默认运行级别)

    • /etc/init/*.conf (其他的在这些文件中)

    *.conf遵循upstart风格的配置文件;

CentOS 7


  • init程序:systemd,配置文件:

    • /usr/lib/systemd/system/*
      /etc/systemd/system/*
  • 完全兼容SysV脚本机制;因此,service命令依然可用;不过,建议使用systemctl命令来控制服务;

    • systmctl {start|stop|restart|status} name[.service]

Grub

  • grub:GRand Unified Bootloader

    • grub 0.x:grub legacy
    • grub 1.x:grub2
  • grub legacy:

    • stage 1:mbr;不属于任何分区,是硬盘的mbr的前446字节;
    • stage 1.5:mbr之后的扇区,让stage 1中的bootloader能识别stage2所在的分区上的文件系统;
    • stage 2:磁盘分区(/etc/grub/)
      配置文件:/boot/grub/grub.conf <– /etc/grub.conf
      /boot/grub/中的

    • stage2及内核等通常放置于一个基本磁盘分区;

      • 功用:

        1. 提供菜单、并提供交互式接口

          • a:内核参数;
          • e:编辑模式,用于编辑菜单;
          • c:命令模式,交互式接口
        2. 加载用户选择的内核或操作系统
          允许传递参数给内核
          可隐藏此菜单
        3. 为菜单提供了保护机制
          为编辑菜单进行认证
          为启用内核或操作系统进行认证
    • 如何识别设备:
      (hd#,#)

      • hd#:磁盘编号,用数字表示;从0开始编号
      • #:分区编号boot分区所在,用数字表示;从0开始编号
    • cat /proc/cmdline 内核参数
      内核参数文档:/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt

    • grub的命令行接口

      • help:获取帮助信息
        help KEYWORD:详细帮助信息
      • find (hd#,#)/PATH/TO/SOMEFILE;
      • root (hd#,#)
      • kernel /PATH/TO/KERNEL_FILE:设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的命令行参数;
        如:init=/path/to/init , selinux=0
      • initrd /PATH/TO/KERNEL_FILE:设定为选定的内核提供额外文件的ramdisk;
      • boot:引导启动的内核;

      • 手动在grub命令行接口启动系统:

        1. grub> root (hd#,#)
        2. grub> ketnel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
        3. grub> initrd /initramfs-VERSION-RELEASE.img
        4. grub> boot
    • 配置文件:/boot/grub/grub.conf

      • 配置项:

        1. default=#:设定默认启动的菜单项;菜单项(title)编号从0开始;
        2. timeout=#:指定菜单项等待选项选择的时长;
        3. splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:Z指明菜单背景图片文件路径;

          • yum searrch ImageMagick
          • 生成.xpm:convert -resize 640×480 -colors 14 win.png win.xpm
          • more win.xpm
          • gzip win.xpm
          • 修改grub.conf中splashimage选项
        4. hiddenmenu:隐藏菜单;
        5. password [–md5|–encrypted] STRING:菜单编辑认证;
        6. title TITLE:定义菜单项“标题”

          • root (hd#,#):boot所在分区;grub查找stage2及ketnel文件所在设备分区;为grub的“根”;
          • kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核

            kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=472a74aa-d91e-4b79-844b-90415bdfb7c8  rhgb(启动时的图标)  quiet(静默,不显示启动过程)

          • initrd /PATH/TO/INITRAMFS_FILE:与内核匹配的ramfs文件;
          • password [–md5|–encrypted] STRING:启动选定的内核或操作系统时进行认证;
    • 生成grub口令

      • grub-md5-crypt :生成md5口令
      • grub-crypt :生成sha512口令
    • 破解root口令:
      启动系统时,设置其运行级别1;进入单用户模式
    • 进入单用户模式:
      (1) 编辑grub菜单(选定要编辑的title,而后使用e命令)
      (2) 在选定的kernel后附加
      1, s, S或single都可以
      (3) 在kernel所在行,键入“b”命令
    • 安装grub:

      1. grub-install:二进制类的文件可以恢复,图片、grub.conf的文件不会恢复。
        安装grub stage1和stage1_5到/dev/DISK磁盘上,并复制GRUB相关文件到 DIR/boot目录下
        grub-install –root-directory=DIR /dev/DISK
      2. grub:依赖于/boot/grub/中的除grub.conf之外的文件;
        grub> root (hd#,#)
        grub> setup (hd#)
      3. sync:强制写入硬盘
    • 在/boot/grub/目录下除grub.conf之外的其他文件都是备份文件,(/boot/grub/stage1内没有分区表):

      • 初始状态下grub使用的文件在硬盘的一个位置,而并非使用grub下的文件;系统启动使用的是grub.conf文件;
      • 但是在后期如果做过修复工作后,grub使用的是grub目录下的文件,所以此时grub不可使用

      实验:

      • 破坏stage1:

        • 备份:dd if=/dev/sda of=/app/mbr bs=1 count=512
        • 破坏:dd if=/dev/zero of=/dev/sda bs=1 count=446;;
        • 表现:stage1破坏后系统会直接进行光盘引导
        • 修复1:使用grub-install –root-directory=/ /dev/DISK
        • 修复2:不启动且此时/boot/grub/下的文件没有任何改动,可以使用grub修复;

          1. grub(hd0,0)
          2. setup(hd0)
      • 破坏stage1.5:

        • 破坏:dd if=/dev/zero of=/dev/sda bs=1 count=2048 skip=512 seek=512
        • 表现:跳过光盘引导,菜单不显示,说明破坏成功;
        • 修复:使用grub依赖于配置文件stage1、stage1.5、stage2

          1. grub>root (hd0,0)
          2. grub>setup (hd0)
      • 破坏stage2:

        • 破坏:把/boot/grub/下的所有文件都移除;
        • 修复:使用grub-install /dev/sda

          1. 修复完成后/boot/grub/中的文件会恢复,grub.conf不会恢复;要么copy、要么手写一份;

自制Linux

  • 分区并创建文件系统
    fdisk /dev/sdb
    分两个必要的分区
    /dev/sdb1对应/boot /dev/sdb2对应根 /
    mkfs.ext4 /dev/sdb1
    mkfs.ext4 /dev/sdb2

  • 挂载boot
    mkdir /mnt/boot 子目录必须为boot
    mount /dev/sdb1 /mnt/boot

  • 安装grub
    grub-install –root-directory=/mnt /dev/sdb

  • 恢复内核和initramfs文件
    cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/
    cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot

  • 建立grub.conf:
    vim /mnt/boot/grub.conf

    title newlinux
    root (hd0,0)
    kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 init=/bin/bash
    initrd /initramfs-2.6.32-642.el6.x86_64.img
  • chroot /mnt/sysroot

  • 创建一级目录
    mkdir /mnt/sysroot
    mount /dev/sdb2 /mnt/sysroot
    mkdir –pv /mnt/sysroot/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}

  • 复制bash和相关库文件

  • ldd查看程序所使用的的库文件
  • 复制相关命令及相关库文件
    如:ls,cat,vim,reboot,hostname等

救援模式

  • 在根文件系统无法使用时需要,如/bin/mount删除
    对系统没有特殊要求
    从光盘引导(boot.iso或者安装光盘#1)
    从USB盘(由boot.iso制作)引导

  • 文件系统重组
    Anaconda将会询问是否应该挂载文件系统
    /mnt/sysimage/*
    /mnt/stage2
    $PATH包括硬盘的目录

  • 文件系统节点
    提供系统特定的设备文件
    mknod了解major/minor

系统配置文件丢失修复

  • 系统在引导期间,很重要的一个过程就是init进程读取其配置文件/etc/inittab,启动系统基本服务程序及默认运行级别的服务程序完成系统引导,如果/etc/inittab误删除或修改错误,Linux将无法正常启动。此时,只有通过救援模式才可以解决此类问题。

    • 有备份文件的回复方法
      没有备份文件的恢复办法
  • 有备份文件的恢复办法:

    • 进入救援模式,执行chroot命令后,如果有此文件的备份(强烈建议系统中的重要数据目录,如/etc、/boot等要进行备份),直接将备份文件拷贝回去,退出重启即可。如果是配置文件修改错误,如比较典型的/boot/grub/grub.conf及/etc/passwd的文件修改错误,也可以直接修正恢复。假设有备份文件/etc/inittab.bak,则在救援模式下执行:

      • sh-3.1# chroot /mnt/sysimage
        sh-3.1# cp /etc/inittab.bak /etc/inittab
  • 没有备份文件的恢复办法

    • 如果一些配置文件丢失或软件误删除,且无备份,可以通过重新安装软件包来恢复,首先查找到/etc/inittab属于哪一个RPM包

      • ~]# chroot /mnt/sysimage
        ~]# rpm -qf /etc/inittab
        initscripts-9.03.49-1.el6.centos.x86_64
        ~]# exit 退出chroot模式
    • 挂载存放RPM包的安装光盘(在救援模式下,光盘通常挂载在/mnt/source目录下)
      ~]# mount /dev/sr0 /mnt/source

    • CentOS6系统的RPM包存放在光盘Package目录下,要修复的硬盘系统的根目录在/mnt/sysimage下,需要使用–root选项指定其位置。覆盖安装/etc/inittab文件所在的RPM包:
      ~]# rpm -ivh –replacepkgs | force /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm
      其中的rpm命令选项“–replacepkgs”表示覆盖安装,执行完成后,即已经恢复了此文件

    • 如果想只提取RPM包中的/etc/inittab文件进行恢复,可以在进入救援模式后,执行命令:
      ~]# rpm2cpio /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm| cpio -idv ./etc/inittab
      ~]# cp etc/inittab /mnt/sysimage/etc
      注意此命令执行时不能将文件直接恢复至/etc目录,只能提取到当前目录下,且恢复的文件名称所在路径要写完整的路径。提取文件成功后,将其复制到根分区所在的/mnt/sysimage目录下相应位置即可

/proc目录

  • /proc目录:
    内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出,还提供了一个配置接口,/proc/sys;

    • 参数:

      • 只读:输出信息
      • 可写:可接受用户指定“新值”来实现对内核某功能或特性的配置;/proc/sys,大多数只有root可写;
        /proc/sys:net/ipv4/ip_forward 相当于 net.ipv4.ip_forward

        1. sysctl命令:专用于查看或设定/proc/sys目录下参数的值;

          • 设置某参数
            sysctl -w parameter=VALUE
            sysctl -w path.to.parameter=VALUE
            sysctl -w kernel.hostname=mail.magedu.com
          • 查看所有生效参数
            sysctl -a
        2. 文件系统命令(cat、echo):命令通过重定向方式也可以修改大多数参数的值

          • 查看:cat /proc/sys/PATH/TO/SOME_KERNEL_FILE

          • 设定:echo “VALUE” > /proc/sys/PATH/TO/SOME_KERNEL_FILE
            echo “VALUE” > /proc/sys/path/to/parameter
            echo “websrv” > /proc/sys/kernel/hostname

        3. 配置文件:/etc/sysctl.conf,/etc/sysctl.d/*.conf
          通过重读取配置文件设置参数
          sysctl -p [/path/to/conf_file]
          注:上述两种方式的设定仅当前运行内核有效;

        4. 常用的几个参数:
          net.ipv4.ip_forward:核心转发功能;
          net.ipv4.icmp_echo_ignore_all
          vm.drop_caches :强制系统释放缓存
          kernel.hoestname:主机名
          net.ipv4.icmp_echo_ignore_all:忽略所有ping操作;

/sys目录

  • /sys目录:

    • sysfs:为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息;有些参数是可以修改的,用于调整硬件工作特性。

    • udev:通过此路径下输出的信息动态为各设备创建所需要设备文件,udev是运行用户空间程序,不能直接跟硬件打交道;专用工具:udevadmin, hotplug

    • udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d及/usr/lib/udev/rules.d目录下

编译安装内核

  • Linux:单内核体系设计,但充分借鉴了微内核设计体系的优点,为内核引入模块化机制

  • 内核组成部分:

    • kernel: 内核核心,一般为bzImage,通常在/boot目录下,名称为vmlinuz-VERSION-RELEASE;

    • kernel object: 内核对象,一般放置于/lib/modules/VERSION-RELEASE/

      • cat config-2.6.32-642.el6.x86_64内核模块与内核核心版本一定要严格匹配;
        [ ]: N,不设计成内核模块;
        [M]: M,Module;编译为内核模块
        [*]: Y,编译进内核核心
    • ramdisk:辅助性文件,并非必须,者取决于内核是否能直接驱动rootfs所在的设备;
      ranmdisk:是一个简装版的根文件系统;如果不需要进行根文件系统切换的话ramdisk也可使用;但是只能临时保存;

      • 借助ramdisk能够加载的内容:

        1. 目标设备驱动,如;SCSI设备的驱动;
        2. 逻辑设备驱动,如LVM设备的驱动;
        3. 文件系统,如xfs文件系统;
  • 内核信息获取
    uname命令:
    uname – print system information
    uname [OPTION]…

    • -n: 显示节点名称,主机名;
      -r: 显示VERSION-RELEASE;
      -a:显示所有信息
      -v:显示版本号,编译版本;

    文件:/boot/vmlinuz-VERSION-RELEASE

  • 模块信息获取

    • lsmod命令:
      显示由核心已经装载的内核模块
      显示的内容来自于: /proc/modules文件

      • 显示模块名称
      • 显示模块大小
      • 模块被引用次数
      • 被什么模块所引用
    • modinfo命令:
      显示模块文件的详细描述信息;
      读取/lib/modules文件;
      不指明显示当前已安装的内核中的模块信息;
      modinfo [ -k kernel ] [ modulename|filename… ]

      • -n: 只显示模块文件路径
        -p: 显示模块参数
        -a: author
        -d: description
        -l: license
        -F field: 仅显示指定字段的信息
  • 内核模块管理

    • modprobe命令:动态装载或卸载内核模块

      • modprobe [ -C config-file ] [ modulename ] [ moduleparame-ters… ]
      • 配置文件:

        1. -C:指明配置文件
        2. 默认是此文件:/etc/modprobe.conf,/etc/modprobe.d/*.conf
      • modprobe [ -r ] modulename…
    • depmod命令:
      内核模块依赖关系文件及系统信息映射文件的生成工具

    • 装载或卸载内核模块:

      • insmod命令:指定模块文件,不自动解决依赖模块
        insmod [ filename ] [ module options… ]
        filename:模块文件的文件路径

        insmod modinfo –n exportfs
        lnsmod modinfo –n xfs

      • rmmod命令:卸载模块
        rmmod [ module_name ]

        rmmod xfs
        rmmod exportfs

        insmod、rmmod组合使用

  • 编译内核

    • 前提:

      1. 准备好开发环境
      2. 获取目标主机上硬件设备的相关信息
      3. 获取目标主机系统功能的相关信息,例如:需要启用相应的文件系统
      4. 获取内核源代码包,www.kernel.org
    1. 开发环境准备

      • 包组(CentOS 6):
        开发库:Server Platform Development
        开发工具:Development Tools
      • 目标主机硬件设备相关信息:
        CPU:
        #cat /proc/cpuinfo
        #x86info -a
        #lscpu
    2. 硬件设备

      • PCI设备:

        • lspci
          -v
          -vv
        • lsusb
          -v
          -vv
        • lsblk 块设备
      • 了解全部硬件设备信息
        hal-device:CentOS6
    3. 内核编译安装系统

      • 安装开发包组
        下载源码文件
        .config:准备文本配置文件
        make menuconfig:配置内核选项
        make [-j #]
        make modules_install:安装模块
        make install :安装内核相关文件

        • 安装bzImage为/boot/vmlinuz-VERSION-RELEASE
          生成initramfs文件
          编辑grub的配置文件

      编译安装内核示例:
      tar xf linux-3.10.67.tar.xz -C /usr/src
      cd /usr/src
      ln -sv linux-3.10.67 linux
      cd /usr/src/linux
      cp /boot/config-$(uname -r) ./.config
      make help
      make menuconfig
      make -j 2
      make modules_install
      make install
      reboot

  • 编译内核

    1. 配置内核选项

      • 支持“更新”模式进行配置:make help
        (a) make config:基于命令行以遍历的方式去配置内核中可配置的每个选项
        (b) make menuconfig:基于curses的文本窗口界面
        (c) make gconfig:基于GTK (GNOME)环境窗口界面
        (d) make xconfig:基于QT(KDE)环境的窗口界面

      • 支持“全新配置”模式进行配置
        (a) make defconfig:基于内核为目标平台提供的“默认”配置进行配置
        (b) make allyesconfig: 所有选项均回答为“yes“
        (c) make allnoconfig: 所有选项均回答为”no“

    2. 编译
      全编译:make [-j #]
      编译内核的一部分功能:
      (a) 只编译某子目录中的相关代码
      # cd /usr/src/linux
      # make dir/
      (b) 只编译一个特定的模块
      # cd /usr/src/linux
      # make dir/file.ko

      例如:只为e1000编译驱动:
      make drivers/net/ethernet/intel/e1000/e1000.ko

    • 如何交叉编译内核:

      • 编译的目标平台与当前平台不相同
        # make ARCH=arch_name
    • 要获取特定目标平台的使用帮助

      • # make ARCH=arch_name help
        # make ARCH=arm help
    • 在已经执行过编译操作的内核源码树做重新编译需要事先清理操作:
      make clean:清理大多数编译生成的文件,但会保留config文件等
      make mrproper: 清理所有编译生成的文件、config及某些备份文件
      make distclean:mrproper、patches以及编辑器备份文件

    • 卸载内核

      • 删除/lib/modules/目录下不需要的内核库文件
        删除/usr/src/linux/目录下不需要的内核源码
        删除/boot目录下启动的内核和内核映像文件
        更改grub的配置文件,删除不需要的内核启动列表

原创文章,作者:s,如若转载,请注明出处:http://www.178linux.com/75506

(0)
ss
上一篇 2017-05-13
下一篇 2017-05-14

相关推荐

  • Linux入门之常见文本处理工具

    Linux入门之常见文本处理工具 文本内容查看命令 cat   tac    rev  more  less   head   tail 普通文本查看 cat  tac  rev cat 命令 cat  [option]…

    Linux干货 2016-08-08
  • Linux 磁盘、文件系统管理

    Linux 磁盘、文件系统管理                                               &nb…

    Linux干货 2016-09-01
  • Linux 第一周总结

    一、描述计算机的组成及其功能。 计算机组成是由软件和硬件组成的。 硬件部分由cpu、主板、存储器、输入输出设备组成 Cpu:主要是解释计算机指令以及处理计算机软件中的数据。 主板:是微机最基本的也是最重要的部件之一,一般有BIOS芯片、I/O控制芯片、键和面板控制开关接口、指示灯插接件、扩充插槽、主板及插卡的直流电源供电接插件等元件。 存储器:是存储程序和各…

    2017-07-02
  • Week 1 计算机组成

    I. 引 Introduction     在学习计算机技术之前,了解计算机的组成是非常必要的。这不仅可以让你对硬件有一个大概的了解,而且会让你将来对基于硬件运行的软件有一个更为透彻的理解。只有理解了计算机是如何协调它的部件来工作的才方能理解人们为何这样设计操作系统和程序。 I. 计算机部件 The Essential…

    Linux干货 2016-06-11
  • bash特性及bash脚本编程初步

    bash特性之命令hash 之前我们讲过用户在执行一个命令的时候bash会遍历环境变量$PATH中所有路径来查找执行文件。而命令hash是用来缓存之前用户使用过的命令下次执行的时候直接搜索hash缓存来减少对$PATH变量中路径的遍历次数,从而提高系统运行效率 hash:hash命令     hash:列出 &nbsp…

    Linux干货 2016-12-20
  • 用户管理相关

    安全3A:     资源分配:       authentication:认证       authorization 授权       accouting|audition 审计 用户分为(centos7):   管理员:root 0 &…

    Linux干货 2017-02-25