CentOS 6启动流程:
POST --> |
加电自检 |
Boot Sequence(BIOS) --> |
根据bootsequence定义的启动次序(BIOS定义), |
Boot Loader (MBR) --> |
逐一搜索带有启动功能的设备,找到这个设备然后找到bootloader(MBR中) |
Kernel(ramdisk) --> |
显示一个菜单,让用户选择内核或者系统版本,加载用户选择的内核kernel(借助于ramdisk完成加载根文件系统的操作) |
rootfs --> |
kennel能识别真正根文件系统rootfs, |
switchroot --> |
并且做根切换switchroot |
/sbin/init --> |
运行真正/sbin/init |
(/etc/inittab, /etc/init/*.conf) --> |
根据配置文件(Centos6为例(/etc/inittab, /etc/init/*.conf)给出的设定 |
设定默认运行级别 --> |
|
系统初始化脚本 --> |
|
关闭或启动对应级别下的服务 --> |
启动终端 |
加载用户所选择的的内核,某个磁盘某个分区某个文件(关键)
grub: GRand Unified Bootloader
grub 0.x: grub legacy
grub 1.x: grub2
grub legacy:
stage1: mbr 安装在MBR中
stage1_5: mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统;
stage2:磁盘分区(/boot/grub/) (不但有stage还有ramdisk,即加载内核文件的原因)
配置文件:/boot/grub/grub.conf <-- /etc/grub.conf(链接文件)
功用:
(1) 提供菜单、并提供交互式接口
e: 编辑模式,用于编辑菜单;
c: 命令模式,交互式接口;
(2) 加载用户选择的内核或操作系统
允许传递参数给内核
可隐藏此菜单
(3) 为菜单提供了保护机制
为编辑菜单进行认证
为启用内核或操作系统进行认证
(hd#,#)
hd#: 磁盘编号,用数字表示;从0开始编号
#: 分区编号,用数字表示; 从0开始编号
(hd0,0) 第一个磁盘的第一个分区
进入grub命令行,在当前界面按C键
grub>find (hd0,0)/vmlinux-2.6.32-504.e16.x86_64
通过设定根root在hd(0,0)
find后面直接可以跟文件名
设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的cmdline参数;
例如:init=/path/to/init, selinux=0,quiet
设定为选定的内核提供额外文件的ramdisk;
grub> root (hd#,#) #指名根设备
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE #(ro:只读。)
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot
root:设置hd00为根
kernel:设置的内核文件
initrd:补充性的ramdisk文件
:/boot/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]:启动的内核
initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件;
password [--md5] STRING: 启动选定的内核或操作系统时进行认证;
[root@localhost~]# vim /etc/grub.conf
启用第一个内核
按E编辑
主界面
启用第二个内核
输入密码
正常启动
进入单用户模式:
(1) 编辑grub菜单(选定要编辑的title,而后使用e命令);
(2) 在选定的kernel后附加
1, s, S或single都可以;
(3) 在kernel所在行,键入“b”命令;
完整安装(1阶段2阶段都安装,会找/boot/grub)
grub-install --root-directory=ROOT /dev/DISK
注意:--root-directory=/mnt : 这个位置必须指定为boot目录所在的父目录,grub会自行在父目录中找到boot目录,然后把grub程序安装到对应的目录中,一般情况在挂载新预备安装gurb的硬盘时,需要在文件系统上建立一个boot目录,再把对应的磁盘挂到boot目录中,这样grub才会找到boot目录,在下面建立所需的文件,如果挂载时不创建boot目录,那和以grub会在目录下创建boot目录,启动时需要将kernel和initrd的位置就应该为/boot/vmliunz格式
grub> root (hd#,#)
grub> setup (hd#,#)
1.给第二块硬盘装grub
2.给没有安装grub的系统安装(系统可能通过U盘或者光盘的grub启动)
3.双系统。(先装windows,在装linux)windows坏了重装了windows就会linux没了
(1)创建分区、格式化分区、使用分区
(2)创建/boot目录以及他的相关配置文件等
修改grub.conf 配置文件
(3)创建/sysroot/ 系统根目录,以及他的所需必要文件夹
(4)复制/bin/bash 到/sysroot/bin下
(5)访问
1.通过channge root登录
2.通过创建的硬盘使用bash
如果需要跑起来,需要添加两个指令
Kernel /vmlinux ro root=/dev/sda3 selinux=0 init=/bin/bash
登录虚拟机
dd命令:convert and copy a file
用法:
dd if=/PATH/FROM/SRC of=/PATH/TO/DEST
bs=#:block size, 复制单元大小;
count=#:复制多少个bs;
磁盘拷贝:
dd if=/dev/sda of=/dev/sdb
备份MBR
dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
破坏MBR中的bootloader:
dd if=/dev/zero of=/dev/sda bs=256 count=1
给备机装grub
备份以及破坏grub,重启就坏了
(1)第一种恢复方式,直接安装grub
(2)第二种方式,通过直接修改grub
指名设备有grub目录,必须先有stage文件stage1 stage2 不然不成功
①通过光盘进入紧急救援模式
②Rescure install system 救援已装系统
按ESC 然后输入linux rescure(效果是一样的)
紧急救援模式会找一找是有否装操作系统
如果找到,会将根挂载到紧急救援模式的linux的/mnt/sysimage下 ,
可以到这个目录下找到所有文件
ldd命令:
- print shared library dependencies
ldd [OPTION]... FILE...
Linux:单内核设计,但充分借鉴了微内核体系的设计的优点;为内核引入了模块化机制;
kernel:内核核心,一般为bzImage,通常位于/boot目录,名称为vmlinuz-VERSION-release;
kernel object:内核对象,即内核模块,一般放置于/lib/modules/VERSION-release/
内核模块与内核核心版本一定要严格匹配;
[ ]:N 不编译此功能
[M]:Module 编译成模块,编译时再用到,需要装载
[*]:Y,编译进内核核心,内核在功能在
内核:动态装载和卸载;
ramdisk:辅助性文件,并非必须,这取决于内核是否能直接驱动rootfs所在的设备;
目标设备驱动,例如SCSI设备的驱动;
逻辑设备驱动,例如LVM设备的驱动;
文件系统,例如xfs文件系统;
ramdisk:是一个简装版的根文件系统;
uname命令:
- print system information
格式:uname [OPTION]...
-r:内核的release号
-n:主机名
-a:所有信息
文件:/boot/vmlinuz-VERSION-release
- Show the status of modules in the Linux Kernel
显示的内核来自于/proc/modules
- Show information about a Linux Kernel module
显示一个linux 单个模块文件详细信息
其通过/lib/modules/[KERNEL-VERSION]/modules/下的所有文件进行分析并显示的,默认情况下在内核modules编译安装的时候,会在其目录下生成所有modules的依赖关系等,建立对应的索引信息
modinfo [-F field] [-k kernel] [modulename|filename...]
-F field: 仅显示指定字段的信息;
-n:显示文件路径;
- Add and remove modules from the Linux Kernel
模块动态装载和卸载
格式:modprobe [-r] module_name
模块的动态装载:modprobe module_name
动态卸载:modprobe -r module_name
- Generate modules.dep and map files.
内核模块依赖关系文件的生成工具;
模块的装载和卸载的另一组命令:
insmod命令:装载
insmod [filename] [module options...]
filename:模块文件的文件路径;
rmmod命令:卸载
rmmod [module_name]
为当前使用中的内核重新制作ramdisk文件:
# mkinitrd [OPTION...] [
--with=
--preload=
示例: ~]# mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
- low-level tool for generating an initramfs image
# dracut [OPTION...] [
示例: ~]# dracut /boot/initramfs-$(uname -r).img $(uname -r)
参数:
只读:信息输出;例如/proc/#/*
可写:可接受用户指定一个“新值”来实现对内核某功能或特性的配置;/proc/sys/
/proc/sys:
net/ipv4/ip_forward 相当于 net.ipv4.ip_forward
专用于查看或设定/proc/sys目录下参数的值;
sysctl [options] [variable[=value]]
查看:
# sysctl -a
# sysctl variable
修改其值:
# sysctl -w variable=value
查看:
# cat /proc/sys/PATH/TO/SOME_KERNEL_FILE
设定:
# echo "VALUE" > /proc/sys/PATH/TO/SOME_KERNEL_FILE
注意:上述两种方式的设定仅当前运行内核有效;一旦重启参数会丢失
立即生效的方式:sysctl -p [/PATH/TO/CONFIG_FILE]
net.ipv4.ip_forward:核心转发;
vm.drop_caches:手动回收内存(0,1, 2)
kernel.hostname:主机名;
net.ipv4.icmp_echo_ignore_all:忽略所有ping操作;
sysfs:输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的可设置参数;对此些参数的修改,即可定制硬件设备工作特性;
udev:通过读取/sys目录下的硬件设备信息按需为各硬件设备创建设备文件;udev是用户空间程序;专用工具:devadmin, hotplug;
udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d/目录下,以及/usr/lib/udev/rules.d/目录下;