您的位置:首页 > 运维架构 > Linux

Linux系统启动过程及简单的安装包制作

2016-12-06 15:31 281 查看
一.Linux系统启动过程
BIOS->MBR->GRUB->LINUX裸内核->init进程
1.BIOS:硬件启动BIOS。管理所有的硬件设备,它会对电脑的硬件设施进行完全彻底的检验和测试,传送或接受各种外部设备的数据,布局各个设备的中断号,使得CUP能准确的响应设备中断。BIOS有一个对外部存储设备的排序记录,决定了下一阶段从哪个设备读取MBR,这些设备的顺序可以在BIOS中设置(启动设备)

2.MBR:master boot record主引导记录。MBR|DPT|BRID一共512字节,合称为Boot Sector引导扇区。
DPT磁盘分区表,只有64字节;BRID引导记录标识,只有2字节;MBR一共446字节位于开头段.MBR一定位于
硬盘的0道0头1扇区的前446字节上,不属于任何分区。BIOS的最后运行阶段就是检查BRID的值是否是0X55AA,
如果不是,当然就死机啦;如果是,就将Boot Sector 512字节读到内存的0x7c00,然后跳转到这里执行MBR。
我们知道在BIOS界面中是可以配置系统的启动盘的,所以这个启动盘的开头段必须存在一个MBR。
MBR太小了,它的作用只是把存储在该存储设备中(MBR,GRUB,操作系统一般在同一存储设备)的操作系统自己的引导程序读入内存并跳转到操作系统的引导程序。本身与任何操作系统无关。

3.GRUB : grand unified bootloader 牛逼的统一引导加载器,属于BootLoader的一种。提供可供用户选择加载的操作系统选项,并加载操作系统。grub是可配置的。

4.LINUX裸内核:grub引导完成之后,就要执行Linux内核了,包括加载硬件驱动,初始化网络堆栈等。最后将调用init程序(sbin/init) ,这是内核空间初始化完成了,init将执行用户空间的初始化。

5.init进程(sbin/init):init的初始化过程可以分成通用初始化和运行级别初始化。通用初始化主要是对主机名,文件系统,
udev,时钟,驱动,键盘布局,等进行初始化;运行级别初始化是针对运行级别0-6作不同的初始化,从而在不同的
运行级别上有不同的表现。程序的初始化脚本统一放在/etc/init.d/目录下,然后在/etc/rc
.d/对应的n运行
级别的目录下创建相应格式的链接,链接名为[K|S][NUM][文件名] 如S99ondemand->../init.d/ondemand
表示在start启动时按顺序第99个执行S99ondemand脚本;K01cermonger表示在系统关闭时执行的文件。用户可以/etc/init.d/下创建初始化脚本然后在
/etc/rc
.d/下创建软链接。所有/etc/rc
.d/下的脚本其实都是通过/etc/init.d/rc脚本来执行的,所有该脚本在开机关机时都会被调用。
/etc/init.d/rc.local会被每一种运行级别执行,因为他在/etc/rc
.d/下都被链接了,所有可以考虑在该文件中配置ip地址。
关于6种运行级别: who -r查看当前运行级别;init n 改变运行级别
0-halt,关闭系统,不能作为默认运行级别
1-single user mode 单用户模式,类似于安全模式
2-Multiuser,whiout NFS 与3类似,但是没有联网模式
3-Full Multiuser mode 全功能的多用户模式
4-unused 保留
5-X11 带有图像用户界面的全功能多用户模式
6-reboot 重新启动,不能作为默认运行级别

6.init进程完成之后,将进入用户登录界面
用户登录时将执行/home/username/.profile文件
当启动终端时将执行/home/username/.bashrc文件

二.简单的安装包制作
制作简单的安装包的时候可以简单的用cat命令连接两个文件,然后头部是脚本文件,执行的时候把下面的文件分解出来就行了。一般这个后部分的文件是个压缩 包,那样,就能够打包很多文件了,在脚本中解压出来即可。这就是Linux那些bin啊run啊等安装脚本的简单制作了。下面来看看两个简单的例子:

run程序安装包实质上是一个安装脚本加要安装的程序,如下图所示:
|—————–|
| |
| 安装脚本 |
| |
|—————–|
| |
| 程序 |
| |
|—————–|
图: run安装包的结构
这样整个run安装包结构就一目了然了,实际上因为实际需要结构多少有点变动但这个无关紧要,只需要明白原理就行了。
制作run安装包以下举个实际的例子:
为了简单起见,要安装的程序就是helloworld程序,安装它的过程就是把它拷贝到/bin目录下。

现在有一个安装脚本了,名为install.sh,有一个要安装的程序helloworld.因为要安装的程序一般都是用.tar.bz2来做的。我们这儿也做一下:
tar -zcvf helloworld.tar.gz helloworld
现在修改一个安装脚本install.sh
改为:
#!/bin/bash
lines=7 #这个脚本共有6行
tail -n +${lines} $0 > /tmp/helloworld.tar.gz
tar -zxvf /tmp/hellowrold.tar.gz
cp helloworld /bin/
exit 0
然后使用cat命令连接安装脚本install.sh和helloworld.tar.bz2。
$ cat install.sh helloworld.tar.gz > myinstall.run
这样就得到了myinstall.run文件,它的结构如下:
|——————| 第1行
| |
| install.sh |
| | 第6行
|——————|
| | 第7行
|helloworld.tar.bz2 |
| |
|——————| 结尾
图: myinstall.run安装包的结构
运行myinstall.run时,运行到第6行的exit 0脚本就退出了,所以不会去运行第7行以下的二进制数据,而我们用了tail巧妙地把第7行以下的数据重 新生成了一个helloworld.tar.gz文件。再执行安装。
run安装包制作较小的程序包是很好的选择,但是它也有缺点,做逻辑比较复杂的安装包,写的安装脚本将会很麻烦。因此此时还是用其他的安装包更好。
(查找当前文件的某行#END_END_END_END/!p,并输出其后的内容)
if ! sed -n -e '1,/^#END_END_END_END/!p' $0 >tmp.tgz 2>/dev/null; then
echo "ERROR: extract tar.gz failed"
exit -1
fi
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  启动盘 record master