简述linux
操作系统启动流程
CentOS 6
版本启动流程
加载
BIOS
的硬件信息,获取第一个启动设备
读取第一个启动设备MBR
的引导加载程序(GRUB
)的启动信息
加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备
核心执行init
程序,并获取默认的运行信息
init
程序执行/etc/rc.d/rc.sysinit
文件,重新挂载根文件系统
启动核心的外挂模块
init
执行运行的各个批处理文件(scripts)
init
执行/etc/rc.d/rc.local
执行/bin/login
程序,等待用户登录
登录后,开始以Shell
控制主机
CentOS 7
版本启动流程
UEFI
或BIOS
初始化,运行POST
开机自检
选择启动设备
引导装载程序,CentOS7
是grub2
,加载装载程序的配置文件(/etc/grub.d/、/etc/default/grub、/boot/grub2/grub.cfg
)
加载initramfs
驱动模块
加载内核选项
内核初始化,CentOS7
使用systemd
替代init
执行initrd.target
所有单元,包括挂载/etc/fstab
从initramfs
根文件系统切换到磁盘根目录
systemd
执行默认target
配置,配置文件/etc/systemd/system/default.target
systemd
执行sysinit.target
初始化系统及basic.target
准备操作系统
systemd
启动multi-user.target
下的本机与服务器服务
systemd
执行multi-user.target
下的/etc/rc.d/rc.local
systemd
执行multi-user.target
下的getty.target
及登录服务
systemd
执行graphical
需要的服务
制作一个只运行shell
的linux
系统
# 分区并创建文件系统
## 说明:/dev/sdb1为/boot,/dev/sdb2为/
# 添加硬盘,在此不赘述
echo -e 'n\np\n1\n\n+1G\nw\n' | fdisk /dev/sdb
echo -e 'n\np\n2\n\n\n\nw\n' | fdisk /dev/sdb
mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2
# 挂载boot
mkdir /mnt/boot
mount /dev/sdb1 /mnt/boot
# 安装grub
grub-install --root-directory=/mnt/ /dev/sdb
# 复制内核及initramfs文件
cp /boot/vmlinuz-2.6.32-754.el6.x86_64 /mnt/boot/vmlinuz
cp /boot/initramfs-2.6.32-754.el6.x86_64.img /mnt/boot/initramfs.img
# 创建grub.conf文件
cat > /mnt/boot/grub/grub.conf << EOF
default=0
timeout=6
title tiger linux
root (hd0,0)
kernel /vmlinuz root=/dev/sda2 selinux=0 init=/bin/bash
initrd /initramfs.img
EOF
# 创建根目录及根下相关目录
mkdir /mnt/sysroot
mount /dev/sdb2 /mnt/sysroot
mkdir –pv /mnt/sysroot/{boot,dev,sys,proc,etc,lib,lib64,bin,sbin,tmp,var,usr,opt,home,root,mnt,media}
# 复制相关的程序及lib库文件
cp -a /bin/bash /mnt/sysroot/bin/
# 找到bash所使用的相关的lib库文件
ldd /bin/bash |sed -nr 's#.*(\/.*/.*) .*#\1#p'
cp -ar `ldd /bin/bash |sed -nr 's#.*(\/.*/.*) .*#\1#p'` /mnt/sysroot/lib64/
# 添加网卡驱动
ethtool -i eth0
modinfo -n e1000
/lib/modules/2.6.32-754.el6.x86_64/kernel/drivers/net/e1000/e1000.ko
cp /lib/modules/2.6.32-754.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/
chroot /mnt/sysroot
# 将硬盘新增的硬盘卸载,安装到其他的机器上,开机启动
总结systemctl
管理命令及system unit
文件格式
1、systemctl
管理命令
命令格式:
systemctl COMMAND name.service
查看状态:systemctl status name.service
启动:systemctl start name.service
停止:systemctl stop name.service
重启:systemctl restart name.service
重新加载配置:systemctl reload name.service
禁用:systemctl mask name.service
;被禁用后,服务将无法启动
取消禁用:systemctl unmask name.service
设置开机自启动:systemctl enable name.service
取消开机自启动:systemctl disenable name.service
查看所有服务的开机自启状态:systemctl list-unit-files --type service
查看服务是否激活状态:systemctl is-active name.service
查看服务是否开机自启:systemctl is-enable name.service
查看服务的依赖关系:systemctl list-dependencies name.service
重新载入systemd,扫描新的或有变动的单元:systemctl daemon-reload
查看已经激活单元:systemctl list-units
查看运行失败的单元:systemctl --failed
重启服务器:systemctl reboot
退出系统并停止电源:systemctl poweroff
待机:systemctl suspend
2、system unit
文件格式
system unit
文件通常由三部分组成:
[Uint]
定义与Unit
类型无关的通用选项;用于提供unit
的描述信息,unit
行为及依赖关系等
[Service]
与特定类型相关的专用选项;此处为Service
类型
[Install]
定义由systemctl enable
以及systemctl disable
命令在实现服务启动或禁用时用到的一些选项
[Uint]
段常用选项
Description
描述信息
After
定义unit
的启动次序,表示当前unit
应该晚于哪些unit
启动,其功能与Before
相反
Require
依赖到的其他units
,强依赖;被依赖的uints
无法激活时,当前unit
也无法激活
Wants
依赖到的其他units
,弱依赖
Conflicts
定义units
间的冲突关系
[Service]
段的常用选项
Type
定义影响ExecStart
及相关参数功能的uint
进程启动类型
simple
默认值,这个daemon
主要有ExecStart
接的指令串来启动,启动后常驻内存中
forking
由ExecStart
启动的程序透过spawns
延伸出其他子程序来作为此daemon
的主要服务;原生父程序在启动程序结束后就会终止
oneshot
与simple
类似,不过这个程序在工作完毕后就结束了,不会常驻内存中
dbus
与simple
类似,但这个daemon
必须要在取得一个D-Bus
的名称后,才会继续运作;因此通常也要同时设置BusName=
才行
notify
在启动完成后会发送一个通知信息;还需要配合NotifyAccess
来让Systemd
接收消息
idle
与simple
类似,要执行这个daemon
必须要所有的工作都顺利执行完毕才会执行。这类的daemon
通常是开机到最后才执行即可的服务
EnvironmFile
环境配置文件
ExcStart
指明启动uint
要运行命令或者脚本的绝对路径
ExcStartPre
ExcStart
前运行
ExcStartPost
ExcStart
后运行
ExecStop
指明停止uint
要运行的命令或脚本
Rstart
当设定Rstart=1
时,则当次daemon
服务意外终止后,会再次自动启动此服务
PrivateTmp
设定为yes
时,会生成/tmp/systemd-private-UUID-NAME.service-XXXX/tmp/
目录
[Install]
段的常用选项
Alias
别名;可使用systemctl Command Alias.service
RequiredBy
被哪些uints
所依赖,强依赖
WantedBy
被哪些uints
所依赖,弱依赖
Also
安装本服务的时候还要安装别的相关的服务
破解centos7
密码
方法一:
# 启动时任意键暂停启动
# 按e键进入编辑模式
# 将光标移动linux 开始的行,添加内核参数rd.break
# 按ctrl-x启动
# 重新挂载根目录,并修改其挂载属性
mount –o remount,rw /sysroot
# 切换根并更重新设置root密码
chroot /sysroot
passwd root
# 如果SELinux是启用的,才需要执行下面操作,如查没有启动,不需要执行
touch /.autorelabel
# 重启
exit
reboot
方法二:
# 启动时任意键暂停启动
# 按e键进入编辑模式
# 将光标移动linux 开始的行,改为rw init=/sysroot/bin/sh
# 按ctrl-x启动
# 切换根并更重新设置root密码
chroot /sysroot
passwd root
# 如果SELinux是启用的,才需要执行下面操作,如查没有启动,不需要执行
touch /.autorelabel
# 重启
exit
reboot