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系统初始化流程及实现系统裁剪的更多相关文章
-
Linux系统初始化流程
POST-->BIOS(Boot Sequence)-->MBR(bootloader)-->Kernel(initrd)-->/sbin/init(/etc/inittab) ...
-
SpringBoot源码修炼—系统初始化器
SpringBoot源码修炼-系统初始化器 传统SSM框架与SpringBoot框架简要对比 SSM搭建流程 缺点: 耗时长 配置文件繁琐 需要找合适版本的jar包 SpringBoot搭建流程 优点 ...
-
PHP新闻系统开发流程
PHP新闻系统开发流程一.系统总体设计 (一)系统功能描述和功能模块划分 (二)系统流程分析 (三)系统所用文件二.数据库设计 (一)创建数据库 (二)设计表结构三.新闻发布模块开发 (一)新闻首页 ...
-
centos 系统初始化
centos 系统初始化 #!/bin/bash # author cfwl create date of 2012-10-21 # blog http://cfwlxf.blog.51cto.com ...
-
Centos 7 x64 系统初始化
前言 Hi,小伙伴们,系统初始化是运维工作中重要的一环,它能有效的提升工作效率,并且是标准化规范化的前提:它能省去要用时再去下载的麻烦,另外,还可以避免因未初始化引起的一些故障问题,可谓好处多多.系统 ...
-
Linux系统初始流程
一.0S(内核的功能):平台类软件(通用软件) 进程管理:进程调度器(scheduler)维持一个任务结构(task_struct) 内存管理:如何使用线性地址空间,如何分段,如何分页,如何避免内存( ...
-
9.Linux系统引导流程
一.Linux系统引导流程 当我们按下主机电源键的那时候开始,主板上的CMOS/BIOS模块将进行固件自检,以此检查各个硬件是否正确连接. 在Linux引导流程中,一般可以分为以下几个主要过程: 1. ...
-
Linux 系统初始化和服务
系统的初始化和服务 1. Linux 系统启动流程 打开计算机,从主板 BIOS(Basic Input/Out System)读取其中所存储的程序,引导你找到存储系统的硬件(如光盘.硬盘等) 接下来 ...
-
详解linux系统的启动过程及系统初始化
一.linux系统的启动流程 关于linux系统的启动流程我们可以按步进行划分为如下: POST加电自检 -->BIOS(Boot Sequence)-->加载对应引导上的MBR(boot ...
随机推荐
-
Hdoop日记Day10---RPC机制
一.RPC(Remote Procedure Call)简介 RPC 是远程过程调用(Remote Procedure Call),即远程调用其他虚拟机中运行的javaobject.RPC 是一种客户 ...
-
[转]在Eclipse中使用JUnit4进行单元测试(高级篇)
通过前2篇文章,您一定对JUnit有了一个基本的了解,下面我们来探讨一下JUnit4中一些高级特性. 一.高级Fixture 上一篇文章中我们介绍了两个Fixture标注,分别是@Before和@Af ...
-
在iis中注册.net framework
首先定位到文件夹:cd C:\Windows\Microsoft.NET\Framework\v4.0.30319 执行命令:aspnet_regiis.exe -i
-
c语言的一些基础知识
c语言作为经典语言,这里不再多说了.咱从基础一起探讨吧! 一. 定义一个整型,如果作为局部变量,没有初始化的情况下,它是一个随机的值的,一般情况下输出会是0,但这个0是作为垃圾值的;而如果作为全局变量 ...
-
Xshell下漂亮的开发环境配置
今天折腾了一天Xshell配置Linux命令行开发环境. 总结几点: 1.Xshell配色方案,这是我自己调的个人使用版,网上比较好的版本有Solarized Dark,可以下载到. [ColorFo ...
-
virtualbox, vt-s, rmmod kvm-intel
http://blog.sina.com.cn/s/blog_4e7b97f00100fltu.html装完后,去下个jdk,坑爹的Oracle非要让老子注册,试了几次都没有成功,密码不合格拉,邮箱已 ...
-
java变量和作用域以及成员变量的默认初始化
Java中的变量有成员变量和局部变量,定义在类中方法之外的变量成为成员变量或者成员字段(域),表示一个类所具有的属性,定义为类的成员变量的变量的作用于是整个类,该变量在定义的时候不需要初始化,在使用前 ...
-
将centos的yum源修改为阿里云的yum源
CentOS系统更换软件安装源 第一步:备份你的原镜像文件,以免出错后可以恢复. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentO ...
-
自动生成构造方法、getter、setter
前言 一直很想知道IDE是如何自动去生成类的构造和getter.setter方法,大概是有个想法,获取当前的类,利用反射去获取属性名和类型,然后生成,所以我想自己试试. 写个模板类 package ...
-
这样学习C语言最有效(高级技巧)——共勉
第一章 学习C语言的起跑线 1.1 C语言已死? 本资料描述的是使用C语言的高级技巧,力求将你的C语言能力由"基础"提升为"高级".但是学习态度胜过学习方法,在 ...