系统的启动流程;
POST加电自检–>Boot Sequence(BIOS)–>Boot Loader(MBR)–>kernel(Ramdisk)–>rootfs–>switchroot–>/sbin/init–>/etc/inittab /etc/init.d/*.conf–>设定默认启动级别–>系统初始化脚本–>关闭或启动对应级别下的服务–>启动终端
grub:Grand Unified Bootloader
grub 0.x:grub legacy
grub 1.x:grub2
grub legacy:
stage1:mbr
stage1_5:mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统
stage2:磁盘分区/boot/grub/
grub的配置文件:/etc/grub.conf–>/boot/grub/grub.conf
stage2及内核通常放置于一个基本磁盘分区上:
1.提供启动菜单,并提供交互式接口
a.内核参数
b.编辑模式,用于编辑菜单
c.命令模式,交互式接口
2.加载用户选择的内核或操作系统
允许传递参数给内核
可以藏菜单启动项
3.为菜单提供了保护机制
为编辑启动菜单进行认证
为启用内核或操作系统进行认证
如何获取设备
(hd#,#)
hd#:磁盘编号,用数字表示,从0开始编号
#:分区编号,用数字表示,从0开始编号
grub的命令行接口
help:获取帮助列表
help keyword:详细帮助信息
find(hd#,#) /path/to/somefile
root (hd#,#)
kernel /path/to/kernel_file:设定本次启动时用到的内核文件;额外还可以添加许多内核使用的cmdline参数
如:init=/path/to/init ,selinux=0
initrd /path/to/initramfs_file:设定为选定的内核提供额外的ramdisk
boot:引导启动选定的内核
手动在grub命令行接口启动系统:
当系统中的grub文件损坏时,除了对文件进行编辑操作进行修复,我们也可以通过COMMAND Line的模式自己手动进行grub的配置
grub>root(hd#,#)
grub>kernel /vmlinuz-version-release ro root=/dev/device
grub>initrd /initramfs-version-release.img
grub>boot
配置文件:
/etc/grub/grub.conf
配置项:
Default=#:设定默认启动的菜单项,菜单项(title)编号从0开始
Timeout=#:指定菜单项等待用户选择的时长
Splashimage=(hd#,#)/path/to/xpm_pic_file:指明菜单背景图片文件路径
Hiddenmenu:隐藏菜单
password [–md5] STRING:菜单编辑认证
title TITLE:定义菜单项“标题”,可出现多次
root (hd#,#):grub查找stage2及kernel文件所在设备分区,即’grub’的根
kernel /path/to/vmlinuz_file[parameters]:启动的内核,为grub的根
initrd /path/to/initramfd_file:内核匹配的ramfs文件
password [–md5] STRING:启动选定的内核或操作系统式进行认证
grub-md5-crypt命令:
该命令可以是用简单的加密算法md5对明文进行加密
进入单用户模式:
1. 编辑grub菜单(选定要编辑的title,而后使用e命令);
2. 在选定的kernel后附加
1,s,S,single
3. 在kernel所在行,键入b命令
安装grub:
1.grub-install
grub-install –root-directory=dir /dev/disk
2.grub
grub>root(hd#,#)
grub>setup(hd#)
SITUATION ONE:
当系统启动stage1过程出现问题,即MBR上前446个字节出现问题,系统不能正确读取数据,导致系统无法正常启动,解决方案:
首先挂载光盘
由于系统无法读取MBR,所以直接进入光盘启动界面,选择救援模式
切换当前的根至系统实际的根分区上:chroot /mnt/sysimage
使用命令grub-install /dev/device 来修复受损的MBR,然后重启系统
出现这个画面表示系统已经能够成功启动了,只需要等待系统扫描完成就可以了。
SITUATION TWO
在系统进行MBR引导启动时,如果在stage1.5阶段出现问题时,即MBR扇区第一个512字节读取完后,后面的数据遭到了损坏,无法读取,系统也无法启动,这是我们可以进行如下的操作将系统恢复正常:
可以看到,512字节(55 aa)之后的数据都被擦出了,然后重启系统
同样系统启动不了,因为破坏了stage1.5,从而系统无法获取/boot分区挂载的相关数据信息
同样,我们选择光盘的救援模式,进入之后,查看下挂载情况,切换根,同样使用grub-install命令加上要修复的磁盘,进行修复,修复完成后重启系统
SITUATION THREE
当系统在执行stage2过程中出现问题,如/boot下grub的配置文件配置错误或者误删了,我们可以除了通过使用光盘挂载来恢复系统,也可以使用网络中的主机进行修复,具体步骤如下:
如果有网络源,我们可以通过配置IP,选择通过网络上的某台主机来恢复
选择网卡设备,设置IP地址,如果是通过dhcp服务自动获取IP,就不需要设置IP,直接通过dhcp服务获取
另开启一个终端,可以查看ip获取情况
通过df命令,我们可以看到系统的根分区被挂载在/mnt/sysimage上,当前我们是在光盘的根目录下,所以我们要切换至系统实际的根目录下,使用命令chroot /mnt/sysimage,然后我们可以通过使用远程拷贝命令:scp remote:/boot/* /boot/ 将受损的文件替换掉,但要注意,我们远程链接的主机的操作系统应该和我们当前主机的操作系统一致。
SITUATION FOUR
预想一个更严重的情况,当我们删除了/boot分区,破坏扇区,然后将/etc/fstab文件也删除了,这种情况下,我们的系统根本就不可能起的来了
此时,我们进去救援模式,此时系统提示已经找不到任何分区,无法识别分区
进入bash,使用df查看到没有系统的分区,可以使用fdisk查看到硬盘分区情况
创建目录,然后将进行挂载,然后切换根,创建/etc/fstab文件,将最根本的两个分区挂载信息写入该文件中/boot和/ ,然后重启系统
重启系统后,可以自动挂载分区,这时我们需要安装kernel包,因为之前我们删了/boot目录,挂载光盘,安装kernel包,然后重启
再次进入救援模式,使用grub-install –root-directory=/mnt/sysimage /dev/sda3 ,如果使用了chroot切换了根目录,那么可以不指定root-directory,因为,我们现在已经位于boot的父目录上,root-directory指定的是boot的父目录,然后编写boot/grub/grub.conf文件,如下:
重启系统:
SITUATION FIVE
当然有些情况下,我们系统的使用的并不是常规的磁盘分区,而是采用的逻辑卷进行分区,安装操作系统,这时,如果上述的某个stage过程出现问题,导致系统无法正常启动,我们也可以通过如下的操作,来修复我们的系统
当系统不能正常启动时,我们应先挂载光盘,然后进入rescue救援模式,这边我们以最坏的情况做演示,如图所示,
现在系统已经无法正确识别分区,使用df命令,我们也无法看到系统中的逻辑卷,也无从得知卷组,逻辑卷名称,这时我们需要先对磁盘进行扫描lvscan,来获取具体有哪些逻辑卷,然后我们可以使用vgchange -ay来激活这些逻辑卷,然后再使用lvscan扫描,这时我们可以看到这些逻辑卷的状态由inactive变为active
然后我们需要创建对应的目录进行挂载,然后将逻辑卷挂载到创建的目录上
,然后“切换”根,不是cd,进入到系统上的根目录下,我们创建/etc/fstab文件,将最重要的两个分区写入文件中,/boot 和 / ,然后重启系统,重启之后,系统就能够识别到挂载的分区,然后我们就可以对照上述的情况,采取对应的操作来使系统恢复正常。
使用rpm命令修复受损的内核
使用grub-install 命令修复受损的grub,然后创建grub.conf文件,将相应的配置信息写进文件中
重启,系统就可以正常运作了
在原有系统的基础上,做一个微型linux
1.先准备一块新硬盘
2.使用echo ‘- – -’ > /sys/class/scsi_host/host0/scan
3.对硬盘进行分区,进行格式化,然后分别挂载到对应目录下
4.安装grub grub-install –root-directory=/mnt /dev/sdd
5.编辑grub.conf文件
vim /mnt/boot/grub/grub.conf
6.复制内核及initramfs文件
7.配置fstab文件
8.复制相关命令
9.重开个虚拟机,以该硬盘作为启动盘,开启系统
Linux:单内核设计,但充分借鉴了微内核体系的设计的优点,为内核引入了模块化机制
内核的组成部分:
kernel:内核核心,一般为bzimage,通常位于/boot目录。名称为vmlinuz-version-release
kernel object:内核对象,即内核模块,一般放置于/lib/modules/version-release/
内核核心与内核模块版本一定要严格匹配;
[]:N
[M]:modules
[*]:Y,直接编译至内核核心
内核:动态装载和卸载
ramdisk:辅助性文件,并非必须,取决于内核是否能直接驱动rootfs所在的设备
目标设备驱动,例如SCSI设备的驱动
逻辑设备驱动,例如LVM设备的驱动
文件系统,例如xfs文件系统
ramdisk:是一个简装的根文件系统;
内核信息查看:
uname命令:print system information
-r:内核的发行好
-n:显示主机名
模块信息获取
lsmod:显示的内核来自于/proc/modules
modinfo命令:显示单个内核模块文件的信息
modinfo [-F field] [-k kernel] [modulename|filename…]
-F field 仅显示指定字段信息
-n 显示文件路径
modprode : add and remove modules from the linux kernel
格式:modprobe [-r] module_name
模块的动态装载 modprobe module_name
动态卸载 modprobe –r module_name
depmod命令:Generate modules.dep and mod files
内核模块依赖关系文件及系统信息的生成工具
模块的装载和卸载的另一组命令
insmod:
insmod [filename] [module options…]
Filename 模块文件的文件路径
rmmod:
rmmod [module_name]
ramdisk文件管理
(1)mkinitrd命令
为当前使用中的内核重新制作ramdisk文件
mkinitrd [option] [<initrd-image>] <kernel-version>
–with=<module> 除了默认的模块之外需要装载至initramfs中的模块
–preload=<module> initramfs所提供的模块需要预先装载的模块
实例:mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
(2)dracut命令
low level tool generating an initramfs image
dracut [option…] [<image>] [<kernel version>]
dracut /boot/initramfs-$(uname -r).img $(uname -r)
内核信息输出的伪文件系统
/proc 内核状态和统计信息的输出接口;同时,还提供一个配置接口/proc/sys
参数:
只读:信息输出 例如/proc/#/*
可写:可接受用户指定一个“新值”来实现对内合谋功能或特性的配置 /proc/sys
/proc/sys:
net/ipv4/ip_forward 相当于net.ipv4.ip_forward
(1)sysctl命令:专用于查看或设置/proc/sys目录下的参数的值
sysctl [options] [variable[=value]]
查看:
#sysctl –a
#sysctl variable
#cat /proc/sys/path/to/some_kernel_file
修改:
#sysctl –w variable=value
(2)文件系统命令(cat echo)
查看
# cat /proc/sys/path/to/some_kernel_file
设定
#echo “value” > /proc/sys/path/to/some_kernel_file
注意:上述两种方式的设定仅当前运行内核有效
(3)配置文件 /etc/sysctl.conf /etc/sysctl.d/*.conf
sysctl –p [/path/to/config_file]立即生效
内核参数
net.ipv4.ip_forward 报文核心转发功能
vm.drop_caches 回收内存 /proc/sys/vm/drop_caches丢弃caches
kernel.hostname
net.ipv4.Icmp_echo_ignore_all 禁止其他主机ping
/sys目录
sysfs:输出内核识别的各硬件设备的相关属性,也有内核对硬件特性的可设置参数,对此写参数的修改,即可定制这些硬件的工作特性
udev:通过读取/sys目录下的硬件设备信息按需为各硬件设备创建设备文件
udev:是用户空间程序 专用工具devadmin hotplug
udev:为设备创建设备文件时,会读取事先定义好的的规则文件,一般在/etc/udev/rules.d/目录下,以及在/usr/lib/udev/rules.d/目录下
编译内核-定制个人LINUX
step1: 从官网上选择一个内核版本下载至本地系统中
step2: 对下载到的包进行解压缩,指定解压的路径至:/usr/src下,tar xvf linux-*.gz -C /usr/src
step3: 拷贝一个配置文件的模板至解压缩的目录下,以.config命名
step4: 使用make menuconfig命令进行个人定制,选择自己所需要的功能组件,对于那些不需要的功能,我们可以选择不加载到模块或者内存中,使用空格键进行选择,M表示加载到模块中,*表示加载到内存中,我们也可以自己设定kernel的名称
step5:make -j #
#:指明处理器核心总数,推荐使用并行编译,加快编译速度
lscup可以查看cpu数量:
step6:编译完成后,模块安装
make modules_install
安装之后,我们可以看到/lib/modules文件下,多了一个模块,这就是我们刚刚编译安装的模块
进入到目录中,我们可以找到自己个人定制的一些功能模块
step7:安装内核对应文件
安装完成后,在/boot目录下,就多了一个刚编译的内核核心
查看/boot/grub2/grub.cfg,可以看到新的内核信息已经写入到该文件中,之后重启系统就可以看到增加了一个新的内核
选择新编译的内核,启动
系统正常启动
至此,个人定制linux系统制作完成
原创文章,作者:Stupid_L,如若转载,请注明出处:http://www.178linux.com/45867