因6和7俩个系列的启动流程有区别,因此我把他们分开来写linux
linux可看做是内核和根文件系统组成咱们把内核单独拿出来总结一下shell
首先总结一下整体的流程,接下来展开来叙述:POST加电自检 -- MBR(0扇区前446个字节为GRUB第1阶段) -- (在1扇区后存放GRUB第1.5阶段)GRUB(第2阶段)-- 加载内核(vmlinuz,initramfs)-- 启动第一个进程(init ;/etc/ini/*.conf init 程序的配置文件)-- 读取/etc/inittab文件来决定进入的系统级别 -- 执行/etc/rc.d/rc.sysinit脚原本初始化系统 -- 使用/etc/rc.d/rc脚原本根据当前所在的系统级别来读取对应/etc/rc#.d/下的脚本 -- K开头的脚本不启动,S开头的脚本启动,启动顺序按后边跟的数子大小来决定 -- 最后执行的脚本/etc/rc.d/rc.local -- 启动/bin/login进程来启动登陆程序 --- OK!apache
Power-On-Self-Test:加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统等硬件状况的检测。c#
BIOS:Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等。安全
CMOS:保存主板的设置时间等参数,依靠主板上的CMOS纽扣电池。bash
引导加载器,Windows使用的bootLoader是ntloader,只能够引导Windows系统;Linux使用的bootloader早期有LILO(LInux LOader),如今6系列用的GRUB0.97版,7系列使用的是GRUB2。服务器
grub总共分为三个阶段:cookie
功用:网络
grub的配置文件(/boot/grub/grub.cfg)框架
default=0 #默认title timeout=5 #grub菜单选择超时时间 splashimage=(hd0,0)/grub/splash.xpm.gz #grub菜单背景图片 hiddenmenu #隐藏grub选择菜单 password --md5 | ----encrypted 口令 #加密方式和口令,为grub加密防止进如单用户模式修改密码,口令使用下面的命令生成
# grub-md5-crypt 生成MD5的密码 # grub-crypt 生成sha12的密码
title Red Hat Enterprise Linux 6 (2.6.32-642.el6.x86_64) root (hd0,0) #指定的是/boot所在磁盘的分区"hd0,0"表示第一块磁盘的第一个分区 kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=e1d36be7-5027-4847-9d80-135ac9fb798e rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet #向内核传递的cmdline参数 initrd /initramfs-2.6.32-642.el6.x86_64.img #指定initramfs文件的所在路径,注意:(这里的"/"相对的是/boot分区)
若是grub损坏咱们能够用下面命令修复
grub-install --root-directory=DIR /dev/DISK --root-directory=DIR:根目录
若是grub配置丢失了怎么办:
在开机的时候会进入grub的命令行接口,可是没法找到内核和ramdisk,因此咱们手动指定参数和路径就能够启动系统了。
help: 获取帮助列表 help KEYWORD: 详细帮助信息 find (hd#,#)/PATH/TO/SOMEFILE: root (hd#,#) kernel /PATH/TO/KERNEL_FILE: 设定本次启动时用到的内核文件;额外还可添加许多内核支持使用的cmdline参数 initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk boot: 引导启动选定的内核
分别指定root(指的是/boot分区),kernel指定内核,initrd指定ramdisk文件,而后boot就能够启动系统了,进入系统后从新编辑/boot/grub.cfg文件来修复问题
在grub第2阶段的时候只能识别到/boot分区,这个时候内核开始初始化,探测完硬件后开始须要去找根,可是这时尚未驱动程序,因此这个时候须要借助ramdisk来驱动硬件。在CentOS5系列中文件名为/boot/inird,6和7已经改为initramfs。
initramfs中也提供了一个根文件系统,其中包括了硬件必须的驱动,到了这步内核借助这个虚根文件系统来挂载真正的根文件系统。
initramfs文件是在安装系统时按当前的环境来生成的。
若是这个文件损坏了咱们也可使用工具来修复:
# mkinitrd /boot/initramfs-`uname -r`.img `uname -r` 为当前正在使用的内核从新制做ramdisk文件
init程序启动系统的第一个进程init,它负责建立系统启动后的全部服务进程
init程序的类型:
初始化的相关文件:
id:3:initdefault:
start on control-alt-delete exec /sbin/shutdown -r now "Control-Alt-Delete pressed"
init #:切换至#级别
runlevel:查看当前的运行级别和上一运行级别
示例:进入单用户模式
1)在启动过程当中看到Booting 。。。的倒计时字样按下esc键
2)按a键修改启动参数,在quiet后加1(单用户模式)
3)按回车键启动,进入单用户模式,能够直接修改root的密码,或者能够修改一些其余服务配置文件错误致使的系统没法进入正常模式的操做。
由/etc/rc.d/rc脚本控制服务脚本启动仍是非启动
for i in /etc/rc$runlevel.d/S* ; do # Check if the subsystem is already up. subsys=${i#/etc/rc$runlevel.d/S??} [ -f /var/lock/subsys/$subsys ] && continue [ -f /var/lock/subsys/$subsys.init ] && continue check_runlevel "$i" || continue # If we're in confirmation mode, get user confirmation if [ "$do_confirm" = "yes" ]; then confirm $subsys rc=$? if [ "$rc" = "1" ]; then continue elif [ "$rc" = "2" ]; then do_confirm="no" fi fi update_boot_stage "$subsys" # Bring the subsystem up. [ -n "$UPSTART" ] && initctl emit --quiet starting JOB=$subsys if [ "$subsys" = "halt" -o "$subsys" = "reboot" ]; then export LC_ALL=C exec $i start fi $i start [ -n "$UPSTART" ] && initctl emit --quiet started JOB=$subsys done
rc脚本读取/etc/rc.d/rc#.d/下的全部脚本,以K开头的服务脚本不启动,以S开头的服务脚本启动。
/etc/rc.d/rc#.d/下的全部脚本都是/etc/rc.d/init.d/下的脚本的符号链接,连接名由chkconfig管理。
/etc/rc.d/rc.local:在全部启动脚本执行完成后执行此脚本,能够把不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中。
全部服务启动完成后启动登陆程序(/bin/login)。
CentOS 6 init程序为: upstart, 其配置文件:/etc/inittab, /etc/init/*.conf,配置文件的语法 遵循 upstart配置文件语法格式,和CentOS5不一样。
chkconfig
service 服务名 { start | stop | restart }
ntsysv:字符界面工具,用来设置开启自启的服务
CentOS7与6版本的不一样之处:
主要介绍一下grub2和systemd吧,其余的启动流程几乎同样
一、/etc/default/grub :grub配置文件模板
GRUB_TIMEOUT=5 #grub菜单选项超时时间 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved #grub菜单默认选择的title GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="rhgb quiet" #向内核传递的cmdline参数 GRUB_DISABLE_RECOVERY="true"
二、/boot/grub2/grub.cfg :grub配置文件,建议使用如下命令生成
# grub2-mkconfig -o /boot/grub2/grub.cfg
三、在救援模式下修复grub2
# chroot /mnt/sysimage # grub2-install /dev/sda # grub2-mkconfig -o /boot/grub2/grub.cfg
四、在grub命令行启动系统(grub2配置文件损坏的状况下)
> insmod xfs > set root=(hd0,1) > linux16 /vmlinux-... root=/dev/sda2 selinux=0 > initrd16 /initramfs-...
系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其它进程。
Systemd新特性:
表示不一样类型的systemd对象
/usr/lib/systemd/system:每一个服务最主要的启动脚本设置,相似于6系列的/etc/init.d/目录的功能
/run/systemd/system:系统执行过程当中所产生的服务脚本
/etc/systemd/system:管理员创建的执行脚本,功能相似于6系列中/etc/rc.d/rcN.d/Sxx目录的功能
类型:
service unit文件格式
[Unit] #定义与Unit类型无关的通用选项 Description=The Apache HTTP Server #描述信息 After=network.target remote-fs.target nss-lookup.target #依赖服务,定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与Before相反 Documentation=man:httpd(8) Documentation=man:apachectl(8) #Requires:依赖到的其它units,强依赖,被依赖的units没法激活时,当前unit也没法激活 #Wants:依赖到的其它units,弱依赖 #Conflicts:定义units间的冲突关系 [Service] #与特定类型相关的专用选项;此处为Service类型 Type=notify #定义影响ExecStart及相关参数的功能的unit进程启动类型 EnvironmentFile=/etc/sysconfig/httpd #环境配置文件 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND #指明启动unit要运行命令或脚本的绝对路径 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful #指明重载unit要运行命令或脚本的绝对路径 ExecStop=/bin/kill -WINCH ${MAINPID} #指明中止unit要运行的命令或脚本 KillSignal=SIGCONT PrivateTmp=true #simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中 #forking:由ExecStart启动的程序透过spawns延伸出其余子程序来做为此daemon的主要服务。原生父程序在启动结束后就会终止 #oneshot:与simple相似,不过这个程序在工做完毕后就结束了,不会常驻在内存中 #dbus:与simple相似,但这个daemon必需要在取得一个D-Bus的名称后,才会继续运做.所以一般也要同时设定BusNname= 才行 #notify:在启动完成后会发送一个通知消息。还须要配合 NotifyAccess 来让 Systemd 接收消息 #idle:与simple相似,要执行这个daemon必需要全部的工做都顺利执行完毕后才会执行。这类的daemon一般是开机到最后才执行便可的服务 [Install] #定义由“systemctl enable”以及"systemctl disable“命令在实现服务启用或禁用时用到的一些选项 WantedBy=multi-user.target #被哪些units所依赖,弱依赖 #Alias:别名,可以使用systemctl command Alias.service #RequiredBy:被哪些units所依赖,强依赖 #Also:安装本服务的时候还要安装别的相关服务
新建立unit文件后或者修改了unit文件须要使用如下命令来重载
# systemctl daemon-reload
用法:systemctl 子命令 name.service
子命令:
start | stop | restart |status | reload :启动 | 中止 | 重启 | 状态 | 重读配置文件
enable :设置开机自动启动
disable :设置开机不自动启动
try-restart:服务在启动状态才会执行重启,服务在中止状态不会重启
reload-or-restart :从新加载配置文件再启动服务
reload-or-try-restart :重载或服务在启动状态才会执行重启
mask:禁止服务启动
unmask:取消禁止服务启动
is-active:查看服务是否在激活状态
is-enabled :查看指定服务是否开机自启
list-dependencies :查看服务的依赖关系
kill :杀掉指定服务的进程
查看类子命令:
list-units :显示全部单元(unit)的状态
list-unit-files -t service -a:查看全部服务的开机自启状态
--failed -t service:查看启动失败的服务
查看指定服务在哪些运行级别下启用和禁用
ls /etc/systemd/system/*.wants/name.service
poweroff.target ==> 0 rescue.target ==> 1 multi-user.target ==> 2,3,4 graphical.target ==> 5 reboot.target ==> 6
切换运行级别:
# systemctl isolate multi-user.target
若是须要在启动中进入rescue模式,须要在linux16后加如下cmdline命令
systemd.unit=rescue.target
破解root口令
方法一: 在grub菜单按e进入编辑模式 在linux16后加rd.break Ctrl + x启动 # mount -o rw,remount /sysroot # chroot /sysroot # passwd # touch /.autorelabel 防止selinux打标签失败 # exit # reboot
方法二: 在linux16后加init=/sysroot/bin/sh # chroot /sysroot # passwd touch /.autorelabel
systemctl
相关子命令:
get-default :查看当前默认启动模式
set-default :设置默认启动模式
rescue :切换紧急救援模式
emergency:切换至emergency模式,比救援模式更底层一级
halt | poweroff :关机
reboot :重启
suspend :挂起
hibernate :休眠
hybrid-sleep :休眠并挂起
进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
内核的设计流派分为单内核和微内核:linux内核为单内核流派,把全部的功能都集成于同一个程序;Windows,Solaris系统的内核是微内核设计,每种功能都使用一个单独的子系统来实现,在一个中心框架下协同工做,从理论上来讲微内核的设计更为先进。
linux内核的特色:
linux的内核组成:
查看内核当前运行的cmdline参数:
[root@rhel6 ~]# cat /proc/cmdline ro root=UUID=e1d36be7-5027-4847-9d80-135ac9fb798e rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
内核参数文档:/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt,须要安装如下包。
yum install kernel-doc-2.6.32-696.el6.noarch
一、准备:
(1) 准备好开发环境(yum groupinstall -y "Development Tools" ; yum install -y ncurses-devel elfutils-libelf-devel openssl-devel bc)
(2) 获取目标主机上硬件设备的相关信息
(3) 获取目标主机系统功能的相关信息
(4) 获取内核源代码包(www.kernel.org)
二、解压内核包,进入linux-xxx目录;调试配置文件(.config)
(a) make config:基于命令行以遍历的方式去配置内核中可配置的每一个选项
(b) make menuconfig:基于curses的文本窗口界面
(c) make gconfig:基于GTK (GNOME)环境窗口界面
(d) make xconfig:基于QT(KDE)环境的窗口界面,支持“全新配置”模式进行配置
(a) make defconfig:基于内核为目标平台提供的“默认”配置进行配置
(b) make allyesconfig: 全部选项均回答为“yes“
(c) make allnoconfig: 全部选项均回答为“no“
三、编译
make -j #:全编译,若是咱们只须要编译单个模块,那么咱们能够cd到子目录或者make /path/MODULS.ko能够实现只对单个模块进行编译
-j:支持并行编译,#为物理CPU核心数
四、安装模块
make modules_install
五、安装内核文件,生成initramfs文件而且自动配置grub菜单
make install
六、reboot启动选择新内核进入系统就完成了
七、若是编译失败须要从新编译咱们可使用如下命令来清理
# make clean:清理大多数编译生成的文件,但会保留config文件等 # make mrproper: 清理全部编译生成的文件、config及某些备份文件 # make distclean:mrproper、patches以及编辑器备份文件
八、若是新的内核有bug须要卸载内核
内核把本身内部状态信息及统计信息,以及可配置参数经过proc伪文件系统加以输出
常见重要参数
/proc/sys/net/ipv4/icmp_echo_ignore_all /proc/sys/net/ipv4/ip_forward /proc/sys/net/ipv4/ip_default_ttl /proc/sys/vm/drop_caches /proc/sys/net/ipv4/tcp_syn_retries /proc/sys/net/ipv4/tcp_fin_timeout /proc/sys/net/ipv4/tcp_syncookies /proc/sys/net/ipv4/tcp_max_tw_buckets /proc/sys/net/ipv4/tcp_max_syn_backlog /proc/sys/net/ipv4/ip_local_port_range
sysfs:为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息;有些参数是能够修改的,用于调整硬件工做特性。
sysctl:修改内核参数的工具
uname
lsmod:显示已经装载的模块
modinfo:显示模块的详细信息
modprobe:装载模块
depmod:内核模块依赖关系文件及系统信息映射文件的生成工具
insmod:指定装载模块文件,但不自动解决依赖模块
rmmod:卸载模块
time cmd 检测命令执行花的时间
lscpu:查看CPU信息
lspci:查看pci相关信息
lsusb:查看usb相关信息
lsblk:查看块设备相关信息
hal-device:查看全部硬件信息(CentOS6.x)
为了对linux系统有更多的认识,咱们能够基于CentOS的环境本身来在新硬盘上安装一个mini版的linux,只须要提供最基础的程序来运行。
1)准备工做
#/bin/bash green_OK() { echo -e "[ \033[1;32mOK\033[0m ]"; } red_FAILED() { echo -e "[ \033[1;31mFAILED\033[0m ]"; } Screen=`stty -F /dev/tty size` Columus=${Screen#* } Spa_Col=$[Columus-16] success() { local i string="$1" Rt_Spa=$[$Spa_Col-${#string}] echo -n "$string" for i in `seq $Rt_Spa` ;do echo -n "." sleep 0.005 done green_OK } failed() { local i string="$1" Rt_Spa=$[$Spa_Col-${#string}] echo -n "$string" for i in `seq $Rt_Spa` ;do echo -n " " done red_FAILED } Ddir="/mnt/sysroot" [ ! -d "$Ddir" ] && mkdir "$Ddir" cpbin() { cmddir=`echo "$Cmd_path" |grep -o ".*/\b"` [ ! -d "${Ddir}${cmddir}" ] && mkdir -p "${Ddir}${cmddir}" cp -n "$Cmd_path" "${Ddir}${cmddir}" } libcp() { echo "$Lib_path" |while read line ;do libdir=`echo "$line" |grep -o ".*/\b"` [ ! -d "${Ddir}${libdir}" ] && mkdir -p "${Ddir}${libdir}" cp -n "$line" "${Ddir}${libdir}" 2>/dev/null done } while read -p "Input a cmd. (quit): " CMD ;do if [ "$CMD" == 'quit' ] ;then echo "Think you! Bye bye."; break; fi if ! which "$CMD" &>/dev/null ;then echo "not find $CMD or is a shell builtin, please input again!" failed "copy $CMD failed." continue fi Cmd_path=`which $CMD |grep -o "/.*"` Lib_path=`ldd $Cmd_path |sed -nr 's#.*[[:space:]]+(/.*) .*#\1#p'` cpbin libcp success "copy $CMD Complete." done
2)分区格式化新硬盘而且挂载
[root@rhel6 ~]# mkfs.ext4 /dev/sdb1 [root@rhel6 ~]# mkfs.ext4 /dev/sdb2 [root@rhel6 ~]# mkdir /mnt/sysroot # [root@rhel6 ~]# mount /dev/sdb2 /mnt/sysroot/ [root@rhel6 ~]# mkdir /mnt/sysroot/boot [root@rhel6 ~]# mount /dev/sdb1 /mnt/sysroot/boot
3)安装grub,提供内核和ramdisk文件,而且编辑配置文件
[root@rhel6 ~]# grub-install --root-directory=/mnt/sysroot/ /dev/sdb [root@rhel6 ~]# cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/sysroot/boot/initramfs.img [root@rhel6 ~]# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/sysroot/boot/vmlinuz [root@rhel6 ~]# cat >/mnt/sysroot/boot/grub/grub.conf <<EOF default=0 timeout=3 title mini_linux root(hd0,0) kernel /vmlinuz ro root=UUID=ce79412f-72b8-4313-8a55-5fb734ffacfe selinux=0 init=/bin/bash #这里是/dev/sdb2(mini_linux的根)的UUID
initrd /initramfs.img
4)接下来咱们就能够把经常使用的cmd和对应依赖的库文件复制到咱们的/mnt/sysroot/下了
[root@rhel6 ~]# mkdir -pv /mnt/sysroot/{bin,dev,etc,home,lib,lib64,media,mnt,opt,proc,root,sbin,sys,usr/{bin,etc,include,lib,lib64,libexec,local,sbin,share,src,tmp},var,tmp} [root@rhel6 ~]# ./copycmd.sh Input a cmd. (quit): bash copy bash Complete................................................................[ OK ] Input a cmd. (quit): ifconfig copy ifconfig Complete............................................................[ OK ] Input a cmd. (quit): insmod copy insmod Complete..............................................................[ OK ] Input a cmd. (quit): ping copy ping Complete................................................................[ OK ] Input a cmd. (quit): mount copy mount Complete...............................................................[ OK ] Input a cmd. (quit): ls copy ls Complete..................................................................[ OK ] Input a cmd. (quit): cat copy cat Complete.................................................................[ OK ] Input a cmd. (quit): df copy df Complete..................................................................[ OK ] Input a cmd. (quit): lsblk copy lsblk Complete...............................................................[ OK ] Input a cmd. (quit): blkid copy blkid Complete...............................................................[ OK ] Input a cmd. (quit): vi copy vi Complete..................................................................[ OK ] Input a cmd. (quit): sed copy sed Complete.................................................................[ OK ] Input a cmd. (quit): grep copy grep Complete................................................................[ OK ] Input a cmd. (quit): awk copy awk Complete.................................................................[ OK ] Input a cmd. (quit): quit Think you! Bye bye.
5)接下来咱们去提供网卡驱动模块
[root@rhel6 ~]# mkdir /mnt/sysroot/lib/modules [root@rhel6 ~]# cp /lib/modules/2.6.32-642.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/modules
6)如今一切都完成了,咱们接下来关闭虚拟机,在关闭前执行几回sync命令来保证数据同步到磁盘上,而后将咱们的mini_linux虚拟磁盘挂到新虚拟机上,调BIOS让其成为第一启动项,启动后将e1000.ko模块装载后就可使用网络了
insmod /lib/modules/e1000.ko ifconfig eth0 192.168.222.222 up
我的学习笔记 2018.5.14 18:19