zoukankan      html  css  js  c++  java
  • centos系统初始化流程及实现系统裁剪


    Linux系统的初始化流程:

    POST:ROM+RAM


    BIOS: Boot Sequence


    MBR:
    446:bootloader
    64: 分区表
    2: 5A


    kernel文件:基本磁盘分区


    /sbin/init
    /lib/modules/


    initrd: 
    rd: ram disk


    /sbin/init:
    /etc/inittab
    /etc/rc.d/rc.sysinit脚本




    init:
    CentOS 5: SysV格式的系统初始化程序
    串行化:100
    A --> B --> C
    A()
    CentOS 6: Upstart
    dbus
    A
    B
    C
    SystemD: 参考OS X中并行初始化的过程




    运行级别:

    0-6: 7个级别
    0:关机
    1: 单用户模式, 直接以root用户登录
    2:多用户模式,不支持NFS文件系统
    3:完全多用户模式,文本模式
    4:预留级别
    5:完全多用户模式,图形模式
    6:重启


    /sbin/init的配置文件:

    每行定义一种操作:
    id: 操作的ID
    runlevels: 在哪些级别下执行此操作
    action: 动作
    initdefault: 设置默认运行级别,无需定义操作
    sysinit:指定系统初始化脚本
    si::sysinit:/etc/rc.d/rc.sysinit
    wait: 等待系统切换至此级别时运行一次;
    ctrlaltdel: 定义组合键被按下时要运行的命令;
    respawn: 当指定操作进程被关闭时立即再启动一次;
    tty1:2345:respawn:/sbin/mingetty tty1
    process: 操作


    /etc/inittab中定义的操作:

    设定默认运行级别
    指定系统运行的初始化脚本
    启动指定级别下的要启动的服务,并关闭需要停止的服务
    定义CtrlAltDel组合的动作
    初始化字符终端

    启动图开终端

    /etc/inittab:
    CentOS5: 每一行定义一个操作
    CentOS6: upstart 脚本


    init要完成的任务:
    设定默认运行级别
    指定系统运行的初始化脚本
    启动指定级别下的要启动的服务,并关闭需要停止的服务
    /etc/init.d/  
    /etc/rc.d/rcN.d  (0-6)
    S##
    K##
    定义CtrlAltDel组合键的动作
    初始化字符终端:
    终端:对应的是设备
    /dev/tty#, /dev/ttyS#, /dev/console, /dev/pts/#
    调用:login-->/etc/issue
    启动图形终端:
    X-Window, 桌面管理器


    系统初始化脚本/etc/rc.d/rc.sysinit
    设置主机名
    打印文本欢迎信息
    激活SELinux和udev
    激活swap
    挂载/etc/fstab定义的本地文件系统
    检测根文件系统并对其以读写方式重新挂载
    设置系统时钟
    装载键盘映射
    根据/etc/sysctl.conf设置内核参数
    激活RAID和LVM设备
    清理操作


    MBR: 
    bootloader: 程序
    LILO:LInux LOader
    不能引导位于1024 Cylinder以后的分区中的OS;
    GRUB: GRand Unified Bootloader
    1st stage: 位于MBR中,为了引导2nd stage
    1.5 stage: 位于boot基本磁盘分区中,为识别内核文件所在的文件系统提供文件系统识别扩展
    2nd stage: 位于boot基本磁盘分区中,GRUB的引导程序
    boot分区大小:
    CentOS5: 100M
    CentOS6: 200M


    /boot/grub/
    stage2: 配置文件
    grub.conf


    Grub的功能:
    1、选择要启动的内核或系统;
    能隐藏选择界面
    2、交互式接口
    e: 编辑模式
    3、基于密码保护
    启用内核映像;
    定义在相应的title下
    传递参数(进入编辑模式)
    定义在全局段中




    grub接口:
    title: 操作系统或内核的标题
    root: 设定内核文件所在的分区为grub的根
    kernel: 定义要使用的内核文件,后面可附加传递给内核的启动参数
    initrd: 指定为内核提供额外驱动等功能的ram disk或ram fs文件




    init的级别1的表示方式:
    1, s, single, S
    单用户模式几乎不会启动任何服务,且不需要用户登录;但是会执行/etc/rc.d/rc.sysinit脚本;
    如是连/etc/rc.d/rc.sysinit文件也不加载,则传递 emergency


    运行级别的切换:
    # init [0-6]


    查看运行级别:
    # runlevel
    # who -r


    grub.conf配置文件语法:
    default=#: 指定默认启动的内核或OS;
    timeout=#: 等待用户选择要启动的内核或OS的时长,单位为秒;
    splashimage=/path/to/splashimage_file: 指定使用的背景图片
    hiddenmenu: 隐藏菜单
    title
    root (hd0,0)
    (Device, Part)
    Device表示方式: 在grub中,统统以hd开头,并紧跟一个数字做各磁盘设备的标记,从0开始编号 
    Part表示方式:代表分区,从0开始编号
    kernel
    指定内核文件及传递给内核的参数
    参数:ro root=/path/to/DEVICE quiet
    initrd
    文件:通常为cpio归档,并使用gzip压缩;通常以.img作为文件名后缀;




    grub的安装:
    第一种方式:
    # grub
    grub> root (hd#,#)
    grub> setup (hd#)
    grub> quit


    第二种方式:
    # chroot /mnt/sysimage
    # grub-install --root-directory=/  /dev/sda


    实用案例:

    1.给系统启动程序加密grub及系统启动

    a.使用命令将需要设置的密码加密

    # grub-md5-crypt

    b.将加密后的内容添加到启动文件中


    2.模拟grub.conf文件被损坏的情况

    # cd /boot/grub

    # mv grub.conf grub.conf.bak

    # reboot


    grub>root (hd0,0)


    grub>kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/vg0-root


    grub>initrd /initramfs-2.6.32-431.el6.x86_64.img


    grub>boot



    3.模拟mbr被损坏并修复

    # dd if=/dev/zero of=/dev/sda bs=100 count=1
    # sync




    # chroot /mnt/sysimage
    进入grub命令行
    # grub
    grub> root (hd0,0)
    grub> setup (hd0)
    grub> quit


    重启即可


    4.模拟制作迷你linux系统



    ①添加硬盘,并分区格式化


    # fdisk /dev/sdb
    分两个主分区,格式化
    # mke2fs -t ext4 /dev/sdb1
    # mke2fs -t ext4 /dev/sdb2


    ②创建模拟的boot和sysroot目录并挂载
    # mkdir /mnt/{boot,sysroot} -pv


    挂载
    # mount /dev/sdb1 /mnt/boot
    # mount /dev/sdb2 /mnt/sysroot


    ③安装grub
    # grub-install --root-directory=/mnt /dev/sdb


    拷贝boot启动文件
    # cp /boot/vmlinuz-2.6.32-431.el6.x86_64 /mnt/boot/vmlinuz
    # cp /boot/initramfs-2.6.32-431.el6.x86_64.img /mnt/boot/initramfs.img


    创建系统目录
    # cd /mnt/sysroot/
    # mkdir -pv etc/rc.d boot dev proc sys tmp var usr lib lib64 bin sbin srv root home mnt media


    ④创建拷贝系统文件的脚本文件
    vim cpbin.sh
    =================================


    #!/bin/bash
    #
    target=/mnt/sysroot


    clearCmd() {
      if which $cmd &> /dev/null; then
            cmdPath=`which --skip-alias $cmd`
      else
            echo "No such command"
            return 5
      fi
    }


    cmdCopy() {
            cmdDir=`dirname $1`
            [ -d ${target}${cmdDir} ] || mkdir -p ${target}${cmdDir}
            [ -f ${target}${1} ] || cp $1 ${target}${cmdDir}
    }


    libCopy() {
            for lib in `ldd $1 | grep -o "/[^[:space:]]{1,}"`; do
                    libDir=`dirname $lib`
                    [ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}
                    [ -f ${target}${lib} ] || cp $lib ${target}${libDir}
            done
    }


    while true; do
      read -p "Enter a command: " cmd
      if [ "$cmd" == 'quit' ] ;then
            echo "quit"
            exit 0
      fi
      clearCmd $cmd
      [ $? -eq 5 ] && continue


      cmdCopy $cmdPath
      libCopy $cmdPath
    done


    =================================


    执行bash cpbin.sh
    将常用的命令:cat、ls、mkdir、watch、vi、cp、mv拷贝到/mnt/sysroot下


    切换目录
    # chroot /mnt/sysroot/
    # ls


    # cd /mnt/sysroot/bin/
    # ln -sv bash sh



    ⑤添加启动grub.conf文件
    vim /mnt/boot/grub/grub.conf


    default 0
    timeout=5
    title Test mini Linux Centos
            root (hd0,0)
            kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/bin/bash
            initrd /initramfs.img




    ⑥将该硬盘挂载至新的系统,启动即可


    使用init文件启动的方式来启动系统

    ①编辑init启动文件
    # vim /mnt/sysroot/sbin/init


    =================================
    #!/bin/bash
    #
    #打印欢迎信息
    echo -e " Wecome to 33[34m Mini Linux-2.6 OS33[0m"
    #挂载两个伪文件系统;-t后面跟文件系统类型
    mount -n -t proc proc /proc
    mount -n -t sysfs sysfs /sys
     #启动后再以读写方式重新挂载/dev/sda2上,这样的话就要把宿主机关机再后再新运行这个小系统了
    mount -n -o remount,rw /dev/sda2 /
    #运行bin下的bash
    /bin/bash
    =================================
    添加执行权限
    # chmod +x /mnt/sysroot/sbin/init


    ②编辑vim /mnt/boot/grub/grub.conf


    =================================
    default=0
    timeout=5
    title Test mini Linux Centos
            root (hd0,0)
            kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/sbin/init
            initrd /initramfs.img
    =================================


    ③为虚拟机系统添加网络功能
    mkdir /mnt/sysroot/lib/modulues
    # cp /lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/modulues/


    接下来我们要在小系统里装载网卡、但是要确保被装载的网卡驱动没有使用、我们可以用lsmod这个命令查看一下:这里以e1000为例来说明问题、我这里的虚拟机上已经装有了、那我就先卸载了再装载上去:


    在宿主机上查看当前内核装载的模块信息:
    # lsmod


    卸载e1000网卡驱动:
    # modprobe -r e1000


    要装载的话用下面命令即可:
    # modprobe e1000


    那怎么样把e1000的内核模块拷贝到我们的小系统里面里、让他装上去、并且启用网络功能呢、首先确保我们系统中的piv4没有做成模块,这里我们的ipv4没有做成模块、那就去移植这个模块吧:
    首先给他创建一个目录、切换到/mnt/sysroot/lib目录中:
    # mkdir modules


    再拷贝我们系统上的内核模块到这个目录里去
    # cp /lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/modules/


    再移植一些所需要用到的命令:insmod、rmmod、ifconfig、ip、ping


    同步一下我们就可以重新启动小系统了
    # sync


    进到小系统里、敲命令吧;
    # insmod /lib/modules/e1000.ko
    # ifocnfig eth0 176.16.251.100/16
    # ping -c 3 176.16.251.100



    也可以通过系统启动自动加载网卡的方式来启动网络功能

    vim /mnt/sysroot/sbin/init

    ===========================

    #!/bin/bash
    #
    #打印欢迎信息
    echo -e " Wecome to 33[34m Mini Linux-2.6 OS33[0m"
    #挂载两个伪文件系统;-t后面跟文件系统类型
    mount -n -t proc proc /proc
    mount -n -t sysfs sysfs /sys
    insmod /lib/modulues/e1000.ko
    [ $? -eq 0 ] && echo -e "Load e1000 module successed [ 33[32mOK33[0m ]"
    ifconfig lo 127.0.0.1/8
    ifconfig eth0 192.168.8.43/24


     #启动后再以读写方式重新挂载/dev/sda2上,这样的话就要把宿主机关机再后再新运行这个小系统了
    mount -n -o remount,rw /dev/sda2 /
    #运行bin下的bash
    /bin/bash

    ===========================

  • 相关阅读:
    企业云盘安全性如何 怎样部署
    Sentinel 控制台部署
    nginx代理静态页面添加二级目录
    java socket
    IDEA
    golang代码生成器
    es 单节点问题
    代码模板
    错误摘要 HTTP 错误 403.14
    安装.Net Framework 4.6.2无法安装的2种情况
  • 原文地址:https://www.cnblogs.com/reblue520/p/6239852.html
Copyright © 2011-2022 走看看