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 "\tWecome to \033[34m Mini Linux-2.6 OS\033[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 "\tWecome to \033[34m Mini Linux-2.6 OS\033[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
[ \033[32mOK\033[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

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

centos系统初始化流程及实现系统裁剪的更多相关文章

  1. Linux系统初始化流程

    POST-->BIOS(Boot Sequence)-->MBR(bootloader)-->Kernel(initrd)-->/sbin/init(/etc/inittab) ...

  2. SpringBoot源码修炼—系统初始化器

    SpringBoot源码修炼-系统初始化器 传统SSM框架与SpringBoot框架简要对比 SSM搭建流程 缺点: 耗时长 配置文件繁琐 需要找合适版本的jar包 SpringBoot搭建流程 优点 ...

  3. PHP新闻系统开发流程

    PHP新闻系统开发流程一.系统总体设计 (一)系统功能描述和功能模块划分 (二)系统流程分析 (三)系统所用文件二.数据库设计 (一)创建数据库 (二)设计表结构三.新闻发布模块开发 (一)新闻首页 ...

  4. centos 系统初始化

    centos 系统初始化 #!/bin/bash # author cfwl create date of 2012-10-21 # blog http://cfwlxf.blog.51cto.com ...

  5. Centos 7 x64 系统初始化

    前言 Hi,小伙伴们,系统初始化是运维工作中重要的一环,它能有效的提升工作效率,并且是标准化规范化的前提:它能省去要用时再去下载的麻烦,另外,还可以避免因未初始化引起的一些故障问题,可谓好处多多.系统 ...

  6. Linux系统初始流程

    一.0S(内核的功能):平台类软件(通用软件) 进程管理:进程调度器(scheduler)维持一个任务结构(task_struct) 内存管理:如何使用线性地址空间,如何分段,如何分页,如何避免内存( ...

  7. 9.Linux系统引导流程

    一.Linux系统引导流程 当我们按下主机电源键的那时候开始,主板上的CMOS/BIOS模块将进行固件自检,以此检查各个硬件是否正确连接. 在Linux引导流程中,一般可以分为以下几个主要过程: 1. ...

  8. Linux 系统初始化和服务

    系统的初始化和服务 1. Linux 系统启动流程 打开计算机,从主板 BIOS(Basic Input/Out System)读取其中所存储的程序,引导你找到存储系统的硬件(如光盘.硬盘等) 接下来 ...

  9. 详解linux系统的启动过程及系统初始化

    一.linux系统的启动流程 关于linux系统的启动流程我们可以按步进行划分为如下: POST加电自检 -->BIOS(Boot Sequence)-->加载对应引导上的MBR(boot ...

随机推荐

  1. [ZJOI2007]矩阵游戏——非常漂亮的二分图转化

    题意: 小 Q 是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个 N×N 黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作: ...

  2. 如何在通用权限管理系统中集成log4net日志功能

    开发人员都知道,在系统运行中要记录各种日志,自己写一个日志功能,无论是在效率还是功能扩展上来说都不是很好,目前大多用的是第三方的日志系统,其中一个非常有名,用的最多的就是log4net.下面是关于这个 ...

  3. springboot项目中jdk版本的问题

    几经周折,在idea中修改了多次jdk编译为1.8,可是一编译就恢复到默认的1.7版本. 在经过多次这个博客的修改内容: https://blog.csdn.net/li396864285/artic ...

  4. 紧急通知:Onion勒索病毒正在大范围传播!已有大量学生中招!(转)

    在5月12日晚上20点左右,全国各地的高校学生纷纷反映,自己的电脑遭到病毒的攻击,文档被加密,壁纸遭到篡改,并且在桌面上出现窗口,强制学生支付等价300美元的比特币到攻击者账户上.我们的一位成员和其多 ...

  5. WinForm ListView虚拟模式加载数据 提高加载速度

    将VirtualMode 属性设置为 true 会将 ListView 置于虚拟模式.控件不再使用Collection.Add()这种方式来添加数据,取而代之的是使用RetrieveVirtualIt ...

  6. CodeForces - 348D Turtles(LGV)

    https://vjudge.net/problem/CodeForces-348D 题意 给一个m*n有障碍的图,求从左上角到右下角两条不相交路径的方案数. 分析 用LGV算法.从(1,1)-(n, ...

  7. UESTC - 1167 一句话题意

    ---恢复内容开始--- 题目链接:https://vjudge.net/problem/UESTC-1167 请问从n*n的正方形左下角走到右上角且不越过对角线的情况总数模m的结果~ 分析: 还记得 ...

  8. 007、Docker 架构详解(2018-12-24 周一)

    参考https://www.cnblogs.com/CloudMan6/p/6763789.html     Docker核心组件包括:       Docker 客户端   Docker Clien ...

  9. 20155209 2016-2017-2 《Java程序设计》第九周学习总结 ## 教材学习内容总结

    教材学习内容总结 JDBC API 允许用户访问任何形式的表格数据,尤其是存储在关系数据库中的数据. 执行流程: •连接数据源,如:数据库. •为数据库传递查询和更新指令. •处理数据库响应并返回的结 ...

  10. Linux - 网络检测

    linux 利用bmon/nload/iftop/vnstat/iptraf实时查看网络带宽状况 .添加yum源方便安装bmon # rpm -Uhv http://apt.sw.be/redhat/ ...