系统启动和内核管理

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)
上一篇 2017-05-13 22:33
下一篇 2017-05-14 09:20

相关推荐

  • OpenStack Glance安装配置过程记录

    Glance是作为OpenStack的虚拟机的Image(镜像)服务, 它提供了一系列的REST API, 用来管理、查询虚拟机的镜像, 它支持多种后端存储介质, 例如用本地文件系统作为介质、Swift(OpenStack Object Storage)作为存储介质或者S3兼容的API作为存储介质。 Glance作为OpenStack的一个核心的系统, 被设…

    2017-09-14
  • M20 – 1- 第三周博客(1):Linux用户、组

    Linux是个多用户多任务的分时操作系统,因此要使用系统资源的用户都必须先向系统管理员申请一个账号,然后以这个账号的身份进入系统。用户的账号一方面能帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问与限制,并为用户提供安全性保护。每个用户账号都拥有一个惟一的用户名(UID)和用户口令(PASSWD)。用户在登录时键入正确的用户名和口令后,才能…

    Linux干货 2016-08-04
  • linux 下的文件压缩与解压

    文件压缩 压缩原理:把文件的二进制代码压缩,把相邻的0,1代码减少,比如有000000,可以把它变成6个0 的写法60,来减少该文件的空间。 目的:时间换空间,cpu时间–>空间 压缩文件工具:    compress|uncompress 压缩后的文件.z    gzip|gunzip  …

    Linux干货 2016-08-21
  • linux iptables替代工具nftables

    1 使用 FirewallD 构建动态防火墙 1.1 “守护进程” 1.2 静态防火墙(system-config-firewall/lokkit) 1.3 使用 iptables 和 ip6tables 的静态防火墙规则 1.4 什么是区域? 1.4.1 预定义的服务 1.4.2 端口和…

    Linux干货 2015-03-11
  • 马哥教育网络第21期-第十一周课程练习

    1、详细描述一次加密通讯的过程,结合图示最佳。 A和B进行通信 A发送数据:A使用单向加密算法获得数据的特征码,把特征码附加到数据的尾部,A使用对称加密算法对数据进行加密。A使用B发过来的公钥对A的对称加 密算法加密密钥进行加密,附加到数据后面。 B接收方:B使用自己的私钥对数据进行解密。得到A的对称密钥,对对称密钥解密获得数据的特征码,B使用单向加密算法获…

    Linux干货 2016-12-26
  • linux任务管理与计划

    linux系统作业控制的命令:     job(作业):一个作业通常包含多个命令(也有可能只包含一个),联合起来由单个小程序组合,完成复杂任务,对Linux而言作业有两种;前台作业和后台作业        前台作业(forgroud):通过终端启动,且启动后会…

    Linux干货 2016-09-13